当前位置:嗨网首页>书籍在线阅读

13-信号

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.11 信号

尽管上一节将信号视为 IPC 的方法之一,但其在其他方面的广泛应用则更为普遍,因此值得深入讨论。

人们往往将信号称为“软件中断”。进程收到信号,就意味着某一事件或异常情况的发生。信号的类型很多,每一种分别标识不同的事件或情况。采用不同的整数来标识各种信号类型,并以SIGxxxx形式的符号名加以定义。

内核、其他进程(只要具有相应的权限)或进程自身均可向进程发送信号。例如,发生下列情况之一时,内核可向进程发送信号。

  • 用户键入中断字符(通常为Control-C)。
  • 进程的子进程之一已经终止。
  • 由进程设定的定时器(告警时钟)已经到期。
  • 进程尝试访问无效的内存地址。

在shell中,可使用kill命令向进程发送信号。在程序内部,系统调用kill()可提供相同的功能。

收到信号时,进程会根据信号采取如下动作之一。

  • 忽略信号。
  • 被信号“杀死”。
  • 先挂起,之后再被专用信号唤醒。

就大多数信号类型而言,程序可选择不采取默认的信号动作,而是忽略信号(当信号的默认处理行为并非忽略此信号时,会派上用场)或者建立自己的信号处理器。信号处理器是由程序员定义的函数,会在进程收到信号时自动调用,根据信号的产生条件执行相应动作。

信号从产生直至送达进程期间,一直处于挂起状态。通常,系统会在接收进程下次获得调度时,将处于挂起状态的信号同时送达。如果接收进程正在运行,则会立即将信号送达。然而,程序可以将信号纳入所谓“信号屏蔽”以求阻塞该信号。如果产生的信号处于“信号屏蔽”之列,那么此信号将一直保持挂起状态,直至解除对该信号的阻塞。(亦即从信号屏蔽中移除。)