III Linux系统编程_ 33 信号_ 2 产生信号

III Linux系统编程_ 33 信号_ 2 产生信号

ID:41081272

大小:37.50 KB

页数:4页

时间:2019-08-15

III Linux系统编程_ 33 信号_ 2 产生信号_第1页
III Linux系统编程_ 33 信号_ 2 产生信号_第2页
III Linux系统编程_ 33 信号_ 2 产生信号_第3页
III Linux系统编程_ 33 信号_ 2 产生信号_第4页
资源描述:

《III Linux系统编程_ 33 信号_ 2 产生信号》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、第 33 章 信号2. 产生信号2.1. 通过终端按键产生信号上一节讲过,SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且CoreDump,现在我们来验证一下。首先解释什么是CoreDump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做CoreDump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortemDebug。一个进程允许产生多

2、大的core文件取决于进程的ResourceLimit(这个信息保存在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。首先用ulimit命令改变Shell进程的ResourceLimit,允许core文件最大为1024K:$ulimit-c1024然后写一个死循环程序:#includeintmain(void){while(1);return0;}前台运行这个程序,

3、然后在终端键入Ctrl-C或Ctrl-:$./a.out(按Ctrl-C)$./a.out(按Ctrl-)Quit(coredumped)$ls-lcore*-rw-------1akaeduakaedu1474562008-11-0523:40coreulimit命令改变了Shell进程的ResourceLimit,a.out进程的PCB由Shell进程复制而来,所以也具有和Shell进程相同的ResourceLimit值,这样就可以产生CoreDump了。2.2. 调用系统函数向进程发信号仍以上一

4、节的死循环程序为例,首先在后台执行这个程序,然后用kill命令给它发SIGSEGV信号。$./a.out&[1]7940$kill-SIGSEGV7940$(再次回车)[1]+Segmentationfault(coredumped)./a.out7940是a.out进程的id。之所以要再次回车才显示Segmentationfault,是因为在7940进程终止掉之前已经回到了Shell提示符等待用户输入下一条命令,Shell不希望Segmentationfault信息和用户的输入交错在一起,所以等用户输入

5、命令之后才显示。指定某种信号的kill命令可以有多种写法,上面的命令还可以写成kill-SEGV7940或kill-117940,11是信号SIGSEGV的编号。以往遇到的段错误都是由非法内存访问产生的,而这个程序本身没错,给它发SIGSEGV也能产生段错误。kill命令是调用kill函数实现的。kill函数可以给一个指定的进程发送指定的信号。raise函数可以给当前进程发送指定的信号(自己给自己发信号)。#includeintkill(pid_tpid,intsigno);intra

6、ise(intsigno);这两个函数都是成功返回0,错误返回-1。abort函数使当前进程接收到SIGABRT信号而异常终止。#includevoidabort(void);就像exit函数一样,abort函数总是会成功的,所以没有返回值。2.3. 由软件条件产生信号SIGPIPE是一种由软件条件产生的信号,在例 30.7“管道”中已经介绍过了。本节主要介绍alarm函数和SIGALRM信号。#includeunsignedintalarm(unsignedint

7、seconds);调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号,该信号的默认处理动作是终止当前进程。这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。打个比方,某人要小睡一觉,设定闹钟为30分钟之后响,20分钟后被人吵醒了,还想多睡一会儿,于是重新设定闹钟为15分钟之后响,“以前设定的闹钟时间还余下的时间”就是10分钟。如果seconds值为0,表示取消以前设定的闹钟,函数的返回值仍然是以前设定的闹钟时间还余下的秒数。例 33.1. ala

8、rm#include#includeintmain(void){intcounter;alarm(1);for(counter=0;1;counter++)printf("counter=%d",counter);return0;}这个程序的作用是1秒钟之内不停地数数,1秒钟到了就被SIGALRM信号终止。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。