信号
信号时事件发生时对进程的通知机制。有时也称为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间。
一个进程能够向另一个进程发送信号,信号的这个用法可以作为进程间通信。进程也可以向自身发送信号。然而,发往进程的诸多信号,通常都是源于内核。引发内核为进程产生信号的各类事件如下。
-
硬件异常:硬件检测到一个错误条件并通知内核,随即再有内核发送相应信号给相关进程。硬件异常的例子包括执行一条异常的机器语言指令,例如,被0除,或者引用无法访问的内存区域。
-
用户键入了能够产生信号的终端特殊字符。其中包括中断字符(通常是Control-C)
-
发生了软件事件。例如,针对文件描述符的输出变为有效,调整了终端窗口大小,定时器到期,进程执行的CPU事件超限,或者该进程的某个子进程退出。
总结
信号是发生某种事件的通知机制,可以由内核、另一进程或进程自身发送给进程。存在一系列的标准信号类型,每种都有唯一的编号和目的。
信号传递通常是异步行为,这意味着信号中断进程执行的位置是不可预测的。有时(比如,硬件产生的信号),信号也可以同步传递,这意味着在程序执行的某一点可以于其并重现信号的传递。
默认情况下,要么忽略信号,要么终止进程(生成或者不生成核心转储文件),要么停止一个正在运行的进程,要么重启一个已停止的进程。特定的默认行为取决于信号类型。此外,程序可以使用signal()或者sigaction()来显式忽略一个信号,或者建立一个由程序员自定义的信号处理器。
一个进程可以使用kill()向另一进程发送信号。发送空信号(0)是判断特定进程ID是否在用的方式之一。
每个进程都具有一个信号掩码,代表当前传递遭到阻塞的一组信号。使用sigprocmask()可从信号掩码中添加或者移除信号。
网友评论