Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – Perl:在信号处理程序中关闭子进程管道挂起?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我需要在正在阻止io的脚本上超时. 令人惊讶的是,如果有一个打开管道到子进程,它会退出挂起: #!/usr/bin/perl (-f "foo") || die "file foo doesn't exist";
我需要在正在阻止io的脚本上超时.
令人惊讶的是,如果有一个打开管道到子进程,它会退出挂起:
#!/usr/bin/perl                                                                                             
(-f "foo") || die "file foo doesn't exist";
open(IN,"tail -f foo |");

$SIG{ALRM} = sub
{
    print "trying to exit...\n";
    exit 0;     # Hangs with above open() call
};
alarm 1;

while (1)
{   
    sleep 5;   # Do stuff ...
}

没有打开调用它可行,不幸的是删除它不是一个选项,在这种情况下脚本需要它.

看起来像是试图关闭文件句柄,这就是悬挂:

$SIG{ALRM} = sub
{
    print "trying to close...\n";
    close(IN);            # Hangs ...
    print "ok\n";
    exit 0;
};

我想从信号处理程序中收获孩子并不太高兴…

有没有人知道这方面的好方法

解决方法

信号处理程序是一个红色的鲱鱼,close将阻止,无论如何:
open my $foo,"tail -f foo |" or die "Can't open process: $!";

close $foo;     # <--- will block

解决此问题的一种方法是通过open捕获子进程ID,然后通过kill捕获该子进程:

@H_825_17@my $subprocess = open my $foo,"tail -f foo |" or die "Can't open process: $!"; say "subprocess=$subprocess"; kill 'KILL',$subprocess; close $foo; # <--- happy Now

大佬总结

以上是大佬教程为你收集整理的linux – Perl:在信号处理程序中关闭子进程管道挂起?全部内容,希望文章能够帮你解决linux – Perl:在信号处理程序中关闭子进程管道挂起?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。