Forum Linux.général init et signaux

Posté par  .
Étiquettes : aucune
0
30
oct.
2004
Bonjour,

Dans mon manuel, man 2 kill précise que l'on ne peut pas envoyer de signaux au processus de pid 1 (init), qui ne possède pas de gestionnaire de signaux, et ce afin d'éviter tout risque d'arrêt intempestif du système.

man init, quant à lui, décrit en détail les réactions d'init aux signaux SIGHUP, SIGUSR1, SIGINT et SIGWINCH.

Est-ce que quelqu'un peut m'expliquer?
  • # Réponse

    Posté par  . Évalué à 1.

    (dixit ce cher phh, spécialiste en init :p, qui n'a plus assez d'XP pour s'exprimer donc voici son texte)
    Le man init décrit le comportement du sys v init, le sysvinit inclue un gestionnaire de signaux, donc c'est lui qui les intercepte pas le noyau comme le dit le man 2 kill (sinon merci de me signaler le man init, j'fé un init et apparemment y a des choses qui pouraient m'intéresser)
    • [^] # Re: Réponse

      Posté par  . Évalué à 2.

      Merci, D.Pierre. J'y pense, je voulais te dire : ta Google Bomb ne marche pas... Je viens encore de vérifier. Ca doit être plus compliqué à faire que ça.

      Pour ce qui est de faire un init, je te signale que j'essayais justement moi aussi d'en faire un, et voici ce que j'ai noté :

      Il y a largement assez de signaux, sous Linux, pour communiquer tous les messages (telinit 0,1,2,3,4,5,6,7,8,9,a,b,c, s ou S, q ou Q, u ou U) à init, avec un seul signal par message. En revanche, il est bien nécessaire d'utiliser une fifo pour passer le paramètre éventuel de telinit -t . Le problème sur lequel je bute actuellement est de savoir ce qu'il faut faire lorsque devfs n'est pas monté, puisque la fifo est sensée être /dev/initctl.

      Bonne chance!
  • # Faut tout lire

    Posté par  . Évalué à -3.

    man 2 kill
      It is impossible to send a signal to task number one, the init process,
      for which it has not installed a signal handler. This is done to
      assure the system is not brought down accidentally.
    Par défaut il n'y a pas de gestionnaire de signaux pour init. Libre à init de l'installer.
    • [^] # Re: Faut tout lire

      Posté par  . Évalué à 4.

      Par défaut il y a un gestionnaire de signaux ! MAIS, et c'est bien ce que dit la page de man, il n'y a pas de gestionnaire pour TOUS les signaux. init a un gestionnaire pour SIGHUP, SIGUSR1... mais pas pour SIGKILL. C'est ce signal SIGKILL qu'on ne peut pas envoyer à init. Peut-être aussi sigstop.

      (En fait c'est carrément un cas particulier géré par le kernel, qui empeche de transmettre SIGKILL au processus de pid 1)
      • [^] # Re: Faut tout lire

        Posté par  . Évalué à 1.

        Le noyau fixe un gestionnaire de signaux par défaut. D'où le comportement sur SIGTERM, etc... init n'a pas ce gestionnaire par défaut mais init peut installer un gestionnaire de signaux (via signal() ou sigaction()...).

        Par contre, tu as raison, les signaux SIGKILL et SIGSTOP ne peuvent normalement être ignoré par un processus et c'est donc le noyau qui inihibe ces signaux pour init. C'est un cas particulier de init (une fois qu'il a installé un gestionnaire de signaux).
        • [^] # Re: Faut tout lire

          Posté par  . Évalué à 2.

          D'accord, merci à vous. En fait, d'après ce que je comprends, contrairement à la page de man, ce sont seulement SIGKILL et SIGSTOP qui ne peuvent être envoyés.

          (Il faudrait peut-être modifier la page de man 2 kill à ce sujet, mais là, je ne vois pas trop à qui faire un rapport de bogue... :))
          • [^] # Re: Faut tout lire

            Posté par  . Évalué à 0.

            > ce sont seulement SIGKILL et SIGSTOP qui ne peuvent être envoyés.

            ...
            Tu peux les envoyer. Mais init (grâce à son cas particulier de ne pas voir d'handler de signaux par défaut) peut les ignorer. C'est différent. Je ne dis pas que c'est comme ça que c'est implémenté ! Peut-être qu'effectivement le noyau ne fait pas suivre les signaux SIGKILL ou SIGSTOP. J'en sais rien et à la limite je m'en fous. Le processus init n'a pas à être tué ou arrêté.

            man 7 signal
              The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

            Mais comme init n'a pas d'handler de signaux par défaut, ce n'est pas applicable.

            > Il faudrait peut-être modifier la page de man 2 kill à ce sujet, mais là, je ne vois pas trop à qui faire un rapport de bogue...

            Il n'y a pas de bug dans la doc !

            Il faut bien peser chaque terme et comprend comme ça marche.
            btw, utilises la doc en anglais quand tu as un doute. Exemple :
            $ env LANG=C man 7 signal (si t'as la doc anglaise d'installée)
            • [^] # Re: Faut tout lire

              Posté par  . Évalué à 2.

              Il n'y a pas de bug dans la doc !

              Pourtant, si je cite ton premier commentaire, il y a bien, dans le man 2 kill, la phrase :

              It is impossible to send a signal to task number one, the init process, for which it has not installed a signal handler

              qui, en bon français, donne "il est impossible d'envoyer un signal au processus numéro 1, le processus init, pour lequel aucun gestionnaire de signal n'a été installé" (Par qui? Je ne sais pas qui est le "it" du texte anglais, mais je suppose que c'est le kernel qui n'a pas placé ce gestionnaire).

              De toutes façons, cela ne change rien, puisque la première partie de la phrase dit bien qu'il est impossible d'envoyer un signal à init, et que la suite de la phrase n'est pas une réserve, mais une simple précision technique.

              Donc, à mon avis, il y a bel et bien un bogue.
              • [^] # Re: Faut tout lire

                Posté par  . Évalué à 0.

                > It is impossible to send a signal to task number one, the init process, for which it has not installed a signal handler

                Tu interprètes cette phrase comme équivalente à :
                - It is impossible to send a signal to task number one, the init process

                Le reste, n'est pas là pour rien.
                • [^] # Re: Faut tout lire

                  Posté par  . Évalué à 2.

                  Au risque de me répéter,"le reste de la phrase n'est pas une réserve, mais une simple précision technique". Donc ce reste ne modifie pas le sens de la première partie de la phrase.
                  • [^] # Re: Faut tout lire

                    Posté par  . Évalué à 0.

                    Je ne suis pas le patron :-)

                    Fais un rapport de bug.
                    • [^] # Re: Faut tout lire

                      Posté par  . Évalué à 2.

                      Ca y est, j'ai fini par comprendre. En fait, dans le texte anglais, le "it" n'est pas relatif au kernel, mais au processus "init" lui-même, ce qui fait qu'une traduction correcte serait :
                      "Les seuls signaux que l'on peut envoyer au processus de pid 1(init) sont ceux pour lesquels ce processus a expressément créé un gestionnaire de signaux".

                      Bon, cela dit, je pense que je fais quand même faire un rapport de bogue. Pour erreur de traduction dans la version française du man, et peut-être aussi pour manque de clarté de la version anglaise.

                      Finalement, c'est toi qui avait raison, 007. Merci!

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.