signalsignal

Imposta la gestione del segnale di interrupt.Sets interrupt signal handling.

Importante

Non utilizzare questo metodo per arrestare un'app di Microsoft Store, ad eccezione di test o gli scenari di debug.Do not use this method to shut down a Microsoft Store app, except in testing or debugging scenarios. Modalità dell'interfaccia utente o a livello di codice per chiudere un'app di Store non sono consentiti in base al i criteri di Microsoft Store.Programmatic or UI ways to close a Store app are not permitted according to the Microsoft Store policies. Per altre informazioni, vedere ciclo di vita app UWP.For more information, see UWP app lifecycle.

SintassiSyntax

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

ParametriParameters

sigsig
Valore del segnale.Signal value.

funcfunc
Il secondo parametro è un puntatore alla funzione da eseguire.The second parameter is a pointer to the function to be executed. Il primo parametro è un valore di segnale e il secondo parametro è un codice secondario che può essere usato quando il primo parametro è SIGFPE.The first parameter is a signal value and the second parameter is a sub-code that can be used when the first parameter is SIGFPE.

Valore restituitoReturn Value

segnale restituisce il valore precedente della funzione che ha associato il segnale specificato.signal returns the previous value of func that's associated with the given signal. Ad esempio, se il valore precedente della func era SIG_IGN, il valore restituito è anche SIG_IGN.For example, if the previous value of func was SIG_IGN, the return value is also SIG_IGN. Un valore restituito pari SIG_ERR indica un errore; in tal caso errno è impostata su EINVAL.A return value of SIG_ERR indicates an error; in that case, errno is set to EINVAL.

Per altre informazioni sui codici restituiti, vedere errno, _doserrno, _sys_errlist e _sys_nerr.See errno, _doserrno, _sys_errlist, and _sys_nerr for more information about return codes.

NoteRemarks

Il segnale (funzione) consente a un processo di scegliere uno dei diversi modi per gestire un segnale di interruzione dal sistema operativo.The signal function enables a process to choose one of several ways to handle an interrupt signal from the operating system. Il sig l'argomento è l'interrupt a cui segnale risponde; deve essere uno delle seguenti costanti manifesto, definite in SIGNAL. H.The sig argument is the interrupt to which signal responds; it must be one of the following manifest constants, which are defined in SIGNAL.H.

SIG valoresig value DescrizioneDescription
SIGABRTSIGABRT Terminazione anomalaAbnormal termination
SIGFPESIGFPE Errore di virgola mobileFloating-point error
SIGILLSIGILL Istruzione non validaIllegal instruction
SIGINTSIGINT Segnale CTRL+CCTRL+C signal
SIGSEGVSIGSEGV Accesso all'archiviazione non validoIllegal storage access
SIGTERMSIGTERM Richiesta di terminazioneTermination request

Se sig non è uno dei valori specificati sopra, viene richiamato il gestore di parametri non validi, come definito nella convalida dei parametri .If sig is not one of the above values, the invalid parameter handler is invoked, as defined in Parameter Validation . Se l'esecuzione può continuare, la funzione imposta errno al EINVAL e restituisce SIG_ERR.If execution is allowed to continue, this function sets errno to EINVAL and returns SIG_ERR.

Per impostazione predefinita segnale termina il programma chiamante con codice di uscita 3, indipendentemente dal valore di sig.By default, signal terminates the calling program with exit code 3, regardless of the value of sig.

Nota

SIGINT non è supportata per le applicazioni Win32.SIGINT is not supported for any Win32 application. Quando si verifica un interrupt CTRL+C, i sistemi operativi Win32 generare un nuovo thread per gestire in maniera specifica l'interrupt.When a CTRL+C interrupt occurs, Win32 operating systems generate a new thread to specifically handle that interrupt. Ciò può far sì che un'applicazione a thread singolo, come una in UNIX, diventi multithreading e causi un comportamento imprevisto.This can cause a single-thread application, such as one in UNIX, to become multithreaded and cause unexpected behavior.

Il func argomento è un indirizzo a un gestore di segnale scritto o a una delle costanti predefinite SIG_DFL oppure SIG_IGN, che sono anche definite in SIGNAL. H.The func argument is an address to a signal handler that you write, or to one of the predefined constants SIG_DFL or SIG_IGN, which are also defined in SIGNAL.H. Se func è una funzione, viene installato come gestore del segnale per il segnale specificato.If func is a function, it is installed as the signal handler for the given signal. Prototipo del gestore di segnale richiede un 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.The signal handler's prototype requires one formal argument, sig, of type int. The operating system provides the actual argument through sig when an interrupt occurs; the argument is the signal that generated the 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.Therefore, you can use the six manifest constants (listed in the preceding table) in your signal handler to determine which interrupt occurred and take appropriate action. Ad esempio, è possibile chiamare segnale due volte per assegnare lo stesso gestore a due segnali diversi e quindi testare il sig argomento nel gestore per eseguire azioni diverse in base al segnale ricevuto.For example, you can call signal twice to assign the same handler to two different signals, and then test the sig argument in the handler to take different actions based on the signal received.

Se si sta testando 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, nel formato FPE_xxx.If you are testing for floating-point exceptions (SIGFPE), func points to a function that takes an optional second argument that is one of several manifest constants, defined in FLOAT.H, of the form FPE_xxx. Quando un SIGFPE segnale si verifica, è possibile testare il valore del secondo argomento per determinare il tipo di eccezione a virgola mobile e quindi intraprendere l'azione appropriata.When a SIGFPE signal occurs, you can test the value of the second argument to determine the kind of floating-point exception and then take appropriate action. Questo argomento e i relativi valori possibili sono estensioni Microsoft.This argument and its possible values are Microsoft extensions.

Per le eccezioni a virgola mobile, il valore di func non viene reimpostato quando viene ricevuto il segnale.For floating-point exceptions, the value of func is not reset when the signal is received. Per risolvere eccezioni a virgola mobile, utilizzare le clausole try/except per racchiudere le operazioni a virgola mobile.To recover from floating-point exceptions, use try/except clauses to surround the floating point operations. È anche possibile ricorrere a setjmp con longjmp.It's also possible to recover by using setjmp with longjmp. In entrambi i casi, il processo chiamante riprende l'esecuzione e lascia che lo stato del processo a virgola mobile sia indefinito.In either case, the calling process resumes execution and leaves the floating-point state of the process undefined.

Se il gestore del segnale restituisce il controllo, il processo chiamante riprende l'esecuzione subito dopo il punto in cui ha ricevuto il segnale di interrupt.If the signal handler returns, the calling process resumes execution immediately following the point at which it received the interrupt signal. Ciò si verifica indipendentemente dal tipo di segnale o dalla modalità operativa.This is true regardless of the kind of signal or operating mode.

Prima che venga eseguita la funzione specificata, il valore di func è impostata su SIG_DFL.Before the specified function is executed, the value of func is set to SIG_DFL. Il segnale di interrupt successivo viene considerato come descritto per SIG_DFL, a meno che una chiamata intermedia a segnale specifichi diversamente.The next interrupt signal is treated as described for SIG_DFL, unless an intervening call to signal specifies otherwise. È possibile utilizzare questa funzionalità per reimpostare i segnali della funzione chiamata.You can use this feature to reset signals in the called function.

Dato che le routine del gestore di segnale vengono in genere chiamate in modo asincrono quando si verifica un'interrupt, la funzione del gestore di segnale può ottenere il controllo quando un'operazione di runtime è incompleta e in uno stato sconosciuto.Because signal-handler routines are usually called asynchronously when an interrupt occurs, your signal-handler function may get control when a run-time operation is incomplete and in an unknown state. Nell'elenco seguente sono riepilogate le restrizioni che determinano quali funzioni è possibile utilizzare nelle routine del gestore di segnale.The following list summarizes the restrictions that determine which functions you can use in your signal-handler routine.

  • Eseguire operazioni non problema di basso livello o STDIO. Routine i/o H (ad esempio, printf oppure fread).Do not issue low-level or STDIO.H I/O routines (for example, printf or fread).

  • Non chiamare le routine dell'heap o qualsiasi routine che utilizzi le routine dell'heap (ad esempio, malloc, StrDup, o putenv).Do not call heap routines or any routine that uses the heap routines (for example, malloc, _strdup, or _putenv). Per altre informazioni, vedere malloc.See malloc for more information.

  • Non usare le funzioni che generano una chiamata di sistema (ad esempio, getcwd oppure tempo).Do not use any function that generates a system call (for example, _getcwd or time).

  • Non utilizzare longjmp , a meno che l'interrupt è causato da un'eccezione a virgola mobile (vale a dire sig viene SIGFPE).Do not use longjmp unless the interrupt is caused by a floating-point exception (that is, sig is SIGFPE). In questo caso, prima di tutto reinizializzare il pacchetto a virgola mobile con una chiamata a fpreset.In this case, first reinitialize the floating-point package by using a call to _fpreset.

  • Non usare routine sostitutive.Do not use any overlay routines.

Un programma deve contenere codice a virgola mobile se prevede di intercettare il SIGFPE eccezione tramite la funzione.A program must contain floating-point code if it is to trap the SIGFPE exception by using the function. Se il programma non dispone di codice a virgola mobile e richiede il codice di gestione di segnale della libreria di runtime, è sufficiente dichiarare un double volatile e inizializzarlo su zero:If your program does not have floating-point code and requires the run-time library's signal-handling code, just declare a volatile double and initialize it to zero:

volatile double d = 0.0f;

Il SIGILL e SIGTERM segnali non vengono generati in Windows.The SIGILL and SIGTERM signals are not generated under Windows. Sono incluso per compatibilità con ANSI.They are included for ANSI compatibility. Pertanto, è possibile impostare gestori di segnale per questi segnali usando segnale, ed è possibile generare in modo esplicito questi segnali chiamando generano.Therefore, you can set signal handlers for these signals by using signal, and you can also explicitly generate these signals by calling raise.

Le impostazioni del segnale non vengono mantenute nei processi generati che vengono creati dalle chiamate a spawn oppure spawn funzioni.Signal settings are not preserved in spawned processes that are created by calls to _exec or _spawn functions. Le impostazioni del segnale del nuovo processo vengono reimpostate sui valori predefiniti.The signal settings are reset to the default values in the new process.

RequisitiRequirements

RoutineRoutine Intestazione obbligatoriaRequired header
signalsignal <signal.h><signal.h>

Per altre informazioni sulla compatibilità, vedere Compatibilità.For additional compatibility information, see Compatibility.

EsempioExample

Nell'esempio seguente viene illustrato come utilizzare segnale per aggiungere un comportamento personalizzato per il SIGABRT segnale.The following example shows how to use signal to add some custom behavior to the SIGABRT signal. Per altre informazioni sul comportamento delle interruzioni, vedere _set_abort_behavior.For additional information about abort behavior, see _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.

Vedere ancheSee also

Controllo di processi e ambienteProcess and Environment Control
abortabort
Funzioni _exec, _wexec_exec, _wexec Functions
exit, _Exit, _exitexit, _Exit, _exit
_fpreset_fpreset
Funzioni _spawn, _wspawn_spawn, _wspawn Functions