Fonctions système Linux de gestion des signaux
Complément de cours
Types
sigset_t
struct sigaction
Fonctions
sigaction()
sigprocmask()
Autres fonctions
sigblock()
sigvec()
sigsetmask()
sigaction()
Nom
sigaction – spécifie le traitement effectué
ou à effectuer à réception d'un signal donné.
Syntaxe
#include <csignal> // permet d'atteindre
le prototype de sigaction() et de struct sigaction
int sigaction (int signum, const struct sigaction * act,
struct sigaction * o_act); |
Description
La fonction sigaction() permet d'installer un nouveau traitant de signal, de consulter sa valeur actuelle, et/ou d'indiquer au système quels signaux devront être masqués pendant l'exécution du traitant.
Les trois paramètres ont la signification suivante :
-
signum : indique le numéro du signal concerné,
-
act, si non nulle, pointe sur une structure de type struct sigaction décrivant le traitement à effectuer,
-
o_act (old action), si non nulle, pointe sur une structure de type
struct sigaction
décrivant l'état courant du traitement du signal (résultat).
C'est la fonction qui remplit cette structure.
La véritable définition de la structure sigaction, accessible à partir du fichier <csignal>, est assez complexe.
Une déclaration simplifiée pourrait être la suivante :
struct sigaction
{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
}; // sigaction |
Les champs de la structure sigaction ont les significations suivantes :
-
sa_handler : pointeur vers la fonction traitant de signal,
-
sa_mask : liste des autres signaux bloqués pendant le traitant.
Les signaux de sa_mask doivent être (dé)positionnés au moyen des
fonctions adéquates.
-
sa_flags : indique des options particulières, parmi lesquelles :
-
SA_RESETHAND : si positionné, le traitant de signal est automatiquement restauré à la valeur par défaut après chaque fois qu'il est exécuté,
-
SA_NODEFER : si positionné, le signal en cours de traitement n'est pas automatiquement bloqué par le système,
-
SA_RESTART : si positionné, certaines fonctions système qui auraient échoué par interruption à cause de la réception d'un signal, en renvoyant la valeur –1 et en positionnant errno à EINTR, sont automatiquement relancées par le système.
Il s'agit essentiellement des fonctions
wait()
(qui sera étudiée ultérieurement),
les fonctions bloquantes comme
select()
et accept() (fonction "réseau"), ainsi que
read()
et
write()
sur un périphérique lent.
-
SA_NOCLDSTOP sera étudiée ultérieurement.
Remarque : sigaction() peut être appliquée à n'importe quel signal à l'exception de SIGKILL et SIGSTOP.
Valeur retournée
La fonction sigaction() renvoie 0 si l'appel s'est bien déroulé.
Diagnostic d'erreur
La fonction sigaction() renvoie -1 en cas d'erreur et positionne la variable globale errno.
sigprocmask()
Nom
sigprocmask – permet de positionner ou consulter le
masque des signaux bloqués.
Syntaxe
#include <csignal>[1] // permet
d'atteindre le prototype de sigprocmask()
// et la déclaration de sigset_t
int sigprocmask (int how, const sigset_t * set,
sigset_t * oldset); |
Description
La fonction sigprocmask() permet de positionner ou consulter le masque des signaux bloqués.
Les trois paramètres ont la signification suivante :
-
how : peut prendre les valeurs suivantes :
-
SIG_BLOCK : l'ensemble des signaux bloqués est l'union des signaux déjà bloqués et de ceux du masque set,
-
SIG_UNBLOCK : l'ensemble des signaux bloqués est l'intersection des signaux déjà bloqués avec le complément de ceux du masque set,
-
SIG_SETMASK : les signaux bloqués sont ceux du masque set.
-
set : si non nulle, pointe sur une zone mémoire de type
sigset_t
décrivant le traitement à effectuer,
-
oldset : si non nulle, pointe sur une zone mémoire de type
sigset_t
remplie par la fonction avec la valeur de l'ensemble des signaux masqués avant l'exécution de la fonction sigprocmask().
Valeur retournée
La fonction sigprocmask() renvoie 0 si l'appel s'est bien déroulé.
Diagnostic d'erreur
La fonction sigprocmask() renvoie -1 en cas d'erreur et positionne la variable globale errno.
Autres fonctions
Il existe d'autres fonctions, système ou pas, permettant d'effectuer des opérations sur les signaux.
Elles ne sont présentes en général que pour assurer la compatibilité avec d'autres systèmes Unix ou avec des versions antérieures, mais ne présentent pas d'intérêt particulier.
Fonctions système
sigblock() |
ajoute certains signaux aux signaux déjà bloqués.
Peut être remplacée par
sigaction(). |
sigvec() |
peut être remplacée par
sigaction()
avec laquelle elle a beaucoup de ressemblances |
sigsetmask() |
peut être remplacé par
sigprocmask(). |
Fonctions C de niveau 3
signal() |
déroute un signal donné sous un traitant de signal donné, en renvoyant un pointeur vers l'ancien traitant.
Peut être remplacée par
sigaction() |
De nombreuses fonctions ou macros sont disponibles dans les différents systèmes, qui permettent les manipulations des masques de signaux :
sigaddset(),
sigdelset(),
sigemptyset(),
sigfillset(),
sigismember().
Type sigset_t
Conformément à la norme POSIX, les masques ne sont pas de type int mais de type sigset_t défini dans le fichier /usr/include/asm/signal.h par l'une des définitions suivantes :
typedef unsigned long sigset_t;
|
ou
typedef struct {
unsigned long sig[_NSIG_WORDS];
} sigset_t;
|
[1] <signal.h> en C standard