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

时间:2010-07-13 02:09:05

标签: c++ ipc

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

由于

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

简单回答:可以通过两个进程共享std::queue,但这样做并不容易。

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

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

答案 2 :(得分:1)

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

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

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