fork + exec + caller不应该等待孩子

时间:2012-05-22 08:04:53

标签: perl exec fork

我有两个脚本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";
}

2 个答案:

答案 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)

perl中的

``backticks 等待命令完成。因此,如果您不希望父进程在后台输入 sytem(command&)