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

标签 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() 的调用中将 SIGTSTP 替换为 18。它不起作用。

有什么想法吗? 感谢您的宝贵时间。

最佳答案

您故意阻止将 SIGTSTP 传递给您的进程

sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_SETMASK, &mask, NULL);

sigprocmaskSIG_SETMASK 设置掩码以阻止 信号。删除对 sigprocmask 的调用,信号应该被传送。

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

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

关于linux - 为什么我的信号处理程序不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247501/

相关文章:

c# - 如何使用 MonoDevelop 打包我的 linux 应用程序?

linux - 什么是 systemd PID 文件?

Linux/64 位/LARGEADDRESSAWARE 等效项

linux - 在 Java 5 中设置文件权限

c - 即使有信号,fork/exec 也会离开僵尸进程

linux - 64位版本的socketcall系统调用Linux

linux - 无法将信号 SIGINT 发送到在脚本内创建的进程

perl - 在 Perl 5 中,我如何获得向我发送信号的进程的 pid?

c - sigaction 和 signal 有什么区别?

swift - 线程 1 : signal SIGTERM (in swift) when changing hardware in IOS simulator