signal

Ustawia obsługę sygnału przerwania.

Ważne

Nie należy używać tej metody do zamykania aplikacji ze sklepu Microsoft Store, z wyjątkiem scenariuszy testowania lub debugowania. Programowe lub interfejsu użytkownika sposoby zamykania aplikacji ze Sklepu nie są dozwolone zgodnie z zasadami sklepu Microsoft Store. Aby uzyskać więcej informacji, zobacz Cykl życia aplikacji platformy UNIWERSALNEJ systemu Windows.

Składnia

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

Parametry

sig
Wartość sygnału.

func
Drugi parametr jest wskaźnikiem do wykonania funkcji. Pierwszy parametr jest wartością sygnału, a drugi parametr jest podkodem, który może być używany, gdy pierwszy parametr to SIGFPE.

Wartość zwracana

signal Zwraca poprzednią wartość func skojarzona z danym sygnałem. Jeśli na przykład poprzednia wartość func to SIG_IGN, zwracana wartość to również SIG_IGN. Zwracana wartość SIG_ERR wskazuje błąd. W takim przypadku errno jest ustawiona wartość EINVAL.

Aby uzyskać więcej informacji na temat kodów zwracanych, zobacz errno, _doserrno, _sys_errlisti _sys_nerr.

Uwagi

Funkcja signal umożliwia procesowi wybór jednego z kilku sposobów obsługi sygnału przerwania z systemu operacyjnego. Argumentem sig jest przerwanie, na które signal odpowiada; musi być jedną z następujących stałych manifestu, które są zdefiniowane w pliku SIGNAL.H.

sig Wartość opis
SIGABRT Nieprawidłowe zakończenie
SIGFPE Błąd zmiennoprzecinkowa
SIGILL Niedozwolone instrukcje
SIGINT Sygnał CTRL+C
SIGSEGV Nielegalny dostęp do magazynu
SIGTERM Żądanie zakończenia

Jeśli sig nie jest jedną z powyższych wartości, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z definicją w temacie Weryfikacja parametru . Jeśli wykonywanie jest dozwolone do kontynuowania, ta funkcja ustawia errno wartość EINVAL i zwraca wartość SIG_ERR.

Domyślnie signal program wywołujący kończy kod zakończenia 3, niezależnie od wartości sig.

Uwaga

SIGINT nie jest obsługiwana w przypadku żadnej aplikacji Win32. Gdy wystąpi przerwanie CTRL+C, systemy operacyjne Win32 generują nowy wątek, aby w szczególności obsłużyć to przerwanie. Może to spowodować, że aplikacja jednowątkowa, taka jak jedna w system UNIX, stanie się wielowątkowa i powoduje nieoczekiwane zachowanie.

Argumentem func jest adres programu obsługi sygnałów, który zapisujesz, lub do jednej ze wstępnie zdefiniowanych akcji sygnałuSIG_DFL lub SIG_IGN, które są również zdefiniowane w signal.H. Jeśli func jest funkcją, jest ona zainstalowana jako program obsługi sygnału dla danego sygnału. Prototyp programu obsługi sygnałów wymaga jednego formalnego argumentu , sigtypu int. System operacyjny udostępnia rzeczywisty argument, gdy sig wystąpi przerwanie; argument jest sygnałem, który wygenerował przerwanie. W związku z tym można użyć sześciu stałych manifestu (wymienionych w poprzedniej tabeli) w programie obsługi sygnałów, aby określić, które przerwanie wystąpiło i podjąć odpowiednie działania. Można na przykład wywołać signal dwa razy, aby przypisać tę samą procedurę obsługi do dwóch różnych sygnałów, a następnie przetestować sig argument w procedurze obsługi, aby wykonać różne akcje na podstawie odebranego sygnału.

Jeśli testujesz wyjątki zmiennoprzecinkowe (SIGFPE), wskazuje funkcję, func która przyjmuje opcjonalny drugi argument, który jest jedną z kilku stałych manifestu zdefiniowanych w FLOAT.Hpostaci FPE_xxx. SIGFPE Gdy wystąpi sygnał, możesz przetestować wartość drugiego argumentu, aby określić rodzaj wyjątku zmiennoprzecinkowego, a następnie podjąć odpowiednie działania. Ten argument i jego możliwe wartości to rozszerzenia firmy Microsoft.

W przypadku wyjątków zmiennoprzecinkowych wartość func nie jest resetowany po odebraniu sygnału. Aby odzyskać operacje z wyjątków zmiennoprzecinkowych, użyj klauzul try/z wyjątkiem, aby otaczać operacje zmiennoprzecinkowe. Istnieje również możliwość odzyskania za pomocą polecenia setjmp .longjmp W obu przypadkach proces wywołujący wznawia wykonywanie i pozostawia stan zmiennoprzecinkowa procesu niezdefiniowany.

Jeśli program obsługi sygnałów powróci, proces wywołujący wznowi wykonywanie natychmiast po punkcie, w którym odebrał sygnał przerwania, niezależnie od rodzaju sygnału lub trybu operacyjnego.

Przed wykonaniem określonej funkcji wartość parametru jest ustawiona func na SIG_DFLwartość . Następny sygnał przerwania jest traktowany zgodnie z opisem dla SIG_DFLelementu , chyba że interweniujące wywołanie signal określa inaczej. Za pomocą tej funkcji można zresetować sygnały w wywoływanej funkcji.

Ponieważ procedury obsługi sygnałów są często wywoływane asynchronicznie, gdy wystąpi przerwanie, funkcja obsługi sygnałów może uzyskać kontrolę, gdy operacja czasu wykonywania jest niekompletna i w nieznanym stanie. Poniższa lista zawiera podsumowanie ograniczeń określających, które funkcje można używać w procedurze obsługi sygnałów.

  • Nie należy wystawiać procedur we/wy niskiego poziomu lub STDIO.H operacji we/wy (na przykład printf lub fread).

  • Nie należy nazywać procedur stert ani procedur, które używają procedur stert (na przykład malloc, lub _strdup_putenv). W celu uzyskania więcej informacji, zobacz następujący temat: malloc.

  • Nie używaj żadnej funkcji, która generuje wywołanie systemowe (na przykład _getcwd lub time).

  • Nie używaj longjmp , chyba że przerwanie jest spowodowane wyjątkiem zmiennoprzecinkowych (czyli sigSIGFPE). W tym przypadku najpierw zainicjuj pakiet zmiennoprzecinkowa przy użyciu wywołania metody _fpreset.

  • Nie używaj żadnych procedur nakładek.

Program musi zawierać kod zmiennoprzecinkowa, jeśli ma zostać wychwytowany SIGFPE wyjątek przy użyciu funkcji . Jeśli program nie ma kodu zmiennoprzecinkowego i wymaga kodu obsługującego sygnał biblioteki czasu wykonywania, po prostu zadeklaruj zmienny podwójny kod i zainicjuj go do zera:

volatile double d = 0.0f;

Sygnały SIGILL i SIGTERM nie są generowane w systemie Windows. Są one uwzględniane w celu zapewnienia zgodności ze standardem ANSI. W związku z tym można ustawić programy obsługi sygnałów dla tych sygnałów przy użyciu metody signal, a także jawnie wygenerować te sygnały, wywołując metodę raise.

Ustawienia sygnału nie są zachowywane w procesach zduplikowanych, które są tworzone przez wywołania lub _exec_spawn funkcje. Ustawienia sygnału są resetowane do wartości domyślnych w nowym procesie.

Wymagania

Procedura Wymagany nagłówek
signal <signal.h>

Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Przykład

W poniższym przykładzie pokazano, jak za pomocą polecenia signal dodać pewne niestandardowe zachowanie do sygnału SIGABRT . Aby uzyskać więcej informacji o zachowaniu przerwania, zobacz _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();
}

Dane wyjściowe zależą od używanej wersji środowiska uruchomieniowego, niezależnie od tego, czy aplikacja jest konsolą, czy aplikacją systemu Windows, oraz ustawieniami rejestru systemu Windows. W przypadku aplikacji konsolowej może zostać wysłany następujący komunikat do narzędzia stderr:

Debug Error!

Program: c:\Projects\crt_signal\Debug\crt_signal.exe

R6010

- abort() has been called

Zobacz też

Kontrola procesu i środowiska
abort
_exec, _wexec funkcje
exit, _Exit, _exit
_fpreset
_spawn, _wspawn funkcje