Scenarios: 可能出現hang的操作,如 connect remote server…
Solution: 設置alarm,並通過SIGALRM終止操作
local $@;
eval {
local $SIG{ALRM} = sub {
print "Got SIGALRM\n";
die "alarm clock restart" };
alarm 10; # schedule alarm in 10 seconds
eval {
# long-running operation goes here
sleep 11;
};
alarm 0; # cancel the alarm
};
alarm 0; # race condition protection
die if $@ && $@ !~ /alarm clock restart/; # reraise
Note: local $SIG{ALRM}
只作用於block內,影響最小化。
嘗試觸發SIGALRM的結果如下:
Got SIGALRM
PS: %SIG (one of Perl’s supervars, like %ENV),存儲定義系統SIG(64個signal,0一般保留,1~64有具體意義),不同os可能存在差異,試一下 kill -l
[root@localhost ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
中斷機制在OS中廣泛使用,獲取程序的retval,分析中斷類型可以更好的掌握其運行情況,參見reap child process line 8:
$exit_code(2 bytes) 的 lower 7bit 返回的既是SIG value