학부 수업 정리/시스템프로그래밍 (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)}$