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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Delphi MlSkin V2.1 (2015.03.08)发布啦! 它能让你的程序拥
- Thinkphp-volist/foreach(在页面循环输出显示数组数据)
- perl – 是否有CPAN模块列出美国邮政编码和州?
- PHP编程:laravel安装zend opcache加速器教程
- POJ 2506 Tiling(大数递推&&(数组模拟||JAVA))
- Inno Setup 自定义命令行参数
- python的Web框架,Django的ORM,模型基础,MySQL连接配置及
- 年度回忆录(?——2011.01)
- [VB.NET]怎样才能在自己的程序自动运行后获得系统中被点击文
- 用Delphi编写U盘整盘数据清除程序