【问题标题】:Is it possible to terminate a program that doesn't respond to signals?是否可以终止不响应信号的程序?
【发布时间】:2015-03-21 16:24:49
【问题描述】:

考虑这段代码

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void sig_handler(int signum)
{
    printf("Received signal %d\n", signum);
}

int main()
{
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);
    signal(SIGHUP, sig_handler);
    signal(SIGQUIT, sig_handler);
    signal(SIGABRT, sig_handler);
    signal(SIGILL, sig_handler);
    signal(SIGKILL, sig_handler);
    signal(SIGFPE, sig_handler);
    signal(SIGSEGV, sig_handler);
    signal(SIGPIPE, sig_handler);
    signal(SIGALRM, sig_handler);
    signal(SIGCHLD, sig_handler);
    signal(SIGUSR1, sig_handler);
    signal(SIGUSR2, sig_handler);
    signal(SIGSTOP, sig_handler);
    sleep(10); 
    return 0;
}

它处理所有可能的信号。我们不能使用killall program_name 杀死这个程序。

是否可以在不重新启动计算机的情况下终止它?如何终止?

【问题讨论】:

  • SIGKILL (-9) 可以解决问题 - 总是
  • @EdHeal,我忘记将其包含在内以进行处理。现在可以解决问题了吗?
  • 当然可以终止,想象一下拦截所有信号的程序可能造成的损害。内核具有强制终止进程的能力。
  • 你无法捕捉到那个信号
  • @juanchopanza - 它不会终止进程。

标签: c unix signals


【解决方案1】:

如 cmets 中所述,答案是“否”,您不能构造这样的程序。标准 (The Open Group Base Specifications Issue 7) 列出了这些不容忽视的信号:

  • SIGKILL
  • 信号停止

【讨论】:

  • “否”不是这个问题的答案。答案是“是的,你可以用kill -9 杀死这个程序。”
【解决方案2】:

您无法处理 SIGKILL,因此可以终止程序。 信号由内核“传递”给进程,因此将信号从 processA 发送到 processB 使用内核。当 SIGKILL 被传递给内核并且没有被传递给进程时。所以内核完成了这项工作并终止了进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多