Perl 的 `system` 怎么能不等待完成而继续。

Posted

技术标签:

【中文标题】Perl 的 `system` 怎么能不等待完成而继续。【英文标题】:How can Perl's `system` proceed without wait for the completion. 【发布时间】:2014-05-25 05:20:17 【问题描述】:

在 Perl 中,command 将等待“命令”完成。有没有办法让command 只等待 20 秒?一种情况如下:

command 是一个无限循环,不会结束。 command 将冻结,程序无法继续。我想让程序不被command阻止。

我知道 Ruby 有办法做到这一点。 Perl 有解决方案吗?

谢谢,

=是的

【问题讨论】:

【参考方案1】:

使用alarm:

eval 
    local $SIGALRM = sub  die "alarm\n" ; # NB: \n required
    alarm 20;
    system("<Your command>")
    alarm 0;
;
if ($@) 
    die unless $@ eq "alarm\n";   # propagate unexpected errors
    # timed out

else 
    # didn't

【讨论】:

【参考方案2】:
#!/usr/bin/perl -w
use strict;
use 5.010;

my $foo = 123;
my $pidChild = fork(); # All objects before this fork statement will be copied.
given ($pidChild)

    when (!defined($_)) 
        die "Cannot fork: $!";
    
    when ($_ == 0) 
        # The child process goes here.
        $foo = 456; # This is a duplicate.
        system 'subprocess options'; # Or: exec 'suprocess options';
    
    default 
        # The original process goes here.
        waitpid($_, 0); # Whether to wait or not is up to you.
        say $foo; # Output: 123
    

如果需要进程间通信 (IPC),在调用 fork 之前,可以使用内置函数 pipe 创建 2 个处理程序,一个用于输入,另一个用于输出,它们将是由原进程和子进程共享。

进行 IPC 的方法肯定不止一种。内置函数open、模块IPC::Open2提供的子程序open2和IPC::Open3提供的open3都可以异步运行子进程。

【讨论】:

以上是关于Perl 的 `system` 怎么能不等待完成而继续。的主要内容,如果未能解决你的问题,请参考以下文章

在 perl 中关闭多个输出管道而不阻塞每个输出管道

从 Perl 调用命令,需要查看输出

Perl 脚本不等待 .bat 文件完成并继续执行

Perl system() 调用使用哪个 shell?

perl脚本统计文件夹下源代码信息

升级Win10后删除Windows.old提示需要SYSTEM权限怎么办?