为了我自己的学习目的,我正在尝试掌握 fork() 和 exec() 的概念。我正在尝试使用 perl fork 作为第二个相同的进程,然后使用它来执行 .sh 脚本。
如果我使用 fork() 和 exec() 可以让 .sh 脚本与我的 perl 脚本并行运行吗?Perl 脚本不会等待子进程并继续执行。所以我的 perl 脚本不关心子进程的输出,而只关心命令是否有效并且正在运行。有点像调用脚本在后台运行。
我可以实施某种安全措施来知道子进程也正确退出了吗?
为了我自己的学习目的,我正在尝试掌握 fork() 和 exec() 的概念。我正在尝试使用 perl fork 作为第二个相同的进程,然后使用它来执行 .sh 脚本。
如果我使用 fork() 和 exec() 可以让 .sh 脚本与我的 perl 脚本并行运行吗?Perl 脚本不会等待子进程并继续执行。所以我的 perl 脚本不关心子进程的输出,而只关心命令是否有效并且正在运行。有点像调用脚本在后台运行。
我可以实施某种安全措施来知道子进程也正确退出了吗?
如果我使用 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 不等待孩子:
use POSIX qw/ WNOHANG /;
my $st = waitpid $pid, WNOHANG;
如果进程仍在运行,则 $st 为 0,如果已收获,则为 pid。