如果我通过perl程序运行外部进程,perl程序将仍然是进程的父进程。使过程管理变得容易。
system('sleep 3000'); # perl is still the parent但是,如果我试图在后台运行进程,以便程序不必等待进程退出.
system('sleep 3000 &'); sleep进程将被系统init进程采用,并且不再与执行它的程序相关联。
在这种情况下,处理过程管理的正确方法是什么?我如何在后台模拟运行过程,但又能保持进程的祖先性?
发布于 2014-08-21 16:16:53
你可以用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->();发布于 2014-08-21 16:08:52
叉/执行和等待()。
通过创建父进程的副本创建子进程,父进程接收子进程的进程id,并对子进程id调用wait()。
同时,子进程使用exec()将自己(父进程的副本)与希望执行的进程重叠起来。
如果您需要一个以上的并发背景作业,我建议使用并行::ForkManager。
https://stackoverflow.com/questions/25430849
复制相似问题