[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

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