sigaltstack

SIGALTSTACK(2)            Manuel du programmeur Linux           SIGALTSTACK(2)



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.70 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 Ã
       <perkamon-fr@traduc.org>.

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



Linux                          26 septembre 2010                SIGALTSTACK(2)