是否可以终止不响应信号的程序?

Is it possible to terminate a program that doesn't respond to signals?

考虑这段代码

#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 终止这个程序。

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

如评论中所述,答案是"no",您无法构建这样的程序。标准 (The Open Group Base Specifications Issue 7) 列出了这些不可忽略的信号:

  • SIGKILL
  • SIGSTOP

您无法处理 SIGKILL,因此有可能终止程序。 内核向进程发送信号 "handed off",因此从进程 A 向进程 B 发送信号会使用内核。当 SIGKILL 被传递给内核并且没有传递给进程时。所以内核完成了工作并终止了进程。