我想在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()调用中尝试用18替换SIGTSTP。它不起作用。
有什么想法吗? 谢谢你的时间。
答案 0 :(得分:2)
您故意通过
阻止SIGTSTP
向您的流程投放
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_SETMASK, &mask, NULL);
带有sigprocmask
的 SIG_SETMASK
设置了阻止信号的掩码。移除对sigprocmask
的呼叫,应该发送信号。
另一件事是在填写之前将act
归零:
memset(&act, 0, sizeof(act));
答案 1 :(得分:0)
最可能的原因是您没有将struct sigaction act
设置为零。它将充满随机堆栈值。
使用struct sigaction act = {};
或memset(&act, 0, sizeof(act))
仔细检查我的memset参数顺序是否正确。我有时会混淆它。