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

Linux/UNIX网络编程 甘刚 第12章信号量编程新.ppt

Linux/UNIX网络编程 甘刚 第12章信号量编程新.ppt

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
sigsuspend函数 上面已经说明,更改进程的信号屏蔽字可以阻塞或解除阻塞所选择的信号。使用这种技术可以保护不希望由信号中断的代码临界区。如果希望对一个信号解除阻塞,然后 pause以等待以前被阻塞的信号发生,则又将如何呢?假定信号是SIGINT,实现这一点的一种不正确的方法是:如果在解除对SIGINT的阻塞和 pause之间产生了SIGINT信号,则此信号被丢失。这是早期的不可靠信号机制的另一个问题。为了纠正此问题,需要在一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠,这种功能是由sigsuspend()函数提供的。 # includesignal.h int sigsuspend (const sigset t, *sigmask); 返回:-1,errno设置为EINTR。 进程的信号屏蔽字设置为由sigmask指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程也被挂起;如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且该进程的信号屏蔽字设置为调用 sigsuspend之前的值。 abort函数 前面已提及abort()函数的功能是使程序异常终止。 #includestdlib.h void abort (void); 此函数将SIGABRT信号发送给调用进程。进程不应忽略此信号。 ANSI C要求若捕捉到此信号而且相应信号处理程序返回,abort()仍不会返回到其调用者。如果捕捉到此信号,则信号处理程序不能返回的唯一方法是它调用exit()、_exit()、longjmp()或siglongjmp()。POSIX.1也说明abort覆盖了进程对此信号的阻塞和忽略。让进程捕捉 SIGABRT的意图是:在进程终止之前由其执行所需的清除操作。如果进程并不在信号处理程序中终止自己,POSIX.1说明当信号处理程序返回时,abort()终止该进程。 system函数 POSIX.2要求system()忽略SIGINT和SIGQUIT,阻塞SIGCHLD。 sleep函数 sleep函数的原型如下: # includeunistd.h unsigned int sleep(unsigned int); 返回:0或未睡的秒数。 此函数使调用进程被挂起直到: (1)已经过了seconds所指定的时间。 (2)该进程捕捉到一个信号并从信号处理程序返回。 在线教务辅导网: 更多课程配套课件资源请访问在线教务辅导网 第12章 信号量编程 知识点: 信号量的作用以及常见的信号量介绍 与信号量有关的常见函数使用方法 信号的概念 除了在正常方式下运行客户及服务器外,还要检查此例的许多边界条件:客户和服务器都启动时是什么情况;如果服务器主机崩溃则客户又会是什么情况等。通过观察这些情况,弄清网络层次发生的一些事情,以及它们是如何反映到套接口API的,将对这些层次的工作原理有更多的认识,并知道如何编写应用代码来处理这些情形。这些就是各种信号出现后应该解决的问题。 信号是发生某事件时对进程的通知,有时称为软中断。它一般是异步的,这就是说,进程不可能提前知道信号发生的时间。 每个信号都有一个处理办法(disposition),也称为与信号相关联的行为(action)。通过调用函数sigaction()来设置一个信号的处理办法,并有3个选择。 (1)可以提供一个情报函数,在信号发生时随即调用。这个函数称为信号处理程序(signal handler),而此行为则称为捕获(catching)信号。有两个信号不能被捕获,即SIGKILL和SIGSTOP。函数由信号值这个单一的整数参数来调用且无返回值,所以其函数原型为: void handler (int signo); 对于多数信号来说,调用函数sigaction()并指定信号发生时调用的函数是捕获信号所需的所有事情,但稍后将看到,有些信号(如SIGIO、SIGPOLL和SIGURG)还要求捕获它们的进程要在指定调用函数后进行其他相关操作。 (2)可以通过设置信号的处理办法为SIG_IGN来忽略它,但SIGKILL和SIGSTOP这两个信号不能忽略。 (3)可以设置信号的处理办法为SIG_DFL来设置默认处理办法。一般地说,默认处理办法是在接收到信号时终止进程,特定信号还在当前工作目录产生一个进程的核心映像。个别信号的默认处理办法是忽略,例如SIGCHLD和SIGURG,就是要用的默认处理办法是忽略的两个信号。 每个信号都有一个名字,这些名字都以3个字符SIG开头,不同的操作系统有不同数目的信号。一般在头文件signal.h中,这些信号都被定义为正整数(信号编号)。没有一个信号编号为0,因为kill函数对信

您可能关注的文档

文档评论(0)

精品课件 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档