使用管道实现异步行为

Accomplishing asynchronous behaviour with pipes

我在管道中遇到了一个有趣的问题。假设我想模拟管道之间的异步行为,这样我就有一个 parent 进程和多个 child 进程。 parent 和 child 进程可以相互对话。但是,我遇到的事情是到目前为止通信是原子的。那就是如果我有一个数据集

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

您可以使用 select 来做到这一点。 Select 将在您的任何管道准备好读取或写入时告诉您。