gpt4 book ai didi

Perl:通过 open() 没有 close() 创建僵尸

转载 作者:行者123 更新时间:2023-12-01 07:21:56 24 4
gpt4 key购买 nike

这是问题所在:
我有一个守护进程,它从客户端获取请求,根据请求执行一个函数(来自某个模块)并向客户端返回一个答案。
在 fork() 之后,我关闭了 STDIN、STDOUT 和 STDERR。
一个功能是检查 dmesg。为此,我通过 dmesg 输出
打开(DMESG,“/bin/dmesg |”)。读完后我没有关闭这个 fh,因为我认为它会在函数完成后自动关闭。
但这并没有发生,每次调用 dmesg 我都会得到一个僵尸。

How can I reinitialize Perl's STDIN/STDOUT/STDERR?我发现“关闭 STDOUT 而不是重新打开的问题在于,如果您打开其他文件,它们可能会得到 fd 0,1 或 2 - 阻止您将来重新打开 STDOUT。”通过 jmanning2k
我认为这与它有关,但我真的不明白。我希望有人能给我解释一下。

我知道我可以避免这个问题,例如通过 qx() 调用 dmesg;或者只是关闭 fh 但我想了解僵尸来自哪里。

最佳答案

表格

open DMESG, "/bin/dmesg|";

打开管道并将其分配给 动态范围 变量 DMESG .动态范围的变量实际上在 Perl 中“永远”存在,只要 local可见。

如果您改为使用表格
open my $dmesg, "/bin/dmesg|";

词汇 文件句柄变量 $dmesg将在范围退出时关闭,假设没有其他理由让它保持事件状态(即它没有被传回或以其他方式存储在全局变量中)。

关于Perl:通过 open() 没有 close() 创建僵尸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4451340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com