Provided by: manpages-fr-dev_3.27fr1.4-1_all bug

NOM

       signalfd - Creer 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()  cree  un  descripteur de fichier qui peut etre utilise pour
       accepter des signaux a destination  de  l'appelant.  Ceci  fournit  une
       alternative   a   l'utilisation  d'un  gestionnaire  de  signal  ou  de
       sigwaitinfo(2), et a l'avantage que le descripteur de fichier peut etre
       surveille avec select(2), poll(2) ou epoll(7).

       Le  parametre  mask specifie l'ensemble des signaux que l'appelant veut
       accepter par le descripteur de fichier. Ce parametre est un ensemble de
       signaux  dont  le  contenu peut etre initialise en utilisant les macros
       decrites dans sigsetops(3). Normalement, l'ensemble des  signaux  recus
       par  le  descripteur  de  fichier  devrait  etre  bloques  en utilisant
       sigprocmask(2) pour eviter que les signaux soient pris  en  charge  par
       les  gestionnaires  par  defaut.  Il n'est pas possible de recevoir les
       signaux SIGKILL ou SIGSTOP par un descripteur de fichier signalfd ; ces
       signaux sont ignores sans rien dire s'ils sont specifies dans mask.

       Si  le  parametre  fd  vaut  -1, l'appel cree un nouveau descripteur de
       fichier et associe l'ensemble des signaux specifies dans mask  avec  ce
       descripteur.  Si  fd  ne  vaut  pas  -1,  alors  il  doit  indiquer  un
       descripteur de fichier signalfd existant valable, et mask  est  utilise
       pour remplacer l'ensemble des signaux associes avec ce descripteur.

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

       SFD_NONBLOCK  Placer  l'attribut  d'etat  de  fichier O_NONBLOCK sur le
                     nouveau  descripteur  de  fichier  ouvert.  Utiliser  cet
                     attribut  economise des appels supplementaires a fcntl(2)
                     pour obtenir le meme resultat.

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

       Dans  les  versions  de  Linux  jusqu'a la version 2.6.26, le parametre
       flags n'est pas utilise et doit valoir zero.

       signalfd() renvoie un descripteur de fichier qui  gere  les  operations
       suivantes :

       read(2)
              Si  un  (ou plus) des signaux specifies dans mask est en attente
              pour le processus, alors le tampon fourni a read(2) est  utilise
              pour  renvoyer  une structure (ou plus) de type signalfd_siginfo
              (voir ci-dessous) qui decrit 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 egale au nombre total d'octets lus.

              En consequence du read(2), les signaux sont consommes, de  telle
              sorte  qu'ils  ne  seront  plus  en  attente  pour  le processus
              (c'est-a-dire  qu'ils  ne   seront   plus   attrapes   par   les
              gestionnaires  de  signaux,  et  ne  seront  plus  acceptes  par
              sigwaitinfo(2)).

              Si aucun des  signaux  de  mask  ne  sont  en  attente  pour  le
              processus, read(2) sera bloquera jusqu'a ce qu'un des signaux de
              mask soit genere pour le processus, ou  echouera  avec  l'erreur
              EAGAIN si le descripteur de fichier est en mode non bloquant.

       poll(2), select(2) (et similaires)
              Le  descripteur  de fichier est lisible (le parametre 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 gere egalement 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 necessaire il doit
              etre ferme. Quand tous les descripteurs de fichier  associes  au
              meme  objet  signalfd  ont  ete  fermes, les ressources pour cet
              objet sont liberees par le noyau.

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

           struct signalfd_siginfo {
               uint32_t ssi_signo;   /* Numero de signal */
               int32_t  ssi_errno;   /* Numero d'erreur (pas utilise) */
               int32_t  ssi_code;    /* Code du signal */
               uint32_t ssi_pid;     /* PID de l'emetteur */
               uint32_t ssi_uid;     /* UID reel de l'emetteur */
               int32_t  ssi_fd;      /* Descripteur de fichier (SIGIO) */
               uint32_t ssi_tid;     /* Identifiant de la temporisation
                                        du noyau (timers POSIX)
               uint32_t ssi_band;    /* Band event (SIGIO) */
               uint32_t ssi_overrun; /* POSIX timer overrun count */
               uint32_t ssi_trapno;  /* Numero de trappe ayant cause le signal */
               int32_t  ssi_status;  /* Code de sortie ou signal (SIGCHLD) */
               int32_t  ssi_int;     /* Entier envoye par sigqueue(2) */
               uint64_t ssi_ptr      /* Pointeur envoye par sigqueue(2) */
               uint64_t ssi_utime;   /* Temps CPU utilisateur consomme (SIGCHLD) */
               uint64_t ssi_stime;   /* Temps CPU systeme consomme (SIGCHLD) */
               uint64_t ssi_addr;    /* Address that generated signal
                                        (for hardware-generated signals) */
               uint8_t  pad[X];      /* Remplissage jusqu'a 128 octets
                                        (espace prevu pour des champs
                                        supplementaires futures) */
           };

       Chacun  des  champs  de cette structure est analogue aux champs de noms
       similaires  d'une  structure  siginfo_t.  La  structure  siginfo_t  est
       decrite   dans   sigaction(2).   Tous   les   champs  de  la  structure
       signalfd_siginfo renvoyee ne seront pas valable pour un signal  donne ;
       l'ensemble  des  champs  valables  peut  etre  determine grace 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 details.

   S'emantique de fork(2)
       Apres  un fork(2), le fils herite d'une copie du descripteur de fichier
       signalfd. Un appel a read(2) sur le descripteur de  fichier  depuis  le
       fils en attente pour le fils.

   S'emantique de execve(2)
       Comme  tout  descripteur de fichier, un descripteur de fichier signalfd
       reste ouvert au travers d'un execve(2), a moins qu'il  ait  ete  marque
       comme  << close-on-exec >>  (consultez fcntl(2)). Tout signal qui etait
       disponible en lecture avant  un  execve(2)  reste  disponible  pour  le
       nouveau  programme.  (C'est analogue a la semantique traditionnelle des
       signaux, pour laquelle un signal bloque qui est  en  attente  reste  en
       attente au travers d'un execve(2))

   S'emantique des threads
       La  semantique  des  descripteurs de fichier signalfd dans un programme
       multithreade copie la semantique  standard  des  signaux.  En  d'autres
       mots,  quand  un thread lit un descripteur de fichier signalfd, il lira
       les signaux qui sont  envoyes  pour  le  thread  lui-meme  ou  pour  le
       processus  (c'est-a-dire l'ensemble du group de threads). (Un thread ne
       sera pas capable de lire  les  signaux  qui  sont  envoyes  aux  autres
       threads du processus)

VALEUR RENVOY'EE

       S'il  reussit,  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 etait 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 ulterieures, flags n'est pas nul.

       EMFILE La limite du nombre total de descripteurs de fichier ouverts par
              processus a ete atteinte.

       ENFILE La  limite  du nombre total de fichiers ouverts sur le systeme a
              ete atteinte.

       ENODEV Impossible  de  monter  (en  interne)  le  peripherique  anonyme
              d'inoeud.

       ENOMEM Pas  assez  de  memoire  pour  creer  le  descripteur de fichier
              signalfd.

VERSIONS

       signalfd() est disponible sous Linux depuis le noyau 2.6.22.  La  glibc
       le gere depuis la version 2.8. L'appel systeme signalfd4() (voir NOTES)
       est disponible sous Linux depuis le noyau 2.6.27.

CONFORMIT'E

       signalfd() et signalfd4() sont specifiques a Linux.

NOTES

       L'appel   systeme   Linux   sous-jacent    necessite    un    parametre
       supplementaire,  size_t  sizemask,  qui specifie la taille du parametre
       mask.  La  fonction  enveloppe  signalfd()  de  la  glibc  n'a  pas  ce
       parametre,   puisqu'elle   fournit   ce  parametre  a  l'appel  systeme
       sous-jacent.

       Un processus peut creer plusieurs  descripteurs  de  fichier  signalfd.
       Ceci  permet  d'accepter differents signaux sur differents descripteurs
       de fichier (et peut etre utile si  les  descripteurs  de  fichier  sont
       surveilles  en  utilisant select(2), poll(2) ou epoll(7) : l'arrivee de
       differents  signaux   rendra   differents   descripteurs   de   fichier
       disponibles).   Si  un  signal  apparait  dans  le  mask  de  plusieurs
       descripteurs de fichier, un signal recu pourra etre lu (une seule fois)
       depuis n'importe lequel des descripteurs.

   Appels syst`eme Linux sous-jacents
       Il y a deux appels systeme sous-jacent : signalfd() et signalfd4(), qui
       est plus recent. Le premier appel systeme n'implemente pas de parametre
       flags.  Le  dernier  appel  systeme  implemente  les  valeurs  de flags
       decrites ci-dessous. A partir de la glibc 2.9,  la  fonction  enveloppe
       signalfd() utilisera signalfd4() quand il est disponible.

BOGUES

       Dans  les  noyaux  anterieurs  a  2.6.25, les champs ssi_ptr et ssi_int
       n'etaient pas renseignes avec les donnees accompagnant un signal envoye
       par sigqueue(2).

EXEMPLE

       Le  programme  ci-dessous  accepte  les  signaux  SIGINT  et SIGQUIT en
       utilisant un descripteur de fichier signalfd. Le programme  se  termine
       apres avoir accepte le signal SIGQUIT. La session shell suivante montre
       l'utilisation du programme :

           $ ./signalfd_demo
           ^C                   # Controle-C genere un SIGINT
           Got SIGINT
           ^C
           Got SIGINT
           ^\                    # Controle-\ genere un 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 gere
              par les gestionnaires par defaut */

           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(struct signalfd_siginfo));
               if (s != sizeof(struct signalfd_siginfo))
                   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  3.27  du  projet  man-pages
       Linux.  Une description du projet et des instructions pour signaler des
       anomalies      peuvent      etre       trouvees       a       l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis  2010,  cette  traduction est maintenue a l'aide de l'outil po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   de   traduction
       francophone        au        sein        du       projet       perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Julien   Cristau   et   l'equipe   francophone   de    traduction    de
       Debian (2006-2009).

       Veuillez   signaler   toute   erreur   de   traduction  en  ecrivant  a
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir acces a la version anglaise de ce document
       en utilisant la commande << man -L C <section> <page_de_man> >>.