【问题标题】:What does it mean when a signal is ignored?忽略信号是什么意思?
【发布时间】:2020-06-12 10:55:53
【问题描述】:

信号被忽略是什么意思?

【问题讨论】:

标签: signals


【解决方案1】:

SIGTERM 用于通知进程它必须停止执行,然后进程决定做什么,通常是清理资源并和平停止其执行,因此这 3 个场景取决于进程开发人员。

如果你想杀死一个进程,无论如何,你必须使用 SIGKILL kill -9,它甚至不会传递给正在运行的进程。

【讨论】:

    【解决方案2】:

    Linux 中的信号处理是通过 glibc 系统调用库“在幕后”完成的。根据gnu library documentation

    SIGTERM 信号是用于导致程序终止的通用信号。与 SIGKILL 不同,此信号可以被阻止、处理和忽略。这是礼貌地要求程序终止的正常方式。

    我将尝试在下面定义术语 blockedhandledignored(代码示例不包括错误处理,因此注意):

    已屏蔽: 在 Linux 中运行的每个进程在进程创建时都会被赋予一个信号掩码。 sigprocmask 函数调用可用于阻塞或解除阻塞信号 - 阻塞的信号被排队,以便稍后在进程解除阻塞时对其进行处理。例如,使用与标准信号相关的系统调用(来自 The Linux Programming Interface,Michael Kerrisk)来阻止 SIGTERM -

        sigset_t blockSet, savedSigMask;
        sigemptyset(&blockSet); /* initialize empty */
        sigaddset(&blockSet, SIGTERM);
        sigprocmask(SIG_BLOCK, &blockSet, &savedSigMask);
    
    /* process will not be interrupted by SIGTERM, which can be restored later*/
    

    忽略: 类似地,可以使用 sigaction 系统调用和 SIG_IGN 标志忽略信号 - 即进程在接收到信号时不会被中断,并且信号不会排队 - 通过使用系统调用 sigaction

    struct sigaction sa;
    sa.sa_handler = SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_NODEFER; /* Dont block the signal when it's handler is running */
    sigaction(SIGTERM, &sa, NULL);
    

    已处理: sigaction 也可用于定义接收信号时调用的函数。这是接收 SIGTERM 的最佳实践,允许您的进程正常关闭。

    struct sigaction sa;
    sa.sa_sigaction = functionp; /* functionp is your handler function */
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_NODEFER | SA_SIGINFO;
    sigaction(signo, &sa, NULL; 
    

    您可以为 SIGTERM 使用信号处理程序,这样它就不会导致您的进程退出,但这通常不是 SIGTERM 处理程序的用途。另一件需要注意的事情是,在运行 systemd 的系统上,systemd 将向接收到 SIGTERM 的程序发送 KILL 信号然后不退出,因此为了防止 systemd 必须配置为允许您的进程忽略 SIGTERM。

    【讨论】:

    • @linuxuser 所以,纯粹假设,假设 chrome 即将进行一些输入/输出,比如从套接字读取;并且它不想被打断:它阻塞了 SIGTERM,打算稍后恢复它;但是当 SIGTERM 被阻塞时,它会崩溃:此时发送 SIGTERM 将不起作用,现在只有 SIGKILL 可以终止进程。
    • 好的,没问题,但如果这是一个大问题,最好提出一个新问题:)
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2010-09-29
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多