- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UC-day09中断,信号函数
-----------------------------------------------
今天内容:
(1)中断的概念
(2)信号的概念和函数 2 3 7 9 11
1.中断
(1)概念
表示暂时停止当前程序的执行,转而执行新的程序或者处理意外情况的过程
(2)分类
中断分为:硬件中断 和 软件中断
ctrl+c 段错误
2.信号的概念和函数
2.1 信号的初识
(1)概念
信号就是软中断,信号既可以作为进程间的一种通信方式,也可以中断一个正在执行的程序,所以更多地用于处理意外情况
(2)特点
a. 信号是异步的
b. 进程既可以处理信号,也可以发送信号给指定的进程
c. 每个信号都有一个名字,这些名字以SIG开头
如:
ctrl+c 是:SIGINT 值为:2
2.2 信号的命令和分类
(1)命令
kill -l = 表示查看当前操作系统中的所有信号(小括号里面是信号的值)
掌握的信号:
ctrl+c 信号2 SIGINT 默认处理是 终止进程
ctrl+\ 信号3 SIGQUIT 默认处理是 终止进程
kill -9 信号9 SIGKILL 不允许被捕捉,终止进程
总线错误 信号7 SIGBUS
段错误 信号11 SIGSEGV
其他信号:
(2)分类
一般来说,linux系统中信号1~64,不保证连续,unix系统的信号和linux系统可能有所不同,
unix系统中的信号一般是1~48
以linux系统为例,做以下分类:
1~31 叫做不可靠信号,信号可能丢失,不支持排队(可能会出现插队的情况),又叫做非实时信号
34~64叫做可靠信号,信号不会丢失,支持排队,又叫做实时信号
2.3 信号的处理方式
(1)默认处理,绝大多数都是终止进程
(2)忽略信号
(3)自定义处理信号,通过自定义函数进行处理
注意:
a.信号9只能进行默认处理,不能忽略,也不能进行自定义处理
b.信号的发送受到用户的限制,一般来说,每个用户只能给自己的进程发信号,root用户可以给所有进程发信号
2.4 信号的处理函数
#include signal.h
typedef void (*sighandler_t)(int);//给函数指针其别名,给*sighandler起别名
sighandler_t signal(int signum, sighandler_t handler);
解析:
typedef void (*)(int) sighandler_t;
void (*)(int) signal(int signum, void (*)(int) handler);
=void (*)(int) signal(int signum, void (*handler)(int));
=void (*signal(int signum, void (*handler)(int)))(int)
综上所述:
=signal是个函数
=函数的第一个参数是int类型的(信号值),第二个参数是函数指针类型的(处理方式)
=函数的返回值是函数指针类型的
=函数指针是一个指向参数为int,返回值为void的函数
函数的使用:
函数功能:设置指定信号的处理方式
第一个参数:表示信号值/信号名称,int类型的
第二个参数:对信号的处理方式,函数指针类型的
SIG_IGN - 忽略
SIG_DFL - 默认处理
函数地址 - 调用指定的函数进行自定义处理
返回值:成功返回之前的处理方式,失败返回SIG_ERR
例子:
//signal函数的使用
#include stdio.h
#include stdlib.h
#include signal.h
#include unistd.h
#include sys/types.h
void fa(int signo){
printf(捕获到了信号%d\n,signo);
signal(“3,SIG_DFL”);//信号第一次是自定义处理,信号第二次是默认处理
}
int main(void){
//设置对信号2的处理方式为忽略,注意是终端发送信号(bash)
signal(2,SIG_IGN);
//设置对信号3,进行自定义处理
signal(SIGQUIT,fa);
//设
文档评论(0)