sigaltstack(2) System Calls Manual sigaltstack(2) NOM sigaltstack - Consulter ou definir la pile de signal BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int sigaltstack(const stack_t *_Nullable restrict ss, stack_t *_Nullable restrict old_ss); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : sigaltstack() : _XOPEN_SOURCE >= 500 || /* Depuis la glibc 2.12 : */ _POSIX_C_SOURCE >= 200809L || /* glibc <= 2.19 : */ _BSD_SOURCE DESCRIPTION sigaltstack() permet a un thread 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 old_ss 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. Le type stack_t utilise pour typer les parametres de cette fonction est defini comme suit : 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; Pour mettre en place une nouvelle pile de signal specifique, les champs de cette structure sont definis comme suit : ss.ss_flags Ce champ contient soit 0, soit le drapeau suivant : SS_AUTODISARM (depuis Linux 4.7) Effacer les parametres de la pile de signal specifique lors de l'entree dans le gestionnaire de signal. Au renvoi du gestionnaire de signal, les parametres de la pile de signal specifique seront restaures. Ce drapeau a ete ajoute afin de securiser la desactivation d'un gestionnaire de signal avec swapcontext(3). Sans ce drapeau, un signal gere apres cette desactivation corrompra l'etat du gestionnaire de signal desactive. Sur les noyaux ou ce drapeau n'est pas pris en charge, sigaltstack() echoue avec l'erreur EINVAL quand ce drapeau est fourni. ss.ss_sp Ce champ indique l'adresse de debut de la pile. Lorsqu'un gestionnaire de signal est appele sur la pile specifique, le noyau aligne automatiquement l'adresse donnee dans ss.ss_sp sur une valeur correcte pour l'architecture materielle utilisee. ss.ss_size Ce champ specifie l'adresse 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 minimale necessaire a l'execution d'un gestionnaire de signal. Afin de desactiver une pile existante, positionnez ss.ss_flags a SS_DISABLE. Dans ce cas, le noyau ignore tous les autres drapeaux de ss.ss_flags et les autres champs de ss. Si old_ss 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 old_ss.ss_sp et old_ss.ss_size renvoient l'adresse de depart et la taille de cette pile. Le champ old_ss.ss_flags peut renvoyer l'une des valeurs suivantes : SS_ONSTACK Le thread 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 thread est en train de s'executer sur cette derniere.) SS_DISABLE La pile specifique de signal est actuellement desactivee. Sinon, cette valeur est renvoyee si le processus s'execute actuellement sur une pile de signal specifique mise en place en utilisant le drapeau SS_AUTODISARM. Dans ce cas, il est plus sur de desactiver le gestionnaire de signal avec swapcontext(3). Il est egalement possible de definir une autre pile specifique en utilisant un autre appel sigaltstack(). SS_AUTODISARM La pile specifique de signal a ete marquee pour etre desactivee comme decrit ci-dessus. En positionnant ss sur NULL et old_ss sur une valeur autre que NULL, on peut obtenir les parametres de la pile de signal specifique sans les modifier. VALEUR RENVOYEE sigaltstack() renvoie 0 en cas de succes, ou -1 en cas d'echec en positionnant alors errno pour preciser l'erreur. ERREURS EFAULT Un des parametres ss ou old_ss 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 valable. ENOMEM La taille de la nouvelle pile specifique de signal indiquee (ss.ss_size) est inferieure a MINSIGSTKSZ. EPERM On a essaye de modifier la pile specifique de signal alors que celle-ci etait active (c'est-a-dire, le thread etait deja en train de s'executer sur la pile specifique de signal courante). ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +---------------------------------+--------------------------+---------+ |Interface | Attribut | Valeur | +---------------------------------+--------------------------+---------+ |sigaltstack() | Securite des threads | MT-Safe | +---------------------------------+--------------------------+---------+ STANDARDS POSIX.1-2008. SS_AUTODISARM est une extension de Linux. HISTORIQUE POSIX.1-2001, SUSv2, SVr4. 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 est epuisee. Dans ce cas, un gestionnaire pour SIGSEGV ne peut pas etre execute sur la pile standard ; 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 thread 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 thread 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 supprime toutes les piles de signal specifiques. Un processus enfant cree a l'aide de fork(2) herite d'une copie des parametres de la pile de signal specifique de son parent. Cela vaut aussi pour un processus enfant cree avec clone(2), sauf si les drapeaux de clone incluent CLONE_VM et n'incluent pas CLONE_VFORK, auquel cas toutes les piles de signal specifique mises en place dans le processus parent sont desactivees dans le processus enfant. 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. BOGUES Dans Linux 2.2, le seul drapeau qui pouvait etre indique dans ss.sa_flags etait SS_DISABLE. A partir de la publication du noyau Linux 2.4, un changement a ete apporte pour permettre a sigaltstack() d'autoriser ss.ss_flags==SS_ONSTACK a avoir le meme sens que ss.ss_flags==0 (a savoir que l'inclusion de SS_ONSTACK dans ss.ss_flags est une non-op). Sur d'autres implementations et selon POSIX.1, SS_ONSTACK n'apparait que comme un drapeau signale dans old_ss.ss_flags. Sur Linux, il n'y a meme pas besoin d'indiquer SS_ONSTACK dans ss.ss_flags, et en effet, vous devriez eviter de le faire pour des raisons de portabilite : plusieurs autres systemes donnent une erreur si SS_ONSTACK est indique dans ss.ss_flags. EXEMPLES Le bout de code suivant montre l'utilisation de sigaltstack() (et de sigaction(2)) pour installer une pile de signal specifique utilisee par le gestionnaire pour le signal SIGSEGV : stack_t ss; ss.ss_sp = malloc(SIGSTKSZ); if (ss.ss_sp == NULL) { perror("malloc"); exit(EXIT_FAILURE); } ss.ss_size = SIGSTKSZ; ss.ss_flags = 0; if (sigaltstack(&ss, NULL) == -1) { perror("sigaltstack"); exit(EXIT_FAILURE); } sa.sa_flags = SA_ONSTACK; sa.sa_handler = handler(); /* Adresse d'un gestionnaire de signal */ sigemptyset(&sa.sa_mask); if (sigaction(SIGSEGV, &sa, NULL) == -1) { perror("sigaction"); exit(EXIT_FAILURE); } VOIR AUSSI execve(2), setrlimit(2), sigaction(2), siglongjmp(3), sigsetjmp(3), signal(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 sigaltstack(2)