signal

Définit la gestion du signal d'interruption.

Important

N’utilisez pas cette méthode pour arrêter une application du Microsoft Store, sauf dans les scénarios de test ou de débogage. Les méthodes programmatiques ou d’interface utilisateur pour fermer une application Store ne sont pas autorisées en fonction des stratégies du Microsoft Store. Pour plus d’informations, consultez le cycle de vie des applications UWP.

Syntaxe

void __cdecl *signal(int sig, int (*func)(int, int));

Paramètres

sig
Valeur du signal.

func
Le deuxième paramètre est un pointeur vers la fonction à exécuter. Le premier paramètre est une valeur de signal, et le deuxième paramètre est un sous-code qui peut être utilisé lorsque le premier paramètre est SIGFPE.

Valeur retournée

signal retourne la valeur précédente de func associée au signal donné. Par exemple, si la valeur précédente de func était SIG_IGN, la valeur de retour est également SIG_IGN. La valeur de retour SIG_ERR indique une erreur ; dans ce cas, errno a la valeur EINVAL.

Pour plus d’informations sur les codes de retour, consultez , , _sys_errlist_doserrnoet _sys_nerr.errno

Notes

La fonction signal permet à un processus de choisir une des différentes méthodes pour gérer un signal d'interruption à partir du système d'exploitation. L’argument sig est l’interruption à laquelle signal répond ; il doit s’agir de l’une des constantes manifeste suivantes, qui sont définies dans SIGNAL.H.

Valeur sig Description
SIGABRT Arrêt anormal
SIGFPE Erreur de virgule flottante
SIGILL Instruction non conforme
SIGINT Signal CTRL+C
SIGSEGV Accès au stockage non conforme
SIGTERM Demande d'arrêt

Si sig ce n’est pas l’une des valeurs ci-dessus, le gestionnaire de paramètres non valide est appelé, tel que défini dans la validation de paramètre. Si l'exécution est autorisée à se poursuivre, cette fonction affecte la valeur errno à EINVAL et retourne SIG_ERR.

Par défaut, signal termine le programme appelant par le code de sortie 3, indépendamment de la valeur de sig.

Remarque

SIGINT n'est pris en charge pour aucune application Win32. Lorsqu'une interruption CTRL+C se produit, les systèmes d'exploitation Win32 génèrent un nouveau thread pour gérer spécifiquement cette interruption. Cela peut amener une application à un seul thread, par exemple celle dans UNIX, à devenir multithread et à provoquer un comportement inattendu.

L’argument func est une adresse à un gestionnaire de signal que vous écrivez, ou à l’une des constantes d’action de signal prédéfiniesSIG_DFLou SIG_IGN, qui sont également définies dans SIGNAL.H. S’il func s’agit d’une fonction, elle est installée en tant que gestionnaire de signal pour le signal donné. Le prototype du gestionnaire de signal requiert un argument formel, sig, de type int. Le système d'exploitation fournit l'argument réel via sig lorsqu'une interruption se produit ; l'argument est le signal qui a généré l'interruption. Par conséquent, vous pouvez utiliser les six constantes de manifeste (répertoriées dans le tableau précédent) de votre gestionnaire de signal pour déterminer le type d'interruption et prendre les mesures appropriées. Par exemple, vous pouvez appeler signal deux fois pour assigner le même gestionnaire à deux signaux différents, puis tester l'argument sig dans le gestionnaire pour prendre des mesures différentes selon le signal reçu.

Si vous testez des exceptions à virgule flottante (SIGFPE), func pointe vers une fonction qui prend un deuxième argument facultatif qui est l’une des constantes manifestes, définies dans FLOAT.H, de la forme FPE_xxx. Lorsqu’un SIGFPE signal se produit, vous pouvez tester la valeur du deuxième argument pour déterminer le type d’exception à virgule flottante, puis prendre les mesures appropriées. Cet argument et ses valeurs possibles sont des extensions Microsoft.

Pour les exceptions à virgule flottante, la valeur de func n’est pas réinitialisée lorsque le signal est reçu. Pour récupérer des exceptions à virgule flottante, utilisez les clauses try/except pour cerner les opérations à virgule flottante. Il est également possible de récupérer à longjmpl’aide setjmp de . Dans les deux cas, le processus appelant reprend l'exécution et quitte l'état à virgule flottante du processus non défini.

Si le gestionnaire de signal retourne, le processus appelant reprend l’exécution immédiatement après le point auquel il a reçu le signal d’interruption, quel que soit le type de signal ou le mode d’exploitation.

Avant que la fonction spécifiée soit exécutée, func a la valeur SIG_DFL. Le signal d'interruption suivant est traité comme décrit pour SIG_DFL, sauf si un appel d'intervention à signal précise le contraire. Vous pouvez utiliser cette fonctionnalité pour réinitialiser les signaux dans la fonction appelée.

Étant donné que les routines de gestionnaire de signal sont souvent appelées de manière asynchrone lorsqu’une interruption se produit, votre fonction de gestionnaire de signal peut obtenir le contrôle lorsqu’une opération d’exécution est incomplète et dans un état inconnu. La liste suivante résume les restrictions qui déterminent les fonctions que vous pouvez utiliser dans votre routine de gestion de signal.

  • Ne émettez pas de routines d’E/S de bas niveau STDIO.H (par exemple, printf ou fread).

  • N’appelez pas de routines de tas ou de routine qui utilise les routines de tas (par exemple, , mallocou _strdup_putenv). Pour plus d’informations, consultez malloc.

  • N’utilisez aucune fonction qui génère un appel système (par exemple, _getcwd ou time).

  • N’utilisez longjmp pas, sauf si l’interruption est due à une exception à virgule flottante (autrement ditSIGFPE). sig Dans ce cas, réinitialisez d'abord le package à virgule flottante à l'aide d'un appel à _fpreset.

  • N’utilisez aucune routine de superposition.

Un programme doit contenir du code à virgule flottante s’il doit intercepter l’exception SIGFPE à l’aide de la fonction. Si votre programme n’a pas de code à virgule flottante et nécessite le code de gestion des signaux de la bibliothèque d’exécution, déclarez simplement un double volatile et initialisez-le sur zéro :

volatile double d = 0.0f;

Les SIGILL signaux et SIGTERM les signaux ne sont pas générés sous Windows. Ils sont inclus pour la compatibilité ANSI. Par conséquent, vous pouvez définir des gestionnaires de signal pour ces signaux à l’aide signalde , et vous pouvez également générer explicitement ces signaux en appelant raise.

Les paramètres de signal ne sont pas conservés dans les processus générés créés par des appels ou _exec_spawn des fonctions. Les valeurs par défaut des paramètres de signal sont réinitialisées dans le nouveau processus.

Spécifications

Routine En-tête requis
signal <signal.h>

Pour plus d’informations sur la compatibilité, consultez Compatibility.

Exemple

L'exemple suivant montre comment utiliser signal pour ajouter un comportement personnalisé au signal SIGABRT. Pour plus d’informations sur le comportement d’abandon, consultez _set_abort_behavior.

// crt_signal.c
// compile with: /EHsc /W4
// Use signal to attach a signal handler to the abort routine
#include <stdlib.h>
#include <signal.h>

void SignalHandler(int signal)
{
    if (signal == SIGABRT) {
        // abort signal handler code
    } else {
        // ...
    }
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);

    abort();
}

La sortie dépend de la version du runtime utilisée, que l’application soit une console ou une application Windows et des paramètres de Registre Windows. Pour une application console, un message semblable au message suivant peut être envoyé à stderr :

Debug Error!

Program: c:\Projects\crt_signal\Debug\crt_signal.exe

R6010

- abort() has been called

Voir aussi

Processus et contrôle d’environnement
abort
_exec, _wexec fonctions
exit, _Exit, _exit
_fpreset
_spawn, _wspawn fonctions