如果我通过perl程序运行外部进程,perl程序将仍然是进程的父进程。简化流程管理。
system('sleep 3000'); # perl is still the parent
但是,如果我尝试在后台运行该过程,以便程序不必等待进程退出...
system('sleep 3000 &');
sleep
进程将被系统init
进程采用,并且不再与执行它的程序相关联。
在这种情况下处理流程管理的正确方法是什么。我如何模拟在后台运行流程但保持流程祖先?
答案 0 :(得分:2)
您可以使用threads
,
use threads;
my $t = async { system('sleep 3000'); };
# do something in parallel ..
# wait for thread to finish
$t->join;
或fork
sub fasync(&) {
my ($worker) = @_;
my $pid = fork() // die "can't fork!";
if (!$pid) { $worker->(); exit(0); }
return sub {
my ($flags) = @_;
return waitpid($pid, $flags // 0);
}
}
my $t = fasync { system('sleep 3000'); };
# do something in parallel ..
# wait for fork to finish
$t->();
答案 1 :(得分:0)
fork / exec和wait()。
Fork通过创建父进程的副本来创建子进程,父进程接收子进程的id,并对子进程id调用wait()。
同时,子进程使用exec()来覆盖自己(父进程的副本)和你想要执行的进程。
如果您需要多个并发后台作业,我建议Parallel::ForkManager。