c - 使用管道实现异步行为

标签 c linux unix pipe posix

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

  • 1。首先创建所有的 child
  • 2。通过循环将数据集的 CHUNK_SIZE 数据发送给 child
  • 3。 child 做一些计算或什么都不做,然后将其数据传回给 parent
  • 4。父级从其子级接收数据

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

最佳答案

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

关于c - 使用管道实现异步行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120516/

相关文章:

c - 用C语言访问一个URL

c - 编译器如何识别要读取或更新哪个静态变量?

c# - Objective C 前端 - Java/C# 后端

linux - Bash 命令(netstat 等)显示数据包传输概览?

c++ - 意外的 undefined reference

python - Linux 将相同的 .py 文件识别为不同的

linux - 如何在 Linux/Unix 上永久设置 $PATH

linux - 如何正确观看 psql 命令?

c++ - int的C赋值

c++ - gethostname() 给出退出状态 -1 我该如何处理?