Linux SIGINT与其他终止信号(如SIGTERM、SIGQUIT和SIGKILL)的关系如何?
在POSIX系统上,终止信号通常具有以下顺序(根据许多手册页和POSIX规范):Linux SIGINT与其他终止信号(如SIGTERM、SIGQUIT和SIGKILL)的关系如何?,linux,unix,posix,Linux,Unix,Posix,在POSIX系统上,终止信号通常具有以下顺序(根据许多手册页和POSIX规范): SIGTERM-礼貌地要求流程终止。它将优雅地终止,清理所有资源(文件、套接字、子进程等),删除临时文件等 SIGQUIT-更有力的请求。它应该终止ungraceful,仍然在清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某处写入调试信息;在某些系统上,还将写入内核转储(无论应用程序是否捕捉到信号) SIGKILL-最有力的请求。这个过程甚至没有被要求做任何事情,但是系统会清理这个过程,不管它喜欢与否。很
但是,除了由CRTL+C发送外,本页没有关于SIGINT的有用解释。有什么理由可以用与SIGTERM不同的方式处理SIGINT吗?如果是这样,原因是什么?处理方式会有什么不同?除少数信号外,信号处理程序可以捕获各种信号,或者可以修改接收到信号时的默认行为。有关详细信息,请参见
signal(7)
手册页。使用kill
(系统调用和实用程序都可以向任何进程发送几乎任何信号,只要您获得了许可。进程无法区分信号是如何产生的以及是谁发送的
这就是说,SIGINT实际上意味着发出Ctrl-C中断信号,而SIGTERM是通用终端信号。没有信号“更有力”的概念,唯一的例外是存在无法阻止或处理的信号(根据手册页,SIGKILL和SIGSTOP)
就接收过程如何处理信号(以及该信号的默认操作)而言,一个信号只能比另一个信号“更有力”。例如,默认情况下,SIGTERM和SIGINT都会导致终止。但如果忽略SIGTERM,则它不会终止进程,而SIGINT仍然会终止进程。正如DarkDust所指出的,许多信号具有相同的结果,但进程可以通过区分每个信号的生成方式为它们附加不同的操作。查看FreeBSD kernel源代码(kern_sig.c)我看到这两个信号是以相同的方式处理的,它们终止进程并传递给任何线程
SA_KILL|SA_PROC, /* SIGINT */
SA_KILL|SA_PROC, /* SIGTERM */
SIGTERM和SIGKILL用于一般用途的“终止此进程”请求。SIGTERM(默认)和SIGKILL(始终)将导致进程终止。SIGTERM可能会被进程捕获(例如,如果需要,它可以自己进行清理),甚至完全忽略;但SIGKILL不能被捕获或忽略 SIGINT和SIGQUIT专门用于来自终端的请求:可以指定特定的输入字符来生成这些信号(取决于终端控制设置)。SIGINT的默认操作与SIGTERM的默认操作和SIGKILL的不可更改操作的进程终止类型相同;SIGQUIT的默认操作也是进程终止,但可能会发生其他实现定义的操作,例如生成核心转储。进程可以捕获或忽略这两种操作如有需要,请使用ss 正如您所说,SIGHUP旨在指示终端连接已丢失,而不是作为终止信号。但是,SIGHUP的默认操作(如果进程未捕获或忽略它)是以与SIGTERM等相同的方式终止进程
定义中有一个表格,列出了各种信号及其默认操作和用途,本章还包括了与终端相关的信号的更多细节。在谷歌快速搜索后,它看起来是唯一一个预期的d
Signal Value Action Comment
----------------------------------------------------------------------
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at tty
SIGTTIN 21,21,26 Stop tty input for background process
SIGTTOU 22,22,27 Stop tty output for background process
The entries in the "Action" column of the tables below specify the default disposition for each signal, as follows:
Term Default action is to terminate the process.
Ign Default action is to ignore the signal.
Core Default action is to terminate the process and dump core (see core(5)).
Stop Default action is to stop the process.
Cont Default action is to continue the process if it is currently stopped.
Signal Default Action Description
SIGABRT A Process abort signal.
SIGALRM T Alarm clock.
SIGBUS A Access to an undefined portion of a memory object.
SIGCHLD I Child process terminated, stopped,
SIGCONT C Continue executing, if stopped.
SIGFPE A Erroneous arithmetic operation.
SIGHUP T Hangup.
SIGILL A Illegal instruction.
SIGINT T Terminal interrupt signal.
SIGKILL T Kill (cannot be caught or ignored).
SIGPIPE T Write on a pipe with no one to read it.
SIGQUIT A Terminal quit signal.
SIGSEGV A Invalid memory reference.
SIGSTOP S Stop executing (cannot be caught or ignored).
SIGTERM T Termination signal.
SIGTSTP S Terminal stop signal.
SIGTTIN S Background process attempting read.
SIGTTOU S Background process attempting write.
SIGUSR1 T User-defined signal 1.
SIGUSR2 T User-defined signal 2.
SIGTRAP A Trace/breakpoint trap.
SIGURG I High bandwidth data is available at a socket.
SIGXCPU A CPU time limit exceeded.
SIGXFSZ A File size limit exceeded.
reboot
static void run_shutdown_and_kill_processes(void)
{
/* Run everything to be run at "shutdown". This is done _prior_
* to killing everything, in case people wish to use scripts to
* shut things down gracefully... */
run_actions(SHUTDOWN);
message(L_CONSOLE | L_LOG, "The system is going down NOW!");
/* Send signals to every process _except_ pid 1 */
kill(-1, SIGTERM);
message(L_CONSOLE, "Sent SIG%s to all processes", "TERM");
sync();
sleep(1);
kill(-1, SIGKILL);
message(L_CONSOLE, "Sent SIG%s to all processes", "KILL");
sync();
/*sleep(1); - callers take care about making a pause */
}
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes