Loading

NOM

       sigaltstack - Consulter 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  fonctionnalités  pour  la  glibc (voir
   feature_test_macros(7)) :

       sigaltstack() : _BSD_SOURCE || _XOPEN_SOURCE >= 500

       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(2), 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.ss_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.

       Lorsqu’un gestionnaire de signal est invoqué sur la pile spécifique, le
       noyau  aligne  automatiquement  l’adresse  donnée dans ss.ss_sp sur une
       valeur correcte pour l’architecture matérielle utilisée.

       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

       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.

       EINVAL ss ne vaut pas NULL et le champ ss_flags contient une valeur non
              nulle différente de SS_DISABLE.

       ENOMEM La taille de la nouvelle  pile  spécifique  de  signal  indiquée
              (ss.ss_size) est inférieure à MINSTKSZ.

       EPERM  On  a  essayé de modifier la pile spécifique de signal alors que
              celle-ci était active (c’est-à-dire, le processus était déjà  en
              train  de s’exécuter sur la pile spécifique de signal courante).

CONFORMITÉ

       SUSv2, SVr4, POSIX.1-2001.

NOTES

       Le cas le plus courant d’utilisation d’une pile spécifique est pour  la
       gestion du signal SIGSEGV qui est généré si la place disponible pour la
       pile normale du processus est épuisée. Dans  ce  cas,  un  gestionnaire
       pour  SIGSEGV  ne  peut  pas être exécuté sur la pile du processus ; si
       l’on souhaite l’intercepter, on doit utiliser une pile spécifique.

       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(2) réussi détruit toutes piles  spécifiques  de  signal
       existantes.  Un  processus fils créé avec fork() hérite d’une copie des
       paramètres de la pile spécifique de signal de son père.

       sigaltstack() succède à l’ancien appel sigstack(). Pour des raisons  de
       compatibilité,  la  glibc  implémente  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.

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.23 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       être       trouvées      à      l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite  par  Stéphan  Rafin  <stephan  DOT
       rafin  AT  laposte  DOT  net> en 2002, puis a été mise à jour par Alain
       Portal <aportal AT  univ-montp2  DOT  fr>  jusqu’en  2006,  et  mise  à
       disposition sur http://manpagesfr.free.fr/.

       Les mises à jour et corrections de la version présente dans Debian sont
       directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
       francophone de traduction de Debian.

       Veuillez   signaler   toute   erreur   de   traduction  en  écrivant  à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir accès à la version anglaise de ce document
       en utilisant la commande « man -L C <section> <page_de_man> ».