Linux prctl,set_pdeathsig在perl中是如何工作的?
RH7上的perl-5.24.0 我希望分叉进程在确定其父进程死亡时自行终止。我已经读到,我可以使用Linux::Prctl,set_pdeathsig()来实现这一点。但我的测试似乎不起作用Linux prctl,set_pdeathsig在perl中是如何工作的?,linux,perl,Linux,Perl,RH7上的perl-5.24.0 我希望分叉进程在确定其父进程死亡时自行终止。我已经读到,我可以使用Linux::Prctl,set_pdeathsig()来实现这一点。但我的测试似乎不起作用 #!/usr/bin/env perl use strict; my $pid = fork(); die if not defined $pid; if($pid == 0) { do_forked_steps(); } print "====PARENT===\n"; print
#!/usr/bin/env perl
use strict;
my $pid = fork();
die if not defined $pid;
if($pid == 0) {
do_forked_steps();
}
print "====PARENT===\n";
print "Hit <CR> to kill parent.\n";
my $nocare = <>;
exit;
sub do_forked_steps {
system("/home/dgauthie/PERL/sub_fork.pl");
}
(我相信发送“1”tp set\u pdeathsig=SIGHUP。但我也尝试了“9”。结果相同)
当我运行第一个脚本时,我可以在另一个窗口中看到使用ps的两个进程。当我点击脚本杀死它时,我可以看到proc消失了,但是第二个,forked进程,仍然存在
我做错了什么 您有三个进程,而不是两个,因为system
fork。它们是:
$pid!=0
),它等待
并调用退出
fork
创建,它调用system
<代码>系统分叉,然后等待其子项退出,然后返回
system
创建的子进程,它执行子脚本、调用prctl并休眠PDEATHSIG
在第一个脚本中将
system
更改为exec
,这样就不会创建第三个进程,这会导致PDEATHSIG
引发您的玩具问题,但如果没有更多信息,就不清楚这是否适用于“真实世界”您尝试执行的操作版本。让我们来看看。谢谢您的回答:-)但是,如果父母去世,proc#2在做什么,甚至是系统(),又有什么关系呢?我认为proc#2会得到中断,然后死掉(将proc#3带到它下面)。顺便说一句,它与您建议的“exec”一起工作。我只是不明白为什么system()会失败。再次感谢@达维格:什么也没发生在#2。。。它不是一个要求在父母去世时得到通知的人,第三个是。但是第二个有。。。“Linux::Prctl::set_pdeathsig(1);”。为什么不要求通知?@daveg那不是2,那是3。
#!/usr/bin/env perl
use strict;
use Linux::Prctl;
Linux::Prctl::set_pdeathsig(1);
sleep(300);
exit;