《LinuxC从入门到精通》.明日科技.第11章.信号及信号处理.pptVIP

《LinuxC从入门到精通》.明日科技.第11章.信号及信号处理.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
alarm()函数 alarm()函数主要用于为发送的信号设定一个时间警告,使系统在设定的时间之后发送信号。alarm()函数的原型为: #includeunistd.h unsigned int alarm(unsigned int seconds); 参数seconds为设定的时间值。如果seconds设置为0值,那么alarm()函数设置的警告时钟将无效。 alarm()函数安排在seconds时间之后,发送一个信号SIGALRM给进程。在默认的情况下,进程接收到SIGALRM信号会终止运行。如果不希望终止进程,可以在进程捕获到该信号后修改默认的处理函数。 调用alarm()函数后,之前设置的任何警告时钟都取消。 标题 捕捉信号 本讲大纲: signal()函数 sigaction()函数 signal()函数 sigaction()函数 标题 信号的阻塞 本讲大纲: sigprocmask()函数 sigsuspend()函数 sigpending()函数 sigprocmask()函数 在前面介绍信号处理时,提到了信号的处理并没有那么的简单,而是有的时候进程并不希望被突如其来的信号中断当前的执行,也不希望信号从此被忽略掉,而是希望过一段时间之后再去处理这个信号,这种情况下,可以使用阻塞信号的方法来实现。能够实现信号阻塞的操作有3个系统调用函数,分别是sigprocmask()函数、sigsuspend()函数和sigpending()函数,下面分别对它们进行详细讲解。 ? 说明:信号屏蔽字就是进程中被阻塞的信号集,这些信号不能发送给该进程,它们在该进程中被屏蔽了,也就是被阻塞了。 11.4.1 sigprocmask()函数 sigprocmask()函数可用于检测和改变进程的信号掩码,该函数的定义形式如下: #includesignal.h Int sigprocmask(int how,const sigset_t *newset,sigset_t *oldset); sigprocmask()函数有3个参数,参数how表示修改信号屏蔽字的方式;参数newset表示把这个信号集设为新的当前信号屏蔽字,如果为NULL则不改变;参数oldset表示保存进程旧的信号屏蔽字,如果为NULL则不保存。 参数how的取值不同带来的操作行为也不同,该参数的可选值如下: SIG_BLOCK:该值代表的功能是将newset所指向的信号集中所包含的信号加到当前的信号掩码中作为新的信号屏蔽字。 SIG_UNBLOCK:将参数newset所指向的信号集中的信号从当前的信号掩码中移除。 SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。 函数调用成功则返回0;出错则返回-1。 ?注意:sigprocmask()函数只为单线程定义的,在多线程中要使用pthread_sigmask变量,在使用之前需要声明和初始化。 sigsuspend()函数 sigsuspend()函数主要实现了等待一个信号的到来,即将当前进程挂起。该函数的定义形式如下: #includesignal.h Int sigsuspend(const sigset_t *mask); 参数mask是一个sigset_t结构体类型的指针,指向一个信号集,当函数sigsuspend()函数被调用时,参数mask所指向的信号集中的信号被复制给信号掩码。随后,进程会被挂起,直到信号被捕捉到,执行信号相应的处理方法返回时,该函数才会返回,此时,信号掩码恢复为函数调用前的值。 sigpending()函数 标题 信号处理的安全问题 在多进程通信时,开发人员通常都会考虑到每个进程运行的安全问题,信号作为进程的异步通信方式,在实际应用中是相当方便的,但是信号的使用存在一定的安全隐患。信号并不仅是在程序出现错误时才调用的。有的时候开发人员也会为了实现某些逻辑的需求,而在程序中安装一个信号,例如,SIGUSR1(预留信号)、SIGRTMIN(未定义)等,信号在执行了相应的处理函数后,剩下的程序还将正常运行,此时,开发人员容易被产生的信号进入另一个运行顺序中,而忽略了该信号处理函数执行时的上下文。 由于信号是用来处理异步事件的,也就是说,信号处理函数执行的上下文所实现的功能是不确定的,例如,一个运行中的程序在调用某个库函数时,可能会被突如其来的信号中断,库函数会提前出错返回,进而转去执行该信号的处理函数。对于alarm()函数产生信号时,在信号处理后,应用程序并不会终止,还是会继续正常运行,因此在编写此类信号处理函数时,需要特别的小心,防止破坏应用程序的正常运行。 因此,在程序中使用信号做相应的事件处理时,往往需要遵循一些规则,才能有效

文档评论(0)

558955999 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档