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_errlist
i _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 systemie 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łu SIG_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 , sig
typu 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.H
postaci 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_DFL
wartość . Następny sygnał przerwania jest traktowany zgodnie z opisem dla SIG_DFL
elementu , 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ładprintf
lubfread
).Nie należy nazywać procedur stert ani procedur, które używają procedur stert (na przykład
malloc
, lub_strdup
_putenv
). Aby uzyskać więcej informacji, zobaczmalloc
.Nie używaj żadnej funkcji, która generuje wywołanie systemowe (na przykład
_getcwd
lubtime
).Nie używaj
longjmp
, chyba że przerwanie jest spowodowane wyjątkiem zmiennoprzecinkowych (czylisig
SIGFPE
). 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