Sdílet prostřednictvím


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 EINVALhodnotu .

Další informace o návratových kódech naleznete v tématu errno, _doserrno, _sys_errlista _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 , sigtypu 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.Hformulář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_DFLhodnotu . 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říklad printf ).fread

  • Nevolejte rutiny haldy ani žádnou rutinu, která používá rutiny haldy (například malloc, _strdupnebo _putenv). Další informace najdete na webu malloc.

  • 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