<NETWORK>
==공유메모리
: shmget() :
: shmat() : attach
: shmdt() : detach
: shmctl() : 관리
-확인
: ipcs -m
-
<sharedmem.c>
#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h>
int main(int argc, char **argv) { key_t keyval = 2345; int shmid; shmid = shmget(keyval, 1024, IPC_CREAT |0666); if(shmid == -1) { printf("shm Create failure\n"); return 1; } printf("shm Create success\n"); return 0; } |
:권한
소유자 그룹 기타
-666 : rwx rwx rwx
110 110 110
-
<shm_producer>실행 전/후


-
<shm_procuder.c>
#include <sys/ipc.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h>
int main(int argc, char **argv) { int shmid;
int *cal_num; void *shared_memory = NULL;
shmid = shmget((key_t) 1234, sizeof(int), 0666|IPC_CREAT); if(shmid == -1) { perror("shmget failed : "); exit(0); }
shared_memory = shmat(shmid, NULL, 0); if(shared_memory == (void *)-1) { perror("shmat failed : "); exit(0); }
cal_num = (int *)shared_memory; while(1) { *cal_num = *cal_num +2; sleep(1); } return 0; } |
<shm_consumer.c>
#include <sys/ipc.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h>
int main(int argc, char ** argv) { int shmid;
int *cal_num; void *shared_memory = NULL;
shmid =shmget((key_t)1234, sizeof(int), 0); if(shmid == -1) { perror("shmget failed : "); exit(0); }
shared_memory = shmat(shmid, NULL, 0); if(shared_memory == (void *)-1) { perror("shmat failed : "); exit(0); }
cal_num = (int *)shared_memory;
while(1) { sleep(1); printf("Read Data : %d\n", *cal_num); } return 0; } |


=
1. 멀티 P : PROCESS 여러개
2. 멀티 T : PROCESS 1개 THREAD 여러개
3. 다중 입출력 : PROCESS 1개
==세마포어(키)
(비행기 좌석 예약 : 같은좌석 중복 예약 안되도록 한사람이 예약 하는 동안 lock) : 동기화
=> 공유메모리 / 파이프 사용 불가 => 세마포어 사용(
<shm_producer_sem.c>
#include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h>
union semun { int val; };
int main(int argc, char **argv) { int shmid; int semid;
int *cal_num; void *shared_memory = NULL; union semun sem_union;
struct sembuf semopen = { 0, -1, SEM_UNDO}; struct sembuf semclose = { 0, 1, SEM_UNDO};
shmid = shmget((key_t)1234, sizeof(int), 0666|IPC_CREAT); if(shmid == -1) { return 1; }
semid = semget((key_t)3477, 1, IPC_CREAT|0666); if(semid == -1) { return 1; }
shared_memory = shmat(shmid, NULL, 0); if(shared_memory == (void *)-1) { return 1; }
cal_num = (int *)shared_memory; sem_union.val = 1; if(-1 == semctl(semid, 0, SETVAL, sem_union)) { return 1; }
while(1) { int local_var = 0; if(semop(semid, &semopen, 1) == -1) { return 1; } local_var = *cal_num +1; sleep(1); *cal_num = local_var; printf("%d\n", *cal_num); semop(semid, &semclose, 1); } return 0; }
|
<shm_consumer_sem.c>
#include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h>
int main(int argc, char **argv) { int shmid; int semid;
int *cal_num; void *shared_memory = NULL;
struct sembuf semopen = {0, -1, SEM_UNDO}; struct sembuf semclose = {0, 1, SEM_UNDO};
shmid = shmget((key_t)1234, sizeof(int), 0666); if(shmid ==-1) { perror("shmget failed : "); exit(0); }
semid = semget((key_t) 3477, 0, 0666); if(semid == -1) { perror("semget failed : "); return 1; }
shared_memory = shmat(shmid, NULL, 0); if(shared_memory == (void *)-1) { perror("shmat failed : "); exit(0); }
cal_num = (int *)shared_memory;
while(1) { int local_var = 0; // 세마포어 획득 실패시 : IPC_NOWAIT 아니므로 무한대기 if(semop(semid, &semopen, 1) == -1) { perror("semop error : "); } local_var = *cal_num +1; sleep(2); *cal_num = local_var; printf("count %d\n", *cal_num); semop(semid, &semclose, 1); } return 0; }
|
=




=시그널(소프트웨어 인터럽트: ctrl+C)(자바: 이벤트)(윈도우: 메세지)


<sig1.c>
#include <stdio.h> #include <stdlib.h> #include <signal.h>
void smart(int iNum) { printf("INTERRUPT : %d\n", iNum); //exit(0); }
int main() { signal(SIGINT, smart); while(1) { sleep(1); printf("-----------------------------\n"); } return 0; } |


void (*)(int);
- ^z : 프로세스 stop
- fg : foregrouond
- bg : background


=채팅프로그램