sygnałsignal

Ustawia obsługę sygnałów przerwań.Sets interrupt signal handling.

Ważne

Nie należy używać tej metody do zamykania aplikacji Microsoft Store, z wyjątkiem scenariuszy testowania lub debugowania.Do not use this method to shut down a Microsoft Store app, except in testing or debugging scenarios. Sposób programistyczny lub interfejs użytkownika służący do zamykania aplikacji ze sklepu nie są dozwolone zgodnie z zasadami Microsoft Storeymi.Programmatic or UI ways to close a Store app are not permitted according to the Microsoft Store policies. Aby uzyskać więcej informacji, zobacz cykl życia aplikacji platformy UWP.For more information, see UWP app lifecycle.

SkładniaSyntax

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

ParametryParameters

SIGsig
Wartość sygnału.Signal value.

funcfunc
Drugi parametr jest wskaźnikiem do funkcji, która ma zostać wykonana.The second parameter is a pointer to the function to be executed. Pierwszy parametr jest wartością sygnału, a drugi parametr jest kodem podrzędnym, który może być używany, gdy pierwszy parametr to SIGFPE.The first parameter is a signal value and the second parameter is a sub-code that can be used when the first parameter is SIGFPE.

Wartość zwracanaReturn Value

sygnał zwraca poprzednią wartość funkcji Func, która jest skojarzona z danym sygnałem.signal returns the previous value of func that's associated with the given signal. Na przykład jeśli Poprzednia wartość Func była SIG_IGN, zwracana wartość jest również SIG_IGN.For example, if the previous value of func was SIG_IGN, the return value is also SIG_IGN. Zwracana wartość SIG_ERR wskazuje na błąd; w takim przypadku errno jest ustawiony na EINVAL.A return value of SIG_ERR indicates an error; in that case, errno is set to EINVAL.

Aby uzyskać więcej informacji na temat kodów powrotnych, zobacz errno, _doserrno, _sys_errlist i _sys_nerr .See errno, _doserrno, _sys_errlist, and _sys_nerr for more information about return codes.

UwagiRemarks

Funkcja sygnałów umożliwia procesowi wybranie jednego z kilku sposobów obsługi sygnału przerwania z systemu operacyjnego.The signal function enables a process to choose one of several ways to handle an interrupt signal from the operating system. Argument SIG to przerwa, do którego reaguje sygnał ; musi to być jeden z następujących stałych manifestu, które są zdefiniowane w SYGNALe. H.The sig argument is the interrupt to which signal responds; it must be one of the following manifest constants, which are defined in SIGNAL.H.

wartość SIGsig value OpisDescription
SIGABRTSIGABRT Nietypowe zakończenieAbnormal termination
SIGFPESIGFPE Błąd zmiennoprzecinkowyFloating-point error
SIGILLSIGILL Niedozwolona instrukcjaIllegal instruction
SIGINTSIGINT CTRL + sygnał CCTRL+C signal
SIGSEGVSIGSEGV Niedozwolony dostęp do magazynuIllegal storage access
SIGTERMSIGTERM Żądanie zakończeniaTermination request

Jeśli SIG nie jest jedną z powyższych wartości, zostanie wywołana procedura obsługi nieprawidłowego parametru, zgodnie z definicją w walidacji parametru .If sig is not one of the above values, the invalid parameter handler is invoked, as defined in Parameter Validation . Jeśli wykonanie może być kontynuowane, ta funkcja ustawia errno na EINVAL i zwraca SIG_ERR.If execution is allowed to continue, this function sets errno to EINVAL and returns SIG_ERR.

Domyślnie sygnał kończy program wywołujący z kodem zakończenia 3, niezależnie od wartości SIG.By default, signal terminates the calling program with exit code 3, regardless of the value of sig.

Uwaga

SIGINT nie jest obsługiwana dla żadnej aplikacji Win32.SIGINT is not supported for any Win32 application. Gdy wystąpi przerwa CTRL + C, systemy operacyjne Win32 generują nowy wątek do obsługi tego przerwania.When a CTRL+C interrupt occurs, Win32 operating systems generate a new thread to specifically handle that interrupt. Może to spowodować, że aplikacja jednowątkowa, taka jak jedna w systemie UNIX, będzie pełnić funkcję wielowątkowości i spowodować nieoczekiwane zachowanie.This can cause a single-thread application, such as one in UNIX, to become multithreaded and cause unexpected behavior.

Argument Func jest adresem do programu obsługi sygnałów, który można napisać lub do jednej ze wstępnie zdefiniowanych stałych SIG_DFL lub SIG_IGN, które są również zdefiniowane w sygnale. H.The func argument is an address to a signal handler that you write, or to one of the predefined constants SIG_DFL or SIG_IGN, which are also defined in SIGNAL.H. Jeśli Func jest funkcją, jest ona instalowana jako program obsługi sygnałów dla danego sygnału.If func is a function, it is installed as the signal handler for the given signal. Prototyp programu obsługi sygnałów wymaga jednego formalnego argumentu, SIG, typu int .The signal handler's prototype requires one formal argument, sig, of type int. System operacyjny udostępnia rzeczywisty argument za pomocą SIG w przypadku wystąpienia przerwania; argument jest sygnałem, który wygenerował przerwanie.The operating system provides the actual argument through sig when an interrupt occurs; the argument is the signal that generated the interrupt. W związku z tym można użyć sześciu stałych manifestu (wymienionych w powyższej tabeli) w programie obsługi sygnałów, aby określić, które przerwanie wystąpiło i podjąć odpowiednie działania.Therefore, you can use the six manifest constants (listed in the preceding table) in your signal handler to determine which interrupt occurred and take appropriate action. Na przykład można wywołać sygnał dwa razy, aby przypisać tę samą procedurę obsługi do dwóch różnych sygnałów, a następnie przetestować argument SIG w programie obsługi, aby wykonać różne akcje na podstawie otrzymanego sygnału.For example, you can call signal twice to assign the same handler to two different signals, and then test the sig argument in the handler to take different actions based on the signal received.

Jeśli testujesz wyjątki zmiennoprzecinkowe (SIGFPE), Func wskazuje funkcję, która przyjmuje opcjonalny drugi argument, który jest jednym z kilku stałych manifestu, zdefiniowanych w float. H FPE_xxx formularza.If you are testing for floating-point exceptions (SIGFPE), func points to a function that takes an optional second argument that is one of several manifest constants, defined in FLOAT.H, of the form FPE_xxx. Gdy wystąpi sygnał SIGFPE , można przetestować wartość drugiego argumentu, aby określić rodzaj wyjątku zmiennoprzecinkowego, a następnie podjąć odpowiednie działania.When a SIGFPE signal occurs, you can test the value of the second argument to determine the kind of floating-point exception and then take appropriate action. Ten argument i jego możliwe wartości to rozszerzenia Microsoft.This argument and its possible values are Microsoft extensions.

Dla wyjątków zmiennoprzecinkowych wartość Func nie jest resetowana po odebraniu sygnału.For floating-point exceptions, the value of func is not reset when the signal is received. Aby wykonać odzyskiwanie z wyjątków zmiennoprzecinkowych, należy użyć klauzul try/except do obsłużenia operacji zmiennoprzecinkowych.To recover from floating-point exceptions, use try/except clauses to surround the floating point operations. Możliwe jest również odzyskanie za pomocą setjmp z longjmp.It's also possible to recover by using setjmp with longjmp. W obu przypadkach proces wywołujący wznawia wykonywanie i pozostawia stan zmiennoprzecinkowy niezdefiniowanego procesu.In either case, the calling process resumes execution and leaves the floating-point state of the process undefined.

Jeśli program obsługi sygnałów zwraca, proces wywołujący wznawia wykonywanie natychmiast po punkcie, w którym otrzymał sygnał przerwania.If the signal handler returns, the calling process resumes execution immediately following the point at which it received the interrupt signal. Ta wartość jest prawdziwa niezależnie od rodzaju sygnału lub trybu operacyjnego.This is true regardless of the kind of signal or operating mode.

Przed wykonaniem określonej funkcji wartość Func jest ustawiana na SIG_DFL.Before the specified function is executed, the value of func is set to SIG_DFL. Następny sygnał przerwania jest traktowany jak opisano dla SIG_DFL, chyba że wywołanie wywołujące do sygnału określa inaczej.The next interrupt signal is treated as described for SIG_DFL, unless an intervening call to signal specifies otherwise. Tej funkcji można użyć do resetowania sygnałów w wywołanej funkcji.You can use this feature to reset signals in the called function.

Ponieważ procedury obsługi sygnałów są zwykle wywoływane asynchronicznie w przypadku wystąpienia przerwania, funkcja obsługi sygnałów może uzyskać kontrolę, gdy operacja czasu wykonywania jest niekompletna i w nieznanym stanie.Because signal-handler routines are usually called asynchronously when an interrupt occurs, your signal-handler function may get control when a run-time operation is incomplete and in an unknown state. Poniższa lista zawiera podsumowanie ograniczeń, które określają funkcje, których można użyć w procedurze obsługi sygnałów.The following list summarizes the restrictions that determine which functions you can use in your signal-handler routine.

  • Nie należy wydawać niskiego poziomu ani STDIO. H procedury we/wy (na przykład printf lub fread).Do not issue low-level or STDIO.H I/O routines (for example, printf or fread).

  • Nie wywołuj procedur sterty ani żadnej procedury korzystającej z procedur sterty (na przykład malloc, _strdup lub _putenv).Do not call heap routines or any routine that uses the heap routines (for example, malloc, _strdup, or _putenv). Aby uzyskać więcej informacji, zobacz malloc .See malloc for more information.

  • Nie należy używać żadnej funkcji generującej wywołanie systemowe (na przykład _getcwd lub Time).Do not use any function that generates a system call (for example, _getcwd or time).

  • Nie należy używać longjmp , chyba że przerwanie jest spowodowane przez wyjątek zmiennoprzecinkowy (czyli SIG to SIGFPE).Do not use longjmp unless the interrupt is caused by a floating-point exception (that is, sig is SIGFPE). W takim przypadku należy najpierw ponownie zainicjować pakiet zmiennoprzecinkowy przy użyciu wywołania do _fpreset.In this case, first reinitialize the floating-point package by using a call to _fpreset.

  • Nie należy używać żadnych procedur nakładki.Do not use any overlay routines.

Program musi zawierać kod zmiennoprzecinkowy, jeśli jest to pułapka wyjątku SIGFPE przy użyciu funkcji.A program must contain floating-point code if it is to trap the SIGFPE exception by using the function. Jeśli program nie ma kodu zmiennoprzecinkowego i wymaga kodu obsługi sygnałów biblioteki wykonawczej, po prostu Zadeklaruj nietrwałą wartość podwójną i zainicjuj ją jako zero:If your program does not have floating-point code and requires the run-time library's signal-handling code, just declare a volatile double and initialize it to zero:

volatile double d = 0.0f;

Sygnały SIGILL i SIGTERM nie są generowane w systemie Windows.The SIGILL and SIGTERM signals are not generated under Windows. Są one dołączone do zgodności ANSI.They are included for ANSI compatibility. W związku z tym, można ustawić programy obsługi sygnałów dla tych sygnałów przy użyciu sygnału i można również jawnie wygenerować te sygnały przez wywołanie metody podnieść.Therefore, you can set signal handlers for these signals by using signal, and you can also explicitly generate these signals by calling raise.

Ustawienia sygnałów nie są zachowywane w procesach duplikowanych, które są tworzone przez wywołania do _exec lub funkcji _spawn .Signal settings are not preserved in spawned processes that are created by calls to _exec or _spawn functions. Ustawienia sygnału są resetowane do wartości domyślnych w nowym procesie.The signal settings are reset to the default values in the new process.

WymaganiaRequirements

ProceduraRoutine Wymagany nagłówekRequired header
sygnałsignal <signal.h>

Aby uzyskać dodatkowe informacje o zgodności, zobacz zgodność.For additional compatibility information, see Compatibility.

PrzykładExample

Poniższy przykład pokazuje, jak za pomocą sygnału dodać niestandardowe zachowanie do sygnału SIGABRT .The following example shows how to use signal to add some custom behavior to the SIGABRT signal. Aby uzyskać dodatkowe informacje na temat zachowania przerwania, zobacz _set_abort_behavior.For additional information about abort behavior, see _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 są zależne od używanej wersji środowiska uruchomieniowego, bez względu na to, czy aplikacja jest konsolą lub aplikacją systemu Windows, czy w ustawieniach rejestru systemu Windows.The output depends on the version of the runtime used, whether the app is a console or Windows app, and on Windows registry settings. W przypadku aplikacji konsolowej można wysłać do stderr następujący komunikat podobny do następującego:For a console app, something like the following message may be sent to stderr:

Debug Error!

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

R6010

- abort() has been called

Zobacz teżSee also

Proces i kontrola środowiskaProcess and Environment Control
przerwijabort
_exec, funkcje _wexec_exec, _wexec Functions
exit, _Exit, _exitexit, _Exit, _exit
_fpreset_fpreset
_spawn, funkcje _wspawn_spawn, _wspawn Functions