.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2008 Michael Kerrisk .\" starting from a version by Davide Libenzi .\" .\" %%%LICENSE_START(GPLv2+_SW_3_PARA) .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 2 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, see .\" . .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SIGNALFD 2 "10 octobre 2019" Linux "Manuel du programmeur Linux" .SH NOM signalfd \- Créer un descripteur de fichier pour accepter des signaux .SH SYNOPSIS \fB#include \fP .PP \fBint signalfd(int \fP\fIfd\fP\fB, const sigset_t *\fP\fImask\fP\fB, int \fP\fIflags\fP\fB);\fP .SH DESCRIPTION \fBsignalfd\fP() 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 \fBsigwaitinfo\fP(2), et a l'avantage que le descripteur de fichier peut être surveillé avec \fBselect\fP(2), \fBpoll\fP(2) ou \fBepoll\fP(7). .PP Le paramètre \fImask\fP 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 \fBsigsetops\fP(3). Normalement, l'ensemble des signaux reçus par le descripteur de fichier devrait être bloqués en utilisant \fBsigprocmask\fP(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 \fBSIGKILL\fP ou \fBSIGSTOP\fP par un descripteur de fichier signalfd\ ; ces signaux sont ignorés sans rien dire s'ils sont spécifiés dans \fImask\fP. .PP If the \fIfd\fP argument is \-1, then the call creates a new file descriptor and associates the signal set specified in \fImask\fP with that file descriptor. If \fIfd\fP is not \-1, then it must specify a valid existing signalfd file descriptor, and \fImask\fP is used to replace the signal set associated with that file descriptor. .PP À partir de Linux 2.6.27, les valeurs suivantes peuvent être incluses avec un OU binaire dans \fIflags\fP pour changer le comportement de \fBsignalfd\fP()\ : .TP 14 \fBSFD_NONBLOCK\fP Placer l'attribut d'état de fichier \fBO_NONBLOCK\fP sur la description du fichier ouvert référencée par le nouveau descripteur de fichier (consulter \fBopen\fP(2)). Utiliser cet attribut économise des appels supplémentaires à \fBfcntl\fP(2) pour obtenir le même résultat. .TP \fBSFD_CLOEXEC\fP Placer l'attribut «\ close\-on\-exec\ » (\fBFD_CLOEXEC\fP) sur le nouveau descripteur de fichier. Consultez la description de l'attribut \fBO_CLOEXEC\fP dans \fBopen\fP(2) pour savoir pourquoi cela peut être utile. .PP Dans les versions de Linux jusqu'à la version 2.6.26, le paramètre \fIflags\fP n'est pas utilisé et doit valoir zéro. .PP \fBsignalfd\fP() renvoie un descripteur de fichier qui gère les opérations suivantes\ : .TP \fBread\fP(2) Si un (ou plus) des signaux spécifiés dans \fImask\fP est en attente pour le processus, alors le tampon fourni à \fBread\fP(2) est utilisé pour renvoyer une structure (ou plus) de type \fIsignalfd_siginfo\fP (voir ci\-dessous) qui décrit les signaux. \fBread\fP(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 \fIsizeof(struct signalfd_siginfo)\fP octets. La valeur de retour de \fBread\fP(2) est égale au nombre total d'octets lus. .IP En conséquence du \fBread\fP(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 \fBsigwaitinfo\fP(2)). .IP Si aucun des signaux de \fImask\fP ne sont en attente pour le processus, \fBread\fP(2) sera bloquera jusqu'à ce qu'un des signaux de \fImask\fP soit généré pour le processus, ou échouera avec l'erreur \fBEAGAIN\fP si le descripteur de fichier est en mode non bloquant. .TP \fBpoll\fP(2), \fBselect\fP(2) (et similaire) Le descripteur de fichier est lisible (le paramètre \fIreadfds\fP de \fBselect\fP(2)\ ; l'attribut \fBPOLLIN\fP de \fBpoll\fP(2)) si un signal ou plus de \fImask\fP est en attente pour le processus. .IP Le descripteur de fichier signalfd gère également les autres interfaces de multiplexage de descripteurs de fichier\ : \fBpselect\fP(2), \fBppoll\fP(2) et \fBepoll\fP(7). .TP \fBclose\fP(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. .SS "La structure signalfd_siginfo" Les structures \fIsignalfd_siginfo\fP renvoyées par \fBread\fP(2) sur une descripteur de fichier signalfd sont au format suivant\ : .PP .in +4n .EX .\" ssi_trapno is unused on most arches .\" ssi_addr_lsb: commit b8aeec34175fc8fe8b0d40efea4846dfc1ba663e 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[\fIX\fP]; /* Pad size to 128 bytes (allow for additional fields in the future) */ }; .EE .in .PP Chacun des champs de cette structure est analogue aux champs de noms similaires d'une structure \fIsiginfo_t\fP. La structure \fIsiginfo_t\fP est décrite dans \fBsigaction\fP(2). Tous les champs de la structure \fIsignalfd_siginfo\fP renvoyée ne seront pas valable pour un signal donné\ ; l'ensemble des champs valables peut être déterminé grâce au champ \fIssi_code\fP de la valeur de retour. Ce champ est analogue au champ \fIsi_code\fP de \fIsiginfo_t\fP\ ; consultez \fBsigaction\fP(2) pour plus de détails. .SS "Sémantique de fork(2)" Après un \fBfork\fP(2), le fils hérite d'une copie du descripteur de fichier signalfd. Un appel à \fBread\fP(2) sur le descripteur de fichier depuis le fils en attente pour le fils. .SS "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 \fBunix\fP(7)). In the receiving process, a \fBread\fP(2) from the received file descriptor will return information about signals queued to that process. .SS "Sémantique de execve(2)" Comme tout descripteur de fichier, un descripteur de fichier signalfd reste ouvert au travers d'un \fBexecve\fP(2), à moins qu'il ait été marqué comme «\ close\-on\-exec\ » (consultez \fBfcntl\fP(2)). Tout signal qui était disponible en lecture avant un \fBexecve\fP(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 \fBexecve\fP(2)) .SS "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) .SS "epoll(7) semantics" If a process adds (via \fBepoll_ctl\fP(2)) a signalfd file descriptor to an \fBepoll\fP(7) instance, then \fBepoll_wait\fP(2) returns events only for signals sent to that process. In particular, if the process then uses \fBfork\fP() to create a child process, then the child will be able to \fBread\fP(2) signals that are sent to it using the signalfd file descriptor, but \fBepoll_wait\fP(2) will \fBnot\fP indicate that the signalfd file descriptor is ready. In this scenario, a possible workaround is that after the \fBfork\fP(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 \fBfork\fP(2). .SH "VALEUR RENVOYÉE" S'il réussit, \fBsignalfd\fP() renvoie un descripteur de fichier signalfd\ ; il s'agit soit d'un nouveau descripteur de fichier (si \fIfd\fP valait \-1), ou \fIfd\fP si \fIfd\fP était un descripteur de fichier signalfd valable. En cas d'erreur, il renvoie \-1 et \fIerrno\fP contient le code d'erreur. .SH ERREURS .TP \fBEBADF\fP Le descripteur de fichier \fIfd\fP n'est pas un descripteur de fichier valable. .TP \fBEINVAL\fP .\" or, the .\" .I sizemask .\" argument is not equal to .\" .IR sizeof(sigset_t) ; \fIfd\fP n'est pas un descripteur de fichier signalfd valable. .TP \fBEINVAL\fP \fIflags\fP n'est pas correct\ ; ou, pour les versions de Linux 2.6.26 ou ultérieures, \fIflags\fP n'est pas nul. .TP \fBEMFILE\fP La limite du nombre de descripteurs de fichiers par processus a été atteinte. .TP \fBENFILE\fP La limite du nombre total de fichiers ouverts pour le système entier a été atteinte. .TP \fBENODEV\fP Impossible de monter (en interne) le périphérique anonyme d'inœud. .TP \fBENOMEM\fP Pas assez de mémoire pour créer le descripteur de fichier signalfd. .SH VERSIONS .\" signalfd() is in glibc 2.7, but reportedly does not build \fBsignalfd\fP() est disponible sous Linux depuis le noyau\ 2.6.22. La glibc le gère depuis la version 2.8. L'appel système \fBsignalfd4\fP() (voir NOTES) est disponible sous Linux depuis le noyau\ 2.6.27. .SH CONFORMITÉ \fBsignalfd\fP() et \fBsignalfd4\fP() sont spécifiques à Linux. .SH 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 \fBselect\fP(2), \fBpoll\fP(2), or \fBepoll\fP(7): the arrival of different signals will make different file descriptors ready.) If a signal appears in the \fImask\fP of more than one of the file descriptors, then occurrences of that signal can be read (once) from any one of the file descriptors. .PP Attempts to include \fBSIGKILL\fP and \fBSIGSTOP\fP in \fImask\fP are silently ignored. .PP .\" The signal mask employed by a signalfd file descriptor can be viewed via the entry for the corresponding file descriptor in the process's \fI/proc/[pid]/fdinfo\fP directory. See \fBproc\fP(5) for further details. .SS Limitations The signalfd mechanism can't be used to receive signals that are synchronously generated, such as the \fBSIGSEGV\fP signal that results from accessing an invalid memory address or the \fBSIGFPE\fP signal that results from an arithmetic error. Such signals can be caught only via signal handler. .PP .\" As described above, in normal usage one blocks the signals that will be accepted via \fBsignalfd\fP(). If spawning a child process to execute a helper program (that does not need the signalfd file descriptor), then, after the call to \fBfork\fP(2), you will normally want to unblock those signals before calling \fBexecve\fP(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 \fBselect\fP(2), \fBpoll\fP(2), or \fBepoll\fP(7). .SS "différences entre bibliothèque C et noyau" L'appel système Linux sous\-jacent nécessite un paramètre supplémentaire, \fIsize_t sizemask\fP, qui spécifie la taille du paramètre \fImask\fP. La fonction enveloppe \fBsignalfd\fP() de la glibc n'a pas ce paramètre, puisqu'elle fournit ce paramètre à l'appel système sous\-jacent. .PP Il y a deux appels système sous\-jacent\ : \fBsignalfd\fP() et \fBsignalfd4\fP(), qui est plus récent. Le premier appel système n'implémente pas de paramètre \fIflags\fP. Le dernier appel système implémente les valeurs de \fIflags\fP décrites ci\-dessous. À partir de la glibc 2.9, la fonction enveloppe \fBsignalfd\fP() utilisera \fBsignalfd4\fP() quand il est disponible. .SH BOGUES .\" The fix also was put into 2.6.24.5 Dans les noyaux antérieurs à 2.6.25, les champs \fIssi_ptr\fP et \fIssi_int\fP n'étaient pas renseignés avec les données accompagnant un signal envoyé par \fBsigqueue\fP(3). .SH EXEMPLE Le programme ci\-dessous accèpte les signaux \fBSIGINT\fP et \fBSIGQUIT\fP en utilisant un descripteur de fichier signalfd. Le programme se termine après avoir accepté le signal \fBSIGQUIT\fP. La session shell suivante montre l'utilisation du programme\ : .PP .in +4n .EX $\fB ./signalfd_demo\fP \fB^C\fP # Contrôle\-C génère un SIGINT Got SIGINT \fB^C\fP Got SIGINT \fB^\e\fP # Contrôle\-\e génère un SIGQUIT Got SIGQUIT $ .EE .in .SS "Source du programme" \& .EX #include #include #include #include #include #define handle_error(msg) \e 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(struct signalfd_siginfo)); if (s != sizeof(struct signalfd_siginfo)) handle_error("read"); if (fdsi.ssi_signo == SIGINT) { printf("Got SIGINT\en"); } else if (fdsi.ssi_signo == SIGQUIT) { printf("Got SIGQUIT\en"); exit(EXIT_SUCCESS); } else { printf("Read unexpected signal\en"); } } } .EE .SH "VOIR AUSSI" \fBeventfd\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBselect\fP(2), \fBsigaction\fP(2), \fBsigprocmask\fP(2), \fBsigwaitinfo\fP(2), \fBtimerfd_create\fP(2), \fBsigsetops\fP(3), \fBsigwait\fP(3), \fBepoll\fP(7), \fBsignal\fP(7) .SH COLOPHON Cette page fait partie de la publication\ 5.04 du projet \fIman\-pages\fP 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/. .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot , Cédric Boutillier et Frédéric Hantrais . Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE 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 à .MT debian-l10n-french@lists.debian.org .ME .