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

标签 linux perl parallel-processing

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

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

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

最佳答案

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

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

use POSIX qw();


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

关于linux - 我可以等待特定的子进程在 perl 中终止吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34889133/

相关文章:

service - 使用 gnu-parallel 无限期地进行 fork 进程,捕获单个退出错误并重生

linux - Linux shell 中的真正并行性

linux - Python 更新 Linux (Raspberry Pi)

linux - 使用 bash 打开和保存更改

linux - Oracle 在没有任何进程的情况下使用内存

Perl并行迭代2个数组的方法

perl - Perl 字符串插值可以执行任何表达式求值吗?

arrays - 如何在散列中插入散列的散列?

c++ - 使用 OpenMP 和减少优化外循环

linux - 包含数据的 udp 数据包的 tcpdump