3

我有两个脚本 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 不再等待子进程。

我的问题是,1.这是正确的方法吗?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";
}
4

2 回答 2

1

而不是在 script_a 中使用 ``。我们在 script_a 中重定向了 STDOUT 和 STDERR。就像是

脚本_a

system("script_b.pl > /var/tmp/out_file 2>&1");

脚本_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 中的子进程完成。

感谢您的帮助。

于 2012-05-24T13:33:14.280 回答
0

`` perl 中的反引号等待命令完成。因此,如果您不希望父进程等待将sytem(command &)放入后台。

于 2012-05-22T10:19:12.800 回答