内容

名称

sigtrap - Perl pragma,用于启用简单的信号处理

概要

    use sigtrap;
    use sigtrap qw(stack-trace old-interface-signals);	# equivalent
    use sigtrap qw(BUS SEGV PIPE ABRT);
    use sigtrap qw(die INT QUIT);
    use sigtrap qw(die normal-signals);
    use sigtrap qw(die untrapped normal-signals);
    use sigtrap qw(die untrapped normal-signals
		    stack-trace any error-signals);
    use sigtrap 'handler' => \&my_handler, 'normal-signals';
    use sigtrap qw(handler my_handler normal-signals
    	    	    stack-trace error-signals);

说明

sigtrap pragma 是安装信号处理程序的一个简单接口。你可以让它安装 sigtrap 本身提供的两个处理程序之一(一个提供 Perl 堆栈跟踪,另一个简单地执行 die()),或者你可以为其提供自己的处理程序以供其安装。它可以被告知仅为未捕获或被忽略的信号安装处理程序。它有三个要捕获的信号列表,另外你还可以提供自己的信号列表。

传递给调用 sigtrapuse 语句的参数按顺序处理。当遇到信号名称或 sigtrap 的信号列表名称时,将立即安装一个处理程序,当遇到选项时,它将影响随后安装的处理程序。

选项

信号处理程序

这些选项会影响随后安装的信号将使用哪个处理程序。

stack-trace

随后安装的信号所使用的处理程序会将 Perl 堆栈跟踪输出到 STDERR,然后尝试转储核心。这是默认信号处理程序。

die

随后安装的信号所使用的处理程序会使用一条消息调用 die(实际上是 croak),该消息会指示捕获到了哪个信号。

handler your-handler

your-handler 将用作随后安装的信号的处理程序。your-handler 可以是任何值,该值作为对 %SIG 元素的赋值是有效的。有关处理程序函数的示例,请参阅 perlvar

信号列表

sigtrap 有几个内置的信号列表要捕获。它们是

normal-signals

这些是程序可能通常会遇到的信号,并且默认情况下会导致程序终止。它们是 HUP、INT、PIPE 和 TERM。

error-signals

这些信号通常表示 Perl 解释器或脚本存在严重问题。它们是 ABRT、BUS、EMT、FPE、ILL、QUIT、SEGV、SYS 和 TRAP。

old-interface-signals

这些是旧 sigtrap 接口默认捕获的信号,它们是 ABRT、BUS、EMT、FPE、ILL、PIPE、QUIT、SEGV、SYS、TERM 和 TRAP。如果没有将任何信号或信号列表传递给 sigtrap,则会使用此列表。

对于这三个列表中的每一个,都会在捕获之前检查设置为要捕获的信号集合;如果你的架构未实现特定信号,则不会捕获该信号,而是会默默地忽略它。

其他

untrapped

此令牌告知 sigtrap 仅为随后列出的尚未捕获或忽略的信号安装处理程序。

any

此令牌告知 sigtrap 为随后列出的所有信号安装处理程序。这是默认行为。

signal

任何看起来像信号名称(即 /^[A-Z][A-Z0-9]*$/)的参数表示 sigtrap 应为该名称安装处理程序。

number

要求至少使用 sigtrap 版本 number

示例

为 old-interface-signals 提供堆栈跟踪

use sigtrap;

同上

use sigtrap qw(stack-trace old-interface-signals);

仅在 4 个列出的信号上提供堆栈跟踪

use sigtrap qw(BUS SEGV PIPE ABRT);

在 INT 或 QUIT 上终止

use sigtrap qw(die INT QUIT);

在 HUP、INT、PIPE 或 TERM 上终止

use sigtrap qw(die normal-signals);

在 HUP、INT、PIPE 或 TERM 上终止,但不要更改已捕获或忽略的信号的行为

use sigtrap qw(die untrapped normal-signals);

在收到当前未捕获的任何normal-signals 之一时终止,在收到error-signals 之一any 时提供堆栈跟踪

    use sigtrap qw(die untrapped normal-signals
		    stack-trace any error-signals);

将 my_handler() 安装为 normal-signals 的处理程序

use sigtrap 'handler', \&my_handler, 'normal-signals';

将 my_handler() 安装为 normal-signals 的处理程序,在收到 error-signals 之一时提供 Perl 堆栈跟踪

use sigtrap qw(handler my_handler normal-signals
	    	    stack-trace error-signals);