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

3.3.3+信号(Signal)处理.pdf

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

3.3.3 信号(Signal)处理 信号(signal)是向进程发送的软件通知,通知进程有事件发生。引发信号的事件发生时,信 号就被生成(generate)了。进程根据信号采取行动时,信号就被传递(deliver)了。信号的 寿命(lifetime)就是信号的生成和传递之间的时间间隔。已经生成但还未被传递的信号被称 为挂起(pending)的信号。在信号生成和信号传递之间可能会有相当长的时间。传递信号时, 进程必须在处理器上运行。 如果在传递信号时,进程执行了信号处理程序(signal handler),那么进程就捕捉(catch) 到了这个信号。程序可以使用用户编写的函数名作为参数调用 sigaction来安装用户自定义 的信号处理程序;或者以 SIG_DFL或 SIG_IGN作为参数调用 sigaction函数,SIG_DFL表示 采取默认的动作,SIG_IGN表示忽略信号,这两个动作都不是在“捕捉”信号。如果将进程 设置为忽略(ignore)某个信号,那么在传递时那个信号就会被丢弃,不会对进程产生影响。 信号生成时所采取的动作取决于那个信号当前使用的信号处理程序和进程信号掩码 (process signal mask)。信号掩码中包含一个当前被阻塞信号(blocked signal)的列表。 阻塞一个信号很容易和忽略一个信号混淆起来。被阻塞的信号不会像被忽略的信号一样被丢 弃。如果一个挂起信号被阻塞了,那么当进程解除了对那个信号的阻塞时,信号就会被传递 出去。程序通过调用 sigprocmask 改变它的进程信号掩码来阻塞一个信号,而通过调用 sigaction将信号处理程序设置为 SIG_IGN来忽略一个信号。 注意,信号最初是在多进程系统中引入,而本节的重点在于讲述多线程系统中如何处理信号。 本节所涉及的函数、数据类型和宏定义都需要使用 signal.h头文件。 3.3.3.1 产生信号 每个信号都有一个以 SIG开头的符号名。信号的名字都定义在 signal.h中,任何一个使用 了信号的 C 程序中都要包含这个文件。信号的名字都是某个大于 0 的小整数的宏定义。表 3.10中描述了必须的 POSIX信号,并列出了它们的默认行为。有两个信号 SIGUSR1和 SIGUSR2 是提供给用户使用的,没有预先指定的用途。出现某些错误时,会产生诸如 SIGFPE或 SIGSEGV 这样的信号,其它的信号是由 alarm这样特殊的调用产生的。 信号 描述 默认行为 SIGABRT 进程放弃 与实现有关 SIGALRM 报警时钟 为正常终止 SIGBUS 访问了内存对象中的未定义 部分 与实现有关 SIGCHLD 子进程被终止、停止或继续 忽略 SIGCONT 如果进程被停止了,本信号使 进程继续执行 继续 SIGFPE 算术计算中出现了被零除的 错误 与实现有关 SIGHUP 在控制终端或进程上挂起或 非正常终止 终止 SIGILL 无效的硬件指令 与实现有关 SIGINT 交互终端提示信号(通常是 Ctrl-C) 非正常终止 SIGKILL 终止(不能被捕获或忽略) 非正常终止 SIGPIPE 向一个没有读程序的管道写 入 非正常终止 SIGQUIT 交互终端终止:信息转储(通 常为 Ctrl-L) 与实现有关 SIGSEGV 无效的内存引用 与实现有关 SIGSTOP 执行停止(不能被捕捉或忽 略) 停止 SITTERM 终止 非正常终止 SIGTSTP 终端停止 停止 SIGTTIN 后台进程试图进行读操作 停止 SIGTTOU 后台进程试图进行写操作 停止 SIGURG 在套接字上有高带宽数据 忽略 SIGUSR1 用户定义的信号 1 非正常终止 SIGUSR2 用户定义的信号 2 非正常终止 表 3.10 POSIX信号 调用 kill函数可以向指定进程发送指定的信号,调用 raise函数可以使进程向自己发送指 定的信号,调用 alarm函数可以使进程向自己在经过指定的秒数之后发送 SIGALRM信号。由 于这些函数不属于本节的主题,在此不详细介绍,感兴趣的读者可以自己查询这些函数的相 关资料。 3.3.3.2 对信号掩码和信号集进行操作 如前所述,进程可以通过阻塞信号暂时地阻止信号的传递。在传递之前,被阻塞的信号不会 影响进程的行为。进程的信号掩码(signal mask)给出了一个信号集合,对哪些信号进行阻 塞需要通过信号掩码进行设置。信号掩码的类型为 sigset_t。 信号集由下面的五个函数来操作。每个函数的第一个参数都是一个指向 sigset_t的指针。 sigaddset负责将 signo加入信号集

文档评论(0)

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

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

1亿VIP精品文档

相关文档