Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
NOM
sigaltstack - Consultez ou fixer la pile de signal
SYNOPSIS
#include <signal.h>
int sigaltstack(const stack_t *ss, stack_t *oss);
Exigences de macros de test de fonctionnalites pour la glibc (consultez
feature_test_macros(7)) :
sigaltstack() :
Depuis la glibc 2.12 :
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE &&
_XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE >= 200809L ||
_XOPEN_SOURCE >= 700
Avant la glibc 2.12 :
_BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
DESCRIPTION
sigaltstack() permet a un processus de definir une nouvelle pile
specifique pour les gestionnaires de signaux et/ou de recuperer l'etat
d'une pile specifique de signal deja existante. Une pile specifique de
signal est utilisee durant l'execution d'un gestionnaire de signal si
la mise en place de ce gestionnaire (consultez sigaction(2)) le
specifiait.
La sequence d'actions nominale pour utiliser une pile specifique de
signal est la suivante :
1. Allouer une zone memoire qui sera utilisee comme pile specifique de
signal.
2. Utiliser sigaltstack() afin d'informer le systeme de l'existence et
de la position de la pile specifique de signal.
3. Lors de la mise en place du gestionnaire de signal en utilisant
sigaction(2), informer le systeme que ce gestionnaire de signal doit
etre execute sur la pile specifique de signal en positionnant le
drapeau SA_ONSTACK.
L'argument ss est utilise afin de definir une nouvelle pile specifique
de signal, tandis que l'argument oss est utilise afin de recuperer des
informations sur la pile de signal actuellement en place. Si une seule
de ces actions vous interesse, alors l'autre argument peut etre
positionne a NULL. Chacun de ces parametres 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 specifique de signal,
ss.ss_flags est positionne a zero, et ss.ss_sp et ss.ss_size specifient
l'adresse de debut et la taille de la pile. La constante SIGSTKSZ est
definie de facon a etre suffisamment grande pour couvrir les besoins
typiques en espace memoire d'une pile specifique de signal, et la
constante MINSIGSTKSZ definit la taille minimum necessaire a
l'execution d'un gestionnaire de signal.
Lorsqu'un gestionnaire de signal est invoque sur la pile specifique, le
noyau aligne automatiquement l'adresse donnee dans ss.ss_sp sur une
valeur correcte pour l'architecture materielle utilisee.
Afin de desactiver une pile existante, positionnez ss.ss_flags a
SS_DISABLE. Dans ce cas, les autres champs de ss sont ignores.
Si oss ne vaut pas NULL, alors il est utilise afin de renvoyer des
informations sur la pile specifique de signal qui etait utilisee avant
l'appel a sigaltstack(). Les champs oss.ss_sp et oss.ss_size renvoient
l'adresse de depart et la taille de cette pile. Le champ oss.ss_flags
peut renvoyer l'une des valeurs suivantes :
SS_ONSTACK
Le processus s'execute actuellement sur la pile specifique de
signal. (Remarquez qu'il n'est pas possible de changer la pile
specifique de signal si le processus est en train de s'executer
sur cette derniere.)
SS_DISABLE
La pile specifique de signal est actuellement desactivee.
VALEUR RENVOY'EE
sigaltstack() renvoie 0 en cas de succes, ou -1 en cas d'echec en
positionnant alors errno pour preciser l'erreur.
ERREURS
EFAULT L'un des parametres ss ou oss ne vaut pas NULL et pointe vers
une zone memoire n'appartenant pas a l'espace d'adressage du
processus.
EINVAL ss ne vaut pas NULL et le champ ss_flags contient une valeur non
nulle differente de SS_DISABLE.
ENOMEM La taille de la nouvelle pile specifique de signal indiquee
(ss.ss_size) est inferieure a MINSTKSZ.
EPERM On a essaye de modifier la pile specifique de signal alors que
celle-ci etait active (c'est-a-dire, le processus etait deja en
train de s'executer sur la pile specifique de signal courante).
CONFORMIT'E
SUSv2, SVr4, POSIX.1-2001.
NOTES
Le cas le plus courant d'utilisation d'une pile specifique est pour la
gestion du signal SIGSEGV qui est genere si la place disponible pour la
pile normale du processus est epuisee. Dans ce cas, un gestionnaire
pour SIGSEGV ne peut pas etre execute sur la pile du processus ; si
l'on souhaite l'intercepter, on doit utiliser une pile specifique.
La mise en place d'une pile specifique de signal est utile si un
processus soupconne qu'il est susceptible d'epuiser sa pile standard.
Cela peut se produire, par exemple, lorsque la pile grossit au point de
rencontrer la limite superieure du tas, ou si elle atteint une limite
etablie par un appel a setrlimit(RLIMIT_STACK, &rlim). Si la pile
standard est epuisee, le noyau envoie au processus un signal SIGSEGV.
Dans ces circonstances, la seule facon d'intercepter ce signal est
d'utiliser une pile specifique de signal.
Sur la plupart des architectures supportees par Linux, les piles
s'etendent vers les adresses decroissantes. sigaltstack() prend
automatiquement en charge le sens d'expansion de la pile.
Les fonctions appelees depuis un gestionnaire de signal s'executant sur
une pile specifique de signal utilisent egalement cette pile. (Cela
s'applique egalement a tous les gestionnaires invoques pour d'autres
signaux alors que le processus s'execute sur la pile specifique de
signal.) Contrairement a la pile standard, le systeme n'accroit pas
automatiquement la pile specifique de signal. Depasser la taille
allouee pour la pile specifique de signal conduit a des resultats
imprevisibles.
Un appel execve(2) reussi detruit toutes piles specifiques de signal
existantes. Un processus fils cree avec fork() herite d'une copie des
parametres de la pile specifique de signal de son pere.
sigaltstack() succede a l'ancien appel sigstack(). Pour des raisons de
compatibilite, la glibc implemente sigstack(). Toutes les nouvelles
applications devraient etre ecrites en utilisant sigaltstack().
Historique
BSD 4.2 possedait un appel systeme sigstack(). Il utilisait une
structure legerement differente, et avait comme desavantage principal
la necessite pour l'appelant de connaitre le sens d'expansion de la
pile.
EXEMPLE
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 */;
VOIR AUSSI
execve(2), setrlimit(2), sigaction(2), siglongjmp(3), sigsetjmp(3),
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/>.
Stephan Rafin (2002), Alain Portal
<URL:http://manpagesfr.free.fr/> (2006). 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> >>.