Linux SIGINT与其他终止信号(如SIGTERM、SIGQUIT和SIGKILL)的关系如何?

Linux SIGINT与其他终止信号(如SIGTERM、SIGQUIT和SIGKILL)的关系如何?,linux,unix,posix,Linux,Unix,Posix,在POSIX系统上,终止信号通常具有以下顺序(根据许多手册页和POSIX规范): SIGTERM-礼貌地要求流程终止。它将优雅地终止,清理所有资源(文件、套接字、子进程等),删除临时文件等 SIGQUIT-更有力的请求。它应该终止ungraceful,仍然在清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某处写入调试信息;在某些系统上,还将写入内核转储(无论应用程序是否捕捉到信号) SIGKILL-最有力的请求。这个过程甚至没有被要求做任何事情,但是系统会清理这个过程,不管它喜欢与否。很

在POSIX系统上,终止信号通常具有以下顺序(根据许多手册页和POSIX规范):

  • SIGTERM-礼貌地要求流程终止。它将优雅地终止,清理所有资源(文件、套接字、子进程等),删除临时文件等

  • SIGQUIT-更有力的请求。它应该终止ungraceful,仍然在清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某处写入调试信息;在某些系统上,还将写入内核转储(无论应用程序是否捕捉到信号)

  • SIGKILL-最有力的请求。这个过程甚至没有被要求做任何事情,但是系统会清理这个过程,不管它喜欢与否。很可能是写入了核心转储

  • SIGINT如何融入到这张图片中?当用户点击CRTL+C时,CLI进程通常由SIGINT终止,但是后台进程也可以使用KILL实用程序由SIGINT终止。我在规范或头文件中看不到的是,SIGINT是否比SIGTERM更有力,或者SIGINT和SIGTERM之间是否有任何区别

    更新:

    到目前为止,我找到的关于终止信号的最好描述是在。它很好地解释了SIGTERM和SIGQUIT之间的预期差异

    它说关于SIGTERM:

    这是礼貌地要求程序终止的正常方式

    它说的是关于SIGQUIT:

    […]并在终止进程时生成内核转储,就像程序错误信号一样。 您可以将此视为用户“检测到”的程序错误条件。[...] 在处理SIGQUIT时,最好省略某些类型的清理。例如,如果程序 创建临时文件时,应通过删除临时文件来处理其他终止请求 文件夹。但是SIGQUIT最好不要删除它们,这样用户就可以在 与堆芯转储相结合

    SIGHUP也解释得很好。SIGHUP并不是一个真正的终止信号,它只是意味着与用户的“连接”已经丢失,因此应用程序不能期望用户读取任何进一步的输出(例如stdout/stderr输出),也不再需要用户输入。对于大多数应用来说,这意味着他们最好退出。理论上,当接收到SIGHUP时,应用程序也可以决定进入守护程序模式,现在作为后台进程运行,将输出写入已配置的日志文件。对于已经在后台运行的大多数守护进程,SIGHUP通常意味着它们应该重新检查配置文件,因此您可以在编辑配置文件后将其发送到后台进程


    但是,除了由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