gpt4 book ai didi

perl - 在不将 $SIG{CHLD} 设置为 IGNORE 或自定义信号处理程序的情况下获取子节点

转载 作者:行者123 更新时间:2023-12-04 09:43:27 25 4
gpt4 key购买 nike

我正在尝试编写一个为每个连接 fork 的套接字服务器。除了一个小警告外,我已经成功了:我的子进程使用 Net:OpenSSH->capture2() ,它要求 $SIG{CHLD} 不设置为 IGNORE 或自定义信号处理程序。如何在不设置信号处理程序或使用 wait 或 waitpid 减慢父进程速度的情况下收割我的 child ?

这是我的服务器代码:

my $sock = new IO::Socket::INET (
LocalHost => 'localhost',
LocalPort => '1337',
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1,
);
die "Could not create socket: $!\n" unless $sock;

my $new_client, $pid;

while($new_client = $sock->accept()){

next if $pid = fork;
die "fork: $!" unless defined $pid;

close $sock;

while(<$new_client> ) {
#do Net::OpenSSH stuff
}

exit;

} continue {
close $new_client;
}

如果我使用如上所示的代码,一切正常,但我最终会得到一堆僵尸进程。如果我添加
local $SIG{CHLD} = 'IGNORE';

僵尸被收割了,但是 Net::OpenSSH->capture2() 方法调用有一个困惑的返回码。我假设我的信号处理程序正在干扰 Net::OpenSSH 需要正常工作的一些自定义处理程序?

最佳答案

继续在父进程中设置一个 SIGCHLD 处理程序,但在子进程中禁用它——例如放置一个 local $SIG{CHLD}紧接在 fork 之后称呼。

在子进程中,SIGCHLD 事件来自 Net::OpenSSH方法和 Net::OpenSSH模块将处理这些事件。

在父进程中,SIGCHLD 事件来自您的子进程退出。这些正是您感兴趣的事件以及您需要处理以防止僵尸的事件。

关于perl - 在不将 $SIG{CHLD} 设置为 IGNORE 或自定义信号处理程序的情况下获取子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3464524/

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