Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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