-
- 메세지 큐
메세지 큐는 프로세스 간 통신을 위한 메커니증 중 하나로, 지명 파이프와 유사하다.
큐(Queue) 데이터 구조로 관리하며, 커널에서 전역적으로 관리되기에 모든 프로세스에서 접근이 가능하다.
메세지 큐의 접근자를 아는 모든 프로세스가 동일한 메세지 큐에 접근하여 데이터를 공유할 수 있어,
다른 IPC 메커니즘에 비해서 사용법이 매우 직관적이고 간단하다.
여러 프로세스가 메세지 큐에 접근할 때, 각 메세지 유형을 지정하여 접근해야 하기에,
각 프로세스가 필요로 하는 메세지만 가져올 수 있다.
단, 하나의 메세지 스택(박스)를 분할하여 가져오는 방식은 안된다. (파이프에서 스트림 형태로 가져온 것과는 대조)
- 메세지 큐 함수
1. key_t ftok(const char *pathname, int proj_id);
System V IPC에서 사용할 고유의 키를 pathname과 proj_id의 하위 8비트를 이용하여 생성한다.
2. int msgget(key_t key, int msgflag);
ftok로 생성한 고유 key값으로 msgflag 플래그 방식으로 메세지 큐를 생성한다.
3. int msgsnd(int msqid, (void *)msgp, size_t msgsz, int msgflag);
메세지 큐(msqid)에 데이터(msgp)를 smgzs크기만큼 전송한다.
4. ssize_t msgrcv(int msqid, (void *)msgp, size_ msgsz, long msgtype, int msgflag);
메세지 큐(msgid)에서 msgtype 유형의 메세지를 msgsz 만큼 msgp에 가져온다.
5. int msgctl(int msgid, int cmd, struct msqid_ds *buf);
메세지 큐를 제어한다.
참고로 메세지 큐 사용시 메세지 구조체를 사용자가 정의해서 사용해야 하는데,
구조체의 첫 번째 멤버는 반드시 메세지 유형을 담을 long 자료형 이어야 한다.
(메세지 사이즈는 이 사용자 정의 메세지 구조체의 크기에서 long 타입의 크기 만큼 빼주면 된다)
클라이언트에서 메세지 형식과 값을 정하고 메세지를 보내면
서버에서 해당 메세지 형식에 맞는 메세지를 읽어 값을 읽어오고 연산한 뒤 메세지 형식과 결과를 정해 메세지를 보낸다.
클라이언트에서 다시 해당 메세지 형식에 맞는 메세지를 읽고 결과를 출력한다.
서버에서 SIGINT(ctrl + c) 시그널이 들어오면 메세지 큐를 삭제 후 종료한다.
(위 코드는 서버를 먼저 실행해야 정상 동작한다. (메세지 큐 생성시 권한설정을 서버 코드에서 구현했기에))