在 C++ 中父进程和子进程之间共享队列

Posted

技术标签:

【中文标题】在 C++ 中父进程和子进程之间共享队列【英文标题】:share queue between parent and child process in c++ 【发布时间】:2010-07-13 02:09:05 【问题描述】:

我知道有很多方法可以处理两个进程之间的相互通信,但我仍然有点困惑如何处理它。是否可以有效地在两个进程之间共享队列(来自标准库)?

谢谢

【问题讨论】:

【参考方案1】:

我相信您的困惑来自于不了解父进程和子进程的内存地址空间之间的关系。这两个地址空间实际上是不相关的。是的,在 fork() 之后,两个进程立即包含几乎相同的内存副本,但您应该将它们视为副本。一个进程对其地址空间中的内存进行的任何更改都不会影响另一个进程的内存。

任何“普通的旧数据结构”(例如由 C++ 标准库提供的)都是纯粹的内存抽象,因此无法使用它们在两个进程之间进行通信。要将数据从一个进程发送到另一个进程,您必须使用提供进程间通信的多个系统调用之一。

但是,请注意共享内存是一个例外。您可以使用系统调用来设置一段共享内存,然后在共享内存中创建数据结构。您仍然需要使用互斥锁来保护这些数据结构,但互斥锁必须是共享内存感知的。对于 Posix 线程,您可以将 pthread_mutexattr_init 与 PTHREAD_PROCESS_SHARED 属性一起使用。

【讨论】:

【参考方案2】:

简单的答案:两个进程共享一个std::queue 是可行的,但这并非易事。

您可以使用共享内存与一些同步机制(通常是互斥锁)一起保存队列。请注意,不仅std::queue 对象必须在共享内存区域中构造,而且队列的内容也必须构造,因此您必须提供自己的分配器来管理共享区域中内存的创建。

如果可以,请尝试查看可能为您的流程通信需求提供已打包解决方案的更高级别的库。考虑Boost.Interprocess 或在您最喜欢的搜索引擎中搜索以进行进程间通信。

【讨论】:

【参考方案3】:

我认为没有任何简单的方法可以在两个项目之间共享结构/对象。如果要在两个进程之间实现队列/列表/数组/等,则需要在进程之间实现某种通信来管理队列以及检索和存储条目。

例如,您可以在一个进程中实现队列管理,并实现某种 IPC(共享内存、套接字、管道等)将条目从一个进程传递到另一个进程。

在标准 C++ 库之外可能还有其他方法可以为您执行此操作。例如,可能有一些 Boost 库已经实现了这一点。

【讨论】:

是的,我认为 Boost.Interprocess 是一个很好的工具。

以上是关于在 C++ 中父进程和子进程之间共享队列的主要内容,如果未能解决你的问题,请参考以下文章

什么是子进程和父进程

为啥在调用 c++ fork 函数之前创建的值没有被父进程和子进程修改两次?

swoole父进程和子进程之间通信的例子

swoole父进程和子进程之间通信的例子

如何在父进程和子进程之间发送带有 pipe() 的矩阵?

使用共享内存的 IPC