为什么我的信号处理程序不工作?
Why is my signal handler not working?
我想在 Linux 上处理信号 SIGTSTP (18)。这是我的代码:
void handler(int signum){
printf("Signal %d has tried to stop me.", signum);
}
int main(void){
struct sigaction act;
sigset_t mask;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(&mask);
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_SETMASK, &mask, NULL);
sigaction(SIGTSTP, &act, NULL);
pause();
}
当我以这种方式从另一个终端发送信号时:
$ kill -18 PID
handler() 函数没有 运行。
我已经尝试在对 sigaction() 的调用中将 SIGTSTP 替换为 18。没用。
有什么想法吗?
谢谢你的时间。
您通过
故意阻止 SIGTSTP
传送到您的进程
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_SETMASK, &mask, NULL);
sigprocmask
和 SIG_SETMASK
设置屏蔽 block 信号。移除对 sigprocmask
的调用,信号应该被传递。
另一件事是在填写之前将 act
归零:
memset(&act, 0, sizeof(act));
最可能的原因是您没有将 struct sigaction act
设置为零。它将充满随机堆栈值。
使用 struct sigaction act = {};
或 memset(&act, 0, sizeof(act))
修复它
仔细检查我的 memset 参数顺序是否正确。我有时会把它搞混。
我想在 Linux 上处理信号 SIGTSTP (18)。这是我的代码:
void handler(int signum){
printf("Signal %d has tried to stop me.", signum);
}
int main(void){
struct sigaction act;
sigset_t mask;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(&mask);
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_SETMASK, &mask, NULL);
sigaction(SIGTSTP, &act, NULL);
pause();
}
当我以这种方式从另一个终端发送信号时:
$ kill -18 PID
handler() 函数没有 运行。 我已经尝试在对 sigaction() 的调用中将 SIGTSTP 替换为 18。没用。
有什么想法吗? 谢谢你的时间。
您通过
故意阻止SIGTSTP
传送到您的进程
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_SETMASK, &mask, NULL);
sigprocmask
和 SIG_SETMASK
设置屏蔽 block 信号。移除对 sigprocmask
的调用,信号应该被传递。
另一件事是在填写之前将 act
归零:
memset(&act, 0, sizeof(act));
最可能的原因是您没有将 struct sigaction act
设置为零。它将充满随机堆栈值。
使用 struct sigaction act = {};
或 memset(&act, 0, sizeof(act))
仔细检查我的 memset 参数顺序是否正确。我有时会把它搞混。