System operacyjny wyśle sygnał, który jest wygenerowanym oprogramowaniem przerwanie, do procesu, gdy użytkownik naciska klawisz „Ctrl-C” lub gdy inny proces musi komunikować się z procesem. Proces może odbierać tylko określony zestaw sygnałów. Liczby całkowite służą jako identyfikatory sygnałów. Nazwy symboliczne są przypisane do numerów sygnałów. Sygnał wydany do procesu nadrzędnego, gdy proces dziecka kończy się na przykład, jest Sigchld.
Sygnał jest przesyłany do procesu, który ustawia odpowiedni bit w liczbie całkowity. OS bada oczekujące i zablokowane liczby całkowite za każdym razem, gdy wybiera się proces uruchomienia na określonym procesorze. Proces jest wznowiony prawidłowo i wznawia wykonanie przy następnej instrukcji, jeśli nie ma żadnych oczekujących sygnałów. Kiedy jeden lub więcej sygnałów jest zatrzymywany, ale jeden lub więcej jest w toku, procedura jest również kontynuowana, a sygnały są nadal odnotowane jako oczekujące. Jeśli jeden lub więcej sygnałów nie jest zablokowanych, ale jest w toku, system operacyjny wywołuje funkcje obsługi sygnału w kodzie procesu.
Składnia funkcji sygnału w języku C
Funkcja sygnału biblioteki C tworzy obsługę sygnału lub funkcję z numerem sygnału SIG. Deklaracja funkcji Signal () znajduje się w następujący sposób:
void (*sygnał (int sig, void (*func) (int))) (int)
Omówmy szczegółowo każdy parametrów funkcji sygnału. „SIG” to numer sygnału, który ma powiązaną funkcję obsługi. Oto kilka kluczowych standardowych liczb sygnałów:
SidaBrt jest określany jako nieprawidłowe zakończenie sygnału takie jak to, które rozpoczyna się przez funkcję. SIGFPE jest określany jako wyjątek zmiennoprzecinkowy sygnału, który jest niewłaściwą operacją matematyczną, taką jak podział zero lub operacja przepełnienia (nie zawsze przy użyciu operacji zmiennoprzecinkowej.)
Sigill jest sygnałem nielegalnym i jest nieprawidłową instrukcją lub nieprawidłowym obrazem funkcji. Zazwyczaj winę jest wysiłek wykonania uszkodzenia danych lub kodu. Sigint jest określany jako przerwanie sygnału, które jest interakcyjną wskazówką uwagi. Użytkownik aplikacji jest zwykle tym, który ją generuje. SigSevg jest skrótem naruszenia segmentacji sygnału i jego nieautoryzowanego dostępu do danych, które mają miejsce, gdy oprogramowanie próbuje odczytać lub zapisać dane, które nie są w pamięci, które zostały mu przydzielone.
SIGTERM jest akronimem rozwiązania sygnału, w którym program otrzymał żądanie rozwiązania.
Wskaźnik funkcji jest reprezentowany przez parametr „FUNC”. Jedna z poniższych ustawień wstępnych można użyć tutaj lub funkcji utworzonej przez programistę. SIG_DFL jest domyślnie obsługą sygnału. Sygnał jest rozpatrywany przez domyślną odpowiedź dla tego konkretnego sygnału. Sig_ign to sygnał ignorowany. Sygnał jest pomijany.
Przykład 1:
Dostępne są różne standardowe procedury obsługi sygnałów. Każdy sygnał ma odpowiednią domyślną procedurę obsługi. Wspólne działania wykonywane przez różne domyślne procedury przewodnika obejmują ignorowanie sygnału, co oznacza nic nie robić i po prostu wrócić. Proces powinien zostać zakończony. Kontynuuj, uwalniając zablokowany proces. Zatrzymaj procedurę, blokując ją. Ta instancja ilustruje domyślną obsługę sygnału w języku C:
#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
void uchwyt_sigint (int sig)
printf („Handler sygnał”);
int main ()
sygnał (SIGINT, HANDED_SIGINT);
While (1)
printf („Hello to C Language \ n”);
sen (1);
powrót 0;
Wraz z innymi wymaganymi plikami nagłówka zaimportowaliśmy „sygnał.H ”plik nagłówka. Sygnał.H ”plik nagłówka zawiera stałą definicję makro sygnałów. Konstruowana jest funkcja HANDE_SIGINT, która przyjmuje obiekt liczb całkowitych „SIG”. Nazwaliśmy tę funkcję w naszej głównej funkcji. Główna funkcja wykorzystywała wywołanie funkcji sygnału i przyjmuje dwa argumenty: Pierwszym argumentem jest SIGINT dla przerwy sygnału, a drugim argumentem jest cel Hande_Signint dla celów obsługi sygnału. Pętla While jest zdefiniowana, która iteruje instrukcję PrintF, która wyświetla ciąg „Hello to C Language”.
String jest drukowany nieskończone czasy na wyjściu. Po otrzymaniu sygnału SIGINT i użyciu domyślnego obsługi, aby zakończyć proces, użytkownik może nacisnąć Ctrl+C, aby zakończyć proces.
Przykład 2:
Z wyjątkiem Sigkilla, proces może użyć kodu modułu obsługi, aby zastąpić domyślną obsługę sygnału praktycznie wszystkie sygnały. Każda nazwa jest dopuszczalna dla funkcji obsługi sygnału, ale musi mieć jeden parametr INT i typ zwrotny. Poniższy przykładowy kod to ilustracja modułu obsługi sygnału zdefiniowanego przez użytkownika:
#włączać
#włączać
void uchwyt_sigint (int sig)
printf („Sygnały złapane %d \ n”, sig);
int main ()
sygnał (SIGINT, HANDED_SIGINT);
podczas (1);
powrót 0;
Po włączeniu pliku nagłówka, po prostu zacznij od kodu. Zdefiniowaliśmy funkcję obsługi sygnału. Parametr int sig jest przekazywany do funkcji obsługi sygnału. Ta funkcja jest obsługą SIGINT i drukuje instrukcję sygnału złapanego, gdy użytkownik wprowadza polecenie „Ctrl+C”. Wewnątrz głównej funkcji mamy wywołanie systemu sygnałowego, które przyjmuje argument SIGINT i argument HANDE_SIGINT.
Program przejdzie w pętli While i drukuje następujące dane wyjściowe na każde polecenie „Ctrl+C”:
Wniosek
Cały ten przewodnik edukuje funkcję sygnału w C. Przeżyliśmy wprowadzenie do sygnałów w C, wraz ze strukturą sygnałów i ich odpowiednich przykładów. Jeśli chodzi o zajęcie się nieplanowanymi zakłóceniami, które zdarzają się w trakcie wykonywania programu w czasie wykonywania, polecenie sygnałowe języka C jest kluczowe. Ponieważ służy jako sygnał dla użytkownika i może wykrywać błędy podczas wykonywania programu, funkcja sygnału może z łatwością je obsłużyć.