130 votes

Quel est le lien entre SIGINT et les autres signaux de terminaison?

Sur les systèmes POSIX, de la cessation des signaux ont généralement l'ordre suivant (selon la plupart des pages de MAN et la POSIX Spec):

  1. SIGTERM - demandez poliment à un processus à arrêter. Il prend fin normalement, le nettoyage de toutes les ressources (fichiers, sockets, les processus enfants, etc.), la suppression des fichiers temporaires et ainsi de suite.

  2. SIGQUIT - plus énergique de la demande. Il doit mettre fin maladroit, toujours le nettoyage de ressources qui ont absolument besoin de nettoyage, mais peut-être pas supprimer les fichiers temporaires, peut-être écrire les informations de débogage quelque part, sur un système aussi un core dump sera écrit (peu importe si le signal est capté par l'application ou non).

  3. SIGKILL - plus énergique de la demande. Le processus n'est même pas demandé de faire quoi que ce soit, mais le système sera de nettoyer le processus, si elle aime ou pas. Le plus probable d'un core dump est écrit.

Comment SIGINT entrer dans l'image? Un CLI processus se termine généralement par SIGINT lorsque l'utilisateur appuie sur CTRL+C, cependant un processus d'arrière-plan peut également être résilié par SIGINT à l'aide de TUER utilitaire. Ce que je ne peut pas voir dans les spécifications ou les fichiers d'en-tête est si SIGINT est plus ou moins énergique que SIGTERM ou si il y a une différence entre SIGINT et SIGTERM à tous.

Mise à JOUR:

La meilleure description de la résiliation signaux j'ai trouvé pour l'instant est dans la GNU LibC Documentation. Il explique très bien qu'il y a une différence entre le signal SIGTERM et SIGQUIT.

Il dit à propos de SIGTERM:

Il est normal de demander poliment un programme de cessation.

Et il dit à propos de SIGQUIT:

[...] et produit un core dump quand il termine le processus, tout comme un programme de signal d'erreur. Vous pouvez considérer cela comme une erreur de programme d'état "détecté" par l'utilisateur. [...] Certains types de nettoyages sont les meilleurs omis dans le traitement des SIGQUIT. Par exemple, si le programme crée des fichiers temporaires, il doit traiter les demandes de résiliation par la suppression temporaire les fichiers. Mais c'est mieux pour SIGQUIT de ne pas les supprimer, afin que l'utilisateur puisse les examiner à conjointement avec le core dump.

Et SIGHUP est également expliqué assez bien. SIGHUP est pas vraiment un signal d'arrêt, cela signifie juste que la "connexion" à l'utilisateur a été perdu, de sorte que l'application ne peut pas s'attendre à l'utilisateur de lire n'importe quel autre sortie (par exemple, stdout/stderr sortie) et il n'y a pas d'entrée d'attendre de l'utilisateur. Pour la plupart des applications qui signifie qu'il est mieux de cesser de fumer. En théorie, une application pourrait aussi décider qu'il passe en mode démon lorsqu'un signal SIGHUP est reçu et fonctionne désormais comme un processus d'arrière-plan, rédaction de la sortie vers un fichier journal configuré. Pour la plupart des démons déjà en cours d'exécution en arrière-plan, SIGHUP signifie généralement qu'ils doivent réexaminer leurs fichiers de configuration, donc vous l'envoyer au processus d'arrière-plan après l'édition de fichiers de configuration.

Il n'existe toutefois aucune explication utile de SIGINT sur cette page, d'autres que c'est envoyé par CTRL+C. Est-il une raison pourquoi l'un serait en mesure de gérer SIGINT d'une manière différente que SIGTERM? Si oui, pour quelle raison serait-ce et comment le traitement sera différent?

109voto

Matthew Slattery Points 21628

SIGTERM et SIGKILL sont destinés à des fins générales de "mettre fin à ce processus". SIGTERM (par défaut) et SIGKILL (toujours) va provoquer l'arrêt du processus. SIGTERM peut être pris par le processus (par exemple, afin qu'elle puisse faire son propre nettoyage si il veut), ou même complètement ignoré; mais SIGKILL ne peuvent pas être capturés ou ignoré.

SIGINT et SIGQUIT sont destinés spécifiquement pour les demandes à partir du terminal: la saisie de caractères peut être attribué à générer ces signaux (en fonction du terminal de contrôle des paramètres). L'action par défaut pour SIGINT est la même sorte de processus de résiliation que l'action par défaut pour SIGTERM et l'immuable action pour SIGKILL; l'action par défaut pour SIGQUIT est aussi la fin du processus, mais la mise en œuvre définies par actions peuvent se produire, tels que la génération d'un core dump. Soit peut être pris ou ignorés par le processus si nécessaire.

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

Il y a une table dans la POSIX définitions signal.h qui répertorie les différents signaux et de leurs actions par défaut et les fins, et le Général de l'Interface du Terminal chapitre comprend beaucoup plus de détails sur le terminal signaux liés.

10voto

Diomidis Spinellis Points 8417

Comme l'a noté DarkDust, de nombreux signaux donnent 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 constate que les deux signaux sont traité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 */
 

9voto

Jonathan Points 6714

Après une rapide recherche sur Google pour sigint vs sigterm, il semble que le seul but de différence entre les deux est de savoir si elle a été initiée par un raccourci clavier ou par un appel explicite à l' kill.

Comme un résultat, vous pouvez, par exemple, d'intercepter sigint et faire quelque chose de spécial avec elle, sachant qu'elle a probablement été envoyé par un raccourci clavier. Peut-être rafraîchir l'écran ou quelque chose, au lieu de mourir (pas recommandé, car les gens s'attendent ^C à tuer le programme, juste un exemple).

J'ai appris que le ^\ doit envoyer sigquit, que je peut commencer à l'utiliser moi-même. Semble très utile.

3voto

DarkDust Points 47584

À l'aide de kill (à la fois le système d'appel et de l'utilitaire, vous pouvez envoyer presque n'importe quel signal à un processus, étant donné que vous avez obtenu la permission. Un processus ne peut pas distinguer comment un signal est venu à la vie et qui l'a envoyé.

Cela étant dit, SIGINT est vraiment destiné à singal le Ctrl-C interruption, tandis que SIGTERM est le grand terminal du signal. Il n'y a pas de concept de signal "plus agressive", avec la seule exception qu'il y a des signaux qui ne peuvent pas être bloqués ou manipulé (SIGKILL et SIGSTOP, selon la page de man).

Un signal ne peut être "plus fort" que l'autre signal à l'égard de la façon dont un processus de réception, qui traite le signal (et ce que l'action par défaut pour ce signal est). Par exemple, par défaut, les deux SIGTERM et SIGINT conduire à la résiliation. Mais si vous ignorez SIGTERM puis il ne sera pas la fin de votre processus, tandis que SIGINT encore.

0voto

À l'exception de quelques signaux, les gestionnaires de signaux peuvent capturer les différents signaux ou le comportement par défaut à la réception d'un signal peut être modifié. Voir la page de manuel signal(7) pour plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X