程序腳本總是遇到這樣那樣的問題,我們預(yù)測(cè)了一些問題,并為它們處理代碼做準(zhǔn)備,而有些問題是不可預(yù)測(cè)的,今天就讓武林技術(shù)頻道小編帶大家進(jìn)入下文總結(jié)處理Perl信號(hào)的學(xué)習(xí)方法。
Unix 下常見的處理信號(hào)
?
?
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的信號(hào)處理原理
Perl 提供了%SIG 這個(gè)特殊的默認(rèn)HASH.調(diào)用需要使用到系統(tǒng)保留全局HASH數(shù)組%SIG,即使 用'$SIG{信號(hào)名}'截取信號(hào),相當(dāng)于,在perl程序中出現(xiàn)這個(gè)信號(hào)時(shí),執(zhí)行我們自己定義某段代碼(子函數(shù))的地址值(定義信號(hào)響應(yīng)函數(shù)),這代碼就是截取這個(gè)信息后要執(zhí)行的結(jié)果了.
舉個(gè)SIGALRM例子,也就是超時(shí)處理:
?
?
my $timeout = 10 ;
??? eval {
??????? local $SIG{ALRM} = sub { die "alarm/n" }; # /n required
??????? alarm $timeout; #如果到了$timeout時(shí)間就會(huì)去執(zhí)行上面的sub
??????? sleep 15;
??????? print " if timeout ,this will not print";
??????? alarm 0; #恢復(fù)到默認(rèn)的狀態(tài)
??? };
??? if ($@) {
??????? die? unless $@ eq "alarm/n";?? #可能捕獲的不是超時(shí),是其他錯(cuò)誤,就die吧
??????? print "timeout /n" ;
??? }
??? else {
??????? print "not timeout";
??? }
?
這里要說(shuō)一下perl的錯(cuò)誤捕獲機(jī)制
?
?
eval {
open(FH,”domains.txt”) or die “Can't open files,$!”;
};
捕獲異常
?
?
?
if($@){#出現(xiàn)異常}
else{#無(wú)異常,打印文件內(nèi)容
while(){
…
}
close FH;
}
以上就是關(guān)于總結(jié)處理Perl信號(hào)的學(xué)習(xí)方法介紹。今天的分享就到這兒了,希望想學(xué)習(xí)的朋友。通過上面的學(xué)習(xí)希望可以幫助到大家,同時(shí)感謝大家對(duì)武林技術(shù)頻道的支持!