我有两个脚本script_a和script_b。 script_a调用script_b。 script_b分叉两个进程。如下图所示。
script_a等待script_b的父级和子级完成。 我希望script_a能够继续而无需等待script_b的子进程。
我为此做的是在script_b中,我添加了以下代码。
if (! $f_id) {
close STDOUT;
close STDERR;
exec("sleep 10; echo 'i am child'");
}
这对我有用。 script_a不再等待子进程。
我的问题是, 这是正确的方法吗? 2.父母和孩子的过程是否共享相同的STDOUT和STDERR,如果有竞争条件,我最终会遇到麻烦吗? 3.有更好的方法吗?
提前感谢您的帮助。
script_a.pl
#! /usr/local/bin/perl
print `script_b.pl`;
script_b.pl
#! /usr/local/bin/perl
$f_id = fork();
if (! $f_id) {
exec("sleep 10; echo 'i am child'");
}
if ($f_id) {
print "i am parent\n";
}
答案 0 :(得分:1)
而不是在script_a中使用``。我们在script_a中重定向了STDOUT和STDERR。 像
这样的东西script_a
system("script_b.pl > /var/tmp/out_file 2>&1");
script_b
#! /usr/local/bin/perl
$f_id = fork();
if (! $f_id) {
exec("sleep 10; echo 'i am child'");
}
if ($f_id) {
print "i am parent\n";
}
这样调用者不会等待exec中的孩子完成。
感谢您的帮助。
答案 1 :(得分:0)
``backticks 等待命令完成。因此,如果您不希望父进程在后台输入 sytem(command&)。