Provided by: manpages-fr-dev_3.57d1p1-1_all bug

NOM

       sigaltstack - Consultez ou définir 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   (consultez
   feature_test_macros(7)) :

       sigaltstack() :
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* Depuis la glibc 2.12 : */ _POSIX_C_SOURCE >= 200809L

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 (consultez 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(2) 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.57 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

       Depuis   2010,   cette   traduction   est   maintenue   à   l'aide   de    l'outil    po4a
       <http://po4a.alioth.debian.org/>  par l'équipe de traduction francophone au sein du projet
       perkamon <http://perkamon.alioth.debian.org/>.

       Stéphan Rafin (2002), Alain Portal <http://manpagesfr.free.fr/> (2006). Julien Cristau  et
       l'équipe francophone de traduction de Debian (2006-2009).

       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> ».