如何为 Windows 使用 Boost 进程间消息队列?

Posted

技术标签:

【中文标题】如何为 Windows 使用 Boost 进程间消息队列?【英文标题】:How to use Boost Interprocess Message Queue for Windows? 【发布时间】:2012-09-14 12:19:26 【问题描述】:

我正在使用 Boost Interprocess 实现进程间通信。 作为测试,我以boost documentation 为例。

第一个进程(创建消息队列)使用CreateProcess(NULL, (LPSTR)commandStream.str().c_str(), NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi)启动另一个进程(应该从队列中接收消息)

第一个进程使用message_queue mq(create_only, "message_queue", 100, sizeof(int)) 创建队列。

不幸的是,message_queue mq(open_only, "message_queue") 抛出了一个 interprocess_exception。异常包含描述 Das System kann die angegebene Datei nicht finden.(系统找不到请求的文件)。

当队列的创建和打开都在一个进程中完成时,不会引发异常并且通信按照文档中的描述进行。

有人知道什么可能导致异常以及我如何解决它?

编辑:我使用的是 Boost 1.45

【问题讨论】:

这可能是权限问题吗? 是的,它可以。但是从 CreateProcess() 文档中,我了解到新创建的进程获得与“父进程”相同的权限? 确实如此。现在父 proc 是否有权创建 msg 队列?您是否尝试过在父进程中创建并查看它是否在那里工作? 这很有趣。创建和打开 msg 队列在父 proc 中不起作用,但在子 proc 中起作用。这有意义吗? 问题似乎在ticket 中描述。不幸的是,目前似乎没有解决方案。 【参考方案1】:

该异常是由 Boost Interpocessing 库中的问题引起的,如this ticket 中所述。该错误已重新打开,我并不完全清楚 Boost 代码是如何更改的,以及如何为 Boost 1.45 应用变通方法。 但是,升级到 Boost 1.51 后,我现在可以按预期使用消息队列了。

【讨论】:

以上是关于如何为 Windows 使用 Boost 进程间消息队列?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 boost::serialization 指定一个 nvp 包装器?

如何为 python C++ 嵌入构建 boost 示例

删除重复项:如何为 boost::geometry::box 编写排序谓词?

如何为 Windows 中的进程分配超过 2GB 的内存?

如何为 RVDS 3.0 的 Code Warrior IDE (v5.7) 构建 Boost 库?

如何为 android 构建 boost::locale