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

Linux                                            1 novembre 2020                                     SIGNALFD(2)