signal

Imposta la gestione del segnale di interrupt.

Importante

Non usare questo metodo per arrestare un'app di Microsoft Store, ad eccezione di scenari di test o debug. I modi programmatici o dell'interfaccia utente per chiudere un'app dello Store non sono consentiti in base ai criteri di Microsoft Store. Per altre informazioni, vedi Ciclo di vita delle app UWP.

Sintassi

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

Parametri

sig
Valore del segnale.

func
Il secondo parametro è un puntatore alla funzione da eseguire. Il primo parametro è un valore del segnale e il secondo parametro è un codice secondario che può essere usato quando il primo parametro è SIGFPE.

Valore restituito

signal restituisce il valore precedente di func associato al segnale specificato. Ad esempio, se il valore precedente di func era SIG_IGN, anche il valore restituito è SIG_IGN. Un valore restituito di SIG_ERR indica un errore; in tal caso errno è impostato su EINVAL.

Per altre informazioni sui codici restituiti, vedere errno, _doserrno, _sys_errliste _sys_nerr.

Osservazioni:

La funzione signal consente a un processo di scegliere uno dei vari modi per gestire un segnale di interrupt proveniente dal sistema operativo. L'argomento sig è l'interrupt a cui signal risponde; deve essere una delle costanti manifesto seguenti, definite in SIGNAL.H.

Valore sig Descrizione
SIGABRT Terminazione anomala
SIGFPE Errore di virgola mobile
SIGILL Istruzione non valida
SIGINT Segnale CTRL+C
SIGSEGV Accesso all'archiviazione non valido
SIGTERM Richiesta di terminazione

Se sig non è uno dei valori precedenti, viene richiamato il gestore di parametri non validi, come definito in Convalida dei parametri . Se l'esecuzione può continuare, la funzione imposta errno suEINVAL e restituisce SIG_ERR.

Per impostazione predefinita, signal termina il programma chiamante con codice di uscita 3, indipendentemente dal valore di sig.

Nota

SIGINT non è supportato per le applicazioni Win32. Quando si verifica un interrupt CTRL+C, i sistemi operativi Win32 generare un nuovo thread per gestire in maniera specifica l'interrupt. Ciò può far sì che un'applicazione a thread singolo, come una in UNIX, diventi multithreading e causi un comportamento imprevisto.

L'argomento func è un indirizzo a un gestore di segnali scritto o in una delle costantiSIG_DFL predefinite di azione del segnale o SIG_IGN, definite anche in SIGNAL.H. Se func è una funzione, viene installata come gestore del segnale per il segnale specificato. Il prototipo del gestore di segnale richiede un solo argomento formale, sig, di tipo int. Il sistema operativo fornisce l'argomento effettivo tramite sig quando si verifica un interrupt. L'argomento è il segnale che ha generato l'interrupt. Pertanto, è possibile utilizzare le sei costanti manifesto (elencate nella tabella precedente) nel gestore di segnale per determinare quale interrupt si è verificato ed eseguire l'azione appropriata. Ad esempio, è possibile chiamare due volte signal per assegnare lo stesso gestore a due segnali diversi, quindi testare l'argomento sig nel gestore per eseguire azioni diverse in base al segnale ricevuto.

Se si esegue il test per le eccezioni a virgola mobile (SIGFPE), func punta a una funzione che accetta un secondo argomento facoltativo che è una delle diverse costanti manifesto, definite in FLOAT.H, del formato FPE_xxx. Quando si verifica un SIGFPE segnale, è possibile testare il valore del secondo argomento per determinare il tipo di eccezione a virgola mobile e quindi eseguire l'azione appropriata. Questo argomento e i relativi valori possibili sono estensioni Microsoft.

Per le eccezioni a virgola mobile, il valore di func non viene reimpostato quando viene ricevuto il segnale. Per risolvere eccezioni a virgola mobile, utilizzare le clausole try/except per racchiudere le operazioni a virgola mobile. È anche possibile eseguire il ripristino usando setjmp con longjmp. In entrambi i casi, il processo chiamante riprende l'esecuzione e lascia che lo stato del processo a virgola mobile sia indefinito.

Se il gestore del segnale viene restituito, il processo chiamante riprende l'esecuzione immediatamente dopo il punto in cui ha ricevuto il segnale di interrupt, indipendentemente dal tipo di segnale o modalità operativa.

Prima che venga eseguita la funzione specificata, il valore di func viene impostato su SIG_DFL. Il segnale di interrupt successivo viene gestito come descritto per SIG_DFL, se non specificato diversamente da una chiamata intermedia a signal. È possibile utilizzare questa funzionalità per reimpostare i segnali della funzione chiamata.

Poiché le routine del gestore del segnale vengono spesso chiamate in modo asincrono quando si verifica un interrupt, la funzione del gestore del segnale può ottenere il controllo quando un'operazione di runtime è incompleta e in uno stato sconosciuto. Nell'elenco seguente sono riepilogate le restrizioni che determinano quali funzioni è possibile utilizzare nelle routine del gestore di segnale.

  • Non emettere routine di I/O di basso livello ( STDIO.H ad esempio, printf o fread).

  • Non chiamare routine heap o routine che utilizza le routine heap (ad esempio, malloc, _strdupo _putenv). Per ulteriori informazioni, vedere malloc.

  • Non usare alcuna funzione che genera una chiamata di sistema (ad esempio, _getcwd o time).

  • Non usare longjmp a meno che l'interrupt non sia causato da un'eccezione a virgola mobile ( sig ovvero , è SIGFPE). In questo caso, bisogna prima di tutto reinizializzare il pacchetto a virgola mobile utilizzando una chiamata a _fpreset.

  • Non usare routine di sovrimpressione.

Un programma deve contenere codice a virgola mobile se si tratta di intercettare l'eccezione SIGFPE usando la funzione . Se il programma non ha codice a virgola mobile e richiede il codice di gestione dei segnali della libreria di runtime, è sufficiente dichiarare un doppio volatile e inizializzarlo su zero:

volatile double d = 0.0f;

I SIGILL segnali e SIGTERM non vengono generati in Windows. Sono inclusi per la compatibilità ANSI. Pertanto, è possibile impostare gestori di segnale per questi segnali usando signale è anche possibile generare in modo esplicito questi segnali chiamando raise.

Le impostazioni del segnale non vengono mantenute nei processi generati da chiamate a _exec o _spawn funzioni. Le impostazioni del segnale del nuovo processo vengono reimpostate sui valori predefiniti.

Requisiti

Ciclo Intestazione obbligatoria
signal <signal.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

Nell'esempio seguente viene illustrato l'utilizzo di signal per aggiungere un comportamento personalizzato al segnale SIGABRT. Per altre informazioni sul comportamento di interruzione, vedere _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();
}

L'output dipende dalla versione del runtime usata, dal fatto che l'app sia una console o un'app di Windows e dalle impostazioni del Registro di sistema di Windows. Per un'app console, è possibile inviare un messaggio simile al seguente a stderr:

Debug Error!

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

R6010

- abort() has been called

Vedi anche

Processo e controllo dell'ambiente
abort
_exec, _wexec funzioni
exit, _Exit, _exit
_fpreset
_spawn, _wspawn funzioni