如何修复信号处理程序分配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修复信号处理程序分配相关的知识,希望对你有一定的参考价值。

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

void handler(int number, signinfo_t, void *ignore){
    printf("Signaling %d
", 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吗?我想修复警告

答案

您正在将处理函数分配给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参数函数分配给sig.sa_sigaction

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

以上是关于如何修复信号处理程序分配的主要内容,如果未能解决你的问题,请参考以下文章

如何修复空白片段?

如何使用导航架构组件修复动态功能模块中片段的发布版本中的ClassNotFoundException?

为啥此代码不起作用以及如何修复它?

颤动如何修复权限处理程序错误

如何从片段 KOTLIN 中调用意图 [重复]

如何修复('throw er; //未处理'错误'事件')代码生命周期?