84 votes

Pourquoi les programmes Unix ne peuvent-ils pas avoir des signaux avec des noms significatifs définis par le programme (plutôt que USR1, etc.) ?

De nombreux programmes Unix acceptent des signaux comme USR1 et USR2 . Par exemple, pour mettre à jour l'exécutable de Nginx à la volée, vous envoyez kill -USR2 .

Je comprends que USR1 est un signal "défini par l'utilisateur", ce qui signifie que la personne qui a créé le programme peut l'utiliser pour signifier "arrêter" ou "vider vos journaux" ou "imprimer foo mille fois" ou autre chose. Mais je ne comprends pas pourquoi ils doivent utiliser ce nom arbitraire. Pourquoi pas kill -UPGRADE ou kill -GRACEFUL_SHUTDOWN ? Unix n'autorise-t-il que des signaux spécifiques ?

Pendant que nous y sommes, Nginx utilise également les signaux suivants (voir documentation ) :

  • TERM, INT : Arrêt rapide
  • QUITTER : Arrêt progressif
  • HUP :
    • Rechargement de la configuration
    • Démarrer les nouveaux processus de travail avec une nouvelle configuration
    • Arrêt définitif des anciens processus de travail
  • USR1 : Rouvrir les fichiers journaux
  • USR2 : Mise à jour de l'exécutable à la volée
  • WINCH : Arrêt définitif des processus de travail

HUP ? WINCH ? Quelle est la raison de ces noms ? Où puis-je en apprendre davantage à ce sujet ?

2 votes

A propos de rien - Il est intéressant de noter que nginx utilise QUIT pour une fermeture en douceur. C'est traditionnellement similaire à TERM+dump-a-core. TERM est capable de s'arrêter en douceur. Tout dépend de la façon dont on gère les signaux, mais c'est bizarre quand les développeurs sortent des sentiers battus.

2 votes

TIL : man signal traite des signaux et en énumère 31.

85voto

Erik Points 38942

Les signaux disponibles sur un système d'exploitation sont définis par le système d'exploitation (généralement selon POSIX) - ce ne sont pas des "chaînes" mais plutôt des constantes entières avec des noms standard. USR1 et USR2 sont les deux signaux qui n'ont pas de signification spécifique attachée - destinés à l'utilisation arbitraire que le développeur souhaite.

Sur votre machine linux, lisez man 7 signal pour un aperçu du traitement des signaux et des signaux.

Vous pouvez redéfinir la signification d'autres signaux si vous êtes prêt à traiter avec le système d'exploitation qui émet ces signaux en réponse à des événements. Vous pouvez, par exemple, faire en sorte que HUP signifie "recharger la configuration" - tant que vous êtes soit certain que le processus ne sera jamais interrompu (perte de terminal), soit que vous êtes prêt à gérer les cas où le système d'exploitation et non un utilisateur envoie le signal HUP.

26voto

caf Points 114951

HUP est l'abréviation de "hang-up". Ce signal est envoyé à un processus si son terminal de contrôle atteint la fin du fichier. Autrefois, les terminaux de contrôle étaient généralement connectés à des ports série, éventuellement via une liaison modem sur une ligne téléphonique. Si la connexion téléphonique était raccrochée, le modem local abaissait la ligne de détection de porteuse, ce qui avait pour conséquence que le noyau signalait la fin du fichier et un signal SIGHUP signal envoyé.

WINCH est l'abréviation de "changement de fenêtre". Il est envoyé à un processus si le terminal qui le contrôle change de taille. Pour des raisons évidentes, les terminaux qui peuvent changer de taille sont généralement des pseudo-terminaux représentés en fin de compte par un émulateur de terminal fonctionnant dans un environnement de fenêtrage (tel que xterm ).

12voto

dtmilano Points 26472

Essayez kill -l et trouver la réponse vous-même :

1)  SIGHUP       2)  SIGINT       3)  SIGQUIT      4)  SIGILL       5)  SIGTRAP
6)  SIGABRT      7)  SIGBUS       8)  SIGFPE       9)  SIGKILL      10) SIGUSR1
11) SIGSEGV      12) SIGUSR2      13) SIGPIPE      14) SIGALRM      15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD      18) SIGCONT      19) SIGSTOP      20) SIGTSTP
21) SIGTTIN      22) SIGTTOU      23) SIGURG       24) SIGXCPU      25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF      28) SIGWINCH     29) SIGIO        30) SIGPWR
31) SIGSYS       34) SIGRTMIN     35) SIGRTMIN+1   36) SIGRTMIN+2   37) SIGRTMIN+3
38) SIGRTMIN+4   39) SIGRTMIN+5   40) SIGRTMIN+6   41) SIGRTMIN+7   42) SIGRTMIN+8
43) SIGRTMIN+9   44) SIGRTMIN+10  45) SIGRTMIN+11  46) SIGRTMIN+12  47) SIGRTMIN+13
48) SIGRTMIN+14  49) SIGRTMIN+15  50) SIGRTMAX-14  51) SIGRTMAX-13  52) SIGRTMAX-12
53) SIGRTMAX-11  54) SIGRTMAX-10  55) SIGRTMAX-9   56) SIGRTMAX-8   57) SIGRTMAX-7
58) SIGRTMAX-6   59) SIGRTMAX-5   60) SIGRTMAX-4   61) SIGRTMAX-3   62) SIGRTMAX-2
63) SIGRTMAX-1   64) SIGRTMAX

10voto

paxdiablo Points 341644

Parce que le noms des signaux sont normalisés (par POSIX). Vous pouvez écrire votre propre exécutable de type kill pour prendre -UPGRADE si vous le souhaitez et faire en sorte qu'il livre le USR1 mais le signal standard kill qui est fourni avec UNIX ne le reconnaîtra pas.

Alternativement, vous pouvez créer un alias, une fonction ou un script de l'interpréteur de commandes pour effectuer la traduction à votre place, comme avec la fonction bash alias :

alias upgrade='kill -USR1'

El signal.h fait correspondre les noms des signaux à leurs valeurs réelles, qui dépendent de l'implémentation.

En termes de WINCH je considère cela comme une abomination. C'est le signal qui est délivré aux applications lorsque la taille de leur fenêtre change (plus précisément lorsque la fenêtre de leur terminal de contrôle change).

L'utiliser pour fermer gracieusement les threads de travail n'est pas une bonne idée, sauf si vous pouvez garantir que le processus ne sera jamais exécuté dans un terminal. Je sais que je serais assez mécontent si j'exécutais une application et qu'elle décidait d'annuler tout le travail en cours juste parce que j'ai maximisé la fenêtre :-)

1 votes

Ah - bien sûr, kill est lui-même un programme, qui ne connaît pas de -UPGRADE . Je n'y avais pas pensé. :)

6voto

Johnsyweb Points 45395

Sur les plateformes compatibles POSIX, SIGUSR1 et SIGUSR2 sont des signaux envoyés à un processus pour indiquer des conditions définies par l'utilisateur. Les constantes symboliques de ces signaux sont définies dans le fichier d'en-tête signal.h . Les noms symboliques des signaux sont utilisés car les numéros des signaux peuvent varier d'une plateforme à l'autre.

SIG est un préfixe commun pour les noms de signaux. USR est l'abréviation de "défini par l'utilisateur".

3 votes

Un exemple de ceci est les variantes ext{2,3,4} de fsck qui, sur USR1, commencera à imprimer des informations sur la progression et s'arrêtera sur USR2. Extrêmement pratique lorsque vous avez des problèmes de système de fichiers, que vous démarrez à partir d'un CD de secours, que vous lancez fsck pour résoudre le problème, et qu'au bout d'un moment, lorsque vous commencez à en avoir marre d'attendre, vous vous dites "mince, j'aurais dû spécifier une option pour activer les informations de progression".

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