Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
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> >>.