【问题标题】:C++: Is it possible to share a pointer through forked processes?C++:是否可以通过分叉进程共享指针?
【发布时间】:2009-03-16 14:57:16
【问题描述】:

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

我试图在母进程的 main() 函数中创建一个指针,并在分叉的子进程中计算该指针。那是行不通的!每个孩子似乎都有自己的副本,即使每个进程的地址都相同。

最好的方法是什么?

【问题讨论】:

标签: c++ pointers fork


【解决方案1】:

每个子进程都有自己的父进程内存副本(至少在它尝试修改任何内容时)。如果您需要在进程之间共享,您需要查看共享内存或一些类似的 IPC 机制。

顺便说一句,你为什么要把它变成一个社区 wiki - 你这样做可能会限制响应。

【讨论】:

  • 好的。谢谢!我期待这样的事情。你能告诉我为什么我在每个过程中都得到相同的地址吗?这不应该因为内存被复制而有所不同吗?
  • 不,因为您看到的是虚拟内存地址,而不是真实的。
  • 好的!再次感谢你。 :) 我不知道社区 wiki 不会产生声誉。只需在常见问题解答中阅读即可。对不起!
【解决方案2】:

2 个进程不能共享相同的内存。确实,分叉的子进程在分叉后将共享相同的底层内存,但尝试写入该内存会导致操作系统在其他地方为其分配新的可写空间。

查看IPC 的另一种形式来使用。

【讨论】:

    【解决方案3】:

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

    Boost Interprocess

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

    【讨论】:

      【解决方案4】:

      不,使用 IPC 或线程。仅共享文件描述符(但不共享查找指针)。

      【讨论】:

        【解决方案5】:

        您可能想查看共享内存。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            一个简单但有限的 IPC 形式可以很好地用于共享计数,即“共享数据段”。在 Windows 上,这是使用 #pragma data_seg 指令实现的。

            请参阅此article 以获取示例。

            【讨论】:

              猜你喜欢
              • 2013-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-09
              • 1970-01-01
              • 1970-01-01
              • 2014-06-20
              • 2010-12-11
              相关资源
              最近更新 更多