Udostępnij za pośrednictwem


sygnał

Ustawia przerwanie obsługi sygnałów.

Ważna uwagaWażne

Nie należy używać tej metody do zamykania aplikacji Windows Store, z wyjątkiem testowania i debugowania scenariuszy.Sposoby Programmatic lub interfejs użytkownika, które zamykają Windows Store aplikację nie są dozwolone zgodnie z pkt 3.6 Wymogów w zakresie certyfikacji aplikacji Windows 8.Aby uzyskać więcej informacji, zobacz Cykl życia aplikacji (aplikacje w Sklepie Windows).

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

Parametry

  • sig
    Wartość sygnału.

  • func
    Funkcja do wykonania.Pierwszy parametr jest wartością sygnału, a drugi parametr jest podkodem, który może być używany gdy pierwszym parametrem jest SIGFPE.

Wartość zwracana

signal zwraca poprzednią wartość func która jest skojarzona z danego sygnału.Na przykład, jeśli poprzednią wartością func była SIG_IGN, wartość zwracana jest również SIG_IGN.Zwracana wartość wynosząca SIG_ERR wskazuje błąd; w takim przypadku errno jest ustawiona na EINVAL.

Aby uzyskać więcej informacji na temat kodów powrotnych, zobacz errno, _doserrno, _sys_errlist, and _sys_nerr.

Uwagi

signal funkcja pozwala procesowi wybrać jeden z kilku sposobów, aby obsłużyć sygnał przerwania od systemu operacyjnego.sig argument jest przerwany, aby signal odpowiedział; musi być jednym z następujących stałych manifestu, które zostały zdefiniowane w sygnale.H.

Wartość wyliczenia sig

Opis

SIGABRT

Nienormalne zakończenie

SIGFPE

Błąd wartości zmiennoprzecinkowej

SIGILL

Niedozwolona instrukcja

SIGINT

CTRL+C sygnalizuje

SIGSEGV

Niedozwolony dostęp do magazynu

SIGTERM

Żądania przerwania

Jeśli sig nie jest jedną z powyższych wartości, procedura obsługi nieprawidłowego parametru zostanie wywołana, jak określono w Sprawdzanie poprawności parametru .Jeśli wykonanie może być kontynuowane, funkcja ta ustawia errno jako EINVAL i zwraca SIG_ERR.

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

[!UWAGA]

SIGINT nie jest obsługiwana dla żadnej aplikacji systemu Win32.Po wystąpieniu przerwania klawisze CTRL + C, system operacyjny Win32 generuje nowy wątek, aby specjalnie obsługiwać to przerwanie.Może to być spowodowane aplikacją pojedynczego wątku, na przykład jednego w systemie UNIX, aby stać się wielowątkowe i spowodować nieoczekiwane zachowanie.

func Argument jest adresem do obsługi sygnałów, które piszesz lub do jednej z wstępnie zdefiniowanych stałych SIG_DFL lub SIG_IGN, które są również określone w sygnale .H.Jeśli func jest funkcją, jest instalowany jako procedura obsługi sygnału dla danego sygnału.Prototyp obsługi sygnałów wymaga jednego argumentu formalnego, sig, typu int.System operacyjny udostępnia rzeczywisty argument poprzez sig po wystąpieniu przerwania; argument jest sygnałem, który wygenerował przerwanie.W związku z tym możesz użyć sześciu stałych manifestów (wymienionych w powyższej tabeli) w sieci obsługi sygnałów do określenia przerwania, które miały miejsce i podejmą odpowiednie działania.Na przykład, można dwukrotnie wywołać signal, aby przypisać tę samą procedurę obsługi dwóm różnym sygnałom, a następnie przetestować argument sig w procedurze obsługi, aby wykonać różne operacje w oparciu o otrzymany sygnał.

Jeśli testujesz wyjątki zmiennoprzecinkowe (SIGFPE), func wskazuje na funkcję, która ma opcjonalny drugi argument, który jest jedną z kilku stałych manifestu — zdefiniowany w FLOAT.H — formularza FPE_xxx.Gdy SIGFPE sygnał występuje, można sprawdzić wartość z drugiego argumentu, aby określić rodzaj wyjątku zmiennoprzecinkowego i wtedy podjąć odpowiednie działania.Ten argument i jego możliwe wartości są rozszerzeniami Microsoft.

W przypadku wyjątków zmiennoprzecinkowych, wartość func nie jest resetowana po odebraniu sygnału.Aby odzyskać wyjątki zmiennoprzecinkowe, użyj spróbuj /z wyjątkiem klauzul do otoczenia operacji punktu zmiennoprzecinkowego.Możliwe jest również, aby odzyskać za pomocą setjmp z longjmp.W każdym przypadku, proces wywołujący wznawia wykonanie i pozostawia stan zapisu zmiennoprzecinkowego jako nieokreślony.

Jeśli procedura obsługi sygnału powraca, proces wywołujący wznawia wykonanie następując bezpośrednio po punkcie, w którym otrzymał sygnał przerwania.To jest prawdziwe niezależnie od rodzaju sygnału lub trybu pracy.

Przed wykonaniem określonej funkcji, wartość func jest ustawiona na SIG_DFL.Kolejny sygnał przerwania jest traktowany jak opisano dla SIG_DFL, chyba że wywołanie interwencyjne signal określi inaczej.Ta funkcja służy do resetowania sygnałów w wywołanej funkcja.

Ponieważ procedury obsługi sygnału są zwykle wywoływane asynchronicznie po wystąpieniu przerwy, funkcja obsługi sygnałów może uzyskać kontrolę, kiedy operacja środowiska uruchomieniowego jest niekompletna i w nieznanym stanie.Na następującej liście podsumowano ograniczenia, które określają, których funkcji, można użyć w rutynowej obsłudze sygnałów.

  • Nie emituj procedur niższego poziomu lub STDIO.H I/O (na przykład printf lub fread).

  • Nie wywołuj sterty procedur lub dowolnej procedury korzystającej z procedury sterty (na przykład malloc, _strdup lub _putenv).Aby uzyskać więcej informacji, zobacz malloc.

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

  • Nie używaj longjmp chyba, że przerwanie jest spowodowane wyjątkiem zmiennoprzecinkowym (to znaczy, sig jest SIGFPE).W tym przypadku najpierw inicjuje ponownie pakiet zmiennoprzecinkowy za pomocą wywołania _fpreset.

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

Program musi zawierać kod zmiennoprzecinkowy, jeżeli ma wyłapać wyjątek SIGFPE przy użyciu funkcji.Jeżeli program nie posiada kodu zmiennoprzecinkowego, ale wymaga kodu obsługi sygnałów biblioteki wykonawczej, zadeklaruj zmienną typu „podwójna lotna” i zainicjuj ją na zero:

volatile double d = 0.0f; 

SIGILL i SIGTERM sygnały nie są generowane w systemie Windows.Są one włączone dla zachowania zgodności z ANSI.W związku z tym, można ustawić programy obsługi sygnału dla tych sygnałów za pomocą signal, i można także jawnie generować te sygnały poprzez wywołanie podnieść.

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

Wymagania

Procedura

Wymagany nagłówek

signal

<signal.h>

Dodatkowe informacje o zgodności – zobacz: Zgodność.

Przykład

Poniższy przykład pokazuje, jak używać signal , aby dodać niektóre zachowania niestandardowe do SIGABRT sygnału.Aby uzyskać dodatkowe informacje na temat zachowań przerywania, 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>
#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();
}
  

Odpowiednik w programie .NET Framework

Nie dotyczy. Aby wywołać standardową funkcję C, należy użyć PInvoke. Aby uzyskać więcej informacji, zobacz Przykłady wywołań platformy.

Zobacz też

Informacje

Procedury kontroli środowiska

przerwij

_exec, _wexec — Funkcje

exit, _exit

_fpreset

_spawn, _wspawn — Funkcje