我有一个小问题,对我来说很奇怪。我写了这段代码来处理信号。
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)。非常感谢你的时间。
答案 0 :(得分:2)
您需要将sa_handler
的{{1}}(伪)成员设置为struct sigaction
,而不是SIG_DFL
本身。
或者,只需使用struct sigaction *
。