首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在后台运行进程,而不被init、Perl采用。

在后台运行进程,而不被init、Perl采用。
EN

Stack Overflow用户
提问于 2014-08-21 15:59:54
回答 2查看 265关注 0票数 1

如果我通过perl程序运行外部进程,perl程序将仍然是进程的父进程。使过程管理变得容易。

代码语言:javascript
复制
system('sleep 3000'); # perl is still the parent

但是,如果我试图在后台运行进程,以便程序不必等待进程退出.

代码语言:javascript
复制
system('sleep 3000 &'); 

sleep进程将被系统init进程采用,并且不再与执行它的程序相关联。

在这种情况下,处理过程管理的正确方法是什么?我如何在后台模拟运行过程,但又能保持进程的祖先性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-21 16:16:53

你可以用threads

代码语言:javascript
复制
use threads;
my $t = async { system('sleep 3000'); };

# do something in parallel ..

# wait for thread to finish 
$t->join;

fork

代码语言:javascript
复制
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->();
票数 2
EN

Stack Overflow用户

发布于 2014-08-21 16:08:52

叉/执行和等待()。

通过创建父进程的副本创建子进程,父进程接收子进程的进程id,并对子进程id调用wait()。

同时,子进程使用exec()将自己(父进程的副本)与希望执行的进程重叠起来。

如果您需要一个以上的并发背景作业,我建议使用并行::ForkManager

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25430849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档