在C中使用sigaction启用信号处理程序

时间:2011-02-25 04:17:56

标签: c

  struct sigaction psa;

我在main函数中启用了我的信号处理程序,如下所示:

    memset (&psa, 0, sizeof (psa));
    psa.sa_handler = pSigHandler;
    sigaction (SIGALRM, &psa, NULL);
    sigaction(SIGVTALRM, &psa, NULL);
    sigaction(SIGPROF, &psa, NULL);

我的信号处理程序是这样的:

static void pSigHandler(int signo){
    printf("Pareint signum: %d", signo);// debug
    switch (signo) {
        case SIGALRM:
            printf("P SIGALRM handler");//debug
            break;
        case SIGVTALRM:
            printf("P SIGVTALRM handler");//debug
            break;
        case SIGPROF:
            printf("P SIGPROF handler");//debug
            break;
        default: /*Should never get this case*/
            break;
    }
    return;
}

现在我的问题对某些人来说可能是显而易见的,为什么我在运行时看不到打印的调试行?事实上,没有印刷任何东西。非常感谢你帮助我理解这一点。我在Linux上运行它,使用Eclipse进行编程。

1 个答案:

答案 0 :(得分:13)

#include <stdio.h>
#include <signal.h>

static void pSigHandler(int signo){
    switch (signo) {
            case SIGTSTP:
            printf("TSTP");
            fflush(stdout);
            break;
    }
}

int main(void)
{
    struct sigaction psa;
    psa.sa_handler = pSigHandler;
    sigaction(SIGTSTP, &psa, NULL);
    for(;;) {}
    return 0;
}

因为你需要fflush(stdout)

尝试使用C-z

我甚至不确定在信号处理程序中使用stdio是否安全。

更新:http://bytes.com/topic/c/answers/440109-signal-handler-sigsegv

根据该链接,您不应该这样做。