[Perl] $SIG{ALRM}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章