【问题标题】:Perl process crashes after handling signalPerl 进程在处理信号后崩溃
【发布时间】:2025-12-30 23:55:16
【问题描述】:

我正在尝试重新读取 SIGHUP 上简单 perl 守护程序的配置文件。 我在努力

use sigtrap qw/handler rereadconf HUP/;

但在执行“rereadconf”过程后进程停止 我也在尝试

%SIG{HUP} = \&rereadconf;
sub rereadconf{
.... mycode
print "procedure executed\n";
};

但结果是一样的,执行过程程序停止后。 那么我怎样才能让这个过程在信号处理后继续执行呢?

【问题讨论】:

  • 程序在您退出处理程序后立即恢复。如果它实际上是由信号而不是您在处理程序中执行的操作引起的,那么最好的猜测是:您中断了一个不准备被中断的 C 库调用。它需要更好的错误处理。
  • 它在哪里“停止”?
  • @ikegami 会不会是因为使用了Socket?所以我需要处理错误?
  • 程序不会停止。他们阻止等待某事。你的程序还在等什么?
  • @ikegami 客户端连接时循环等待,如果你想看源码link

标签: perl signals daemon


【解决方案1】:

您的程序退出,因为 accept 返回 false,因为它被信号中断了。你想要的

while (1) {
    my $client = $srv->accept();
    if (!$client) {
        next if $!{EINTR};
        die(sprintf(STDERR "[%s] accept: %s\n", basename($0), $!));
    }

    print(STDERR "accepted new client\n");
    serve_client($client);
}

【讨论】: