程序腳本總是遇到這樣那樣的問題,我們預測了一些問題,并為它們處理代碼做準備,而有些問題是不可預測的,今天就讓武林技術頻道小編帶大家進入下文總結處理Perl信號的學習方法。
Unix 下常見的處理信號
?
?
No??? Name???????? Default Action?????? Description
?1???? SIGHUP?????? terminate process??? terminal line hangup
?2???? SIGINT?????? terminate process??? interrupt program
?3???? SIGQUIT????? create core image??? quit program
?4???? SIGILL?????? create core image??? illegal instruction
?5???? SIGTRAP????? create core image??? trace trap
?6???? SIGABRT????? create core image??? abort program (formerly SIGIOT)
?7???? SIGEMT?????? create core image??? emulate instruction executed
?8???? SIGFPE?????? create core image??? floating-point exception
?9???? SIGKILL????? terminate process??? kill program
?10??? SIGBUS?????? create core image??? bus error
?11??? SIGSEGV????? create core image??? segmentation violation
?12??? SIGSYS?????? create core image??? non-existent system call invoked
?13??? SIGPIPE????? terminate process??? write on a pipe with no reader
?14??? SIGALRM????? terminate process??? real-time timer expired
?15??? SIGTERM????? terminate process??? software termination signal
?16??? SIGURG?????? discard signal?????? urgent condition present on socket
?17??? SIGSTOP????? stop process???????? stop (cannot be caught or ignored)
?18??? SIGTSTP????? stop process???????? stop signal generated from keyboard
?19??? SIGCONT????? discard signal?????? continue after stop
?20??? SIGCHLD????? discard signal?????? child status has changed
?21??? SIGTTIN????? stop process???????? background read attempted from control terminal
?22??? SIGTTOU????? stop process???????? background write attempted to control terminal
?23??? SIGIO??????? discard signal?????? I/O is possible on a descriptor (see fcntl(2))
?24??? SIGXCPU????? terminate process??? cpu time limit exceeded (see setrlimit(2))
?25??? SIGXFSZ????? terminate process??? file size limit exceeded (see setrlimit(2))
?26??? SIGVTALRM??? terminate process??? virtual time alarm (see setitimer(2))
?27??? SIGPROF????? terminate process??? profiling timer alarm (see setitimer(2))
?28??? SIGWINCH???? discard signal?????? Window size change
?29??? SIGINFO????? discard signal?????? status request from keyboard
?30??? SIGUSR1????? terminate process??? User defined signal 1
?31??? SIGUSR2????? terminate process??? User defined signal 2
?
perl的信號處理原理
Perl 提供了%SIG 這個特殊的默認HASH.調用需要使用到系統保留全局HASH數組%SIG,即使 用'$SIG{信號名}'截取信號,相當于,在perl程序中出現這個信號時,執行我們自己定義某段代碼(子函數)的地址值(定義信號響應函數),這代碼就是截取這個信息后要執行的結果了.
舉個SIGALRM例子,也就是超時處理:
?
?
my $timeout = 10 ;
??? eval {
??????? local $SIG{ALRM} = sub { die "alarm/n" }; # /n required
??????? alarm $timeout; #如果到了$timeout時間就會去執行上面的sub
??????? sleep 15;
??????? print " if timeout ,this will not print";
??????? alarm 0; #恢復到默認的狀態
??? };
??? if ($@) {
??????? die? unless $@ eq "alarm/n";?? #可能捕獲的不是超時,是其他錯誤,就die吧
??????? print "timeout /n" ;
??? }
??? else {
??????? print "not timeout";
??? }
?
這里要說一下perl的錯誤捕獲機制
?
?
eval {
open(FH,”domains.txt”) or die “Can't open files,$!”;
};
捕獲異常
?
?
?
if($@){#出現異常}
else{#無異常,打印文件內容
while(){
…
}
close FH;
}
以上就是關于總結處理Perl信號的學習方法介紹。今天的分享就到這兒了,希望想學習的朋友。通過上面的學習希望可以幫助到大家,同時感謝大家對武林技術頻道的支持!