perl – 无需将$SIG {CHLD}设置为IGNORE或自定义信号处理程序即可收集子项

前端之家收集整理的这篇文章主要介绍了perl – 无需将$SIG {CHLD}设置为IGNORE或自定义信号处理程序即可收集子项前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个为每个连接分叉的套接字服务器.除了一个小警告之外我一直很成功:我的子进程使用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事件来自您的子进程退出.这些正是您感兴趣的事件以及您需要处理以防止僵尸的事件.

原文链接:https://www.f2er.com/Perl/172031.html

猜你在找的Perl相关文章