首页 > 解决方案 > sigaction 只捕获一次信号

问题描述

考虑以下代码:

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

    void catch ()
    {
        printf("hi\n");
    }
    int main()
    {
        struct sigaction act;
        act.sa_handler = catch;
        sigaction(SIGINT, &act, NULL);
        for(;;);
        return 0;
    }

当这个程序运行时。我第一次按CTRL-C时,它会打印“hi”。
但是第二次程序退出。这可能是什么原因?
我想要的是程序在每次发出信号时都会捕获它。

标签: clinuxsignalssignal-handlingsigaction

解决方案


如果您不使用任何 SA_FLAG 来明确定义“第一次捕获信号后要做什么”的行为,它应该可以工作。

清除sigaction的内容,然后初始化。

memset(&act,0,sizeof(act)); // clear contents first
act.sa_handler = catch;
sigaction(SIGINT, &act, NULL);

请参阅sigaction(2)

此外,正如 Daniel 指出的那样,不要在信号处理程序中使用 printf。参见信号安全(7)

如果你想打印一些东西,或者只是在你的信号处理程序中做一些事情,你必须使用信号安全函数。在您的情况下,您可以使用 write() 系统调用,而不是使用 printf。见write(2)

经过,

write(1,"hi\n",3); // 1 means standard out.

推荐阅读