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

标签 c linux signals handler sigaction

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

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?我想修复警告

最佳答案

您将处理函数分配给了错误的 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;

关于c - 如何修复信号处理程序分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55034028/

相关文章:

c++ - g+++strncat : might overflow destination buffer

c++ - 不同编译器的不同输出 - C 和 C++

c++ - 如何检查特定路径中不在 CWD 中的目录?

linux - 内核中特定于进程的数据

Linux 内核 inode 时间戳

linux - 如何grep遍历许多相同文件类型的文件

c - 如何fork最年轻的进程

bash:为什么我不能在后台 shell 中为 SIGINT 设置陷阱?

r - 如何将频谱图矩阵转换为WAV文件

c - 目标文件和可执行文件的反汇编差异