SIGALTSTACK
Section: Manuel du programmeur Linux (2) Updated: 18 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
NOTES
HISTORIQUE
CONFORMITÉ
VOIR AUSSI
TRADUCTION
NOM
sigaltstack - Consulter ou fixer la pile de signal.
SYNOPSIS
#include <signal.h>
int sigaltstack(const stack_t *ss, stack_t *oss);
DESCRIPTION
sigaltstack permet à un processus de définir une nouvelle
pile spécifique pour les gestionnaires de signaux et/ou de récupérer
l'état d'une pile spécifique de signal déjà existante.
Une pile spécifique de signal est utilisée durant l'exécution d'un
gestionnaire de signal si la mise en place de ce gestionnaire ( voir
sigaction(2))
le spécifiait.
La séquence d'actions nominale pour utiliser une pile spécifique de signal
est la suivante :
- 1.
-
Allouer une zone mémoire qui sera utilisée comme pile spécifique
de signal.
- 2.
-
Utiliser sigaltstack afin d'informer le système de l'existence
et de la position de la pile spécifique de signal.
- 3.
-
Lors de la mise en place du gestionnaire de signal en utilisant
sigaction, informer le système que ce gestionnaire de
signal doit être exécuté sur la pile spécifique de signal en
positionnant le drapeau SA_ONSTACK.
L'argument ss est utilisé afin de définir
une nouvelle pile spécifique de signal, tandis que
l'argument oss est utilisé afin de récupérer des
informations sur la pile de signal actuellement en place.
Si une seule de ces actions vous intéresse,
alors l'autre argument peut être positionné à NULL.
Chacun de ces paramètres est une structure du type suivant :
-
typedef struct {
void *ss_sp; /* Adresse de base de la pile*/
int ss_flags; /* drapeaux */
size_t ss_size; /* Nombre d'octets dans la pile */
} stack_t;
Afin de mettre en place une nouvelle pile spécifique de signal,
ss.ss_flags est positionné à zéro, et ss.sp_sp et
ss.ss_size spécifient l'adresse de début et la taille
de la pile.
La constante SIGSTKSZ est définie de façon à être
suffisamment grande pour couvrir les besoins typiques en espace mémoire
d'une pile spécifique de signal,
et la constante MINSIGSTKSZ définit la taille minimum
nécessaire à l'exécution d'un gestionnaire de signal.
Afin de désactiver une pile existante, positionnez ss.ss_flags
à SS_DISABLE. Dans ce cas, les autres champs de
ss sont ignorés.
Si oss ne vaut pas NULL, alors il est utilisé afin de renvoyer
des informations sur la pile spécifique de signal qui était utilisée
avant l'appel à sigaltstack.
Les champs oss.ss_sp et oss.ss_size renvoient l'adresse
de départ et la taille de cette pile.
Le champ oss.ss_flags peut renvoyer l'une des valeurs suivantes :
- SS_ONSTACK
-
Le processus s'exécute actuellement sur la pile
spécifique de signal. (Remarquez qu'il n'est pas possible
de changer la pile spécifique de signal si le processus
est en train de s'exécuter sur cette dernière.)
- SS_DISABLE
-
La pile spécifique de signal est actuellement désactivée.
VALEUR RENVOYÉE
sigaltstack renvoie 0 en cas de succès, ou -1 en cas d'échec
en positionnant alors errno pour préciser l'erreur.
ERREURS
- ENOMEM
-
La taille de la nouvelle pile spécifique de signal
indiquée(ss.ss_size) est inférieure à MINSTKSZ.
- EFAULT
-
L'un des paramètres ss ou oss ne vaut pas NULL et pointe
vers une zone mémoire n'appartenant pas à l'espace d'adressage du
processus.
- EPERM
-
On a essayé de modifier la pile spécifique de signal alors
que celle ci était active (i.e, le processus était déjà en train
de s'exécuter sur la pile spécifique de signal courante).
- EINVAL
-
ss ne vaut pas NULL et le champ ss_flags contient
une valeur non nulle différente de SS_DISABLE.
NOTES
Le segment de code suivant donne un exemple d'utilisation de
sigaltstack:
-
stack_t ss;
ss.ss_sp = malloc(SIGSTKSZ);
if (ss.ss_sp == NULL)
/* Traitement de l'erreur */;
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) == -1)
/* Traitement de l'erreur */;
La mise en place d'une pile spécifique de signal est utile si
un processus soupçonne qu'il est susceptible d'épuiser sa pile
standard.
Cela peut se produire, par exemple, lorsque la pile grossit au
point de rencontrer la limite supérieure du tas, ou si elle
atteint une limite établie par un appel à setrlimit(RLIMIT_STACK, &rlim).
Si la pile standard est épuisée, le noyau envoie au
processus un signal SIGSEGV.
Dans ces circonstances, la seule façon d'intercepter ce signal
est d'utiliser une pile spécifique de signal.
Sur la plupart des architectures supportées par Linux, les piles
s'étendent vers les adresses décroissantes. sigaltstack
prend automatiquement en charge le sens d'expansion de la
pile.
Les fonctions appelées depuis un gestionnaire de signal s'exécutant
sur une pile spécifique de signal utilisent également cette pile.
(Cela s'applique également à tous les gestionnaires invoqués pour
d'autres signaux alors que le processus s'exécute sur la pile spécifique
de signal.)
Contrairement à la pile standard, le système n'accroît pas
automatiquement la pile spécifique de signal.
Dépasser la taille allouée pour la pile spécifique de signal
conduit à des résultats imprévisibles.
Un appel execve réussi détruit toutes piles spécifiques de
signal existantes.
sigaltstack succède à l'ancien appel sigstack.
Pour des raisons de compatibilité, la glibc implante
sigstack.
Toutes les nouvelles applications devraient être écrites en utilisant
sigaltstack.
HISTORIQUE
BSD 4.2 possédait un appel système sigstack(). Il utilisait
une structure légèrement différente, et avait comme désavantage
principal la nécessité pour l'appelant de connaître le sens
d'expansion de la pile.
CONFORMITÉ
SUSv2, SVr4, POSIX 1003.1-2001.
VOIR AUSSI
TRADUCTION
Stéphan Rafin, 2002.
|