프로세스 간 메시지 큐: /dev/shm 대 /dev/mqueue [닫기]

프로세스 간 메시지 큐: /dev/shm 대 /dev/mqueue [닫기]

Boost Interprocess 라이브러리의 메시지 대기열을 사용하는 일부 C++ 코드를 개발 중이며 제대로 작동합니다. 단지 재미와 학습을 위해 "ipc" 상자의 메시지 큐를 사용하여 Rust의 실행 파일 중 하나를 다시 구현하려고 합니다.
떠나지 마세요! C++ 애플리케이션의 메시지는 Rust 애플리케이션에 도달하지 않습니다. 몇 가지 탐색 후에 Boost 라이브러리가 다음 위치에 대기열을 생성했다는 것을 발견했습니다./dev/shm, Rust가 ipc에서 생성하는 동안/dev/mqueue!

그럼 의견을 주십시오. 메시지 대기열을 생성하는 "올바른" 장치 노드는 무엇입니까? 아니면 IPC 라이브러리가 루트 장치 노드 지정을 허용해야 합니까?

답변1

기본적으로 공유 메모리와 메시지 큐는 서로 다른 유형의 IPC이며 다르게 작동합니다. 필요한 것은 응용 프로그램에 따라 다릅니다.

공유 메모리를 사용하면 다음과 같은 방법으로 두 프로세스의 주소 공간에 매핑되는 메모리 영역을 생성할 수 있습니다.

handle = shm_open(Name /* '/dev/shm100' or similar*/, FLAGS);
/* now the memory can be mapped into address space */
address = mmap(0, SIZE, PROT, MAP_SHARED, &handle, 0);

여전히 세마포어나 이와 유사한 것을 통해 메모리에 대한 액세스를 동기화해야 합니다.

반면에 메시지 큐는 일반 파일처럼 쓰고 읽을 수 있습니다.최대 크기와 최대 메시지 수를 고려해야 합니다., sysctrl을 통해 구성할 수 있습니다.

fs.mqueue.msgsize_max = 9000
fs.mqueue.queues_max = 1024

보내고 받는 호출은 다음과 같습니다.

mqd_t queue = mq_open(MQ_NAME, O_RDWR);
msg_size = mq_timedreceive(queue , request, SIZE, 0, (const struct timespec*) &my_timeout);
/* or */
int ret = mq_send(queue, (const char*) req, SIZE, 1);
mq_close(queue);

관련 정보