进程间消息队列:/dev/shm vs /dev/mqueue

进程间消息队列:/dev/shm vs /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);

相关内容