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

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)