Namespaces
Variants

signal

From cppreference.net
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 :
définit les types de signaux
(constante macro)
handler - le gestionnaire de signal. Ce doit être l'un des éléments suivants :
  • SIG_DFL macro. Le gestionnaire de signal est défini sur le gestionnaire de signal par défaut.
  • SIG_IGN macro. Le signal est ignoré.
  • pointeur vers une fonction. La signature de la fonction doit être équivalente à ce qui suit :
void fun ( int sig ) ;

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
  • signal avec 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

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)