[Perl] $SIG{ALRM}

本文介绍如何在Perl中通过设置SIGALRM信号来避免长时间运行的操作导致程序挂起。通过实例展示了如何定义信号处理程序并设置定时器,在指定时间内未完成操作时终止进程。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值