Sur les systèmes POSIX, les signaux de terminaison ont généralement l'ordre suivant (selon de nombreuses pages MAN et les spécifications POSIX):
SIGTERM - demandez poliment à un processus de se terminer. Il se terminera en douceur, nettoyant toutes les ressources (fichiers, sockets, processus enfants, etc.), supprimant les fichiers temporaires, etc.
SIGQUIT - demande plus énergique. Il se terminera de manière disgracieuse, nettoyant toujours les ressources qui ont absolument besoin d'être nettoyées, mais peut-être pas supprimer les fichiers temporaires, peut-être écrire des informations de débogage quelque part; sur certains systèmes, un vidage de mémoire sera également écrit (que le signal soit capté par l'application ou non).
SIGKILL - la demande la plus forte. On ne demande même pas au processus de faire quoi que ce soit, mais le système nettoiera le processus, que cela veuille ou non. Très probablement, un vidage de mémoire est écrit.
Comment SIGINT s'inscrit-il dans cette image? Un processus CLI est généralement terminé par SIGINT lorsque l'utilisateur frappe CRTL + C, cependant un processus d'arrière-plan peut également être terminé par SIGINT à l'aide de l'utilitaire KILL. Ce que je ne vois pas dans les spécifications ou les fichiers d'en-tête, c'est si SIGINT est plus ou moins puissant que SIGTERM ou s'il y a une différence entre SIGINT et SIGTERM.
METTRE À JOUR:
La meilleure description des signaux de terminaison que j'ai trouvée jusqu'à présent se trouve dans la documentation GNU LibC . Cela explique très bien qu'il existe une différence voulue entre SIGTERM et SIGQUIT.
Cela dit à propos de SIGTERM:
C'est la manière normale de demander poliment à un programme de se terminer.
Et cela dit à propos de SIGQUIT:
[...] et produit un vidage de mémoire quand il termine le processus, tout comme un signal d'erreur de programme. Vous pouvez considérer cela comme une condition d'erreur de programme «détectée» par l'utilisateur. [...] Il est préférable d'omettre certains types de nettoyages lors de la gestion de SIGQUIT. Par exemple, si le programme crée des fichiers temporaires, il doit gérer les autres demandes d'arrêt en supprimant les fichiers temporaires. Mais il vaut mieux que SIGQUIT ne les supprime pas, afin que l'utilisateur puisse les examiner conjointement avec le vidage de mémoire.
Et SIGHUP est également assez bien expliqué. SIGHUP n'est pas vraiment un signal de terminaison, cela signifie simplement que la "connexion" à l'utilisateur a été perdue, donc l'application ne peut pas s'attendre à ce que l'utilisateur lise une autre sortie (par exemple, la sortie stdout / stderr) et il n'y a aucune entrée à attendre du utilisateur plus. Pour la plupart des applications, cela signifie qu'il vaut mieux arrêter. En théorie, une application peut également décider qu'elle passe en mode démon lorsqu'un SIGHUP est reçu et s'exécute maintenant en tant que processus d'arrière-plan, en écrivant la sortie dans un fichier journal configuré. Pour la plupart des démons déjà exécutés en arrière-plan, SIGHUP signifie généralement qu'ils doivent réexaminer leurs fichiers de configuration, donc vous les envoyez aux processus d'arrière-plan après avoir édité les fichiers de configuration.
Cependant, il n'y a aucune explication utile de SIGINT sur cette page, à part qu'il est envoyé par CRTL + C. Y a-t-il une raison pour laquelle on traiterait SIGINT d'une manière différente de SIGTERM? Dans l'affirmative, quelle en serait la raison et en quoi le traitement serait-il différent?
sudo fuser -l
sur votre invite de commande. Pour moi, cela soulève:HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
kill -l
une liste de signaux.