signal(2) System Calls Manual signal(2) NOM signal - Gestion de signaux ANSI C BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); DESCRIPTION AVERTISSEMENT : Le comportement de signal() varie selon les versions d'UNIX, et a aussi varie au cours du temps dans les differentes versions de Linux. Evitez de l'utiliser : utilisez plutot sigaction(2). Consultez la section Portabilite plus bas. signal() installe le gestionnaire handler pour le signal signum. handler peut etre SIG_IGN, SIG_DFL ou l'adresse d'une fonction definie par le programmeur (un << gestionnaire de signal >>). Lors de l'arrivee d'un signal correspondant au numero signum, l'un des evenements suivants se produit : * Si le gestionnaire vaut SIG_IGN, le signal est ignore. * Si le gestionnaire est SIG_DFL, l'action par defaut associee a ce signal est entreprise (consultez signal(7)). * Si le gestionnaire est une fonction, alors tout d'abord le gestionnaire est reconfigure a SIG_DFL, ou le signal est bloque (voir la section Portabilite ci-dessous), puis handler est appelee avec l'argument signum. Si l'invocation du gestionnaire a bloque le signal, le signal est debloque au retour du gestionnaire. Les signaux SIGKILL et SIGSTOP ne peuvent etre ni ignores, ni interceptes. VALEUR RENVOYEE signal() renvoie la valeur precedente du gestionnaire de signaux. En cas d'erreur, il renvoie SIG_ERRs et errno est positionne pour indiquer l'erreur. ERREURS EINVAL signum est invalide. VERSIONS L'utilisation du type sighandler_t est une extension GNU, exposee si _GNU_SOURCE est definie. La glibc definit aussi sig_t (derive de BSD) si _BSD_SOURCE (dans la glibc 2.19 ou les precedentes) ou _DEFAULT_SOURCE (dans la glibc 2.19 et les suivantes) est definie. Sans cette definition de ce type, la declaration de signal() est un peu plus difficile a lire : void ( *signal(int signum, void (*handler)(int)) ) (int); Portabilite La seule utilisation portable de signal() est de de configurer le gestionnaire du signal a SIG_DFL ou SIG_IGN. La semantique associee a l'utilisation de signal() pour definir un gestionnaire de signal depend suivant les systemes (et POSIX.1 autorise explicitement ces ecarts) ; ne l'utiliser pas pour cela. POSIX.1 a resolu ce probleme de portabilite est specifiant sigaction(2), qui fournit un controle explicite de la semantique quand un gestionnaire de signal est appele ; utilisez cette interface plutot que signal(). STANDARDS C11, POSIX.1-2008. HISTORIQUE C89, POSIX.1-2001. Dans les systemes UNIX d'origine, quand un gestionnaire defini par signal() etait appele lors de la distribution d'un signal, le gestionnaire du signal etait remis a SIG_DFL, et le systeme ne bloquait pas la distribution des instances suivantes du signal. Cela revenait a appeler sigaction(2) avec les attribut suivants : sa.sa_flags = SA_RESETHAND | SA_NODEFER; System V fournit egalement cette semantique pour signal(). Cela posait probleme parce qu'un signal pouvait etre distribue avant que le gestionnaire ait le temps de se reactiver. De plus, la distribution rapide d'un meme signal pouvait causer des appels recursif au gestionnaire. BSD a ameliore la situation, mais a malheureusement egalement modifie la semantique de l'interface de signal() en procedant de cette facon. Sous BSD, lorsqu'un gestionnaire de signal est appele, la disposition du signal n'est pas reinitialisee, et les instances suivantes du signal ne peuvent etre distribuees tant que le gestionnaire s'execute. En outre, certains appels systeme bloquants sont automatiquement relances s'ils sont interrompus par le gestionnaire de signal (consultez signal(7)). La semantique BSD est equivalente a un appel de sigaction(2) avec les attributs suivants : sa.sa_flags = SA_RESTART; La situation sous Linux est la suivante : - L'appel systeme signal() du noyau fournit la semantique System V. - Par defaut, dans la glibc 2 et les suivantes, la fonction de bibliotheque signal() n'appelle pas l'appel systeme du noyau. A la place, elle appelle sigaction(2) est fournissant un attribut qui fournit la semantique BSD. Ce comportement par defaut est fourni tant que la macro de test de fonctionnalites est definie : _BSD_SOURCE dans la glibc 2.19 et les precedentes ou _DEFAULT_SOURCE dans la glibc 2.19 et les suivantes (par defaut, ces macros sont definies ; consultez feature_test_macros(7) pour des details). Si une telle macro de test de fonctionnalites n'est pas definie, signal() fournit la semantique de System V. NOTES Les effets de signal() dans un processus multithreade sont indetermines. Comme specifie par POSIX, le comportement d'un processus est indefini apres la reception d'un signal SIGFPE, SIGILL, ou SIGSEGV qui n'a pas ete engendre par une fonction kill(2) ou raise(3). La division entiere par zero a un resultat indefini, sur certaines architectures elle declenche un signal SIGFPE. De meme, diviser l'entier le plus negatif par -1 peut declencher SIGFPE. Consultez sigaction(2) pour des details sur ce qui se passe quand la posture de SIGCHLD est positionnee sur SIG_IGN. Consultez signal-safety(7) pour une liste de fonctions sures pour les signaux asynchrones qui peuvent etre appelees dans un gestionnaire de signaux. VOIR AUSSI kill(1), alarm(2), kill(2), pause(2), sigaction(2), signalfd(2), sigpending(2), sigprocmask(2), sigsuspend(2), bsd_signal(3), killpg(3), raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), sysv_signal(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 signal(2)