10.4 不可靠的信号在早期的UNIX版本中(例如V7),信号是不可靠的。不可靠在这里指的是,信号可能会被丢失——一个信号发生了,但进程却决不会知道这一点。那时,进程对信号的控制能力也很低,它能捕捉信号或忽略它,但有些很需要的功能它却并不具备。例如,有时用户希望通知内核阻塞一信号——不要忽略该信号,在其发生时记住它,然后在进程作好了准备时再通知它。这种阻塞信号的能力当时并不具备。
4.2 BSD对信号机构进行了更改,提供了被称之为可靠信号的机制。然后,SVR3也修改了信号机制,提供了另一套系统V可靠信号机制。POSIX.1选择了BSD模型作为其标准化的基础。早期版本中的一个问题是在进程每次处理信号时,随即将信号动作复置为默认值(在前面运行程序10-1时,我们通过只捕捉每种信号各一次避免了这一点)。以下是早期版本中关于如何处理中断信号的经典实例的代码:由于早期的C语言版本不支持ANSI C的void数据类型,所以将信号处理程序说明为int类型。这种代码段的一个问题是:在信号发生之后到信号处理程序中调用signal函数之间有一个时间窗口。在此段时间中,可能发生另一次中断信号。第二个信号会造成执行默认动作,而对中断信号则是终止该进程。这种类型的程序段在大多数情况下会正常工作,使得我们认为它们正确,而实际上却并不是如此。这些早期版本的另一个问题是:在进程不希望某种信号发生时,它不能关闭该信号。进程能做的就是忽略该信号。有时希望通知系统“阻止下列信号发生,如果它们确实产生了,请记住它们。”这种问题的一个经典实例是下列程序段,它捕捉一个信号,然后设置一个表示该信号已发生的标志。
进一步了解信号处理的机制和实际应用,可以参考以下资源:数字信号处理C语言程序、Linux下C语言编程信号处理以及数字信号处理课程中语言信号处理实验。这些资源提供了丰富的C语言信号处理示例,帮助深入理解信号处理在编程中的应用。
暂无评论