【问题标题】:Does sleep get interrupted when any signal is received in perl?在 perl 中收到任何信号时,睡眠是否会中断?
【发布时间】:2011-05-02 22:06:54
【问题描述】:

我有这个简单的 perl 守护进程:

#!/usr/bin/perl

use strict;
use warnings;
use Proc::Daemon;

Proc::Daemon::Init;

my $continue = 1;

$SIG{TERM} = sub { $continue = 0 };
$SIG{USR1} = sub { do_process(1) };

# basic daemon                                                                                    

boxesd_log("started boxesd");

while ($continue) {
    do_process(0);
    sleep(30);
}

boxesd_log("finished boxesd");

exit(0);

# required subroutines                                                                            

sub do_process {
    my ($notified) = @_;
    boxesd_log("doing it $notified");
}

但是有些东西不能正常工作。

当守护程序启动时,它会每 30 秒记录一次,而不会按预期发出通知:

2010 年 10 月 30 日星期六 21:05:47 做 0
2010 年 10 月 30 日星期六 21:06:17 做 0
2010 年 10 月 30 日星期六 21:06:47 这样做 0

当我使用kill -USR1 xxxxx 向进程发送USR1 信号时,问题就出现了。输出不是我所期望的:

2010 年 10 月 30 日星期六 21:08:25 这样做 1
2010 年 10 月 30 日星期六 21:08:25 做 0

我得到两个连续的条目,一个来自信号处理子例程,另一个来自不断运行的循环。似乎只要收到USR1 信号,睡眠就会中断。

发生了什么事?

【问题讨论】:

    标签: linux perl signals daemon


    【解决方案1】:

    在您的程序将处理传入信号的意义上,睡眠被中断,但循环将继续(返回睡眠),直到收到 TERM 信号。这是sleep() 函数的记录行为:

    如果进程收到“SIGALRM”之类的信号,可能会被中断。

    注意,如果你需要休眠30秒,即使被信号中断,你也可以确定休眠的秒数,然后再休眠剩余的秒数:

    while (1)
    {
        my $actual = sleep(30);
        sleep(30 - $actual) if $actual < 30;
    }
    

    PS。您可以在perldoc perlipc 中阅读有关信号处理的更多信息,在W. Richard Stevens 的几乎所有 unix 编程书籍中都可以阅读。 :)

    【讨论】:

    • 你没有检查你的第二个sleep是否也被打断了。要正确处理它,您需要某种循环,而不仅仅是 if
    • @mark4o:无限直到有信号中断它,是的,这通常是守护进程所做的。 (为了清楚起见,我删除了$continue 变量,因为它与sleep 在各种条件下的行为方式的核心问题无关。显然,人们可能想让实际代码更复杂,例如在第二次中断时再次休眠正如 cjm 提到的那样。)
    • 哦,我认为循环应该替换sleep(30),而不是整个主循环。在那种情况下,我同意 cjm,而且对 do_process 的调用也丢失了。
    • @mark: 我相信你可以假装do_process() 调用是它应该在的地方:p
    • $sleep = 30; while ($sleep > 0) $sleep -= sleep($sleep);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多