linux IPC
프로세스간 통신을 IPC(inter process communication)이라고 한다.
시그널 : 가장 오래된 방식.
시그널 전송 : kill(pid, SIGUSR1); /-pid에 해당하는 프로세스에 SIGUSR1을 전송*-
- 시그널 handler 등록
-
signal(SIGUSR1, (void*)handler);
void handler().. «- SIGUSR1이 호출되면 호출되게 된다.
시스템 V에서 제공하는 IPC는 아래와 같다.
| 시스템콜 | 세마포어 | 메시지큐 | 공유 메모리 |
| 헤더파일 선언 | sys/sem.h | sys/msg.h | sys/shm.h |
| 생성과 오픈 시스템 콜 | semget | msgget | shmget |
| IPC 제어를 위한 시스템 콜 | semctl | msgctl | shmctl |
| IPC 동작을 위한 시스템 콜 | semop | msgsnd msgrcv | shmat shmdt |
shm 사용방법
http://forum.falinux.com/zbxe/?document_srl=423456
간단한 shm 사용한 code.
-
ipc_maker.c 에서는 shared memory를 할당하고 1초에 한번씩 값을 넣는다.
-
ipc_shower.c에서는 shared memory를 1초에 한번씩 읽어서 print한다.
//————————— ipc_maker.c ——————————–
1 // this is IPC test sample code
2
3 #include
4 #include
5 #include <sys/ipc.h>
6 #include <sys/shm.h>
7
8 #define KEY 0x1234
9 #define MEM_SIZE 1024
10
11 void main(void)
12 {
13 int id;
14 void *addr;
15 int count;
16
| 17 id = shmget((key_t)KEY, MEM_SIZE, (IPC_CREAT | 0666)); |
18 // KEY값을 가지는 MEM_SIZE만큼 할당한 shared memory를 id값으로 만든다.
19 addr = shmat(id, (void *)0, 0);
20 // id값을 가지고 있는 shared memory의 address를 가져온다.
21 count =0;
22
23 while(1)
24 {
25 // printf(“maker : %d\n”, count++);
26 sprintf((char*)addr, “%d”, count++);
27 sleep(1);
28 }
29 }
//————————— ipc_shower.c ——————————–
1 // this is IPC test sample code
2 #include
3 #include
4 #include <sys/ipc.h>
5 #include <sys/shm.h>
6
7 #define KEY 0x1234
8 #define MEM_SIZE 1024
9
10 void main(void)
11 {
12 int id;
13 void *addr;
14
| 15 id = shmget((key_t)KEY, MEM_SIZE, IPC_CREAT | 0666); |
16 addr = shmat(id, (void *)0, 0);
17
18 while(1)
19 {
20 printf(“shower: %s\n”,(char*)addr);
21 sleep(1);
22 }
23 }
//————————————————————————-
Build
$ gcc -g -o m ipc_maker.c
$ gcc -g -o s ipc_show.c
결과
$ ./m &
[1] 9391
$ ./s
shower: 1
shower: 2
shower: 3
shower: 4
\