【问题标题】:How do I make a system call and resume execution without waiting for the call to return?如何在不等待调用返回的情况下进行系统调用并恢复执行?
【发布时间】:2014-03-20 04:29:59
【问题描述】:

基本上我想使用system()、exec()、反引号或其他东西来进行系统调用,然后立即在调用脚本中恢复执行,而不关心调用的结果以及是否调用返回,死亡,停止,等等。

是否可以在不使用线程/分叉的情况下做到这一点?

【问题讨论】:

标签: perl system-calls


【解决方案1】:

简短的回答,不。这是fork() 的整个。唯一的问题是你是直接打电话给fork(),还是找别的东西来帮你。

如前所述,您可以使用 shell 的后台操作符 (&) 来执行此操作,但随后您使用的是 shell,这会带来通常的字符串注入攻击问题

system("some command with args &");

更直接地说,您可以只执行通常的fork()exec(),然后不执行通常发生的waitpid(),这就是发生阻塞的地方:

if(fork() == 0) {
  exec("some", "command", "with", "args") or die "Cannot exec - $!";
}
# No waitpid here so no waiting

如果你这样做,最好也放一个SIGCHLD 处理程序,以便在孩子最终退出时忽略,以免让僵尸闲逛。在代码开头附近的某个位置,放置

$SIG{CHLD} = 'IGNORE';

【讨论】:

    【解决方案2】:

    使用shell的后台操作符&:

    system("some command &");
    

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 2023-03-31
      • 2021-12-24
      • 2019-02-01
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2014-03-03
      • 2016-09-13
      相关资源
      最近更新 更多