olo*_*olo 3 perl file-io filehandle zombie-process
问题出在这里:我有一个守护进程,它从客户端获取请求,由于请求而执行一个函数(来自某个模块),并向客户端返回一个答案.在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,但我想了解僵尸的来源.
表格
open DMESG, "/bin/dmesg|";
Run Code Online (Sandbox Code Playgroud)
打开管道并将其分配给动态范围的变量DMESG.动态范围的变量实际上在Perl中"永远"存在,每当local看到它时都会根据需要进行保存.
如果你改为使用表格
open my $dmesg, "/bin/dmesg|";
Run Code Online (Sandbox Code Playgroud)
在词法文件句柄变量$dmesg将在范围退出关闭,假设没有其他原因,以保持它活着(即它不是传递回或以其他方式存储在一个全局变量).
open(DMESG, "/bin/dmesg |")读完之后我没有关闭这个fh,因为我认为它会在函数完成后自动关闭.
为了使其工作,句柄必须是词法,因此它可以正确地落在范围之外.
open my $dmesg, …
Run Code Online (Sandbox Code Playgroud)