Provided by: manpages-fr-dev_4.13-4_all bug

NOM

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

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.  Ceci  fournit  une  alternative  à   l'utilisation   d'un
       gestionnaire de signal ou de sigwaitinfo(2), et a l'avantage que le descripteur de fichier
       peut être surveillé 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és  en  utilisant
       sigprocmask(2) pour éviter que les signaux soient pris en charge par les gestionnaires par
       défaut.  Il  n'est  pas  possible  de  recevoir  les  signaux  SIGKILL  ou  SIGSTOP par un
       descripteur de fichier signalfd ; ces signaux sont  ignorés  sans  rien  dire  s'ils  sont
       spécifiés dans mask.

       If  the  fd argument is -1, then the call creates a new file descriptor and associates the
       signal set specified in mask with that file descriptor. If fd is  not  -1,  then  it  must
       specify  a valid existing signalfd file descriptor, and mask is used to replace the signal
       set associated with that file descriptor.

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

       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.

       Dans les versions de Linux jusqu'à la version 2.6.26, le paramètre flags n'est pas utilisé
       et doit valoir 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  gestionnaires  de  signaux,  et  ne  seront  plus  acceptés par
              sigwaitinfo(2)).

              Si aucun des signaux de mask ne sont en attente pour  le  processus,  read(2)  sera
              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  interfaces de
              multiplexage de descripteurs de fichier : pselect(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 objet sont libérées par le noyau.

   La structure signalfd_siginfo
       Les structures signalfd_siginfo renvoyées par  read(2)  sur  une  descripteur  de  fichier
       signalfd sont au format suivant :

           struct signalfd_siginfo {
               uint32_t ssi_signo;    /* Signal number */
               int32_t  ssi_errno;    /* Error number (unused) */
               int32_t  ssi_code;     /* Signal code */
               uint32_t ssi_pid;      /* PID of sender */
               uint32_t ssi_uid;      /* Real UID of sender */
               int32_t  ssi_fd;       /* File descriptor (SIGIO) */
               uint32_t ssi_tid;      /* Kernel timer ID (POSIX timers)
               uint32_t ssi_band;     /* Band event (SIGIO) */
               uint32_t ssi_overrun;  /* POSIX timer overrun count */
               uint32_t ssi_trapno;   /* Trap number that caused signal */
               int32_t  ssi_status;   /* Exit status or signal (SIGCHLD) */
               int32_t  ssi_int;      /* Integer sent by sigqueue(3) */
               uint64_t ssi_ptr;      /* Pointer sent by sigqueue(3) */
               uint64_t ssi_utime;    /* User CPU time consumed (SIGCHLD) */
               uint64_t ssi_stime;    /* System CPU time consumed
                                         (SIGCHLD) */
               uint64_t ssi_addr;     /* Address that generated signal
                                         (for hardware-generated signals) */
               uint16_t ssi_addr_lsb; /* Least significant bit of address
                                         (SIGBUS; since Linux 2.6.37)
               uint8_t  pad[X];       /* Pad size to 128 bytes (allow for
                                         additional fields in the future) */
           };

       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_siginfo  renvoyée ne seront pas valable 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), le fils hérite d'une copie du descripteur de fichier signalfd. Un  appel
       à read(2) sur le descripteur de fichier depuis le fils en attente pour le fils.

   Semantics of file descriptor passing
       As with other file descriptors, signalfd file descriptors can be passed to another process
       via a UNIX domain socket (see unix(7)). In the receiving  process,  a  read(2)   from  the
       received file descriptor will return information about signals queued to that process.

   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 nouveau programme. (C'est analogue à la  sémantique  traditionnelle  des  signaux,
       pour  laquelle  un  signal  bloqué  qui  est  en  attente reste en attente 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 mots, 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
       processus (c'est-à-dire l'ensemble du group de threads). (Un thread ne sera pas capable de
       lire les signaux qui sont envoyés aux autres threads du processus)

   epoll(7) semantics
       If a process adds (via epoll_ctl(2))  a signalfd file descriptor to an epoll(7)  instance,
       then  epoll_wait(2)   returns events only for signals sent to that process. In particular,
       if the process then uses fork(2)  to create a child process, then the child will  be  able
       to  read(2)   signals  that  are  sent  to  it  using  the  signalfd  file descriptor, but
       epoll_wait(2)  will not indicate that the signalfd  file  descriptor  is  ready.  In  this
       scenario, a possible workaround is that after the fork(2), the child process can close the
       signalfd file descriptor that it inherited from the parent process and then create another
       signalfd  file  descriptor and add it to the epoll instance. Alternatively, the parent and
       the child could delay creating their (separate) signalfd file descriptors and adding  them
       to the epoll instance until after the call to 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  ulté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 signalfd.

VERSIONS

       signalfd() est disponible sous Linux depuis le noyau 2.6.22. La glibc le  gère  depuis  la
       version  2.8. L'appel système signalfd4() (voir NOTES) est disponible sous Linux depuis le
       noyau 2.6.27.

CONFORMITÉ

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

NOTES

       A process can create multiple signalfd file descriptors. This makes it possible to  accept
       different  signals  on  different  file descriptors. (This may be useful if monitoring the
       file descriptors using select(2), poll(2), or epoll(7): the arrival of  different  signals
       will  make different file descriptors ready.) If a signal appears in the mask of more than
       one of the file descriptors, then occurrences of that signal can be read (once)  from  any
       one of the file descriptors.

       Attempts to include SIGKILL and SIGSTOP in mask are silently ignored.

       The signal mask employed by a signalfd file descriptor can be viewed via the entry for the
       corresponding file descriptor in the process's /proc/[pid]/fdinfo directory.  See  proc(5)
       for further details.

   Limitations
       The  signalfd mechanism can't be used to receive signals that are synchronously generated,
       such as the SIGSEGV signal that results from accessing an invalid memory  address  or  the
       SIGFPE  signal  that results from an arithmetic error. Such signals can be caught only via
       signal handler.

       As described above, in normal usage one blocks the  signals  that  will  be  accepted  via
       signalfd().  If  spawning  a child process to execute a helper program (that does not need
       the signalfd file descriptor), then, after the call to fork(2), you will normally want  to
       unblock  those  signals  before  calling execve(2), so that the helper program can see any
       signals that it expects to see. Be aware, however, that this won't be possible in the case
       of a helper program spawned behind the scenes by any library function that the program may
       call. In such cases, one must fall back to using a traditional signal handler that  writes
       to a file descriptor monitored by select(2), poll(2), or epoll(7).

   différences entre bibliothèque C et noyau
       L'appel  système Linux sous-jacent nécessite un paramètre supplémentaire, 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-jacent : signalfd() et signalfd4(), qui est plus récent.
       Le premier appel système n'implémente pas de paramè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

       Dans les noyaux  antérieurs  à  2.6.25,  les  champs  ssi_ptr  et  ssi_int  n'étaient  pas
       renseigné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 utilisant 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                   # Control-C generates SIGINT
           Got SIGINT
           ^C
           Got SIGINT
           ^\                    # Control-\ generates SIGQUIT
           Got SIGQUIT
           $

   Source du programme

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

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char *argv[])
       {
           sigset_t mask;
           int sfd;
           struct signalfd_siginfo fdsi;
           ssize_t s;

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

           /* Bloquer les signaux pour qu'il ne soit plus géré
              par les gestionnaires par défaut */

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

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

           for (;;) {
               s = read(sfd, &fdsi, sizeof(fdsi));
               if (s != sizeof(fdsi))
                   handle_error("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)

COLOPHON

       Cette page fait partie de la publication 5.10 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

       La traduction française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.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.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier   <barbier@debian.org>,   David   Prévot  <david@tilapin.org>,  Cédric  Boutillier
       <cedric.boutillier@gmail.com> et Frédéric Hantrais <fhantrais@gmail.com>

       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 ⟨⟩.