Perl:是否可以撤消 SIG{INT} 捕获?
Perl: Is it possible to undo a SIG{INT} catch?
我正在尝试在我的 Perl 程序中添加一个捕获信号。当出现 ctrl+C 时,我想要一条确认消息和一个用户输入( Y 或 N )。 Y输入工作正常。
如果用户输入 N,那么基本上我想 "cancel" ctrl+C 命令和 return 脚本。
代码:
$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 对于初学者。
所以你已经显示的 "cancels" 信号和你的程序将在处理程序 returns 之后继续,当然除非用户确认退出。程序继续的位置和方式并不是一成不变的,但通常是从中断的地方开始。
如果阻塞系统调用被信号中断,则该调用失败并显示 EINTR
(errno(3)
)。‡ 这些错误代码主要反映在 %!
variable 中,所以当一个这样的调用 returns 出现错误时,我们可以检查是否设置了 $!{EINTR}
,如果是,那么重新启动该调用可能是有意义的。感谢 ikegami
的评论。
究竟是什么调用有这个并没有确定,但可以从 signal(7)
中推断出来(参见 ‡ 脚注)。
如果他们确实选择退出,那比被信号吹出水面更好,因为具有停止程序倾向的信号只会终止程序。当一个程序调用 exit
时,它是受控的并且可以清理,并以选定的代码退出;此外,缓冲区被刷新,END
块 运行.
†除了无法捕获的信号外,STOP
(sigstop)和KILL
(sigkill)放在首位。
‡ 在 C 中,我们可以在 sigaction(2)
中设置 SA_RESTART
以重新启动此类调用(请参阅 signal(7)
中的 Interruption of system calls...
例如),但不适用于 Perl 中的本机 %SIG
。 POSIX::sigaction
中有支持,但它的使用相当复杂且几乎没有记录。
我正在尝试在我的 Perl 程序中添加一个捕获信号。当出现 ctrl+C 时,我想要一条确认消息和一个用户输入( Y 或 N )。 Y输入工作正常。
如果用户输入 N,那么基本上我想 "cancel" ctrl+C 命令和 return 脚本。
代码:
$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 对于初学者。
所以你已经显示的 "cancels" 信号和你的程序将在处理程序 returns 之后继续,当然除非用户确认退出。程序继续的位置和方式并不是一成不变的,但通常是从中断的地方开始。
如果阻塞系统调用被信号中断,则该调用失败并显示 EINTR
(errno(3)
)。‡ 这些错误代码主要反映在 %!
variable 中,所以当一个这样的调用 returns 出现错误时,我们可以检查是否设置了 $!{EINTR}
,如果是,那么重新启动该调用可能是有意义的。感谢 ikegami
的评论。
究竟是什么调用有这个并没有确定,但可以从 signal(7)
中推断出来(参见 ‡ 脚注)。
如果他们确实选择退出,那比被信号吹出水面更好,因为具有停止程序倾向的信号只会终止程序。当一个程序调用 exit
时,它是受控的并且可以清理,并以选定的代码退出;此外,缓冲区被刷新,END
块 运行.
†除了无法捕获的信号外,STOP
(sigstop)和KILL
(sigkill)放在首位。
‡ 在 C 中,我们可以在 sigaction(2)
中设置 SA_RESTART
以重新启动此类调用(请参阅 signal(7)
中的 Interruption of system calls...
例如),但不适用于 Perl 中的本机 %SIG
。 POSIX::sigaction
中有支持,但它的使用相当复杂且几乎没有记录。