Perl的fork()和exec()函数

4

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

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

我可以实现某种安全性来确保子进程正确退出吗?


请参阅waitwaitpid - mob
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} = $?;
    }
};

但是如果我使用waitpid(),那么Perl脚本不会停止并等待子进程吗? - user1539348
1
是的,waitpid()会暂停程序执行。然而,在子进程退出时,Unix信号SIGCHLD会被传递给父进程,因此您可以安装一个信号处理程序($SIG{ CHLD } = sub { ... }),然后在其中使用wait() / waitpid()。perlipc中有一个示例。 - rohanpm
谢谢@rohanpm,我编辑了我的答案以展示如何做到这一点。 - François Févotte

3

要让waitpid不等待子进程:

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

$st的值为0表示该进程仍在运行,若已结束则为其pid。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接