管道导致进程冻结

pipe causing processes to freeze

程序 report 启动两个 accessed 进程。报告基本上会向 accessed 提供文件名列表,如果它们在 x 天内被访问过,则 accessed 会打印出来。

但是,我的实施导致 accessed 以某种方式冻结。在 运行ning reports 之后,没有打印任何内容。当我 运行 ps 时,我可以看到两个 accessed 程序在附近徘徊,没有死。

起初,我认为 accessed 中从 stdin 读取的方法是错误的,但我手动将一些文件名传递给它 cat filenames.txt | ./accessed,并且它有效。所以report程序一定是错误的。

我将 gdb 附加到冻结的 accessed 进程,它似乎在 while 循环 getline 处被冻结。所以我将 while 循环更改为单个 getline 语句,它突然起作用了。但是,我需要阅读 stdin 直到 EOF。非常感谢对可能的错误来源的任何帮助。这让我很头疼。

示意图:

--------
|      |--------> Access1  ---> print stuff out
|report|
|______|--------> Access2 ----> print stuff out

每个进程关闭自己的输入管道(在读取端 dup2 之后)。

但是,他们让其他进程的输入管道保持打开状态。每个人都不会看到 EOF,即使在父进程关闭它之后也是如此,因为另一个子进程可能决定向它发送数据。

子进程应该关闭彼此的管道(或者在不继承其他进程的管道的情况下启动)。