Man page - signalfd4(2)

Packages contains this manual

Available languages:

en fr ja ru

Manual

signalfd

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
La structure signalfd_siginfo
Sémantique de fork(2)
Sémantique pour passer un descripteur de fichier
Sémantique de execve(2)
Sémantique des threads
SĂ©mantique d’epoll(7)
VALEUR RENVOYÉE
ERREURS
VERSIONS
Différences entre bibliothÚque C et noyau
STANDARDS
HISTORIQUE
NOTES
Limites
BOGUES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

signalfd - Créer un descripteur de fichier pour accepter des signaux

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

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. Cela 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Ă© 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 silencieusement ignorĂ©s s’ils sont spĂ©cifiĂ©s dans mask .

Si le paramĂštre fd vaut -1 , alors l’appel crĂ©e un nouveau descripteur de fichier et y associe le signal dĂ©fini dans mask . Si fd ne vaut pas -1 alors il doit indiquer un descripteur de fichier signalfd existant valable, et mask est utilisĂ© pour remplacer l’ensemble des signaux associĂ©s avec ce descripteur.

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

Jusqu’à Linux 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) 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 un descripteur de fichier signalfd sont au format suivant :

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[ X ]; /* Remplissage jusqu’à 128 octets
(espace prévu pour des champs
supplémentaires futurs) */
};

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 valables 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), l’enfant hĂ©rite d’une copie du descripteur de fichier signalfd. Un appel Ă  read (2) sur le descripteur de fichier depuis l’enfant renverra des informations sur les signaux en attente pour l’enfant.

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 unix (7)). Dans le processus rĂ©cepteur, un read (2) depuis le descripteur de fichier reçu renverra des informations sur les signaux en attente pour ce processus.

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

SĂ©mantique d’epoll(7)

Si un processus ajoute (Ă  l’aide d’ epoll_ctl (2)) un descripteur de fichier signalfd Ă  une instance epoll (7), epoll_wait (2) ne renvoie des Ă©vĂ©nements que pour des signaux envoyĂ©s Ă  ce processus. En particulier, si le processus utilise alors fork (2) pour crĂ©er son enfant, celui-ci pourra lire ( read (2)) des signaux qui lui sont envoyĂ©s en utilisant le descripteur de fichier signalfd, mais epoll_wait (2) n’indiquera pas que le descripteur de fichier signalfd est prĂȘt. Dans ce scĂ©nario, un coutournement possible est qu’aprĂšs le fork (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 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 antĂ©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

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

STANDARDS

Linux.

HISTORIQUE

signalfd ()

Linux 2.6.22, glibc 2.8.

signalfd4 ()

Linux 2.6.27.

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 select (2), poll (2) ou epoll (7) : l’arrivĂ©e de diffĂ©rents signaux rendra diffĂ©rents descripteurs de fichier disponibles). Si un signal apparaĂźt dans le mask de plusieurs descripteurs de fichier, un signal reçu pourra ĂȘtre lu (une seule fois) depuis n’importe lequel des descripteurs.

Les tentatives pour inclure SIGKILL et SIGSTOP dans mask sont ignorées silencieusement.

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 /proc/ pid /fdinfo du processus. Consultez proc (5) pour de plus amples dĂ©tails.

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 SIGSEGV issu d’un accĂšs non valable Ă  l’adresse de mĂ©moire ou le signal SIGFPE qui provient d’une erreur arithmĂ©tique. De tels signaux ne peuvent ĂȘtre rĂ©cupĂ©rĂ©s que par un gestionnaire de signal.

Comme dĂ©crit ci-dessus, en temps normal, on bloque les signaux qui seront acceptĂ©s Ă  l’aide de signalfd (). 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 fork (2), vous voudrez dĂ©bloquer ces signaux, en principe, avant d’appeler execve (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 select (2), poll (2) ou epoll (7).

BOGUES

Avant Linux 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
# ContrÎle-C génÚre un SIGINT
Got SIGINT
^C

Got SIGINT
^\
# ContrÎle-\ génÚre un SIGQUIT
Got SIGQUIT
$

Source du programme

#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/signalfd.h>
#include <sys/types.h>
#include <unistd.h>
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\n");
} else if (fdsi.ssi_signo == SIGQUIT) {
printf("Got SIGQUIT\n");
exit(EXIT_SUCCESS);
} else {
printf("Lecture d’un signal imprĂ©vu\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)

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>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>

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 .