为什么我的信号处理程序不工作?

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);

sigprocmaskSIG_SETMASK 设置屏蔽 block 信号。移除对 sigprocmask 的调用,信号应该被传递。

另一件事是在填写之前将 act 归零:

memset(&act, 0, sizeof(act));

最可能的原因是您没有将 struct sigaction act 设置为零。它将充满随机堆栈值。

使用 struct sigaction act = {};memset(&act, 0, sizeof(act))

修复它

仔细检查我的 memset 参数顺序是否正确。我有时会把它搞混。