Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux prctl,set_pdeathsig在perl中是如何工作的?_Linux_Perl - Fatal编程技术网

Linux prctl,set_pdeathsig在perl中是如何工作的?

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

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 "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并休眠
  • 按enter键时,进程#1将终止,但进程#2不会终止,并且由于进程#2是进程#3的父进程,因此永远不会调用
    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;