signalfd()
crée un descripteur de fichiers qui peut être utilisé pour accepter
des signaux ciblés par l'appelant.
Ceci fournit une alternative à l'utilisation
d'un gestionnaire de signaux ou de
sigwaitinfo(2),
et à l'avantage que le descripteur de fichiers peut être surveillé par
select(2),
poll(2)
et
epoll(7).
L'argument
mask
indique l'ensemble des signaux que l'appelant souhaite accepter
via le descripteur de fichiers.
Cet argument est un ensemble de signaux dont le contenu peut être
initialisé en utilisant les macros décrites dans
sigsetops(3).
Normalement, l'ensemble de signaux devant être reçus via le descripteur
de fichiers devrait être bloqué avec
sigprocmask(2),
pour éviter que les signaux soient gérés conformément à leurs
dispositions par défaut.
Il n'est pas possible de recevoir les signaux
SIGKILL
ou
SIGSTOP
via un descripteur de fichiers signalfd ;
ces signaux sont silencieusement ignorés s'ils sont spécifiés dans
mask.
Si l'argument
fd
vaut -1, l'appel crée un nouveau descripteur de fichiers et lui associe
l'ensemble de signaux spécifié dans
mask.
Si
fd
ne vaut pas -1, il doit spécifier un descripteur de fichiers existant
et valide, et
mask
est utilisé pour remplacer l'ensemble de signaux associé à ce descripteur.
L'argument
flags
n'est actuellement pas utilisé et doit être spécifié à zéro.
Dans le futur, il pourrait être utilisé pour des fonctionnalités
supplémentaires.
signalfd()
renvoie un descripteur de fichiers qui accepte les opérations suivantes :
-
- read(2)
-
Si un ou plusieurs des signaux spécifiés dans
mask
est en attente du processus, le tampon fourni à
read(2)
est utilisé pour renvoyer une ou plusieurs structures
signalfd_siginfo
(voir plus loin) qui décrivent les signaux.
L'appel
read(2)
returns information for as many signals as are pending and will
fit in the supplied buffer.
Le tampon doit avoir une taille d'au moins
sizeof(struct signalfd_siginfo)
octets.
La valeur de retour de
read(2)
est le nombre total d'octets lus.
-
La conséquence d'un
read(2)
est que les signaux sont consommés, ainsi ils ne sont plus en attente
pour le processus (c'est-à-dire qu'ils ne seront pas interceptés par
des gestionnaires de signaux et ne peuvent pas être acceptés avec
sigwaitinfo(2)).
-
Si aucun des signaux de
mask
est en attente du processus,
read(2)
soit bloquera jusqu'à ce qu'un des signaux de
mask
soit généré pour le processus, soit échouera avec l'erreur
EAGAIN
si le descripteur de fichiers a été rendu non bloquant
(via l'utilisation de l'opération
F_SETFL
de
fcntl(2)
pour définir l'attribut
O_NONBLOCK).
-
- poll(2), select(2) (et semblables)
-
Le descripteur de fichiers est accessible en lecture
(l'argument
readfds
de
select(2) ;
POLLIN
de
poll(2))
si un ou plusieurs des signaux de
mask
est en attente pour le processus.
-
Le descripteur de fichiers accepte également les autres API
de multiplexage de descripteur de fichiers :
pselect(2),
ppoll(2)
et
epoll(7).
-
- close(2)
-
Lorsque le descripteur de fichiers n'est plus nécessaire,
il devrait être fermé.
Lorsque tous les descripteurs de fichiers associés au même objet signalfd
ont été fermés, les ressources pour l'objet sont libérées par le noyau.