SIG_DFL在编译时抛出警告,在执行时被OS忽略

时间:2014-05-17 11:02:48

标签: c linux signals bsd

我有一个小问题,对我来说很奇怪。我写了这段代码来处理信号。

void sig_install(wlist *arg)
{
    struct sigaction sigstruct;
    //Doing stuff
    sigstruct.sa_handler = &handlerfunc;
    sigstruct.sa_flags = SA_RESTART;
    sigaction(sig, &sigstruct, NULL)
}

这个工作得很好。我不得不定义

#define _POSIX_C_SOURCE 200809L

解决SA_RESTART-flag(我的教授告诉我使用它)。 我的问题如下:我到处读到我可以使用SIG_DFL和sigaction为我的信号安装defaulthandler,如:

void sig_uninstall(wlist *arg)
{
    //Do stuff
    if (sigaction(sig, SIG_DFL, NULL) == 0)
        printf("Signalhandler deleted!\n");
    else
        printf("Signalhandler could not be deleted!\n");
}

但是当我编译它时,我收到SIG_DFL参数的警告:

»const struct sigaction * __restrict__« expected, but Argument is type »void (*)(int)«

当我执行程序时,sigaction()返回0表示成功,但是当我发送信号时,我的signalhandler仍然不是默认值。

标题中的定义是:

#define SIG_DFL ((__sighandler_t) 0)        /* Default action.  */
# define SA_RESTART   0x10000000 /* Restart syscall on signal return.  */
/* Get and/or set the action for signal SIG.  */
extern int sigaction (int __sig, __const struct sigaction *__restrict __act,
          struct sigaction *__restrict __oact) __THROW;

我在mandb中读到SA_RESTART刚用于BSD。这可能是问题吗?是否有一个替代标志的Linux?(在大学我们必须使用BSD,但在家里我使用Linux)。非常感谢你的时间。

1 个答案:

答案 0 :(得分:2)

您需要将sa_handler的{​​{1}}(伪)成员设置为struct sigaction,而不是SIG_DFL本身。

或者,只需使用struct sigaction *