使用管道

时间:2016-03-20 22:38:43

标签: c linux unix pipe posix

在配管过程中我遇到了一个有趣的问题。假设我想模拟管道之间的异步行为,这样我就有一个父进程和多个子进程。父进程和子进程可以相互通信。然而,我遇到的是迄今为止通信是原子的。那就是我有一个数据集

  • 1。首先创建所有孩子
  • 2。通过循环向子项发送数据集的CHUNK_SIZE数据
  • 3。孩子会做一些计算或什么都不做,并将其数据传回父母
  • 4。家长从其子女那里收到数据

然而,问题是我的通信是原子的,我必须发送我的所有数据,然后阅读它。发送很好,因为孩子几乎是瞬间读取它,因此不需要担心管道填满。但是,所有的孩子都会完成他们的工作并返回他们的数据,但是在完成所有数据的发送之前,父母不会读取这些数据。也就是说,在父级甚至达到步骤 4 之前,管道可以在步骤 3 期间填充其中一个孩子。避免这种情况的一种方法是在我们再次发送另一个数据集之前发送数据然后接收,但这在某种程度上破坏了整个点。另一种方法是再次fork()并让另一个孩子处理这个问题。但这只是将问题转移到其他地方。我认为这是我设计的问题,但似乎不可能,因为我在一个进程中的代码必须同时在两个地方! (这是给孩子们的readingwriting数据)。在这种方法中,仅使用管道设计“真正的”异步行为是否有最佳实践或后见之明?

1 个答案:

答案 0 :(得分:2)

您可以使用select执行此操作。选择将告诉您何时准备好读取或写入任何管道。