网站大量收购闲置独家精品文档,联系QQ:2885784924

Linux信号处理解析.doc

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux信号处理解析

1. 信号概念 1 2. signal信号处理机制 1 3. sigaction信号处理机制 3 3.1. 信号处理情况分析 3 3.2. sigaction信号处理注册 4 3.3. sigprocmask信号阻塞 8 4. 用程序发送信号 12 4.1. kill信号发送函数 12 4.2. sigqueue信号发送函数 13 5. 计时器与信号 16 5.1. 睡眠函数 16 5.2. 时钟处理 16 信号概念 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件)。信号是硬件中断的软件模拟(软中断)。每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD、SIGINT等,它们在系统头文件signal.h中定义,也可以通过在shell下键入kill –l查看信号列表,或者键入man 7 signal查看更详细的说明。 信号的生成来自内核,让内核生成信号的请求来自3个地方: 用户:用户能够通过输入CTRL+c、Ctrl+\,或者是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号; 内核:当进程执行出错时,内核会给进程发送一个信号,例如非法段存取(内存访问违规)、浮点数溢出等; 进程:一个进程可以通过系统调用kill给另一个进程发送信号,一个进程可以通过信号和另外一个进程进行通信。 由进程的某个操作产生的信号称为同步信号(synchronous signals),例如除0;由像用户击键这样的进程外部事件产生的信号叫做异步信号(asynchronous signals)。 进程接收到信号以后,可以有如下3种选择进行处理: 接收默认处理:接收默认处理的进程通常会导致进程本身消亡。例如连接到终端的进程,用户按下CTRL+c,将导致内核向进程发送一个SIGINT的信号,进程如果不对该信号做特殊的处理,系统将采用默认的方式处理该信号,即终止进程的执行; signal(SIGINT,SIG_DFL); 忽略信号:进程可以通过代码,显示地忽略某个信号的处理,例如:signal(SIGINT,SIG_IGN);但是某些信号是不能被忽略的; 捕捉信号并处理:进程可以事先注册信号处理函数,当接收到信号时,由信号处理函数自动捕捉并且处理信号。 有两个信号既不能被忽略也不能被捕捉,它们是SIGKILL和SIGSTOP。即进程接收到这两个信号后,只能接受系统的默认处理,即终止进程。 signal信号处理机制 可以用函数signal注册一个信号捕捉函数。原型为: #include signal.h typedef void (*sighandler_t)(int); //函数指针 sighandler_t signal(int signum, sighandler_t handler); signal的第1个参数signum表示要捕捉的信号,第2个参数是个函数指针,表示要对该信号进行捕捉的函数,该参数也可以是SIG_DFL(表示交由系统缺省处理,相当于白注册了)或SIG_IGN(表示忽略掉该信号而不做任何处理)。signal如果调用成功,返回以前该信号的处理函数的地址,否则返回SIG_ERR。 sighandler_t是信号捕捉函数,由signal函数注册,注册以后,在整个进程运行过程中均有效,并且对不同的信号可以注册同一个信号捕捉函数。该函数只有一个整型参数,表示信号值。 示例: 捕捉终端CTRL+c产生的SIGINT信号: #include unistd.h #include stdio.h #include sys/wait.h #include sys/types.h #include signal.h void SignHandler(int iSignNo) { printf(Capture sign no:%d\n,iSignNo); } int main() { signal(SIGINT,SignHandler); while(1) sleep(1); return 0; } 该程序运行起来以后,通过按CTRL+c将不再终止程序的运行(或者另开一个终端,然后发送消息:“kill –s 2 进程号”或者“kill -2 进程号”,可以实现Ctrl + c同样的效果。因为CTRL+c产生的SIGINT信号已经由进程中注册的SignHandler函数捕捉了。该程序可以通过Ctrl+\终止,因为组合键Ctrl+\能够产生SIGQUIT信号,而该信号的捕捉函数尚未在程序中注册。 忽略掉终端CTRL+c产生的SIGINT信号: #include unistd.h #include stdio.h #include sys/wait.h #includ

文档评论(0)

little28 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档