0

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

4

1 回答 1

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;
于 2019-03-07T00:44:16.733 回答