gpt4 book ai didi

c - 如何使多个 `fork()` -ed 进程使用共享内存进行通信?

转载 作者:太空狗 更新时间:2023-10-29 15:56:29 26 4
gpt4 key购买 nike

我有一个有 5 个子进程的父进程。我想向每个子进程发送一个随机变量。每个 child 都会对变量进行平方并将其发送回父级,然后父级将它们加在一起。

这可能吗?我想不通...

编辑:这个进程将使用共享内存。

最佳答案

有很多方法可以做到这一点,所有方法都涉及某种形式的进程间通信。您选择哪一个将取决于许多因素,但其中一些是:

  • 共享内存。
  • 管道(popen 等)。
  • 套接字。

一般来说,我可能会在生成子级之前popen 在父级中进行一些通信 session ; parent 会知道所有五个,但每个 child 都可以配置为只使用一个。

共享内存也是一种可能性,尽管您可能必须在其中为每个 child 提供几个值以确保通信顺利进行:

  • 用于存储变量和返回值的值。
  • 一个存储状态的值(0 = 开始,1 = 变量为 child 准备好,2 = 变量再次为 parent 准备好)。

在所有情况下,您都需要一种方法让 children 只接受他们的值(value)观,而不是其他 child 的值(value)观。这可能就像向共享内存块添加一个值以存储子进程的 PID 一样简单。所有 child 都会扫描 block 中的每个元素,但只会处理状态为 1 且 PID 是其 PID 的元素。

例如:

  • Main 为五个 child 创建共享内存。每个元素都有状态、PID 和值。
  • Main 将所有状态设置为“开始”。
  • Main 启动了五个 child ,他们都附加到共享内存。
  • 主要存储他们所有的 PID。
  • 所有 child 开始扫描共享内存中的状态 = "ready for child"和他们的 PID。
  • Main 放入第一个元素(state = "ready for child",PID = pid1,value = 7)。
  • Main 放入第二个元素(state = "ready for child",PID = pid5,value = 9)。
  • 子 pid1 获取第一个元素,将值更改为 49,将状态设置为“为父准备就绪”),返回监控。
  • 子 pid5 拾取第二个元素,将值更改为 81,将状态设置为“为父准备就绪”),返回监控。
  • Main 获取 pid5 的响应,将该状态设置回“开始”。
  • Main 获取 pid1 的响应,将该状态设置回“开始”。

这给出了并行性的衡量标准,每个子进程持续监控共享内存以了解它打算做的工作,Main 将工作放在那里并定期接收结果。

关于c - 如何使多个 `fork()` -ed 进程使用共享内存进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/593722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com