signal
| Défini dans l'en-tête <signal.h>
|
||
void (*signal( int sig, void (*handler) (int))) (int);
|
||
Modifie la gestion du signal sig. Selon la valeur de handler, le signal peut être ignoré, remis à sa valeur par défaut, ou géré par une fonction définie par l'utilisateur invoquée sous la forme (*handler)(sig).
Lorsque le gestionnaire de signal est défini comme 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 que le gestionnaire de signal s'exécute.
Paramètres
| sig | - | le signal pour lequel définir le gestionnaire. Il peut s'agir d'une valeur définie par l'implémentation ou de l'une des valeurs suivantes :
| ||||||
| handler | - | le gestionnaire de signal. Il doit s'agir de l'un des 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 à la suite de abort ou raise (autrement dit, le gestionnaire de signal est asynchrone), le comportement est indéfini si
- le gestionnaire de signal appelle une fonction quelconque de la bibliothèque standard, sauf
- abort
- _Exit
- quick_exit
signalavec le premier argument étant le numéro du signal actuellement traité (un gestionnaire asynchrone peut se ré-enregistrer lui-même, mais pas pour d'autres signaux).- fonctions atomiques de
<stdatomic.h>si les arguments atomiques sont sans verrou - atomic_is_lock_free (avec toute sorte d'arguments atomiques)
- le gestionnaire de signal fait référence à tout objet avec static ou thread-local(depuis C11) durée de stockage qui n'est pas un atomique(depuis C11) sans verrou autrement qu'en assignant à une static
volatile sig_atomic_t.
À l'entrée dans le gestionnaire de signal, l'état de l'environnement à virgule flottante et les valeurs de tous les objets sont indéterminés, sauf pour
- objets de type
volatile sig_atomic_t - objets de types atomiques sans verrou (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 est indéfini si signal est utilisé dans un programme multithreadé. Il n'est pas nécessaire qu'il soit thread-safe.
Notes
POSIX exige que signal soit thread-safe, et spécifie une liste de fonctions de bibliothèque sûres en asynchrone-signal qui peuvent être appelées depuis tout gestionnaire de signal.
Outre 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 d'implémentation importantes, 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 C23 (ISO/IEC 9899:2024) :
- 7.14.1.1 La fonction signal (p: 285-286)
- Norme C17 (ISO/IEC 9899:2018) :
- 7.14.1.1 La fonction signal (p: 193-194)
- Norme C11 (ISO/IEC 9899:2011) :
- 7.14.1.1 La fonction signal (p: 266-267)
- Norme C99 (ISO/IEC 9899:1999) :
- 7.14.1.1 La fonction signal (p: 247-248)
- Norme C89/C90 (ISO/IEC 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
| |