小编Mic*_*ael的帖子

无需将$ 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用上面显示的代码,一切正常,但我最终得到了一堆僵尸进程.如果我加

local $SIG{CHLD} = 'IGNORE';
Run Code Online (Sandbox Code Playgroud)

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

perl parent-child signal-handling

7
推荐指数
2
解决办法
4234
查看次数

标签 统计

parent-child ×1

perl ×1

signal-handling ×1