Condividi tramite


signal

Imposta la gestione del segnale di interrupt.

Nota importanteImportante

Non utilizzare questo metodo per interrompere un'applicazione di Windows Store, ad eccezione di test o gli scenari di debug.Le modalità di interfaccia utente o a livello di codice chiudere un'applicazione di Windows Store non sono consentite dalla parte 3,6 di Windows 8 requisiti di certificazione di applicazione.Per ulteriori informazioni, vedere Ciclo di vita dell'applicazione (finestre archiviano le applicazioni).

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

Parametri

  • sig
    Valore del segnale.

  • func
    Funzione da eseguire.Il primo parametro è un valore di segnale e il secondo parametro è un codice secondario che può essere utilizzato 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 sarà SIG_IGN.Un valore restituito pari a SIG_ERR indica un errore, nel qual caso errno è impostato su EINVAL.

Vedere _doserrno, errno, _sys_errlist, e _sys_nerr per ulteriori informazioni su questo, e altri, codici restituiti.

Note

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

Valore sig

Descrizione

SIGABRT

Terminazione anomala

SIGFPE

Errore a virgola mobile

SIGILL

Istruzione non valida

SIGINT

Segnale CTRL+C

SIGSEGV

Accesso alla memoria non valido

SIGTERM

Richiesta di terminazione

Se sig non è uno dei valori riportati in precedenza, viene richiamato il gestore di parametro non valido, come descritto in Convalida dei parametri.Se l'esecuzione può continuare, la funzione imposta errno e imposta EINVAL su 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 qualsiasi applicazione Win32.Quando si verifica un'interrupt CTRL+C, i sistemi operativi Win32 generano un nuovo thread per gestire in maniera specifica tale interrupt.Ciò può far sì che un'applicazione a thread singolo come una di UNIX diventi multithreading, generando un comportamento imprevisto.

L'argomento func è un indirizzo a un gestore del segnale scritto dall'utente, o una delle costanti predefinite SIG_DFL o SIG_IGN, definite in SIGNAL.H.Se func è una funzione, viene impostata come gestore di segnale per il segnale specificato.Il prototipo del gestore di segnale richiede un argomento formale, sig, di tipo int.Quando si verifica un'interrupt il sistema operativo fornisce l'argomento effettivo tramite sig; 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 verificare l'argomento sig nel gestore per eseguire azioni diverse in base al segnale ricevuto.

Se si stanno verificando le eccezioni a virgola mobile (SIGFPE), func fa riferimento a una funzione che accetta un secondo argomento facoltativo che è una delle numerose costanti manifesto definite in FLOAT.H nella forma FPE_xxx.Quando viene generato un segnale SIGFPE, è possibile verificare 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 func non viene reimpostato quando viene ricevuto un segnale.Per gestire eccezioni di virgola mobile, utilizzare le clausole try/except racchiudendo le operazioni in virgola mobile.È anche possibile gestirle utilizzando setjmp con longjmp.In entrambi i casi, il processo chiamante riprende l'esecuzione con lo stato a virgola mobile del processo lasciato indefinito.

Se il gestore del segnale restituisce il controllo, il processo chiamante riprende l'esecuzione immediatamente dopo il punto in cui aveva ricevuto il segnale di interrupt.Questo vale indipendentemente dal tipo di segnale o dalla modalità operativa.

Prima che la funzione specificata venga eseguita, il valore di func è impostato su SIG_DFL.Il segnale di interrupt seguente viene trattato come descritto per SIG_DFL, a meno che non sia specificata una corrispondente chiamata a signal.Questa funzionalità consente di reimpostare i segnali nella funzione chiamata.

Poiché le routine del gestore di segnale in genere vengono chiamate in modo asincrono quando si verifica un'interrupt, la funzione del gestore di segnale potrebbe ottenere il controllo quando un'operazione 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 eseguire le routine I/O di basso livello o di STDIO.H (ad esempio printf e fread).

  • Non chiamare le routine dello heap o qualsiasi routine che utilizzi le routine dello heap (ad esempio malloc, _strdupe _putenv).Vedere malloc per ulteriori informazioni.

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

  • Non utilizzare longjmp a meno che la riproduzione sia causato da un'eccezione a virgola mobile (ovvero, sig è SIGFPE).In questo caso, bisogna prima di tutto reinizializzare il pacchetto a virgola mobile con una chiamata a _fpreset.

  • Non utilizzare routine sovrapposte.

Un programma deve contenere codice a virgola mobile se prevede di intercettare l'eccezione SIGFPE con la funzione.Se il programma non dispone di codice a virgola mobile e richiede il codice del gestore di segnale della libreria di runtime, è sufficiente dichiarare un double volatile e inizializzarlo su zero:

volatile double d = 0.0f; 

I segnali SIGILL e SIGTERM non vengono generati in Windows.Sono inclusi per la compatibilità ANSI.Pertanto è possibile impostare i gestori del segnale per questi segnali con signal, nonché generare in modo esplicito questi segnali chiamando raise.

Le impostazioni del segnale non vengono mantenute nei processi compilati creati dalle chiamate alle funzioni _exec o _spawn.Le impostazioni del segnale del nuovo processo vengono reimpostate sui valori predefiniti.

Requisiti

Routine

Intestazione obbligatoria

signal

<signal.h>

Per ulteriori informazioni sulla compatibilità, vedere Compatibilità nell'introduzione.

Esempio

Nell'esempio seguente viene illustrato l'utilizzo di signal per aggiungere un comportamento personalizzato al segnale SIGABRT.Per ulteriori informazioni sul comportamento di interruzione, vedere _set_abort_behavior.

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

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

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

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

Equivalente .NET Framework

Non applicabile. Per chiamare la funzione standard C, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di Invocazione della Piattaforma.

Vedere anche

Riferimenti

Processo e controllo ambiente

abort

_exec, funzioni di _wexec

exit, _exit

_fpreset

_spawn, funzioni di _wspawn