C++:通过fork进程,是否可以共享指针?

5

我有一个计数变量,应该由我派生的几个进程进行计数,并由母进程使用/读取。

我尝试在母进程的main()函数中创建一个指针,并在派生的子进程中递增该指针。但是这样做不起作用!每个子进程似乎都有自己的副本,即使在每个进程中地址相同。

最好的方法是什么?


1
你可能会发现 Boost.Interprocess 在这里很有用。 http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html - Functastic
7个回答

15
每个子进程都会获得其父进程内存的副本(至少在它尝试修改任何内容时是这样)。如果您需要在进程之间共享数据,您需要查看共享内存或一些类似的IPC机制。
顺便问一下,为什么您要将此设置为社区wiki?这样做可能会限制回复。

好的。谢谢!我预期会有这样的情况。您能告诉我为什么每个进程都获得了相同的地址吗?难道内存不是被复制了吗? - Lennart Koopmann
不可以,因为你看到的是虚拟内存地址,而不是真实的地址。 - anon
好的!再次感谢。 :) 我不知道社区维基不会产生声望。我在FAQ中读到了这一点。抱歉! - Lennart Koopmann

2

两个进程不能共享同一内存。虽然一个分叉出来的子进程在分叉后会共享相同的底层内存,但尝试向其写入会导致操作系统在其他地方分配新的可写空间。

考虑使用另一种形式的IPC


1
我的经验是,如果您想在至少两个进程之间共享信息,几乎从来不会只想分享一些指向内存的void*指针。您可能想看一下:

Boost Interprocess

这可以让您了解如何在进程之间共享结构化数据(阅读“类”和“结构体”)。

0
不要使用文件描述符进行进程间通信或线程间通信,而是使用IPC或线程。虽然文件描述符可以共享,但它们的 seek 指针并不会被共享。

0
你可能想要查看共享内存。

0

指针始终位于同一进程中。 它相对于进程的基地址是私有的。 在任何操作系统中都有不同类型的IPC机制可用。您可以选择Windows消息传递、共享内存、套接字、管道等。根据您的要求和数据大小选择其中一种。另一种机制是使用可用的虚拟内存API将数据写入目标进程,并使用相应的指针通知该进程。


0

一种简单但有限的进程间通信(IPC)选项,适用于共享计数的是“共享数据段”。在Windows上,可以使用#pragma data_seg指令来实现。

请参阅此文章以获取示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接