학부 수업 정리/시스템프로그래밍 (21-2)
[시스템] 6. IPC (Inter Process Communication)
퐁키조아
2021. 12. 28. 21:21
1. IPC 소개
Signal은 프로세스 사이에 메시지를 보내는 아주 간단한 방법이다. 하지만 전송할 수 있는 정보는 단순히 시그널 숫자 뿐이므로 프로세스들끼리 더 많은 메시지들을 전송하기 위해서는 IPC라는 새로운 방법이 필요하다. IPC의 종류에는 Pipe, Message Queue, Shared Memory, Shmaphore 가 있다. (수업에서는 Pipe와 Message Queue를 위주로 다루었다.)
2. Pipe
- 단방향 데이터 채널
- FIFO - 큐처럼 작동
- Stream (바이트) 단위로 전송하기 때문에 메시지의 경계가 존재하진 않는다.
- System Call: $\verb|pipe()|$ - 파이프 생성 / $\verb|read(), write()|$
- 커맨드 창에서 파이프의 사용: $\texttt{cmd1 | cmd2}$ - $\verb|cmd1|은$ 키보드로부터 입력을 받고, 그 결과는 파이프를 통해서 $\verb|cmd2|$의 입력으로 들어간다. $\verb|cmd2|$의 결과는 터미널 창에 최종적으로 출력된다.
3. Message Queue
- 양방향 데이터 채널
- FIFO로 작동하지 않고 중간에 메시지를 빼갈 수도 있다.
- Message 단위로 전송하기 때문에 메시지의 경계가 분명하다. (연결 리스트로 구현됨)
- Sender와 Receiver 모두 여러개일 수 있다.
- sysV System Call: $\texttt{msgget(), msgsnd(), msgrcv()}$
- POSIX System Call: $\verb|mq_open(),mq_send(),mq_receive(), mq_close(), mq_unlink()|$
SysV Message Queue - Example
- Format: $\verb|struct { long id; int value; } mymsg;|$
- Create: $\texttt{int mqdes = msgget(ftok("./tmp/foo", 2021), IPC_CREAT|0600)}$
- Send: $\texttt{msgsnd(mqdes, &mymsg, buf\_len, 0)}$
- Receive: $\texttt{msgrcv(mqdes, &mymsg, buf\_len, i+1, 0)}$
- Remove MQ: $\texttt{ipcrm msg MSQID}$
POSIX Message Queue - Example
- Message Attr: $\verb|struct mq_attr attr : mq_maxmsg = 10, mq_msgsize = MSG_SIZE|$
- Create: $\texttt{mqdes = mq_open(MQNAME, O_CREAT|O_WRONLY, 0600, &attr)}$
- Send: $\texttt{mq_send(mqdes, (char*) &value, MSG\_SIZE, prio)}$
- Receive: $\verb|mq_receive(mqdes, (char*) &value, MSG\_SIZE, &prio)|$
- Remove MQ: $\texttt{mq_close(mqdes), mq_unlink(MQNAME)}$