Sygnał
Sygnał to zdarzenie, które jest generowane w celu powiadomienia procesu lub wątku, że nadeszła jakaś ważna sytuacja. Gdy proces lub wątek otrzymają sygnał, proces lub wątek zatrzymają to, co robi i podejmie jakieś działania. Sygnał może być przydatny do komunikacji między procesami.
Standardowe sygnały
Sygnały są zdefiniowane w pliku nagłówka sygnał.H Jako stała makro. Nazwa sygnału rozpoczęła się od „SIG”, a następnie krótki opis sygnału. Tak więc każdy sygnał ma unikalną wartość liczbową. Twój program powinien zawsze używać nazwy sygnałów, a nie numeru sygnałów. Przyczyną jest to, że liczba sygnału może się różnić w zależności od systemu, ale znaczenie nazw będzie standardem.
Makro NSIG jest całkowitą liczbą zdefiniowanego sygnału. Wartość NSIG jest jednym większym niż całkowita liczba zdefiniowanych sygnału (wszystkie liczby sygnałów są przydzielane kolejno).
Poniżej znajdują się standardowe sygnały:
Nazwa sygnału | Opis |
Wzdychanie | Rozłączyć się proces. Sygnał westchnienia służy do zgłaszania odłączenia terminali użytkownika, być może dlatego, że zdalne połączenie jest utracone lub rozłącza się. |
Sigint | Przerwać proces. Gdy użytkownik wpisuje znak Intr (zwykle Ctrl + C) Sygnał SIGINT jest wysyłany. |
Sigquit | Wyrzuć proces. Gdy użytkownik wpisuje znak rezygnacji (zwykle Ctrl + \), wysyłany jest sygnał sigquit. |
Sigill | Nielegalne instrukcje. Gdy podjęto próbę wykonania śmieci lub uprzywilejowanej instrukcji, generowany jest sygnał Sigill. Również Sigill można wygenerować, gdy stos jest przepełniony lub gdy system ma problemy z uruchomieniem modułu obsługi sygnału. |
Sigtrrap | TRAP TRAP. Instrukcja przerwania i inna instrukcja pułapki wygenerują sygnał SIGTRAP. Debugger używa tego sygnału. |
Sigabrt | Anulować. Sygnał sigabrt jest generowany, gdy funkcja abort () jest wywoływana. Ten sygnał wskazuje błąd wykryty przez sam program i zgłaszany przez wywołanie funkcji abort (). |
Sigfpe | Wyjątek zmiennoprzecinkowy. Gdy wystąpił śmiertelny błąd arytmetyczny, generowany jest sygnał SIGFPE. |
Sigusr1 i Sigusr2 | Sygnały sigusr1 i sigusr2 mogą być używane według własnego uznania. Przydatne jest napisanie dla nich obsługi sygnału w programie, który odbiera sygnał do prostej komunikacji międzyprocesowej. |
Domyślne działanie sygnałów
Każdy sygnał ma domyślne działanie, jeden z poniższych:
Termin: Proces zakończy się.
Rdzeń: Proces zakończy się i wytworzy plik zrzutu podstawowego.
IGN: Proces zignoruje sygnał.
Zatrzymywać się: Proces zatrzyma się.
Cd: Proces będzie kontynuowany od zatrzymania.
Domyślne działanie można zmienić za pomocą funkcji Handler. Nie można zmienić domyślnego działania niektórych sygnału. Sigkill I Sigabrt Domyślne działania sygnału nie można zmienić ani zignorować.
Obsługa sygnału
Jeśli proces odbiera sygnał, proces ma wybór działania dla tego rodzaju sygnału. Proces może zignorować sygnał, może określić funkcję obsługi lub zaakceptować domyślne działanie dla tego rodzaju sygnału.
Możemy obsłużyć sygnał za pomocą sygnał Lub sigaction funkcjonować. Tutaj widzimy, jak najprostsze sygnał() Funkcja służy do obsługi sygnałów.
int sygnał () (int signum, void (*func) (int))sygnał() zadzwoni do Func funkcja, jeśli proces odbiera sygnał sformułowanie. sygnał() zwraca wskaźnik do funkcjonowania Func Jeśli się powiedzie lub zwraca błąd do Errno i -1 w przeciwnym razie.
Func Wskaźnik może mieć trzy wartości:
Podstawowy przykład obsługi sygnału
#włączaćNa zrzucie ekranu wyjścia z przykładu1.c, widzimy, że w funkcji głównej wykonywanie Infinite Loop. Gdy użytkownik wpisał Ctrl+C, główna funkcja wykonania i wywoływana jest funkcja obsługi sygnału. Po zakończeniu funkcji obsługi, wykonanie funkcji głównej wznowiło. Gdy typ użytkownika wpisał ctrl+\, proces jest rezygnacji.
Zignoruj przykład sygnałów
#włączaćTutaj funkcja obsługi jest rejestracja Sig_ign () funkcja ignorowania działania sygnału. Tak więc, gdy użytkownik wpisał Ctrl+C, Sigint Sygnał generuje, ale akcja jest ignorowana.
Przykład reżyser
#włączaćNa zrzucie ekranu wyjścia z przykładu3.c, widzimy, że gdy użytkownik po raz pierwszy wpisał Ctrl+C, funkcja obsługi wywołała. W funkcji obsługi obsługi sygnał rejestruje się do rejestru Sig_dfl dla domyślnego działania sygnału. Gdy użytkownik wpisał Ctrl+C po raz drugi, proces jest zakończony, co jest domyślnym działaniem Sigint sygnał.
Wysyłanie sygnałów:
Proces może również wyraźnie wysyłać sygnały do siebie lub do innego procesu. Do wysyłania sygnałów może być używana funkcja Raise () i Kill (). Obie funkcje są zadeklarowane sygnałem.H Plik nagłówka.
Int Raise (int signum)Funkcja Raise () używana do wysyłania sygnału sformułowanie do procesu wywołania (samego). Zwraca zero, jeśli się powiedzie, i niezerowa wartość, jeśli się nie powiedzie.
Int Kill (PID_T PID, int signum)Funkcja zabijania używana do wysyłania sygnału sformułowanie do procesu lub grupy procesowej określonej przez pid.
Przykład obsługi sygnału SIGUSR1
#włączaćTutaj proces wysyła sygnał Sigusr1 do siebie za pomocą funkcji Racid ().
Program przykładowy z przykładem z zabójstwem
#włączaćTutaj proces wysyła Sigusr1 sygnał do siebie zabić() funkcjonować. getPid () służy do uzyskania samego siebie identyfikatora procesu.
W następnym przykładzie zobaczymy, w jaki sposób procesy rodzica i dzieci komunikuje się (komunikacja między procesami) za pomocą zabić() i funkcja sygnału.
Komunikacja dla dzieci z sygnałami
#włączaćTutaj, widelec() Funkcja tworzy proces dzieci i zwraca zero do procesu dziecka i identyfikatora procesu dziecięcego do procesu nadrzędnego. Tak więc PID został sprawdzony, aby zdecydować o procesie rodzica i dzieci. W procesie nadrzędnym spał przez 1 sekundę, aby proces dzieci mógł zarejestrować funkcję obsługi sygnału i czekać na sygnał z nadrzędnego. Po 1 sekundowej procesie nadrzędnej wyślij Sigusr1 sygnał do procesu dziecka i poczekaj na sygnał odpowiedzi od dziecka. W procesie dziecka najpierw czeka na sygnał z nadrzędnego i po odbieraniu sygnału, wywoływana jest funkcja modułu obsługi. Z funkcji obsługi procesu dziecięcego wysyła kolejne Sigusr1 sygnał do rodzica. Tutaj getppid () Funkcja służy do uzyskania identyfikatora procesu nadrzędnego.
Wniosek
Sygnał w Linux to duży temat. W tym artykule widzieliśmy, jak obsługiwać sygnał z bardzo podstawowego, a także uzyskać wiedzę, w jaki sposób sygnał generuje, w jaki sposób proces może wysyłać sygnał do siebie i innego procesu, w jaki sposób sygnał można wykorzystać do komunikacji międzyprocesowej.