基本上我想使用system(),exec(),back-ticks等来进行系统调用,然后立即在调用脚本中恢复执行,而不关心调用的结果以及是否调用返回,死亡,摊位,等等。
是否可以在没有线程/分叉的情况下执行此操作?
答案 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 &");