IPC는 Inter Process Communication의 약자로, 프로세스 간 통신을 뜻합니다.
앞서 살펴봤듯이, Pipe 외에도 많은 방법들이 존재합니다. 이번 게시글에서는 IPC의 수단들을 구체적으로 다뤄보려고 합니다.
구조는 위와 같은 형태입니다. 언뜻 보면 pipe와 비슷하다고 생각할 수 있습니다. 허나 중요한 차이점은 위와 같은 구조가 pipe는 데이터의 흐름이라면 message queue는 메모리 공간에 존재한다는 것입니다. 또한, 두 프로세스 간이 아닌 여러 프로세스들이 활용할 수 있습니다. message queue를 사용하기 위해 쓰이는 함수들은 다음과 같습니다.
key에는 message queue의 key가 들어갑니다, msgflg에는 create, open이 들어가서 queue를 열거나 생성합니다. 정상적인 경우라면 message queue의 id가 반환되고 error시 -1이 반환됩니다.
msgp에 user message pointer가, msgsz에는 message size, msgflg에는 blocking, non-blocking 설정을 할 수 있습니다. 정상적인 경우 0을, error시 -1을 반환합니다. pipe의 write처럼 message queue의 msgsnd를 통해 message queue에 내용을 넣습니다.
msgtype에 message의 type이 들어갑니다. type > 0이면 type이 동일한 message들 중에 가장 먼저 들어간 것을 꺼내는 것입니다. type == 0이면 전체 message 중에서 가장 먼저 들어간 것을 꺼냅니다. type < 0이면 가장 낮은 값을 가지고 type의 첫 번째 message를 꺼냅니다. 정상적인 경우 0을, error시 -1을 반환합니다.
msgsnd든 msgrcv든 먼저 msqid를 찾아야 하므로 msgget을 해야 합니다.
이렇게 qid를 찾고 난 다음,
이런 식으로 send 혹은 receive를 합니다. 당연히 mymsg는 message가 담겨져 있는 문자열 or 포인터입니다.
여러 프로세스들이 하나의 메모리 공간을 공유할 수 있도록 함으로써 정보를 주고받을 수 있게 만든 메모리 공간입니다.
shared segment는 각 프로세스의 heap에 자리잡는데 그 위치는 프로세스마다 다릅니다. 하지만 key 값을 통해 어떤 프로세스에서 shared memory에 read, write 하면 다른 프로세스에도 즉각 반영됩니다.
shared memory의 id (key)를 얻는 함수입니다.
shared segment를 address에 attach하는 함수입니다. 반환 값으로 shared segment가 mapping 된 address를 줍니다.
shmaddr에 앞의 shmat 함수에서 반환된, mapping된 address를 주면 그걸 detach 합니다.
shm-producer는
이런 식으로 shmget을 통해 shmid을 받아와서, shmat의 반환 값에 해당하는 shmaddr를 받고 임시로 tempaddr에 shmaddr의 주소 값을 받아서 그 안에 값을 집어넣으면 shared memory에 write가 됩니다. detach 할 때는 shmaddr를 shmdt 합니다.
shm-consumer는
이런 식으로 앞의 producer와 동일하지만 tempaddr에 shmaddr의 주소 값을 받아서 그 안에 있는 값을 읽어 들임으로써 shared memory 안의 내용을 read 합니다.