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