linux – 在perl中收到任何信号时,睡眠会中断吗?

linux – 在perl中收到任何信号时,睡眠会中断吗?,第1张

概述我有这个简单的perl守护进程: #!/usr/bin/perluse strict;use warnings;use Proc::Daemon;Proc::Daemon::Init;my $continue = 1;$SIG{TERM} = sub { $continue = 0 };$SIG{USR1} = sub { do_process(1) };# basic 我有这个简单的perl守护进程:

#!/usr/bin/perluse 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秒记录一次,而不会发出预期的通知:

Sat Oct 30 21:05:47 2010 doing it 0Sat Oct 30 21:06:17 2010 doing it 0Sat Oct 30 21:06:47 2010 doing it 0

当我使用kill -USR1 xxxxx将USR1信号发送到进程时出现问题.输出不是我所期望的:

Sat Oct 30 21:08:25 2010 doing it 1Sat Oct 30 21:08:25 2010 doing it 0

我得到两个连续的条目,一个来自信号处理子程序,另一个来自永远运行的循环.每当收到USR1信号时,似乎睡眠就会中断.

到底是怎么回事?

解决方法 在您的程序将处理输入信号的意义上,睡眠中断,但循环将继续(返回睡眠状态),直到收到TERM信号.这是 sleep()函数的记录行为:

May be interrupted if the process receives a signal such as “SIgalRM”.

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

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

PS.您可以在perldoc perlipc中阅读有关信号处理的更多信息,并在W. Richard Stevens中阅读几乎任何unix编程手册.:)

总结

以上是内存溢出为你收集整理的linux – 在perl中收到任何信号时,睡眠会中断吗?全部内容,希望文章能够帮你解决linux – 在perl中收到任何信号时,睡眠会中断吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1026714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存