【问题标题】:Should I worry about a pipe getting overflown?我应该担心管道溢出吗?
【发布时间】:2012-02-19 09:48:21
【问题描述】:

有两个进程(父进程和子进程)通过管道进行通信。父级正在等待其子级退出,然后从管道的读取端读取数据。孩子可能会产生相当多的输出。管道是否有可能因为其中的未读数据过多而失败并丢失一些孩子的输出?

【问题讨论】:

  • 这是你这样做的原因吗?如果进程一次只在一个方向上通信,似乎没有必要使用管道。为什么不让父级生成一个随机文件名并让子级写入该文件?

标签: linux unix ipc pipe


【解决方案1】:

无需担心:在标准 2.6 或 3.0 内核上,管道缓冲区为 64k - 因此,如果缓冲区已满,第一个进程将在写入时阻塞。

另一方面,如果这太少,请在两个工人之间使用buffer,它具有可配置的内存大小

【讨论】:

  • 等一下,这正是我确实必须担心的,因为如果缓冲区已满,第二个进程永远不会退出,而第一个进程永远不会从缓冲区读取任何内容,直到第二个退出。这是一个僵局!
  • 尽管如果管道已满,写入过程确实会阻塞,但 Linux 的版本和管道缓冲区的大小都不会影响这种行为。
  • @DanD。我不同意:在 2.4 内核中,有类似“可扩展管道”(我忘了确切名称)之类的东西,可以 ioctl'd 到其他缓冲区大小。
  • @EugenRieck 如果它试图写入一个完整的管道,它不会影响进程的阻塞,它只是为进程提供了一种方法来使管道缓冲区更大或更小。
  • 您也可以在管道 fd 上设置 O_NONBLOCK 并且当 PIPEBUF 被命中时,孩子的写入将失败而不是阻塞
【解决方案2】:

是的,如果管道填满子进程块并且您遇到死锁。

这也是在 python 中遇到的问题,请参阅 [1] 中的 Popen.wait() 警告,第 17.1.2 节;他们使用了通信方法来避免这个问题。

[1]http://docs.python.org/library/subprocess.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多