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에 등록할 수 없다
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
'임베디드 > 리눅스시스템프로그래밍' 카테고리의 다른 글
fork 후 _exit를 반드시 해야하는 이유 (0) | 2019.06.04 |
---|---|
.bashrc와 .bash_profile의 차이 (0) | 2019.06.04 |
Message Queue (0) | 2019.06.02 |
pthread_self() 그리고 syscall(__NR_gettid) (0) | 2019.06.02 |
리눅스 타입 자료형 (0) | 2019.06.01 |