Provided by: manpages-fr-dev_3.65d1p1-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.65 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> ».