sigaction句柄信号只需一次

时间:2016-11-01 19:19:17

标签: c signals sigaction

有没有办法用sigaction结构和功能捕获一次信号?更具体地说,我想简单地重置为默认特定信号(SIGINT)。是否有可能在处理程序中实现这一点?

修改

所以,这样的事情是正确的:

void sig_int(int sig)
{
    printf(" -> Ctrl-C\n");
    struct sigaction act;
    act.sa_handler = SIG_DFL;

    if(sigaction(SIGINT, &act, NULL) < 0)
    {
        exit(-1);
    }

}

int main()
{
    struct sigaction act;
    act.sa_handler = sig_int;

    if(sigaction(SIGINT, &act, NULL) < 0)
    {
        exit(-1);
    }

    while(1)
    {
        sleep(1);
    }

    return 0;   
}

3 个答案:

答案 0 :(得分:4)

sa_flags struct sigaction成员中设置的

The standard SA_RESETHAND flag就是这样做的。

在指定SIGINT处理程序时设置该标志,并且在进入时处理程序将重置为SIG_DFL。

答案 1 :(得分:1)

是的,您可以在信号处理程序中调用sigaction。由Posix指定的,(在XBD chapter 2.4.3)&#34;中定义了一组异步信号安全的函数。&#34;然后它注意到&#34;应用程序可以无限制地调用信号捕获功能。 &#34 ;. sigaction()列在该列表中。

答案 2 :(得分:1)

只需恢复程序中的默认操作。

struct sigaction old;
void sig_int(int sig)
{
        printf(" -> Ctrl-C\n");

        if(sigaction(SIGINT, &old, NULL) < 0)
        {
                exit(-1);
        }

}

int main()
{
        struct sigaction act;
        act.sa_handler = sig_int;

        if(sigaction(SIGINT, &act, &old) < 0)
        {
                exit(-1);
        }

        while(1)
        {
                sleep(1);
        }

        return 0;
}