gpt4 book ai didi

Perl:是否可以撤消 SIG{INT} 捕获?

转载 作者:行者123 更新时间:2023-12-05 00:09:57 24 4
gpt4 key购买 nike

我正在尝试在我的 Perl 程序中添加一个捕获信号。当 ctrl+C 发生时,我想要一条确认消息和一个用户输入( Y 或 N )。 Y 输入工作正常。

如果用户输入 N,那么基本上我想“取消” ctrl+C 命令并返回到脚本。

编码:

$SIG{INT} = \&catchSignal;
$SIG{TERM} = \&catchSignal;

sub catchSignal
{
my $ans;
print " Are you sure you want to quit? Y or N:\n";
$ans = <STDIN>;

chomp $ans;

if( $ans eq "Y" )
{
exit;
}
else
{
# Cancel the ctrl+C command
}

}

这样的事情可能吗?

最佳答案

一旦您安装了处理程序,该信号的默认操作将被抑制,并且一旦该信号进入,您的处理程序就会运行†。参见 Signals in perlipc对于初学者。

因此,您显示的内容已经“取消”了信号,并且您的程序将在处理程序返回后继续,除非用户当然确认退出。程序在哪里以及如何继续并不是一成不变的,但通常是在中断之后。

如果阻塞系统调用被信号中断,则该调用失败并返回 EINTR ( errno(3) ).‡ 这些错误代码主要反射(reflect)在 %! variable 中,所以当一个这样的调用返回错误时,我们可以检查 $!{EINTR}已设置,如果是,则重新启动该调用可能很有意义。感谢 ikegami发表评论。

确切地说,这不是固定的,但可以从signal(7)推断出来。 (见‡脚注)。

如果他们确实选择退出,那比被信号吹出水面更好,因为具有停止程序的倾向的信号只会终止它。而当程序调用 exit这是受控的,可以清理,使用选定的代码退出;此外,缓冲区被刷新,END块运行。

† 无法捕获的信号除外,STOP (sigstop) 和 KILL (sigkill) 首先。

‡ 在 C 中我们可以设置 SA_RESTARTsigaction(2)重新启动此类调用(例如,请参见 Interruption of system calls... 中的 signal(7)),但不使用 native %SIG在 Perl 中。 POSIX::sigaction有支持但它的使用相当复杂,而且几乎没有记录。

关于Perl:是否可以撤消 SIG{INT} 捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59164368/

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