管道导致进程冻结
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,即使在父进程关闭它之后也是如此,因为另一个子进程可能决定向它发送数据。
子进程应该关闭彼此的管道(或者在不继承其他进程的管道的情况下启动)。
程序 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,即使在父进程关闭它之后也是如此,因为另一个子进程可能决定向它发送数据。
子进程应该关闭彼此的管道(或者在不继承其他进程的管道的情况下启动)。