对于 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/