是否可以终止不响应信号的程序?
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 被传递给内核并且没有传递给进程时。所以内核完成了工作并终止了进程。
考虑这段代码
#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 被传递给内核并且没有传递给进程时。所以内核完成了工作并终止了进程。