这是问题所在:我有一个守护进程,它从客户端获取请求,根据请求执行一个函数(来自某个模块)并向客户端返回一个答案。在 fork() 之后,我关闭了 STDIN、STDOUT 和 STDERR。一个功能是检查 dmesg。为此,我通过 open(DMESG, "/bin/dmesg |") 获得 dmesg 输出。读完后我没有关闭这个 fh,因为我认为它会在函数完成后自动关闭。但这并没有发生,每次调用 dmesg 我都会得到一个僵尸。
关于如何重新初始化 Perl 的 STDIN/STDOUT/STDERR?我发现“关闭 STDOUT 而不是重新打开的问题在于,如果您打开其他文件,它们可能会得到 fd 0,1 或 2 - 阻止您将来重新打开 STDOUT。” by jmanning2k 我认为这与它有关,但我真的不明白。我希望有人能给我解释一下。
我知道我可以避免这个问题,例如通过 qx(); 调用 dmesg; 或者只是关闭 fh 但我想了解僵尸来自哪里。