signal
Nastaví zpracování signálu přerušení.
Důležité
Tuto metodu nepoužívejte k vypnutí aplikace z Microsoft Storu, s výjimkou scénářů testování nebo ladění. Programové způsoby zavření aplikace pro Store prostřednictvím kódu programu nebo uživatelského rozhraní nejsou povoleny podle zásad Microsoft Storu. Další informace najdete v tématu Životní cyklus aplikace pro UPW.
Syntaxe
void __cdecl *signal(int sig, int (*func)(int, int));
Parametry
sig
Hodnota signálu.
func
Druhý parametr je ukazatel na funkci, která se má provést. První parametr je hodnota signálu a druhý parametr je podkód, který lze použít při prvním parametru SIGFPE
.
Vrácená hodnota
signal
vrátí předchozí hodnotu func, která je přidružena k danému signálu. Například pokud byla předchozí hodnota func
, návratová hodnota je také SIG_IGN
.SIG_IGN
Návratová SIG_ERR
hodnota označuje chybu, errno
v takovém případě je nastavena na EINVAL
hodnotu .
Další informace o návratových kódech naleznete v tématu errno
, _doserrno
, _sys_errlist
a _sys_nerr
.
Poznámky
Funkce signal
umožňuje proces zvolit jeden z několika způsobů zpracování signálu přerušení z operačního systému. Argument sig
je přerušení, na které signal
reaguje; musí být jednou z následujících konstant manifestu, které jsou definovány v SIGNAL.H
.
sig hodnota |
Popis |
---|---|
SIGABRT |
Neobvyklé ukončení |
SIGFPE |
Chyba s plovoucí desetinou čárkou |
SIGILL |
Neplatná instrukce |
SIGINT |
Ctrl+C signál |
SIGSEGV |
Neplatný přístup k úložišti |
SIGTERM |
Žádost o ukončení |
Pokud sig
není jedna z výše uvedených hodnot, vyvolá se neplatná obslužná rutina parametru, jak je definováno v ověření parametru . Pokud je spuštění povoleno pokračovat, tato funkce nastaví errno
EINVAL
a vrátí SIG_ERR
.
Ve výchozím nastavení signal
ukončí volající program ukončovací kód 3 bez ohledu na hodnotu sig
.
Poznámka:
SIGINT
aplikace Win32 není podporována. Když dojde k přerušení CTRL+C, operační systémy Win32 vygenerují nové vlákno pro konkrétní zpracování tohoto přerušení. To může způsobit, že se aplikace s jedním vláknem, například jednovláknová aplikace v systému UNIX, stane vícevláknovou a způsobí neočekávané chování.
Argument func
je adresa obslužné rutiny signálu, kterou napíšete, nebo na jednu z předdefinovaných konstant akce signálu nebo SIG_IGN
, které jsou také definovány SIG_DFL
v signal.H. Pokud func
je funkce, nainstaluje se jako obslužná rutina signálu pro daný signál. Prototyp obslužné rutiny signálu vyžaduje jeden formální argument , sig
typu int
. Operační systém poskytuje skutečný argument, když sig
dojde k přerušení. Argument je signál, který vygeneroval přerušení. Proto můžete v obslužné rutině signálu použít šest konstant manifestu (uvedených v předchozí tabulce), abyste zjistili, ke kterému přerušení došlo, a provést odpovídající akci. Můžete například zavolat signal
dvakrát, aby se stejná obslužná rutina přiřadil dvěma různým signálům, a pak otestujte sig
argument v obslužné rutině, aby se na základě přijatého signálu chytly různé akce.
Pokud testujete výjimky s plovoucí desetinou čárkou (SIGFPE
), func
odkazuje na funkci, která přebírá volitelný druhý argument, který je jedním z několika konstant manifestu definovaných ve FLOAT.H
formuláři FPE_xxx
. Když dojde k signálu SIGFPE
, můžete otestovat hodnotu druhého argumentu, abyste určili druh výjimky s plovoucí desetinou čárkou a pak proveďte odpovídající akci. Tento argument a jeho možné hodnoty jsou rozšíření Microsoftu.
U výjimek s plovoucí desetinou čárkou se hodnota func
při přijetí signálu nevynuluje. Pokud chcete provést zotavení z výjimek s plovoucí desetinou čárkou, použijte k ohraničení operací s plovoucí desetinou čárkou klauzuli try/except. Je také možné obnovit pomocí .setjmp
longjmp
V obou případech volající proces obnoví provádění a ponechá stav s plovoucí desetinou čárkou procesu nedefinovaný.
Pokud se obslužná rutina signálu vrátí, volající proces obnoví provádění okamžitě za bodem, ve kterém obdržel signál přerušení bez ohledu na druh signálu nebo provozního režimu.
Před provedením zadané funkce je hodnota func
nastavena na SIG_DFL
hodnotu . Další signál přerušení je považován za popsaný pro SIG_DFL
, pokud intervenující volání signal
neurčí jinak. Pomocí této funkce můžete resetovat signály volané funkci.
Vzhledem k tomu, že rutiny obslužné rutiny signálu se často označují asynchronně, když dojde k přerušení, může funkce obslužné rutiny signálu získat kontrolu, když je operace běhu neúplná a v neznámém stavu. Následující seznam shrnuje omezení, která určují, které funkce můžete použít v rutině obslužné rutiny signálu.
Nezadávejte rutiny nízké úrovně nebo
STDIO.H
vstupně-výstupních operací (napříkladprintf
).fread
Nevolejte rutiny haldy ani žádnou rutinu, která používá rutiny haldy (například
malloc
,_strdup
nebo_putenv
). Další informace najdete na webumalloc
.Nepoužívejte žádnou funkci, která generuje systémové volání (například
_getcwd
time
).Nepoužívejte, pokud přerušení není
longjmp
způsobeno výjimkou s plovoucí desetinou čárkou (to znamenásig
SIGFPE
). V tomto případě nejprve znovu inicializovat balíček s plovoucí desetinou čárkou pomocí volání_fpreset
.Nepoužívejte žádné překryvné rutiny.
Program musí obsahovat kód s plovoucí desetinou čárkou, pokud má výjimku schytnout SIGFPE
pomocí funkce. Pokud váš program neobsahuje kód s plovoucí deseti desetinou čárkou a vyžaduje kód knihovny pro zpracování signálů za běhu, stačí deklarovat nestálý double a inicializovat ho na nulu:
volatile double d = 0.0f;
Signály SIGILL
a SIGTERM
signály se negenerují ve Windows. Jsou součástí kompatibility ANSI. Proto můžete nastavit obslužné rutiny signálu pro tyto signály pomocí signal
, a můžete také explicitně generovat tyto signály voláním raise
.
Nastavení signálu se nezachovávají ve vytvořených procesech vytvořených voláními _exec
nebo _spawn
funkcemi. Nastavení signálu se resetuje na výchozí hodnoty v novém procesu.
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
signal |
<signal.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
Následující příklad ukazuje, jak použít signal
k přidání vlastního chování signálu SIGABRT
. Další informace o chování přerušení naleznete v tématu _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();
}
Výstup závisí na používané verzi modulu runtime, ať už je aplikace konzolou nebo aplikací pro Windows, a v nastavení registru Windows. V případě konzolové aplikace se do stderru může odeslat něco jako následující zpráva:
Debug Error!
Program: c:\Projects\crt_signal\Debug\crt_signal.exe
R6010
- abort() has been called
Viz také
Řízení procesů a prostředí
abort
_exec
, _wexec
funkce
exit
, , _Exit
_exit
_fpreset
_spawn
, _wspawn
funkce