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_errlist
e _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 costanti SIG_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
ofread
).Non chiamare routine heap o routine che utilizza le routine heap (ad esempio,
malloc
,_strdup
o_putenv
). Per ulteriori informazioni, vederemalloc
.Non usare alcuna funzione che genera una chiamata di sistema (ad esempio,
_getcwd
otime
).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 signal
e è 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