深入理解linux内核——信号

信号是很短的消息,可以被发送到一个进程或一组进程。发送给进程的唯一信号通常是一个数。

使用信号的两个主要的目的是:

让进程知道已经发生了一个特定的事件。

强迫进程执行它自己代码中的信号处理程序。

信号的一个重要特点是它们可以随时被发送给状态经常不可预知的进程。发送给非运行进程的信息号必须由内核保护,直到进程恢复执行。阻塞一个信号要求信号的传递拖延,直到随后解除阻塞,这使得信号产生一段时间之后才能对其传递这一问题变得更加严重。

因此,内核区分信息传递的两个不同阶段:

信号产生

内核更新目标进程的数据结表示一个新信号已被发送。

信号传递

内核强迫目标进程通过以下方式对信号作出反应:或改变目标进程的执行状态,或开始执行一个特定的信号处理程序,或两者都是。

深入理解linux内核——信号

每个所产生的信号至多被传递一次。信号是可以消费资源:一旦它们已传递出去,进程描述符中有关这个信号的所有信息都被取消。

已经产生但还没有传递的信号称为挂起信号(pending singal)。任何时候,一个进程仅存在给定类型的一个挂起信号,同一进程同种类型的其他信息不被排队,只被简单地丢弃。但是,实时信号是不同的:同种类型的挂起信号可以有好几个。

深入理解linux内核——信号

进程描述符的signal字段指向信号描述符(signal descriptor)-- 一个single_struct类型的结构,用来跟踪共享挂起信号。

除了信号描述符以外, 每个进程还引用一个信号处理程序描述符(signad handler descriplor),它是一个sighand_strust类型的结构,用来描述每个信号必须怎样被线程组处理。

深入理解linux内核——信号

很多内核函数都会产生信号:它们完成信号处理第一步的工作,即根据需要更新一个或多个进程的描述符。它们不直接执行第二步的信号民传递操作,而是可能根据信号的类型和目标进程的状态唤醒一些进程,并促使这些进程接收信号。


分享到:


相關文章: