signal
|
Défini dans l'en-tête
<signal.h>
|
||
|
void
(
*
signal
(
int
sig,
void
(
*
handler
)
(
int
)
)
)
(
int
)
;
|
||
Définit le gestionnaire d'erreur pour le signal
sig
. Le gestionnaire de signal peut être configuré pour que le traitement par défaut se produise, que le signal soit ignoré, ou qu'une fonction définie par l'utilisateur soit appelée.
Lorsqu'un gestionnaire de signal est défini sur une fonction et qu'un signal se produit, il est défini par l'implémentation si signal ( sig, SIG_DFL ) sera exécuté immédiatement avant le début du gestionnaire de signal. De plus, l'implémentation peut empêcher un ensemble défini par l'implémentation de signaux de se produire pendant l'exécution du gestionnaire de signal.
Table des matières |
Paramètres
| sig | - |
le signal auquel définir le gestionnaire de signal. Il peut s'agir d'une valeur définie par l'implémentation ou d'une des valeurs suivantes :
|
||||||
| handler | - |
le gestionnaire de signal. Ce doit être l'un des éléments suivants :
|
Valeur de retour
Gestionnaire de signal précédent en cas de succès ou SIG_ERR en cas d'échec (la définition d'un gestionnaire de signal peut être désactivée sur certaines implémentations).
Gestionnaire de signal
Les limitations suivantes sont imposées à la fonction définie par l'utilisateur qui est installée comme gestionnaire de signal.
Si la fonction définie par l'utilisateur retourne lors du traitement de SIGFPE , SIGILL ou SIGSEGV , le comportement est indéfini.
Si le gestionnaire de signal est appelé à la suite de abort ou raise , le comportement est indéfini si le gestionnaire de signal appelle raise .
Si le gestionnaire de signal est appelé NON suite à abort ou raise (en d'autres termes, le gestionnaire de signal est asynchrone ), le comportement est indéfini si
- le gestionnaire de signal appelle toute fonction de la bibliothèque standard, sauf
-
- abort
- _Exit
- quick_exit
-
signalavec le premier argument étant le numéro du signal actuellement traité (le gestionnaire asynchrone peut se réenregistrer lui-même, mais pas d'autres signaux). -
fonctions atomiques de
<stdatomic.h>si les arguments atomiques sont sans verrouillage - atomic_is_lock_free (avec tout type d'arguments atomiques)
- le gestionnaire de signal fait référence à tout objet ayant une durée de stockage statique ou thread-local (depuis C11) storage duration qui n'est pas un atomic lock-free (depuis C11) autrement qu'en assignant à un volatile sig_atomic_t statique.
À l'entrée du gestionnaire de signal, l'état de l'environnement en virgule flottante et les valeurs de tous les objets sont non spécifiés, à l'exception de
- objets de type volatile sig_atomic_t
- objets de types atomiques sans verrouillage (depuis C11)
- effets secondaires rendus visibles via atomic_signal_fence (depuis C11)
Au retour d'un gestionnaire de signal, la valeur de tout objet modifié par le gestionnaire de signal qui n'est pas volatile sig_atomic_t ou atomique sans verrou (depuis C11) est indéfinie.
Le comportement n'est pas défini si signal est utilisé dans un programme multithread. Il n'est pas requis d'être thread-safe.
Notes
POSIX exige que
signal
soit thread-safe, et
spécifie une liste de fonctions de bibliothèque asynchrone-sûres
qui peuvent être appelées depuis n'importe quel gestionnaire de signal.
En plus de
abort
et
raise
, POSIX spécifie que
kill
,
pthread_kill
, et
sigqueue
génèrent des signaux synchrones.
POSIX recommande
sigaction
au lieu de
signal
, en raison de son comportement sous-spécifié et des variations significatives d'implémentation concernant la livraison des signaux pendant l'exécution d'un gestionnaire de signal.
Exemple
#include <signal.h> #include <stdio.h> volatile sig_atomic_t gSignalStatus; void signal_handler(int signal) { gSignalStatus = signal; } int main(void) { signal(SIGINT, signal_handler); printf("SignalValue: %d\n", gSignalStatus); printf("Sending signal: %d\n", SIGINT); raise(SIGINT); printf("SignalValue: %d\n", gSignalStatus); }
Sortie :
SignalValue: 0 Sending signal: 2 SignalValue: 2
Références
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.14.1.1 La fonction signal (p. 193-194)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.14.1.1 La fonction signal (p. 266-267)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.14.1.1 La fonction signal (p. 247-248)
- Norme C89/C90 (ISO/CEI 9899:1990) :
-
- 4.7.1.1 La fonction signal
Voir aussi
|
exécute le gestionnaire de signal pour un signal particulier
(fonction) |
|
|
Documentation C++
pour
signal
|
|