signal

 

Pour obtenir la dernière documentation sur Visual Studio 2017, consultez Documentation Visual Studio 2017.

Définit la gestion du signal d'interruption.

System_CAPS_ICON_important.jpg Important

N'utilisez pas cette méthode pour arrêter une application Windows 8.x Store, sauf dans les scénarios de test ou de débogage. Méthodes de programmation ou de l’interface utilisateur pour fermer une Windows 8.x Store application ne sont pas autorisées selon la Section 3.6 de la critères de certification des applications Windows 8. Pour plus d’informations, consultez cycle de vie des applications (applications du Windows Store).

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

Paramètres

sig
Valeur du signal.

func
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.

signal retourne la valeur précédente de func qui est associé 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.

Consultez la page errno, _doserrno, _sys_errlist et _sys_nerr pour plus d’informations sur les codes de retour.

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 être l'une des constantes de manifeste suivantes, définies dans SIGNAL.H.

Valeur sigDescription
SIGABRTArrêt anormal
SIGFPEErreur de virgule flottante
SIGILLInstruction non conforme
SIGINTSignal CTRL+C
SIGSEGVAccès au stockage non conforme
SIGTERMDemande d'arrêt

Si sig n’est pas une des valeurs ci-dessus, le Gestionnaire de paramètre non valide est appelé, comme défini dans 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.

System_CAPS_ICON_note.jpg 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 l'adresse d'un gestionnaire de signal que vous écrivez, ou d'une des constantes prédéfinies SIG_DFL ou SIG_IGN, qui sont également définies dans SIGNAL.H. Si func est une fonction, il est installé 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 accepte un deuxième argument facultatif qui est l'une des nombreuses constantes de manifeste définies dans FLOAT.H, sous la forme FPE_xxx. Lorsqu'un signal SIGFPE se produit, vous pouvez tester la valeur du deuxième argument pour déterminer le type d'exception à virgule flottante et agir en conséquence. 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 à l’aide de setjmp avec longjmp. 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 moment où il a reçu le signal d'interruption. Cela est vrai quel que soit le type de signal ou le mode de fonctionnement.

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.

Dans la mesure où les routines de gestion de signal sont généralement appelées de façon asynchrone lorsqu'une interruption se produit, votre fonction de gestion de signal peut obtenir le contrôle lorsqu'une opération du runtime 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 publiez pas les routines d'E/S STDIO.H ou de niveau inférieur (par exemple, printf ou fread).

  • N'appelez pas les routines de tas ou toute routine qui utilise les routines de tas (par exemple, malloc, _strdup ou _putenv). Consultez la page malloc pour plus d’informations.

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

  • N'utilisez pas longjmp à moins que l'interruption soit provoquée par une exception à virgule flottante (autrement dit, si sig a la valeur SIGFPE). 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 un code à virgule flottante s'il doit intercepter l'exception SIGFPE à l'aide de la fonction. Si votre programme ne contient pas de code à virgule flottante et qu'il requiert le code de gestion de signal de la bibliothèque runtime, déclarez un chiffre de type double volatile et initialisez-le à zéro :

volatile double d = 0.0f;   

Les signaux SIGILL et SIGTERM 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 de signal, et vous pouvez également générer explicitement ces signaux en appelant déclencher.

Les paramètres de signal ne sont pas conservés dans les processus engendrés qui sont créés par les appels aux fonctions _exec ou _spawn. Les valeurs par défaut des paramètres de signal sont réinitialisées dans le nouveau processus.

RoutineEn-tête requis
signal<signal.h>

Pour plus d'informations sur la compatibilité, voir Compatibilité.

L'exemple suivant montre comment utiliser signal pour ajouter un comportement personnalisé au signal SIGABRT. Pour plus d’informations sur le comportement d’arrêt, 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>  
#include <tchar.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();  
}  

This application has requested the Runtime to terminate it in an unusual way.  
Please contact the application's support team for more information.  
  

Non applicable. Pour appeler la fonction C standard, utilisez PInvoke. Pour plus d'informations, consultez Exemples d'appel de plateforme.

Processus de contrôle et d’environnement
abandonner
_exec, _wexec, fonctions
Exit, _Exit, _exit
_fpreset
_spawn, _wspawn, fonctions

Afficher: