用sigaction处理信号

gio*_*ozh 6 c unix signals

我需要用sigaction处理一些信号,但是当我编译我的代码时,我得到这个错误:

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

代码是:

struct sigaction hup_act;
...
hup_act.sa_flags=SA_SIGINFO;
hup_act.sa_sigaction = sighupHandler;
sigaction(SIGHUP, &hup_act, NULL);
Run Code Online (Sandbox Code Playgroud)

警告在hup_act.sa_sigaction分配上.当我将sighup发送到我的应用程序时,此警告会导致分段错误.

alk*_*alk 6

如果SA_SIGINFOstruct sigaction's成员中设置sa_flags使用类型的方法

void signalhandler(int, siginfo_t *, void *);
Run Code Online (Sandbox Code Playgroud)

作为要分配给struct sigaction成员的处理函数sa_sigaction

否则使用类型的方法

void signalhandler(int);
Run Code Online (Sandbox Code Playgroud)

作为要分配给struct sigaction成员的处理函数sa_handler.


Jay*_*Jay 5

你的sighupHandler必须是下面两个中的一个:

void sighupHandler(int) //for sa_handler
Run Code Online (Sandbox Code Playgroud)

要么

void sighupHandler(int, signinfo_t *, void *) //for sa_sigaction which is your case
Run Code Online (Sandbox Code Playgroud)

有关此内容的更多信息,请参阅此处此处

编辑:请参阅下面和我上面建议的链接,以便更清晰.我认为在你的情况下,由于下面建议的常见存储,编译器只生成警告,否则它会产生错误.

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);
};
Run Code Online (Sandbox Code Playgroud)

在某些体系结构中涉及到一个联合:不要分配给两者sa_handlersa_sigaction.

  • `.sa_restorer`已过时且非POSIX.最好不要在示例中包含它. (2认同)