dwww Home | Manual pages | Find package

signalfd(2)                   System Calls Manual                  signalfd(2)

NOM
       signalfd - Créer un descripteur de fichier pour accepter des signaux

BIBLIOTHÈQUE
       Bibliothèque C standard (libc, -lc)

SYNOPSIS
       #include <sys/signalfd.h>

       int signalfd(int fd, const sigset_t *mask, int flags);

DESCRIPTION
       signalfd()  crée  un  descripteur de fichier qui peut être utilisé pour
       accepter des signaux à destination de l'appelant. Cela fournit une  al-
       ternative  à  l'utilisation  d'un  gestionnaire de signal ou de sigwai-
       tinfo(2), et a l'avantage que le descripteur de fichier peut être  sur-
       veillé avec select(2), poll(2) ou epoll(7).

       Le  paramètre  mask spécifie l'ensemble des signaux que l'appelant veut
       accepter par le descripteur de fichier. Ce paramètre est un ensemble de
       signaux  dont  le  contenu peut être initialisé en utilisant les macros
       décrites dans sigsetops(3). Normalement, l'ensemble des  signaux  reçus
       par le descripteur de fichier devrait être bloqué en utilisant sigproc-
       mask(2) pour éviter que les signaux soient pris en charge par les  ges-
       tionnaires  par  défaut.  Il n'est pas possible de recevoir les signaux
       SIGKILL ou SIGSTOP par un descripteur de fichier signalfd ; ces signaux
       sont silencieusement ignorés s'ils sont spécifiés dans mask.

       Si  le  paramètre fd vaut -1, alors l'appel crée un nouveau descripteur
       de fichier et y associe le signal défini dans mask. Si fd ne  vaut  pas
       -1   alors il doit indiquer un descripteur de fichier signalfd existant
       valable, et mask est utilisé pour remplacer l'ensemble des signaux  as-
       sociés avec ce descripteur.

       À  partir  de Linux 2.6.27, les valeurs suivantes peuvent être incluses
       avec un OU binaire dans flags  pour  changer  le  comportement  de  si-
       gnalfd() :

       SFD_NONBLOCK  Placer  l'attribut  d'état  de  fichier O_NONBLOCK sur la
                     description du fichier ouvert référencée par  le  nouveau
                     descripteur  de fichier (consulter open(2)). Utiliser cet
                     attribut économise des appels supplémentaires à  fcntl(2)
                     pour obtenir le même résultat.

       SFD_CLOEXEC   Placer  l'attribut  « close-on-exec » (FD_CLOEXEC) sur le
                     nouveau descripteur de fichier. Consultez la  description
                     de l'attribut O_CLOEXEC dans open(2) pour savoir pourquoi
                     cela peut être utile.

       Jusqu'à Linux 2.6.26, le paramètre flags n'est pas utilisé et doit  va-
       loir zéro.

       signalfd()  renvoie  un  descripteur de fichier qui gère les opérations
       suivantes :

       read(2)
              Si un (ou plus) des signaux spécifiés dans mask est  en  attente
              pour  le processus, alors le tampon fourni à read(2) est utilisé
              pour renvoyer une structure (ou plus) de  type  signalfd_siginfo
              (voir  ci-dessous)  qui  décrit les signaux. read(2) renvoie les
              informations pour tous les signaux qui sont en  attente  et  qui
              tiennent  dans le tampon fourni. Le tampon doit avoir une taille
              d'au moins sizeof(struct signalfd_siginfo) octets. La valeur  de
              retour de read(2) est égale au nombre total d'octets lus.

              En  conséquence du read(2), les signaux sont consommés, de telle
              sorte qu'ils  ne  seront  plus  en  attente  pour  le  processus
              (c'est-à-dire  qu'ils  ne  seront plus attrapés par les gestion-
              naires de signaux,  et  ne  seront  plus  acceptés  par  sigwai-
              tinfo(2)).

              Si  aucun des signaux de mask ne sont en attente pour le proces-
              sus, read(2) bloquera jusqu'à ce qu'un des signaux de mask  soit
              généré pour le processus, ou échouera avec l'erreur EAGAIN si le
              descripteur de fichier est en mode non bloquant.

       poll(2), select(2) (et similaire)
              Le descripteur de fichier est lisible (le paramètre  readfds  de
              select(2) ;  l'attribut  POLLIN de poll(2)) si un signal ou plus
              de mask est en attente pour le processus.

              Le descripteur de fichier signalfd gère également les autres in-
              terfaces  de  multiplexage  de  descripteurs  de  fichier : pse-
              lect(2), ppoll(2) et epoll(7).

       close(2)
              Quand le descripteur de fichier n'est plus  nécessaire  il  doit
              être  fermé.  Quand tous les descripteurs de fichier associés au
              même objet signalfd ont été fermés, les ressources pour cet  ob-
              jet sont libérées par le noyau.

   La structure signalfd_siginfo
       Les  structures  signalfd_siginfo renvoyées par read(2) sur un descrip-
       teur de fichier signalfd sont au format suivant :

           struct signalfd_siginfo {
               uint32_t ssi_signo;   /* Numéro de signal */
               int32_t  ssi_errno;   /* Numéro d'erreur (pas utilisé) */
               int32_t  ssi_code;    /* Code du signal */
               uint32_t ssi_pid;     /* PID de l'émetteur */
               uint32_t ssi_uid;     /* UID réel de l'émetteur */
               int32_t  ssi_fd;      /* Descripteur de fichier (SIGIO) */
               uint32_t ssi_tid;     /* Identifiant de la temporisation
                                        du noyau (timers POSIX) */
               uint32_t ssi_band;    /* Événement de bande (SIGIO) */
               uint32_t ssi_overrun; /* Compte des dépassements de la
                                        temporisation POSIX */
               uint32_t ssi_trapno;  /* Numéro de trappe ayant causé le signal */
               int32_t  ssi_status;  /* Code de sortie ou signal (SIGCHLD) */
               int32_t  ssi_int;     /* Entier envoyé par sigqueue(3) */
               uint64_t ssi_ptr      /* Pointeur envoyé par sigqueue(3) */
               uint64_t ssi_utime;   /* Temps CPU utilisateur consommé (SIGCHLD) */
               uint64_t ssi_stime;   /* Temps CPU système consommé (SIGCHLD) */
               uint64_t ssi_addr;    /* Adresse qui a généré le signal
                                        (pour les signaux issu du matériel) */
               uint16_t ssi_addr_lsb; /* Le bit le plus faible de l'adresse
                                         (SIGBUS ; depuis Linux 2.6.37) */
               uint8_t  pad[X];      /* Remplissage jusqu'à 128 octets
                                        (espace prévu pour des champs
                                        supplémentaires futurs) */
           };

       Chacun des champs de cette structure est analogue aux  champs  de  noms
       similaires  d'une  structure  siginfo_t. La structure siginfo_t est dé-
       crite dans sigaction(2). Tous les champs de la  structure  signalfd_si-
       ginfo renvoyée ne seront pas valables pour un signal donné ; l'ensemble
       des champs valables peut être déterminé grâce au champ ssi_code  de  la
       valeur de retour. Ce champ est analogue au champ si_code de siginfo_t ;
       consultez sigaction(2) pour plus de détails.

   Sémantique de fork(2)
       Après un fork(2), l'enfant hérite d'une copie du descripteur de fichier
       signalfd. Un appel à read(2) sur le descripteur de fichier depuis l'en-
       fant renverra des informations sur les signaux en  attente  pour  l'en-
       fant.

   Sémantique pour passer un descripteur de fichier
       Comme  avec  d'autres descripteurs de fichier, ceux de signalfd peuvent
       être passés à un autre processus à l'aide d'un socket de  domaine  UNIX
       (voir  unix(7)). Dans le processus récepteur, un read(2) depuis le des-
       cripteur de fichier reçu renverra des informations sur les  signaux  en
       attente pour ce processus.

   Sémantique de execve(2)
       Comme  tout  descripteur de fichier, un descripteur de fichier signalfd
       reste ouvert au travers d'un execve(2), à moins qu'il  ait  été  marqué
       comme  « close-on-exec »  (consultez  fcntl(2)).  Tout signal qui était
       disponible en lecture avant un execve(2) reste disponible pour le  nou-
       veau  programme.  C'est analogue à la sémantique traditionnelle des si-
       gnaux, pour laquelle un signal bloqué qui est en attente reste  en  at-
       tente au travers d'un execve(2).

   Sémantique des threads
       La  sémantique  des  descripteurs de fichier signalfd dans un programme
       multithreadé copie la sémantique  standard  des  signaux.  En  d'autres
       termes, quand un thread lit un descripteur de fichier signalfd, il lira
       les signaux qui sont envoyés pour le thread lui-même ou pour le proces-
       sus  (c'est-à-dire  l'ensemble du groupe de threads). Un thread ne sera
       pas capable de lire les signaux qui sont envoyés aux autres threads  du
       processus.

   Sémantique d'epoll(7)
       Si  un processus ajoute (à l'aide d'epoll_ctl(2)) un descripteur de fi-
       chier signalfd à une instance epoll(7), epoll_wait(2)  ne  renvoie  des
       événements que pour des signaux envoyés à ce processus. En particulier,
       si le processus utilise alors fork(2) pour créer son  enfant,  celui-ci
       pourra  lire (read(2)) des signaux qui lui sont envoyés en utilisant le
       descripteur de fichier signalfd, mais epoll_wait(2) n'indiquera pas que
       le  descripteur de fichier signalfd est prêt. Dans ce scénario, un cou-
       tournement possible est qu'après le fork(2), le processus enfant puisse
       fermer  le  descripteur de fichier signalfd dont il hérite du parent et
       puis créer un autre descripteur de  fichier  signalfd  et  l'ajouter  à
       l'instance  epoll. Autrement, le parent et l'enfant pourraient retarder
       la création de leurs descripteurs de fichier signalfd (individuels)  et
       les ajouter à l'instance epoll jusqu'à la fin de l'appel fork(2).

VALEUR RENVOYÉE
       S'il  réussit,  signalfd() renvoie un descripteur de fichier signalfd ;
       il s'agit soit d'un nouveau descripteur de fichier (si fd  valait  -1),
       ou  fd  si  fd était un descripteur de fichier signalfd valable. En cas
       d'erreur, il renvoie -1 et errno contient le code d'erreur.

ERREURS
       EBADF  Le descripteur de fichier fd n'est pas un descripteur de fichier
              valable.

       EINVAL fd n'est pas un descripteur de fichier signalfd valable.

       EINVAL flags  n'est pas correct ; ou, pour les versions de Linux 2.6.26
              ou antérieures, flags n'est pas nul.

       EMFILE La limite du nombre de descripteurs de fichiers par processus  a
              été atteinte.

       ENFILE La  limite  du  nombre total de fichiers ouverts pour le système
              entier a été atteinte.

       ENODEV Impossible  de  monter  (en  interne)  le  périphérique  anonyme
              d'inœud.

       ENOMEM Pas  assez  de  mémoire pour créer le descripteur de fichier si-
              gnalfd.

VERSIONS
       signalfd() est disponible depuis  Linux 2.6.22.  Une  prise  en  charge
       fonctionnelle  est  founie  depuis  la  glibc 2.8.  L'appel système si-
       gnalfd4() (voir NOTES) est disponible depuis Linux 2.6.27.

STANDARDS
       signalfd() et signalfd4() sont spécifiques à Linux.

NOTES
       Un processus peut créer plusieurs  descripteurs  de  fichier  signalfd.
       Cela  permet  d'accepter différents signaux sur différents descripteurs
       de fichier (et peut être utile si les descripteurs de fichier sont sur-
       veillés en utilisant select(2), poll(2) ou epoll(7) : l'arrivée de dif-
       férents signaux rendra différents descripteurs de fichier disponibles).
       Si  un  signal  apparaît  dans le mask de plusieurs descripteurs de fi-
       chier, un signal reçu pourra être lu (une seule fois) depuis  n'importe
       lequel des descripteurs.

       Les  tentatives pour inclure SIGKILL et SIGSTOP dans mask sont ignorées
       silencieusement.

       Le masque de signal utilisé par le descripteur de fichier signalfd peut
       être  visualisé  à l'aide de l'entrée de descripteur de fichier corres-
       pondante du répertoire /proc/pid/fdinfo du processus. Consultez proc(5)
       pour de plus amples détails.

   Limites
       Le  mécanisme  signalfd  ne peut pas être utilisé pour recevoir des si-
       gnaux générés de manière synchrone, tel que le signal SIGSEGV issu d'un
       accès  non  valable à l'adresse de mémoire ou le signal SIGFPE qui pro-
       vient d'une erreur arithmétique. De tels signaux ne peuvent être  récu-
       pérés que par un gestionnaire de signal.

       Comme  décrit ci-dessus, en temps normal, on bloque les signaux qui se-
       ront acceptés à l'aide de signalfd(). Si on force un processus enfant à
       exécuter un programme d'aide (ce qui ne nécessite pas le descripteur de
       fichier signalfd), alors après l'appel fork(2), vous voudrez  débloquer
       ces  signaux,  en principe, avant d'appeler execve(2), pour que le pro-
       gramme d'aide puisse voir les signaux auxquels  il  s'attend.Gardez  en
       tête,  toutefois,  que  cela ne sera pas possible dans le cas d'un pro-
       gramme d'aide créé en tâche de fond par une  fonction  de  bibliothèque
       que  le programme peut appeler. Dans ce cas-là, il faut se rabattre sur
       l'utilisation d'un gestionnaire de signal traditionnel qui écrit sur un
       descripteur de fichier surveillé par select(2), poll(2) ou epoll(7).

   différences entre bibliothèque C et noyau
       L'appel  système  Linux  sous-jacent  nécessite un paramètre supplémen-
       taire, size_t sizemask, qui spécifie la taille du  paramètre  mask.  La
       fonction  enveloppe  signalfd()  de  la  glibc  n'a  pas  ce paramètre,
       puisqu'elle fournit ce paramètre à l'appel système sous-jacent.

       Il y a deux appels système sous-jacents :  signalfd()  et  signalfd4(),
       qui  est  plus récent. Le premier appel système n'implémente pas de pa-
       ramètre flags. Le dernier appel système implémente les valeurs de flags
       décrites  ci-dessous.  À  partir de la glibc 2.9, la fonction enveloppe
       signalfd() utilisera signalfd4() quand il est disponible.

BOGUES
       Avant Linux 2.6.25, les champs ssi_ptr et ssi_int n'étaient pas rensei-
       gnés avec les données accompagnant un signal envoyé par sigqueue(3).

EXEMPLES
       Le programme ci-dessous accèpte les signaux SIGINT et SIGQUIT en utili-
       sant un descripteur de fichier signalfd. Le programme se termine  après
       avoir  accepté  le  signal  SIGQUIT.  La  session shell suivante montre
       l'utilisation du programme :

           $ ./signalfd_demo
           ^C                   # Contrôle-C génère un SIGINT
           Got SIGINT
           ^C
           Got SIGINT
           ^\                 # Contrôle-\ génère un SIGQUIT
           Got SIGQUIT
           $

   Source du programme

       #include <err.h>
       #include <signal.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/signalfd.h>
       #include <unistd.h>

       int
       main(void)
       {
           int                      sfd;
           ssize_t                  s;
           sigset_t                 mask;
           struct signalfd_siginfo  fdsi;

           sigemptyset(&mask);
           sigaddset(&mask, SIGINT);
           sigaddset(&mask, SIGQUIT);

           /* Bloquer les signaux pour qu'ils ne soient plus gérés
              par les dispositifs par défaut */

           if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
               err(EXIT_FAILURE, "sigprocmask");

           sfd = signalfd(-1, &mask, 0);
           if (sfd == -1)
               err(EXIT_FAILURE, "signalfd");

           for (;;) {
               s = read(sfd, &fdsi, sizeof(fdsi));
               if (s != sizeof(fdsi))
                   err(EXIT_FAILURE, "read");

               if (fdsi.ssi_signo == SIGINT) {
                   printf("Got SIGINT\n");
               } else if (fdsi.ssi_signo == SIGQUIT) {
                   printf("Got SIGQUIT\n");
                   exit(EXIT_SUCCESS);
               } else {
                   printf("Read unexpected signal\n");
               }
           }
       }

VOIR AUSSI
       eventfd(2), poll(2), read(2), select(2), sigaction(2),  sigprocmask(2),
       sigwaitinfo(2),  timerfd_create(2), sigsetops(3), sigwait(3), epoll(7),
       signal(7)

TRADUCTION
       La traduction française de cette page de manuel a été créée par  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, Fran-
       çois  Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Gué-
       rard <fevrier@tigreraye.org>, Jean-Luc  Coulon  (f5ibh)  <jean-luc.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org>,  Cédric Boutillier <ce-
       dric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com>  et
       Jean-Philippe MENGUAL <jpmengual@debian.org>

       Cette traduction est une documentation libre ; veuillez vous reporter à
       la       GNU       General       Public        License        version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les conditions
       de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de  manuel,
       veuillez envoyer un message à ⟨debian-l10n-french@lists.debian.org⟩.

Pages du manuel de Linux 6.03   5 février 2023                     signalfd(2)

Generated by dwww version 1.15 on Sat Jun 29 01:40:20 CEST 2024.