加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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事件来自您的子进程退出.这些正是您感兴趣的事件以及您需要处理以防止僵尸的事件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读