![进程间消息队列:/dev/shm vs /dev/mqueue](https://linux22.com/image/158571/%E8%BF%9B%E7%A8%8B%E9%97%B4%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%EF%BC%9A%2Fdev%2Fshm%20vs%20%2Fdev%2Fmqueue%20.png)
我们正在开发一些使用 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);