Sdílet prostřednictvím


signal

Nastavuje zpracování signálu přerušení.

Důležitá poznámkaDůležité

Nepoužívejte tuto metodu k vypnutí aplikace Windows Store, s výjimkou testování nebo ladění scénářů.Programátorské způsoby zavírání aplikace Windows Store ani způsoby přes uživatelské rozhraní nejsou povoleny podle bodu 3.6 Podmínek certifikace aplikace pro systém Windows 8.Další informace naleznete v tématu Životní cyklus aplikace (Aplikace pro Windows Store).

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

Parametry

  • sig
    Hodnota signálu.

  • func
    Funkce ke spuštění.První parametr je hodnota signálu a druhý parametr je dílčí kód, který lze použít, pokud je první parametr SIGFPE.

Vrácená hodnota

signal vrátí předchozí hodnotu func, která je přidružená zadanému signálu.Například pokud předchozí hodnota func byla SIG_IGN, vrácená hodnota je také SIG_IGN.Vrácená hodnota SIG_ERR označuje chybu; v takovém případě je errno nastavena na EINVAL.

Další informace o návratových kódech viz errno, _doserrno, _sys_errlist, and _sys_nerr.

Poznámky

Funkce signal umožňuje procesu 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í, kterému signal odpovídá; musí to být jedna z následujících konstant manifestu, které jsou definovány v souboru SIGNAL.H.

Hodnota sig

Description

SIGABRT

Abnormální ukončení

SIGFPE

Chyba plovoucí desetinné čárky

SIGILL

Neplatná instrukce

SIGINT

CTRL+C signál

SIGSEGV

Neplatný přístup k úložišti

SIGTERM

Žádost o ukončení

Pokud sig není jednou z výše uvedených hodnot, je vyvolán neplatný parametr rutiny, jak je definováno v Ověření parametru.Pokud provádění může pokračovat, tato funkce nastaví errno na EINVAL a vrátí SIG_ERR.

Ve výchozím nastavení signal ukončí volající program s kódem ukončení 3, bez ohledu na hodnotu sig.

[!POZNÁMKA]

SIGINT není podporováno pro žádnou aplikaci Win32.Pokud dojde k přerušení CTRL + C, operační systémy Win32 vygenerují nové vlákno, které konkrétně zpracuje toto přerušení.To může způsobit, že aplikace s jedním vláknem, jako jsou například v systému UNIX, se stane aplikací s více vlákny a způsobí neočekávané chování.

Argument func je adresa popisovače signálu, který napíšete, nebo jedné z předdefinovaných konstant SIG_DFL nebo SIG_IGN, které jsou také definovány v souboru SIGNAL.H.Pokud func je funkce, je nainstalována 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 prostřednictvím sig, když dojde k přerušení; argument je signál, který je vygenerován přerušením.Proto můžete používat šest konstant manifestu (uvedených v předchozí tabulce) v obslužné rutině signálu k určení, ke kterému přerušení došlo a přijmout vhodná opatření.Například můžete volat signal dvakrát a přiřadit stejnou obslužnou rutinu dvěma různým signálům a poté otestovat argument sig v obslužné rutině, aby provedl různé akce podle přijatého signálu.

Pokud testujete výjimky s plovoucí desetinnou čárkou (SIGFPE), func odkazuje na funkci, která přebírá volitelný druhý argument, který je jednou z několika konstant manifestu – podle typu FLOAT.H – formuláře FPE_xxx.Když dojde k signálu SIGFPE, můžete testovat hodnotu druhého argumentu pro určení druhu výjimky s plovoucí desetinnou čárkou a poté přijmout vhodná opatření.Tento argument a jeho možné hodnoty jsou rozšíření Microsoft.

Pro výjimky s plovoucí desetinnou čárkou hodnota func není resetována při příjmu signálu.Pro zotavení z výjimek s plovoucí desetinnou čárkou obklopujte operace s plovoucí desetinnou čárkou klauzulemi klauzule try/except.Je také možné obnovit pomocí setjmp s longjmp.V obou případech volající proces pokračuje v provádění a ponechá stav s plovoucí desetinnou čárkou procesu nedefinovaný.

Pokud se vrátí obslužná rutina signálu, volající proces pokračuje v provádění bezprostředně za bodem, kdy obdržel signál přerušení.To platí bez ohledu na druh signálu nebo provozní režim.

Před provedením zadané funkce je hodnota func nastavena na SIG_DFL.Další signál přerušení je považován, jak je popsáno pro SIG_DFL, pokud intervenující volání signal neurčí jinak.Tato funkce slouží k obnovení signálů ve volané funkci.

Protože rutiny popisovače signálu jsou obvykle volány asynchronně, když dojde k přerušení, funkce popisovače signálu může převzít kontrolu, když operace spuštění je neúplná a v neznámém stavu.Následující seznam obsahuje souhrn omezení určujících, které funkce můžete používat ve své obslužné rutině signálu.

  • Nevydávejte rutiny nízké úrovně nebo STDIO.H I/O (například printf nebo fread).

  • Nevolejte rutiny haldy nebo jakékoli rutiny, které používají rutiny haldy (například malloc, _strdup nebo _putenv).Další informace naleznete v tématu malloc.

  • Nepoužívejte žádné funkce, které generují volání systému (například _getcwd nebo time).

  • Nepoužívejte longjmp, pokud přerušení není způsobeno výjimkou plovoucí desetinné čárky (tj. sig je SIGFPE).V tomto případě nejprve znovu inicializujte balíček s plovoucí desetinnou čárkou pomocí volání _fpreset.

  • Nepoužívejte žádné překrytí rutin.

Program musí obsahovat kód s plovoucí desetinnou čárkou, pokud má zachytit výjimku SIGFPE pomocí funkce.Pokud program nemá kód s plovoucí desetinnou čárkou a vyžaduje kód pro zpracování signálu knihovny run-time, stačí deklarovat volatile double a inicializovat je na nulu:

volatile double d = 0.0f; 

Signály SIGILL a SIGTERM nejsou generovány v systému Windows.Jsou zahrnuty z důvodu kompatibility ANSI.Proto lze nastavit obslužné rutiny signálu pro tyto signály pomocí signal a tyto signály lze také generovat explicitně voláním raise.

Není zachováno nastavení signálu ve vytvářených procesech, které jsou vytvořeny pomocí volání funkcí _exec nebo _spawn.Nastavení signálu je obnoveno na výchozí hodnoty v novém procesu.

Požadavky

Rutina

Požadované záhlaví

signal

<signal.h>

Další informace o kompatibilitě naleznete v tématu Kompatibilita.

Příklad

Následující příklad ukazuje, jak použít signal k přidání některého vlastního chování signálu SIGABRT.Další informace o chování ruš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>
#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();
}
  

Ekvivalent v rozhraní .NET Framework

Nelze použít. Pokud chcete volat standardní funkci jazyka C, použijte PInvoke. Další informace naleznete v tématu Příklady vyvolání platformy.

Viz také

Referenční dokumentace

Řízení procesů a prostředí

abort

_exec, _wexec – funkce

exit, _exit

_fpreset

_spawn, _wspawn – funkce