4

为了我自己的学习目的,我正在尝试掌握 fork() 和 exec() 的概念。我正在尝试使用 perl fork 作为第二个相同的进程,然后使用它来执行 .sh 脚本。

如果我使用 fork() 和 exec() 可以让 .sh 脚本与我的 perl 脚本并行运行吗?Perl 脚本不会等待子进程并继续执行。所以我的 perl 脚本不关心子进程的输出,而只关心命令是否有效并且正在运行。有点像调用脚本在后台运行。

我可以实施某种安全措施来知道子进程也正确退出了吗?

4

2 回答 2

5

如果我使用 fork() 和 exec() 可以让 .sh 脚本与我的 perl 脚本并行运行吗?[...] 有点像调用脚本在后台运行。

是的。Fork & exec 实际上是 shell 在后台运行命令的方式。

我可以实施某种安全措施来知道子进程也正确退出了吗?

是的,使用waitpid()并查看存储在$?

就像@rohanpm 提到的那样,perlipc手册页有很多有用的例子来展示如何做到这一点。这是最相关的之一,其中设置了信号处理程序SIGCHLD(当孩子终止时将发送给父母)

use POSIX ":sys_wait_h";
$SIG{CHLD} = sub {
    while ((my $child = waitpid(-1, WNOHANG)) > 0) {
        $Kid_Status{$child} = $?;
    }
};
于 2012-09-25T22:00:01.997 回答
3

要让 waitpid 不等待孩子:

use POSIX qw/ WNOHANG /;
my $st = waitpid $pid, WNOHANG;

如果进程仍在运行,则 $st 为 0,如果已收获,则为 pid。

于 2012-09-26T22:12:59.340 回答