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

时间:2015-01-31 02:22:42

标签: linux signals

我想在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。它不起作用。

有什么想法吗? 谢谢你的时间。

2 个答案:

答案 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参数顺序是否正确。我有时会混淆它。