不可靠信号API - 代码无法按预期工作

时间:2010-02-19 11:39:24

标签: c linux signals unix

基本上,预期输出是它捕获KeyboardInterrupt 5次并退出第6次。(如果 handler()的第1行未注释

  

现在,如果我也评论那条线,那么   程序的行为也没有   即使我正在使用,也会改变   不可靠的API。

由于我使用了signal()函数,在第一次调用handler()之后这是不可靠的bcos,因此SIGINT将具有默认行为,那就是退出a.out ..

程序在5 ^ C之后仍然退出..为什么? **

  

即使没有,代码也能正常工作   恢复处理程序()。为什么呢?

**

/* ursig1.c */
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static int count = 0;
void handler(int signo) {
//  signal(SIGINT,handler);
    /* Re-instate handler */
    ++count;
    /* Increment count */
    write(1,"Got SIGINT\n",11); /* Write message */
}
int
main(int argc,char **argv) {
    signal(SIGINT,handler);
    /* Register function */
    while ( count < 5 ) {
        puts("Waiting for SIGINT..");
        sleep(4);
        /* Snooze */
    }
    puts("End.");
    return 0;
}

1 个答案:

答案 0 :(得分:4)

Portability 部分下阅读signal(2)的Linux手册页,其中讨论了许多不同版本的Unix中信号(2)的变化行为。特别是,

  

在原始的Unix系统中,当一个   使用。建立的处理程序   signal()被调用   传递信号,处置   信号将被重置为   SIG_DFL,系统没有   阻止进一步的实例   信号。 System V还提供   signal()的这些语义。

这是您期望的行为,但它不是Linux提供的,正如POSIX.1所允许的那样。您应该使用sigaction(2)来安装信号处理程序,以获得可移植和定义的行为。