- 1、本文档共13页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Perl SIG信号处理
Perl SIG信号处理
Perl SIG信号处理
2010-12-16 linux中的信号
先了解在linux中的信号,信号其实就是编程里俗称的中断,它使监视与控制其他进程变为有可能。中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。
首先看看linux中的常用信号,见如下列表:
==
信号名值标注解释
--
HUP 1A检测到挂起
INT 2A来自键盘的中断
QUIT 3A来自键盘的停止
ILL 4A非法指令
ABRT 6C失败
FPE 8C浮点异常
KILL 9AF终端信号
USR1 10 A用户定义的信号1 SEGV 11 C非法内存访问
USR2 12 A用户定义的信号2 PIPE 13 A写往没有读取者的管道
ALRM 14 A来自闹钟的定时器信号
TERM 15 A终端信号
CHLD 17 B子进程终止
CONT 18 E如果被停止则继续
STOP 19 DF停止进程
TSTP 20 Dtty键入的停止命令
TTIN 21 D对后台进程的tty输入
TTOU 22 D对后台进程的tty输出
--
著明:上表中值列下没有列出的值所对应的信号为系统调用的非标准信号。上表中的第三列标注定义了当进程接受到信号后的默认的操作
A-–终止进程
B-–忽略进程信号
C-–终止进程并卸下内核
D-–停止进程
E-–恢复进程
F-–不能截取或忽略进程信号
==
Perl中命令信号的原理
Perl提供了%SIG这个特殊的默认HASH.调用需要使用到系统保留全局HASH数组%SIG,即使用$SIG{信号名}截取信号,相当于,在perl程序中出现这个信号时,执行我们自己定义某段代码(子函数)的地址值(定义信号响应函数),这代码就是截取这个信息后要执行的结果了。
例如:
10 11 12#!/usr/bin/perl
$SIG{TERM}=$SIG{INT}=\yoursub;
my$i=1;
while 1{
sleep 1;
$i=$i+1;
print$i.\n;
}
sub yoursub{
printexit.\n;
exit 0;
}
最程序运行前,我们给$SIG{TERM}和$SIG{INT}二个hash放一个子函数的引用(地址),当有终端信号或来自键盘的中断时,上面的while中的就不在运行,就开始运行yoursub这个函数.
可以使用的地方
象对信息的处理,我们常用到的地方,可以捕捉die及一些warning的信息,然后打印出来,我们也可以让程序在退出来之前,就是按下Ctrl+c时,进行一些任务(如删除tmp文件),需要注意的地方是.为了尽可能早的加载这些代码,这样就能保证程序一执行就能先得到信号。这样用处非常大,比如我们写的perl的CGI.可以用信号来捕捉CGI程序Internal 500错误,不然出现了问题,大多数都必须查看Web server的日志才能知道程序哪里出了错误,页面只一个500服务器错误,象php因为是mod,直接就显示在网页上。可以使用如下的方法.比如将信号捕捉代码放到BEGIN块中
10 11#!/usr/bin/perl use strict;
BEGIN{
#fatal handler setting.
$SIG{__DIE__}=$SIG{__WARN__}=\handler_fatal;
}
sub handler_fatal{
printContent-type:text/html\n;
print@_;
}
当然perl的CGI的500错误,用下面的模块CGI:Carp来处理会更加容易些
use CGI Carp qw fatalsToBrowser;
dieBad error here;
另一个常用的用法使用$SIG{ALRM},设置等待超时一般都这样做:
local$SIG{ALRM}=sub{alarm 0;dieTIMEOUT;};#超时处理过程
eval{
alarm 10;#设定10秒钟后如果下面的代码没处理完,则进入超时处理过程
$input=#处理过程
alarm 0;#如果处理完了,取消超时处理设置
};
if$@=~/TIMEOUT/{}
注意这里alarm(10)一定要放在eval内。否则,万一程序执行完alarm后发生任务切换,而程序再次获得时间片时,ALRM信号已经发生,这时程序还没有执行到eval内就产生die,程序就会退出
有时我们要杀死所有的子进程,需要用到向进程组发送信息
在perl中,进程组的ID就是$$.如果程序想给所有由它启动的所有子进程发送一个挂
您可能关注的文档
最近下载
- 智能制造工程专业培养方案.PDF
- 新教材高中语文人教版选择性必修上册检测-第1单元测试卷-含解析.pdf VIP
- 检察院书记员测试题库及答案.pdf
- 2023年人民检察院公开招聘用制书记员考试题及答案.pdf VIP
- 中华民族现代文明有哪些鲜明特质建设中华民族现代文明的路径是什么.docx VIP
- 《旅行社计调业务》项目三任务3-4国内组团计调操作流程.ppt
- 全国青少年科技创新大赛样稿04附件研究日记6.pdf
- 机械维修合同范本5篇.docx VIP
- 2024年云南省三校生教育类模拟考试复习题库(刷题600题).docx
- 2023—2024学年湖南省五市十校教研教改共同体高二上学期期中联考数学试卷.doc VIP
文档评论(0)