加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 有没有办法防止特定的孩子触发SIGCHLD?

发布时间:2020-12-15 21:44:19 所属栏目:大数据 来源:网络整理
导读:我正在写一个 debugging utility,我想分叉一个孩子,同时阻止孩子终止触发SIGCHLD到它的父母.我仍然希望其他孩子在终止时通常会导致SIGCHLD. 我想这样做是因为我不希望fork触发现有的$SIG {CHLD}处理程序,但我仍然希望其他孩子触发它.也就是说,我想隔离我的新
我正在写一个 debugging utility,我想分叉一个孩子,同时阻止孩子终止触发SIGCHLD到它的父母.我仍然希望其他孩子在终止时通常会导致SIGCHLD.

我想这样做是因为我不希望fork触发现有的$SIG {CHLD}处理程序,但我仍然希望其他孩子触发它.也就是说,我想隔离我的新生儿,我不希望它干扰现有儿童的管理.

我担心本地安装自定义$SIG {CHLD}处理程序,因为我认为我不能正确检测何时应该调用原始处理程序.例如,如果我安装了一个本地$SIG {CHLD}处理程序,那么一旦我生成一个子进程并让父waitpid终止它,我保证会收到一个SIGCHLD信号.但是,SIGCHLD不会指示其他孩子是否也已终止,因此我无法确定是否要调用原始处理程序.

我研究过一个进程不能改变它的父pid.我不确定更改子进程组ID或会话ID是否有用.

是否有可能阻止特定的孩子触发父母的SIGCHLD?当我收到一个它没想到的孩子的SIGCHLD信号时,我是否被迫依靠现有的$SIG {CHLD}处理程序做正确的事情?

虽然可能有更好的方法来实现调试实用程序(让我知道是否有),我仍然想知道POSIX是否提供了对孩子的这种细粒度控制,并且我正在寻找Perl解决方案来解决我的困境.

解决方法

您无法完全阻止SIGCHLD,但如果信号处理程序写得正确,您可以阻止waitpid通过孤立它来返回调试工具的pid.
use Signal::Mask;
sub start_background_child {
  local $Signal::Mask{CHLD} = 1;
  my $first = fork;
  croak "fork failed: $!" if not defined $first;
  if ($first) {
    waitpid $first,0;
    return;
  }

  my $second = fork;
  croak "fork failed: $!" if not defined $second;
  exit if $second;

  your_stuff_here();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读