我可以等待特定的子进程在perl中终止

时间:2016-01-19 23:52:28

标签: linux perl parallel-processing

目前,我正在尝试通过使用proc A创建proc B和proc B创建proc C来创建一个孤立进程。然后,我想杀死proc B,以便proc C不再附加到proc的进程树答:但是,我也想知道proc A中proc C的进程ID。到目前为止,我尝试过:

use FileHandle;
pipe(READ, WRITE);

WRITE->autoflush();
my $pid1 = fork();
if ($pid1) {
  #Proc A
  waitpid($pid1, 0);
  close WRITE;
  my $msg = <READ>;
  print "msg: $msg\n";
} elsif ($pid1 == 0) {
  #Proc B
  my $pid2 = fork();
  if ($pid2) {
    #Proc B
    print WRITE $pid2;
    exit 0;
  } elsif ($pid2 == 0) {
    #Proc C
    print "child 2 proc $$\n";
    sleep(5);
    exit 0;
  }
}

不幸的是,运行它会使proc A等待proc C完成(睡眠5),然后才打印出proc C的id,这不是我想要的。一旦proc B退出,有没有办法让waitpid函数返回?

或者,是否有更好的方法来创建孤儿进程?

编辑:添加了有关读/写管道的信息。

2 个答案:

答案 0 :(得分:0)

当我运行您的脚本时,它不会以您描述的方式运行。这可能与您省略的READ和WRITE句柄的机制有关。

然而我认为 POSIX::setsid()功能可以满足您的需求。它将一个进程放入其自己的进程组,该进程组与父进程的控制TTY断开连接:

use POSIX qw();


# after forking, in the child process that you want to become an orphan
    POSIX::setsid();

答案 1 :(得分:0)

我最终使用下面的内容来实现这一点:

use FileHandle;
pipe(READ, WRITE);

WRITE->autoflush();

my $cmd = "nohup ./test.sh";

my $pid1 = fork();
if ($pid1) {
  #parent
  my $kid;
  $kid = waitpid($pid1, 0);
  close WRITE;
  my $msg = <READ>;
  print "msg: $msg\n";
  sleep(10);
} elsif ($pid1 == 0) {
  #1st child
  my $pid2 = fork();
  if ($pid2) {
    #1st child
    print WRITE $pid2;
    exit 0;
  } elsif ($pid2 == 0) {
    exec $cmd;
    exit 0;
  }
}