【发布时间】:2013-09-17 09:20:24
【问题描述】:
我正在尝试使用 AnyEvent 和 EV 实现一些代码。 我想安装一个儿童观察者(我想在下面做的样机)
use Modern::Perl;
use AnyEvent;
use EV;
my $SIG{QUIT} = \&kill_child;
my $exit_status = undef;
my $pid = fork or exec 'child.pl';
my $w = AnyEvent->child(pid => $pid, cb => sub { $exit_status = $_[2]; cleanup_after_child(); });
my $t = AE::timer 0, 5, sub { say $exit_status; fork_another_process(); };
AnyEvent->condvar->recv;
sub kill_child{
foreach my $signal (qw(HUP QUIT INT KILL)){
if(child_alive()){
kill($signal,$pid);
sleep 1;
}
}
exit; #Probably wrong
}
我需要一些帮助来编写 child_alive() 以及找出各种回调的时间以及在 kill_child() 中放置一个出口。我需要确保在进程退出之前调用 cleanup_after_child()。
使用 AnyEvent 信号观察器会有帮助吗?我的目标是能够安全地关闭守护进程,首先杀死进程子进程并在它们之后进行清理。我之前曾问过一个相关问题 (Waiting on a child process in perl),并希望防止在退出处理期间发生该错误。
谢谢
编辑:以下内容是否适用于 child_alive() 函数?
sub child_alive{
return defined($exit_status)?1:0;
}
换句话说,一旦孩子退出,回调是否已经被调用,或者回调只会在 EventLoop 的下一次迭代中执行?如果是这样,只有在处理完所有信号后我才能退出?我是否只是删除所有事件,例如:
$w = undef;
$t = undef;
抱歉,我更想弄清楚 AnyEvent 将如何处理这些信号,而不是信号的一般工作方式。
【问题讨论】:
标签: perl events unix posix anyevent