我们正在开发一些C++代码,它使用来自Boost Interprocess库的消息队列,它们运行良好。为了好玩和学习,我试着用"ipc“机箱中的消息队列重新实现Rust中的一个可执行文件。
不走!来自C++应用程序的消息无法传递到Rust应用程序。经过一些头晕目眩之后,Boost库在/dev/shm中创建了队列,而Rust ipc在/dev/mqueue中创建了队列!
因此,请给出意见--哪个是“正确”的设备节点,用于创建消息队列?或者IPC库应该允许指定根设备节点?
发布于 2019-08-07 08:10:41
基本上,共享mem和消息队列是不同类型的ipc,并且工作方式不同。您需要哪一个,取决于您的应用程序。
使用共享mem,您将创建一个内存区域,通过以下方法将其映射到两个进程的地址空间:
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);https://unix.stackexchange.com/questions/534287
复制相似问题