gpt4 book ai didi

perl - 在不中断当前 sleep 的情况下处理信号

转载 作者:行者123 更新时间:2023-12-04 04:07:10 24 4
gpt4 key购买 nike

在下面的代码中,如果 QUIT 信号到来, sleep 将立即结束并执行最后一行代码。

#!/opt/tertio/localperl/bin/perl

use strict;
use warnings;

my $quit = 0;

$SIG{'QUIT'} = sub {
print "Please dont try to take thread dump as i am not java\n";
$quit++;
};

my $sleep = shift || 30;
print "I am going to sleep\n";
sleep($sleep);

print "I woke up so will exit, but someone tried to quit me $quit times\n";

无论我设置的sleep时间有多长,只要我发送一个QUIT信号,sleep就会结束,程序会继续。

有没有一种方法可以在不影响程序当前运行的情况下处理 QUIT,从而使 sleep 继续按原计划继续?

最佳答案

在宝贵的 sleep 周围设置一个障碍物,以忽略其中的信号

IGNORE_QUIT: {
local $SIG{QUIT} = 'IGNORE';
sleep 10;
};

如果 sleep 碰巧已经被适本地限定了范围那么你就不需要额外的 block 。

如果有更多的话可以使用包装器

sub sleep_protected {
local $SIG{QUIT} = 'IGNORE';
sleep $_[0];
}

local是至关重要的,因此 $SIG{QUIT} 不会在全局范围内更改,而只会在 block 内更改。

如果您需要信号处理程序(并且不能只使用 'IGNORE'),那么 sleep 会被中断,以便处理程序可以运行。所以需要重启通话

sub sleep_protected {
my $sl = $_[0];
my $sigquit;
local $SIG{QUIT} = sub {
say "Got $_[0], but don't do thread dump";
++$sigquit;
};
$sl -= sleep $sl while $sl > 0;
return $sigquit;
}

计数器是本地的并返回,但您可以使用全局计数器,用 our 声明。或者将其声明为 state变量,它会在调用中被记住(参见 feature )。

如果被信号中断,中断的调用将返回错误 EINTR。这可以使用 %! 检查,如 if ($!{EINTR}) {...}。但是,我不知道 sleep 除了被信号之外如何合理地被打断,所以没有使用它。

关于perl - 在不中断当前 sleep 的情况下处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50988544/

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