SysV Message Queue

2019. 6. 2. 22:21임베디드/리눅스시스템프로그래밍

1. SysV Message Queue만의 특징으로 message type을 지원한다. 각각의 message마다 type을 지정해서 보낼 수 있다. 수신하는 프로세스쪽에서도 message type을 정해서 수신할 수 있다 

2. unrelated process간 통신을 위해선 프로세스들은 fd가 아닌 IPC key값을 알아야만 서로 통신할 수 있다. 중요한 점은 fd가 아니므로 epoll이나 select같은 IO Multiplexing에 등록할 수 없다

 

 각각의 message type에 따라 프로세스들은 자신이 원하는 message들을 구분지어 수신할 수 있다

SysV Message Queue API

  • 데이터 송수신
    • int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg) - 반드시 msgp에는 struct msgbuf에 맞춰서 msg type과 data 둘 다 넣어서 전달해야 한다. 그리고 전달하는 사이즈는 type을 제외한 크기를 전달하면 된다
    • msgrcv() - 지정한 msg type이 아니어도 마구잡이로도 수신할 수 있다
  • 제어
    • msgctl() - 현재의 msgq의 정보를 읽어오거나 수정(제한적), 삭제할 수 있다
    • int msgget(key_t key, int msgflg) - 프로세스를 attach해서 key 값을 얻으면서 Message Queue에 등록하는 작업이다
    • key-t ftok(const char *pathname, int proj_id) - 수신하려는 프로세스가 쉽게 Message Queue ID를 얻기 위한 작업이다. Message Queue ID가 생성될 때 같은 파일이름이 생성될 수 있는데, 충돌의 여지를 제거하고자 proj_id를 넣어서 구분지을 수 있다. proj_id는 사전에 미리 약속에 놓은 값이다. 커널에게 적절한 pathname과 proj_id를 매개변수로 전달하면 적달한 IPC key를 반환하게끔 요청하게 된다. 실제 key와 하지만 100% unique하다고 보장할 수 없다

 

 

https://github.com/surinoel/linux/blob/master/ipc/msq/sysV_comment.c

https://github.com/surinoel/linux/blob/master/ipc/msq/sysV_various_msg_comment.c