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

06-信号的同步生成和异步生成

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

22.5 信号的同步生成和异步生成

前文已然论及,进程一般无法预测其接收信号的时间。要证实这一点,需要对信号的同步生成和异步生成加以区分。

截止目前所探讨的均属于信号的异步生成,即引发信号产生(无论信号发送者是内核还是另一进程)的事件,其发生与进程的执行无关。(例如,用户输入中断字符,或者子进程终止。)对于异步产生的信号,本节起始处的论断并非虚言。

然而,有时候信号的产生是由进程本身的执行造成的,前面就曾提及两个这样的例子。

  • 执行特定的机器语言指令,可导致硬件异常,并因此而产生22.4节所述的硬件产生信号(SIGBUS、SIGFPE、SIGILL、SIGSEGV和SIGEMT)。
  • 进程可以使用raise()、kill()或者killpg()向自身发送信号。

在这些情况下,信号的产生就是同步的——会立即传递信号(除非该信号遭到阻塞,但还要参考22.4节就阻塞硬件产生信号而展开的讨论)。换言之,本节开始处的论断则并不成立。对于同步产生的信号而言,其传递不但可以预测,而且可以重现。

注意,同步是对信号产生方式的描述,并不针对信号本身。所有的信号既可以同步产生(例如,进程使用kill()向自身发送信号),也可以异步产生(例如,由另一进程使用kill()来发送信号)。