【问题标题】:Is there a Perl function like 'system' that doesn't wait for a returned value? [duplicate]有没有像“system”这样不等待返回值的 Perl 函数? [复制]
【发布时间】:2011-12-03 13:45:54
【问题描述】:

可能重复:
How can I run Perl system commands in the background?

我有一个简单的 Perl 程序,它根据 if 语句的结果触发另一个进程。但是,在触发过程完成之前,我无法继续发送命令。我认为这是因为“系统”函数在继续之前等待进程的返回值。

while (bla bla bla) {
  if (command is bla) { 
    system("osascript 'something.app'");
  } else { 
    print $client "invalid command\r\n";
  } 
} continue {
  …etc

简而言之,我的脚本在从 something.app 收到反馈之前不会继续。有什么办法吗?

【问题讨论】:

标签: perl if-statement while-loop system


【解决方案1】:

fork 中的 exec 将在不阻塞执行的情况下工作:

if (command is bla) { 
    exec "osascript 'something.app'" if fork;
} else { 
    print $client "invalid command\r\n";
}

【讨论】:

  • 当子进程使用此方法退出时,您需要一些东西来获取子进程。 SIGCHLD 处理程序可以完美运行。
  • 我希望,主脚本将很快结束执行。否则,当执行 oascript 将结束时,它会将其状态更改为“僵尸”,并将向您的脚本发送 SIGCHLD 信号。您可以为这种情况制作非常简单的处理程序。但是当主脚本首先结束时,子命令将被移入养父母,这是初始化过程。此进程将自动处理已结束进程的“等待”命令。你可以在这里找到一些代码:perldoc.perl.org/perlipc.html
【解决方案2】:

在 Unix/Linux 上,您可以“放大”

system( "osascript 'something.app' & " );

添加 '&' 告诉 shell 在后台运行进程。我不记得“孙子”进程是否被重新设置为父进程,因此您可能需要一个 SIGCHLD 处理程序来在子进程退出时获取它们。

我认为有一种方法可以在 Windows 上做同样的事情,但我现在不记得了。也许是“开始 /b”。

http://perldoc.perl.org/functions/system.html http://perldoc.perl.org/perlipc.html#Signals

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 2016-10-16
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多