gpt4 book ai didi

linux - prctl、set_pdeathsig 在 perl 中如何工作?

转载 作者:行者123 更新时间:2023-12-03 09:48:54 25 4
gpt4 key购买 nike

RH7 上的 perl-5.24.0

我希望 fork 进程在确定其父进程死亡时自行终止。我读过我可以使用 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");
}

而 sub_fork.pl 就是...

#!/usr/bin/env perl

use strict;
use Linux::Prctl;

Linux::Prctl::set_pdeathsig(1);

sleep(300);

exit;

(我相信发送“1”tp set_pdeathsig = SIGHUP。但我也试过“9”。结果相同)

当我运行第一个脚本时,我可以在另一个窗口中使用 ps 查看两个过程。当我点击脚本将其杀死时,我可以看到该进程消失了,但第二个进程( fork 进程)仍然存在。

我做错了什么?

最佳答案

你有三个进程,而不是两个,因为system fork 。它们是:

  1. 父脚本 ( $pid != 0 ) 中等待 <> 的父进程并调用 exit .
  2. 子进程,由 fork 创建在父脚本中调用 system . system叉然后wait让它的 child 在返回之前退出。
  3. 子进程 system 创建 执行您的子脚本,调用 prctl,然后休眠。

当您按下回车键时,进程#1 结束,但进程#2 没有,并且由于进程#2 是进程#3 的父进程,PDEATHSIG永远不会被调用。

改变 systemexec在您的第一个脚本中,不创建第三个进程会导致 PDEATHSIG解决你的玩具问题,但没有更多信息,不清楚这是否适合你正在尝试做的“现实世界”版本。

关于linux - prctl、set_pdeathsig 在 perl 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62368781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com