perl – 无需将$SIG {CHLD}设置为IGNORE或自定义信号处理程序即
发布时间:2020-12-15 21:53:09 所属栏目:大数据 来源:网络整理
导读:我正在尝试编写一个为每个连接分叉的套接字服务器.除了一个小警告之外我一直很成功:我的子进程使用Net:OpenSSH- capture2(),这要求$SIG {CHLD}不能设置为IGNORE或自定义信号处理程序.如何在不设置信号处理程序的情况下收获我的孩子,或者使用wait或waitpid
我正在尝试编写一个为每个连接分叉的套接字服务器.除了一个小警告之外我一直很成功:我的子进程使用Net:OpenSSH-> capture2(),这要求$SIG {CHLD}不能设置为IGNORE或自定义信号处理程序.如何在不设置信号处理程序的情况下收获我的孩子,或者使用wait或waitpid减慢父进程的速度?
这是我的服务器代码: 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处理程序,但在子进程中禁用它 – 例如在fork调用之后立即放置本地$SIG {CHLD}.
在子进程中,SIGCHLD事件来自Net :: OpenSSH方法,Net :: OpenSSH模块将处理这些事件. 在父进程中,SIGCHLD事件来自您的子进程退出.这些正是您感兴趣的事件以及您需要处理以防止僵尸的事件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |