如何在不等待呼叫返回的情况下进行系统调用并恢复执行?

时间:2014-03-20 04:30:00

标签: perl system-calls

基本上我想使用system(),exec(),back-ticks等来进行系统调用,然后立即在调用脚本中恢复执行,而不关心调用的结果以及是否调用返回,死亡,摊位,等等。

是否可以在没有线程/分叉的情况下执行此操作?

2 个答案:

答案 0 :(得分:4)

简短的回答,没有。这是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';

答案 1 :(得分:0)

使用shell的后台运算符&

system("some command &");