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