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()
),或者您也可以提供自己的處理常式讓它安裝。它可以被告知僅安裝處理常式,以處理未捕捉或忽略的訊號。它有三個訊號清單要捕捉,此外您還可以提供自己的訊號清單。
傳遞給呼叫 sigtrap 的 use
陳述式的引數會依序處理。當遇到訊號名稱或 sigtrap 訊號清單的名稱時,會立即安裝處理常式;當遇到選項時,會影響隨後安裝的處理常式。
這些選項會影響隨後安裝訊號所使用的處理常式。
隨後安裝訊號所使用的處理常式會將 Perl 堆疊追蹤輸出至 STDERR,然後嘗試傾印核心。這是預設的訊號處理常式。
用於後續安裝的訊號處理程式呼叫 die
(實際上是 croak
),並附帶訊息指出已捕獲哪個訊號。
your-handler 將用作後續安裝的訊號處理程式。your-handler 可以是任何值,只要有效指定給 %SIG
的元素即可。請參閱 perlvar 以取得處理函式的範例。
sigtrap 內建幾個要捕捉的訊號清單。它們是
這些是程式通常預期會遇到的訊號,而且預設會導致程式終止。它們是 HUP、INT、PIPE 和 TERM。
這些訊號通常表示 Perl 詮釋器或您的腳本有嚴重問題。它們是 ABRT、BUS、EMT、FPE、ILL、QUIT、SEGV、SYS 和 TRAP。
這些是舊版 sigtrap 介面預設會捕捉的訊號,它們是 ABRT、BUS、EMT、FPE、ILL、PIPE、QUIT、SEGV、SYS、TERM 和 TRAP。如果沒有將任何訊號或訊號清單傳遞給 sigtrap,就會使用這個清單。
對於這三個清單中的每一個,都會在捕捉之前檢查設定為要捕捉的訊號集合;如果您的架構未實作特定訊號,它將不會被捕捉,而是會被靜默忽略。
此權杖告訴 sigtrap 僅為尚未捕捉或忽略的後續列出訊號安裝處理程式。
此權杖告訴 sigtrap 為所有後續列出的訊號安裝處理程式。這是預設行為。
任何看起來像訊號名稱的引數(即 /^[A-Z][A-Z0-9]*$/
)表示 sigtrap 應該為該名稱安裝處理程式。
要求至少使用 sigtrap 版本 number。
提供舊版介面訊號的堆疊追蹤
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);
在收到目前未攔截的任何正常訊號時結束,在收到任何錯誤訊號時提供堆疊追蹤
use sigtrap qw(die untrapped normal-signals
stack-trace any error-signals);
將 my_handler() 安裝為正常訊號的處理常式
use sigtrap 'handler', \&my_handler, 'normal-signals';
將 my_handler() 安裝為正常訊號的處理常式,在收到錯誤訊號之一時提供 Perl 堆疊追蹤
use sigtrap qw(handler my_handler normal-signals
stack-trace error-signals);