嵌入式LINUX_C基础11.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.信号 1.1 信号处理 1)忽略:不予理睬; 2)默认:系统预定义的处理方式(缺省处理); 3)捕获:通过编程来针对特定信号,做出特殊处理; SIGKILL(9),不能被忽略或捕获,而只能采用默认方式处理:令进程终止; SIGTERM(15),可以忽略或捕获,改变其默认行为,而其默认方式:令进程终止; ****尝试SIGINT/SIGQUIT信号的默认处理************************************** #includestdio.h #includestdlib.h #includeunistd.h int main() { printf(我在运行Ctrl+C或Ctrl+\\终止...\n); for(;;); return 0; } 1.2 捕获信号 signal()函数 使用时引入头文件signal.h 功能:设置针对特定信号的处理方式。 格式:#include signal.h typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 注意:第一个参数:信号值; 第二个参数:信号处理函数的指针,sighandler_t是一个函数指针类型;有两个特殊值:SIG_IGN(忽略)/SIG_DFL(默认) 每次系统内核产生信号,都会使进程转而执行signal函数注册的信号处理函数 返回值:成功以前的信号处理函数的指针,有两个特殊值:SIG_IGN(忽略)/SIG_DFL(默认),失败返回SIG_ERR。 信号处理函数的形式:void sighandler(int signum/*信号编号*/){信号处理代码}; tips:某些Unix系统,通过signal函数注册的信号处理函数只能一次性有效。系统内核在调用信号处理函数之前会先将对该信号的处理恢复默认。对于这种情况,可以在信号处理函数返回之前通过signal函数再次注册即可。 多个不同个信号可以通过一个信号处理函数处理。在信号处理函数内部,根据其信号编号参数区分不同的处理方式。 ****使用signal函数更改信号处理************************************************* #includestdio.h #includesignal.h #includeunistd.h //定义自己的处理函数 void sigint(int signum) { printf(%d进程:我收到了%d信号\n,getpid(),signum); //再次注册,以确保所注册的信号处理函数持续有效 signal(SIGINT,sigint); } int main() { //更改原来的ctrl+c处理方式为忽视:SIG_IGN if(SIG_ERR==signal(SIGINT,SIG_IGN)) { perror(signal); return -1; } printf(%d进程:我在运行Ctrl+C测试,Ctrl+\\终止...\n,getpid()); //使用自己的函数处理 //按下ctrl+l引起用户态的中断,切换至内核态 //内核态开始调用信号处理函数,即进行中断处理,处理结束根据断点现场数据返回内核态,最终由内核态返回用户态 if(SIG_ERR==signal(SIGINT,sigint)) { perror(signal); return -1; } for(;;); return 0; } 一个进程无论什么原因终止运行,都会向其父进程递送SIGCHLD(17)信号。因此父进程可以在对该信号的处理函数中回收子进程的僵尸。需要注意的是,SIGCHLD信号并不可靠,因此在其信号处理函数执行过程中信号有可能被丢弃,进而导致漏网僵尸。为此,可以采用在循环中通过waitpid以非阻塞方式回收尽可能多的僵尸的方法加以解决。 ****使用信号处理函数处理多个子进程回收的异步处理****************************** #includestdio.h #includestdlib.h #includeunistd.h #includestring.h #includesys/wait.h #includesignal.h #includeerrno.h void sigchld(int signum) { for(;;) {

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档