【问题标题】:How to fix Signal Handler assignment如何修复信号处理程序分配
【发布时间】:2019-03-06 23:56:23
【问题描述】:

对于 Linux C 编程,我有这个处理程序和 main 方法:

void handler(int number, signinfo_t, void *ignore){
    printf("Signaling %d\n", si->si_pid);
}

int main(){
    struct sigaction sig;
    sig.sa_flags = SA_SIGINFO;
    sigemptyset(&sig.sa_mask);
    sig.sa_handler = handler // This line has error 

如果我只使用 1 个参数 void handler(int num) 制作处理程序 它工作正常;但是,我将无法使用si->si_pid。我得到的警告是:

 warning: assignment to __sighandler_t from an incompatible pointer type
 -Wincompatible-pointer-types
 sig.sa_handler = handler;

我是否改为sig.sa_action?我想修复警告

【问题讨论】:

  • 注意:您不能在信号处理程序中使用printf()(和朋友)。
  • 您在 handler 函数定义中缺少变量名。你的意思是写siginfo_t *si

标签: c linux signals handler sigaction


【解决方案1】:

您将处理函数分配给 sig 的错误成员。 struct 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);
};

sig.sa_handler 是一个只有一个参数的函数,即信号编号。当您使用SA_SIGINFO 标志时,您需要将3-argument 函数分配给sig.sa_sigaction

int main(){
    struct sigaction sig;
    sig.sa_flags = SA_SIGINFO;
    sigemptyset(&sig.sa_mask);
    sig.sa_sigaction = handler;

【讨论】:

  • 我这样做了,现在它说 struct sigaction 没有名为“sa_action”的成员
  • 这是sa_sigaction,而不是sa_action
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2011-04-23
相关资源
最近更新 更多