sigreturn(2) | System Calls Manual | sigreturn(2) |
NOM
sigreturn, rt_sigreturn - Revenir d'un gestionnaire de signaux et nettoyer la pile
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
int sigreturn(...);
DESCRIPTION
Si le noyau Linux détermine qu'un signal non bloqué est en attente d'un processus, au prochain retour en mode utilisateur de ce processus (par exemple au retour d'un appel système ou quand le processus est réordonnancé sur le processeur), il créera un nouvel emplacement dans la pile de l'espace utilisateur où il enregistrera des morceaux de contexte de processus (mot sur l'état du processeur, registres, masque de signal et paramètres de la pile du signal).
Le noyau s'arrange aussi pour que, lors du retour à l'espace utilisateur, le gestionnaire de signal soit appelé et pour qu'au retour du gestionnaire, le contrôle soit redonné à un bout de code de l'espace utilisateur appelé généralement le « trampoline de signal ». En retour, ce code appelle sigreturn().
Cet appel à sigreturn() défait tout ce qui a été fait — modifier le masque de signaux du processus, commutation des piles (consultez sigaltstack(2)) — de façon à invoquer le gestionnaire de signal. L'utilisation des informations précédemment sauvegardées dans la pile de l'espace utilisateur sigreturn() restaure le masque de signal du processus, commute les piles et restaure le contexte du processus (drappeaux et registres du processeur, notamment le pointeur de la pile et les instructions du pointeur), de sorte que le processus reprenne son exécution au point où il a été interrompu par le signal.
VALEUR RENVOYÉE
sigreturn() ne renvoit jamais.
VERSIONS
De nombreux systèmes de type UNIX ont un appel système sigreturn() ou presque équivalent. Cependant, cet appel n'est pas spécifié dans POSIX et les détails de son comportement varient en fonction des systèmes.
STANDARDS
Aucun.
NOTES
sigreturn() n'existe que pour permettre l'implémentation de gestionnaires de signal. Il ne devrait jamais être appelé directement (en effet, une simple enveloppe sigreturn() de la bibliothèque GNU C renvoie simplement -1 et errno est positionné sur ENOSYS). Les détails des paramètres (s'il y en a) passés à sigreturn() varient selon l'architecture (sur certaines architectures telles que x86-64, sigreturn() ne prend aucun paramètre puisque toutes les informations dont il a besoin sont disponibles dans la pile créée précédemment par le noyau dans la pile de l'espace utilisateur).
Autrefois, les systèmes UNIX mettaient le code du trampoline de signal dans la pile utilisateur. De nos jours, les pages de la pile utilisateur sont protégées pour interdire l'exécution d'un code. Ainsi, sur les systèmes Linux contemporains, selon l'architecture, le code du trampoline de signal réside soit dans le vdso(7), soit dans la bibliothèque C. Dans ce dernier cas, la fonction enveloppe sigaction(2) de la bibliothèque C informe le noyau de l'emplacement du code du trampoline en mettant son adresse dans le champ sa_restorer de la structure sigaction et il positonne le drapeau SA_RESTORER dans le champ sa_flags.
Les informations du contexte du processus sauvegardées vont dans la structure ucontext_t (consultez <sys/ucontext.h>). Cette structure est visible à l'intérieur du gestionnaire de signal comme le troisième paramètre d'un gestionnaire mis en place à l'aide de sigaction(2) avec le drapeau SA_SIGINFO.
Sur d'autres systèmes UNIX, l'opération de trampoline du signal diffère quelque peu. En particulier, sur certains systèmes où il y a une transition vers le retour à l'espace utilisateur, le noyau donne le contrôle au trampoline (plutôt qu'au gestionnaire de signal) et le code du trampoline appelle le gestionnaire de signal (puis appelle sigreturn() après le renvoi du gestionnaire de signal).
Différences entre bibliothèque C et noyau
L'appel système Linux d'origine s'appelait sigreturn(). Toutefois, avec l'arrivée des signaux en temps réel dans Linux 2.2, un nouvel appel système, rt_sigreturn(), a été ajouté pour prendre en charge un type sigset_t élargi. La bibliothèque GNU C nous cache ces détails en appelant de manière transparente rt_sigreturn() quand le noyau le fournit.
VOIR AUSSI
kill(2), restart_syscall(2), sigaltstack(2), signal(2), getcontext(3), signal(7), vdso(7)
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess https://www.blaess.fr/christophe/, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
2 mai 2024 | Pages du manuel de Linux 6.8 |