.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2008 Michael Kerrisk .\" starting from a version by Davide Libenzi .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH signalfd 2 "3 mai 2023" "Pages du manuel de Linux 6.05.01" .SH NOM signalfd \- Créer un descripteur de fichier pour accepter des signaux .SH BIBLIOTHÈQUE Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP) .SH SYNOPSIS .nf \fB#include \fP .PP \fBint signalfd(int \fP\fIfd\fP\fB, const sigset_t *\fP\fImask\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .SH DESCRIPTION \fBsignalfd\fP() crée un descripteur de fichier qui peut être utilisé pour accepter des signaux à destination de l'appelant. Cela 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é 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 silencieusement ignorés s'ils sont spécifiés dans \fImask\fP. .PP Si le paramètre \fIfd\fP vaut \fB\-1\fP, alors l'appel crée un nouveau descripteur de fichier et y associe le signal défini dans \fImask\fP. Si \fIfd\fP ne vaut pas \fB\-1\fP alors il doit indiquer un descripteur de fichier signalfd existant valable, et \fImask\fP est utilisé pour remplacer l'ensemble des signaux associés avec ce descripteur. .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 Jusqu'à Linux\ 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) 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 un 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; /* Numéro de signal */ int32_t ssi_errno; /* Numéro d'erreur (pas utilisé) */ int32_t ssi_code; /* Code du signal */ uint32_t ssi_pid; /* PID de l'émetteur */ uint32_t ssi_uid; /* UID réel de l'émetteur */ int32_t ssi_fd; /* Descripteur de fichier (SIGIO) */ uint32_t ssi_tid; /* Identifiant de la temporisation du noyau (timers POSIX) */ uint32_t ssi_band; /* Événement de bande (SIGIO) */ uint32_t ssi_overrun; /* Compte des dépassements de la temporisation POSIX */ uint32_t ssi_trapno; /* Numéro de trappe ayant causé le signal */ int32_t ssi_status; /* Code de sortie ou signal (SIGCHLD) */ int32_t ssi_int; /* Entier envoyé par sigqueue(3) */ uint64_t ssi_ptr /* Pointeur envoyé par sigqueue(3) */ uint64_t ssi_utime; /* Temps CPU utilisateur consommé (SIGCHLD) */ uint64_t ssi_stime; /* Temps CPU système consommé (SIGCHLD) */ uint64_t ssi_addr; /* Adresse qui a généré le signal (pour les signaux issu du matériel) */ uint16_t ssi_addr_lsb; /* Le bit le plus faible de l'adresse (SIGBUS\ ; depuis Linux\ 2.6.37) */ uint8_t pad[\fIX\fP]; /* Remplissage jusqu'à 128 octets (espace prévu pour des champs supplémentaires futurs) */ }; .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 valables 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 \fBfork\fP(2)" Après un \fBfork\fP(2), l'enfant hérite d'une copie du descripteur de fichier signalfd. Un appel à \fBread\fP(2) sur le descripteur de fichier depuis l'enfant renverra des informations sur les signaux en attente pour l'enfant. .SS "Sémantique pour passer un descripteur de fichier" Comme avec d'autres descripteurs de fichier, ceux de signalfd peuvent être passés à un autre processus à l'aide d'un socket de domaine UNIX (voir \fBunix\fP(7)). Dans le processus récepteur, un \fBread\fP(2) depuis le descripteur de fichier reçu renverra des informations sur les signaux en attente pour ce processus. .SS "Sémantique de \fBexecve\fP(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 termes, 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 groupe de threads). Un thread ne sera pas capable de lire les signaux qui sont envoyés aux autres threads du processus. .SS "Sémantique d'\fBepoll\fP(7)" Si un processus ajoute (à l'aide d'\fBepoll_ctl\fP(2)) un descripteur de fichier signalfd à une instance \fBepoll\fP(7), \fBepoll_wait\fP(2) ne renvoie des événements que pour des signaux envoyés à ce processus. En particulier, si le processus utilise alors \fBfork\fP(2) pour créer son enfant, celui\-ci pourra lire (\fBread\fP(2)) des signaux qui lui sont envoyés en utilisant le descripteur de fichier signalfd, mais \fBepoll_wait\fP(2) \fBn'indiquera pas\fP que le descripteur de fichier signalfd est prêt. Dans ce scénario, un coutournement possible est qu'après le \fBfork\fP(2), le processus enfant puisse fermer le descripteur de fichier signalfd dont il hérite du parent et puis créer un autre descripteur de fichier signalfd et l'ajouter à l'instance epoll. Autrement, le parent et l'enfant pourraient retarder la création de leurs descripteurs de fichier signalfd (individuels) et les ajouter à l'instance epoll jusqu'à la fin de l'appel \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 \fB\-1\fP), ou \fIfd\fP si \fIfd\fP était un descripteur de fichier signalfd valable. En cas d'erreur, il renvoie \fB\-1\fP 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 anté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 .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\-jacents\ : \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 STANDARDS Linux. .SH HISTORIQUE .TP \fBsignalfd\fP() .\" signalfd() is in glibc 2.7, but reportedly does not build Linux\ 2.6.22, glibc\ 2.8. .TP \fBsignalfd4\fP() Linux\ 2.6.27. .SH NOTES Un processus peut créer plusieurs descripteurs de fichier signalfd. Cela permet d'accepter différents signaux sur différents descripteurs de fichier (et peut être utile si les descripteurs de fichier sont surveillés en utilisant \fBselect\fP(2), \fBpoll\fP(2) ou \fBepoll\fP(7)\ : l'arrivée de différents signaux rendra différents descripteurs de fichier disponibles). Si un signal apparaît dans le \fImask\fP de plusieurs descripteurs de fichier, un signal reçu pourra être lu (une seule fois) depuis n'importe lequel des descripteurs. .PP Les tentatives pour inclure \fBSIGKILL\fP et \fBSIGSTOP\fP dans \fImask\fP sont ignorées silencieusement. .PP .\" Le masque de signal utilisé par le descripteur de fichier signalfd peut être visualisé à l'aide de l'entrée de descripteur de fichier correspondante du répertoire \fI/proc/\fPpid\fI/fdinfo\fP du processus. Consultez \fBproc\fP(5) pour de plus amples détails. .SS Limites Le mécanisme signalfd ne peut pas être utilisé pour recevoir des signaux générés de manière synchrone, tel que le signal \fBSIGSEGV\fP issu d'un accès non valable à l'adresse de mémoire ou le signal \fBSIGFPE\fP qui provient d'une erreur arithmétique. De tels signaux ne peuvent être récupérés que par un gestionnaire de signal. .PP Comme décrit ci\-dessus, en temps normal, on bloque les signaux qui seront acceptés à l'aide de \fBsignalfd\fP(). Si on force un processus enfant à exécuter un programme d'aide (ce qui ne nécessite pas le descripteur de fichier signalfd), alors après l'appel \fBfork\fP(2), vous voudrez débloquer ces signaux, en principe, avant d'appeler \fBexecve\fP(2), pour que le programme d'aide puisse voir les signaux auxquels il s'attend.Gardez en tête, toutefois, que cela ne sera pas possible dans le cas d'un programme d'aide créé en tâche de fond par une fonction de bibliothèque que le programme peut appeler. Dans ce cas\-là, il faut se rabattre sur l'utilisation d'un gestionnaire de signal traditionnel qui écrit sur un descripteur de fichier surveillé par \fBselect\fP(2), \fBpoll\fP(2) ou \fBepoll\fP(7). .SH BOGUES .\" The fix also was put into Linux 2.6.24.5 Avant Linux\ 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 EXEMPLES 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\[ha]C\fP # Contrôle\-C génère un SIGINT Got SIGINT \fB\[ha]C\fP Got SIGINT \fB\[ha]\e\fP # Contrôle\-\e génère un SIGQUIT Got SIGQUIT $ .EE .in .SS "Source du programme" .\" SRC BEGIN (signalfd.c) \& .EX #include #include #include #include #include #include \& int main(void) { int sfd; ssize_t s; sigset_t mask; struct signalfd_siginfo fdsi; \& sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGQUIT); \& /* Bloquer les signaux pour qu'ils ne soient plus gérés selon leur disposition par défaut */ \& if (sigprocmask(SIG_BLOCK, &mask, NULL) == \-1) err(EXIT_FAILURE, "sigprocmask"); \& sfd = signalfd(\-1, &mask, 0); if (sfd == \-1) err(EXIT_FAILURE, "signalfd"); \& for (;;) { s = read(sfd, &fdsi, sizeof(fdsi)); if (s != sizeof(fdsi)) err(EXIT_FAILURE, "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("Lecture d'un signal imprévu\en"); } } } .EE .\" SRC END .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) .PP .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 , Frédéric Hantrais et Jean-Philippe MENGUAL . .PP 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. .PP 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 .