管道导致进程冻结

时间:2015-03-01 04:19:07

标签: c pipe

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

但是,我的实现导致accessed以某种方式冻结。运行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

1 个答案:

答案 0 :(得分:1)

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

但是,他们会将其他进程的输入管道保持打开状态。即使父进程关闭它,每个人也永远不会看到EOF,因为其他子进程可能决定向其发送数据。

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