使用sigaction处理信号

6
我需要使用sigaction处理一些信号,但是当我编译我的代码时会出现以下错误信息:

警告:从不兼容的指针类型中分配

代码如下:
struct sigaction hup_act;
...
hup_act.sa_flags=SA_SIGINFO;
hup_act.sa_sigaction = sighupHandler;
sigaction(SIGHUP, &hup_act, NULL);

警告在hup_act.sa_sigaction赋值处。当我向应用程序发送sighup信号时,此警告会导致分段错误。


3
请展示您的 sighupHandler 函数声明。它可能是错误的类型。 - SKi
void sighupHandler(siginfo_t *info) - giozh
1
void sighupHandler(int, siginfo_t *, void *); - Brett Hale
2个回答

6
如果在`struct sigaction`的成员变量`sa_flags`中设置了`SA_SIGINFO`,则使用类型为 `SA_SIGACTION` 的方法。
void signalhandler(int, siginfo_t *, void *);

作为处理函数分配给struct sigaction的成员sa_sigaction,否则使用类型为的方法。
void signalhandler(int);

作为处理程序函数分配给struct sigaction的成员sa_handler


5

您的 sighupHandler 必须是以下两种之一:

void sighupHandler(int) //for sa_handler

或者
void sighupHandler(int, signinfo_t *, void *) //for sa_sigaction which is your case

更多信息请参考这里这里
编辑:为更好的清晰度,请参考下面以及上述建议链接。我认为在您的情况下,由于常见存储建议,编译器只会生成一个警告,否则它将生成一个错误。
sigaction结构被定义为类似以下内容:
struct sigaction {
    void     (*sa_handler)(int);
    void     (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};

在某些架构中涉及到联合体:不要同时赋值给sa_handlersa_sigaction

2
.sa_restorer已经过时且不符合POSIX标准。最好不要在示例中包含它。 - moshbear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接