不可靠的信号-hds ams 2500用户手册
10.4 不可靠的信号
在早期的 UNIX 版本中(例如 V7),信号是不可靠的。不可靠在这里指的是,信号可能会被丢失——一个信号发生了,但进程却决不会知道这一点。那时,进程对信号的控制能力也很低,它能捕捉信号或忽略它,但有些很需要的功能它却并不具备。有时用户希望通知内核阻塞一信号——不要忽略该信号,在其发生时记住它,然后在进程作好了准备时再通知它。这种阻塞信号的能力当时并不具备。
4.2 BSD 对信号机构进行了更改,提供了被称之为可靠信号的机制。然后,SVR3 也修改了信号机制,提供了另一套系统 V 可靠信号机制。POSIX.1 选择了 BSD 模型作为其标准化的基础。早期版本中的一个问题是在进程每次处理信号时,随即将信号动作复置为默认值(在前面运行程序 10-1 时,我们通过只捕捉每种信号各一次避免了这一点)。
以下是早期版本中关于如何处理中断信号的经典实例的代码:由于早期的 C 语言版本不支持 ANSI C 的 void 数据类型,所以将信号处理程序说明为 int 类型。这种代码段的一个问题是:在信号发生之后到信号处理程序中调用 signal 函数之间有一个时间窗口。在此段时间中,可能发生另一次中断信号。第二个信号会造成执行默认动作,而对中断信号则是终止该进程。这种类型的程序段在大多数情况下会正常工作,使得我们认为它们正确,而实际上却并不是如此。这些早期版本的另一个问题是:在进程不希望某种信号发生时,它不能关闭该信号。进程能做的就是忽略该信号。
有时希望通知系统“阻止下列信号发生,如果它们确实产生了,请记住它们。”这种问题的一个经典实例是下列程序段,它捕捉一个信号,然后设置一个表示该信号已发生的标志:BSD UNIX Toolbox、Unix进程_Unix进程、OS实验一_进程控制和信号处理。
这样的设计是否让人感到困惑?早期的程序设计师不得不应对这些复杂的信号处理问题,而我们今天却可以享受更加可靠和便捷的信号机制。这一切的改变都源于系统的不断演进和改进。
有关进程控制和信号处理的更多详细信息,您可以访问以下链接:BSD.UNIX.Toolbox.2008、unix编程进程控制详细介绍、Wiley BSD UNIX Toolbox May2008、Unix BSD Linux的口令机制初探。这些资源将为您提供更深入的了解,并帮助您掌握复杂的 UNIX 系统概念。