【问题标题】:Can I wait for a specific child process to terminate in perl我可以等待特定的子进程在 perl 中终止吗
【发布时间】:2016-01-19 23:52:28
【问题描述】:

目前,我正在尝试通过让 proc A 创建 proc B 和 proc B 创建 proc C 来创建一个孤立进程。然后,我想杀死 proc B 以便 proc C 不再附加到 proc 的进程树A.但是,我也想知道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函数返回?

或者,有没有更好的方法来创建孤立进程?

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

【问题讨论】:

    标签: linux perl parallel-processing


    【解决方案1】:

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

    但是我认为POSIX::setsid() 函数可以满足您的需求。它将一个进程放入自己的进程组中,该进程组与父进程的控制 TTY 断开连接:

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

    【讨论】:

    • 我添加了一些关于读/写管道的信息。另外,我将setsid插入为:POSIX::setsid();打印“子 2 过程 $$\n”;但是好像没有什么效果。
    【解决方案2】:

    我最终使用了类似下面的东西来实现这个:

    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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2013-11-08
      相关资源
      最近更新 更多