GNU/Linux >> Tutoriels Linux >  >> Linux

Comment SIGINT est-il lié aux autres signaux de terminaison tels que SIGTERM, SIGQUIT et SIGKILL ?

SIGTERM et SIGKILL sont destinés à des requêtes générales "terminer ce processus". SIGTERM (par défaut) et SIGKILL (toujours) provoqueront l'arrêt du processus. SIGTERM peut être capturé par le processus (par exemple pour qu'il puisse faire son propre nettoyage s'il le souhaite), ou même être complètement ignoré ; mais SIGKILL ne peut pas être attrapé ou ignoré.

SIGINT et SIGQUIT sont destinés spécifiquement aux requêtes du terminal :des caractères d'entrée particuliers peuvent être affectés pour générer ces signaux (selon les paramètres de contrôle du terminal). L'action par défaut pour SIGINT est le même type de fin de processus que l'action par défaut pour SIGTERM et l'action non modifiable pour SIGKILL ; l'action par défaut pour SIGQUIT est également l'arrêt du processus, mais des actions supplémentaires définies par l'implémentation peuvent se produire, telles que la génération d'un vidage mémoire. L'un ou l'autre peut être intercepté ou ignoré par le processus si nécessaire.

SIGHUP, comme vous le dites, est destiné à indiquer que la connexion au terminal a été perdue, plutôt qu'à être un signal de terminaison en tant que tel. Mais, encore une fois, l'action par défaut pour SIGHUP (si le processus ne l'attrape pas ou ne l'ignore pas) est de terminer le processus de la même manière que SIGTERM etc.

Il y a un tableau dans les définitions POSIX pour signal.h qui répertorie les différents signaux et leurs actions et objectifs par défaut, et le chapitre Interface générale du terminal comprend beaucoup plus de détails sur les signaux liés au terminal.


Comme l'a noté DarkDust, de nombreux signaux ont les mêmes résultats, mais les processus peuvent leur associer différentes actions en distinguant la manière dont chaque signal est généré. En regardant le code source du noyau FreeBSD (kern_sig.c), je vois que les deux signaux sont gérés de la même manière, ils terminent le processus et sont livrés à n'importe quel thread.

SA_KILL|SA_PROC,             /* SIGINT */
SA_KILL|SA_PROC,             /* SIGTERM */

man 7 signal

Il s'agit de la page de manuel non normative pratique du projet de pages de manuel Linux que vous souhaitez souvent consulter pour obtenir des informations sur les signaux Linux.

La version 3.22 mentionne des choses intéressantes telles que :

Les signaux SIGKILL et SIGSTOP ne peuvent pas être interceptés, bloqués ou ignorés.

et contient le tableau :

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

qui résume le signal Action qui distingue par ex. SIGQUIT de SIGQUIT, puisque SIGQUIT a l'action Core et SIGINT Term .

Les actions sont documentées dans le même document :

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.

Je ne vois aucune différence entre SIGTERM et SIGINT du point de vue du noyau puisque les deux ont l'action Term et les deux peuvent être attrapés. Il semble que ce ne soit qu'une "distinction de convention d'utilisation courante":

  • SIGINT est ce qui se passe lorsque vous faites CTRL-C depuis le terminal
  • SIGTERM est le signal par défaut envoyé par kill

Certains signaux sont ANSI C et d'autres non

Une différence considérable est que :

  • SIGINT et SIGTERM sont ANSI C, donc plus portables
  • SIGQUIT et SIGKILL ne le sont pas

Ils sont décrits à la section "7.14 Signal handling" du C99 draft N1256 :

  • SIGINT réception d'un signal d'attention interactif
  • SIGTERM une demande de résiliation envoyée au programme

ce qui fait de SIGINT un bon candidat pour un Ctrl + C interactif.

POSIX 7

POSIX 7 documente les signaux avec le signal.h en-tête :https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html

Cette page contient également le tableau d'intérêt suivant qui mentionne certaines des choses que nous avions déjà vues en man 7 signal :

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.

Initiation BusyBox

reboot par défaut de BusyBox 1.29.2 La commande envoie un SIGTERM aux processus, se met en veille pendant une seconde, puis envoie SIGKILL. Cela semble être une convention commune à différentes distributions.

Lorsque vous éteignez un système BusyBox avec :

reboot

il envoie un signal au processus init.

Ensuite, le gestionnaire de signal init finit par appeler :

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 */
}

qui imprime sur le terminal :

The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes

En voici un exemple concret minimal.

Signaux envoyés par le noyau

  • SIGKILL :
    • OOM killer :qu'est-ce que RSS et VSZ dans la gestion de la mémoire Linux ?

Linux
  1. Comment fonctionne le Sticky Bit ?

  2. Le but de .bashrc et comment ça marche ?

  3. Signaux Linux - Exemple de programme C pour capturer des signaux (SIGINT, SIGKILL, SIGSTOP, etc.)

  4. Quand le système envoie-t-il un SIGTERM à un processus ?

  5. Comment systemd gère-t-il la mort d'un enfant d'un processus géré ?

Comment trouver l'ID de processus d'un programme et le tuer [Astuce rapide]

Linux - Comment le tueur d'Oom décide-t-il quel processus tuer en premier ?

Que fait un programme lorsqu'il envoie un signal Sigkill ?

SIGTERM vs SIGKILL :Quelle est la différence ?

Comment trouver le PID et le PPID d'un processus sous Linux

Comment Linux conserve-t-il le contrôle du processeur sur une machine monocœur ?