不可靠的信号-鸿鹄论坛_华为认证h35-211-hcnp-access network题库
在早期的UNIX版本中(例如V7),信号是不可靠的。不可靠在这里指的是,信号可能会被丢失——一个信号发生了,但进程却决不会知道这一点。那时,进程对信号的控制能力也很低,它能捕捉信号或忽略它,但有些很需要的功能它却并不具备。例如,有时用户希望通知内核阻塞一信号——不要忽略该信号,在其发生时记住它,然后在进程作好了准备时再通知它。这种阻塞信号的能力当时并不具备。
4.2BSD对信号机构进行了更改,提供了被称之为可靠信号的机制。然后,SVR3也修改了信号机制,提供了另一套系统V可靠信号机制。POSIX.1选择了BSD模型作为其标准化的基础。早期版本中的一个问题是在进程每次处理信号时,随即将信号动作复置为默认值。由于早期的C语言版本不支持ANSI C的void数据类型,所以将信号处理程序说明为int类型。
这种代码段的一个问题是:在信号发生之后到信号处理程序中调用signal函数之间有一个时间窗口。在此段时间中,可能发生另一次中断信号。第二个信号会造成执行默认动作,而对中断信号则是终止该进程。这种类型的程序段在大多数情况下会正常工作,使得我们认为它们正确,而实际上却并不是如此。这些早期版本的另一个问题是:在进程不希望某种信号发生时,它不能关闭该信号。进程能做的就是忽略该信号。有时希望通知系统“阻止下列信号发生,如果它们确实产生了,请记住它们。”
这种问题的一个经典实例是下列程序段,它捕捉一个信号,然后设置一个表示该信号已发生的标志:
#include
#include
int signal_occurred = 0;
void handler(int signo) {
signal_occurred = 1;
}
int main() {
signal(SIGINT, handler);
while (!signal_occurred) {
// Do some work
}
printf("Signal occurred!\n");
return 0;
}
在这一过程中,UNIX和POSIX API的演变为开发者提供了更强大的工具和灵活性,促进了更加可靠和健壮的应用程序开发。
有关POSIX线程编程的更多信息,可以参考以下链接:
下载地址
用户评论