Programowanie C

Sygnały POSIX z programowaniem C C

Sygnały POSIX z programowaniem C C
Możemy zdefiniować sygnał jako aktywność, która jest wyzwalana w celu zaalarmowania operacji lub wątku za każdym razem, gdy czas nadejścia określonej znaczącej sytuacji. Za każdym razem, gdy procedura lub wątek potwierdzi sygnał, procedura lub wątek zatrzyma wszystko, co robi i podejmie natychmiastowe działanie. W koordynacji międzyprocesowej sygnał może być skuteczny. W tym przewodniku nauczysz się obsługi sygnałów w systemie Linux poprzez język C C.

Sygnały standardowe lub regularne:

Plik nagłówkowy 'sygnał'.h' ma w sobie sygnały określone jako makrostała. Tytuł sygnału zaczyna się od „SIG” i jest poprzedzony krótkim opisem sygnału. W związku z tym każdy sygnał ma wyraźną wartość liczbową. Kod programu powinien używać nazwy sygnału, a nie kilku sygnałów. Powodem tego jest to, że liczba sygnałów może się różnić w zależności od systemu, ale interpretacja nazw jest standardowa. Poniżej znajduje się kilka zwykłych sygnałów ze zdefiniowaną funkcjonalnością.

REKRUTACJA:

Ten sygnał zawiesi przetwarzanie. Sygnał SIGHUP jest odrzucany, aby wskazać odłączenie terminala użytkownika, prawdopodobnie z powodu zerwania lub rozłączenia komunikacji zdalnej.

PODPIS:

Zakłóci to proces. Sygnał SIGINT jest odbierany za każdym razem, gdy użytkownik wprowadzi klawisz INTR (zwykle Ctrl + C).

WYJDŹ:

Zatrzyma lub zakończy przetwarzanie. Sygnał SIGQUIT jest odbierany za każdym razem, gdy użytkownik wprowadzi klawisz QUIT (zwykle Ctrl + \).

SIGILL:

Działa po wydaniu niedozwolonego polecenia. Sygnał SIGILL jest tworzony za każdym razem, gdy podjęto próbę wykonania śmieci lub uprzywilejowanego polecenia. Zawsze, gdy stos się przepełni, a maszyna ma problemy z uruchomieniem kontrolera sygnału, może również zostać utworzony SIGILL.

SIGTRAP:

Jest wywoływana, gdy wykonywana jest jakaś instrukcja pułapki śledzenia. Sygnał SIGTRAP jest tworzony przez polecenie punktu przerwania i inne polecenie pułapki. Debuger wykorzystuje taki sygnał.

SIGABRT:

Nazywa się to sygnałem przerwania. Sygnał SIGABRT jest tworzony przez wywołanie metody abort(). Taki sygnał służy do wskazania niedokładności zaobserwowanej przez kod ww. i zarejestrowanej przez wywołanie metody abort().

SIGFPE:

Wyjątek dla liczb zmiennoprzecinkowych; Sygnał SIGFPE jest wytwarzany, gdy wystąpi katastrofalny błąd matematyczny.

SIGUSR1 i SIGUSR2:

Sygnały SIGUSR1 i SIGUSR2 mogą być używane w dowolny sposób. Dla łatwej interakcji międzyprocesowej korzystne jest utworzenie obsługi sygnału dla takich sygnałów w aplikacji, która odbiera sygnał.

Domyślne zachowanie sygnałów:

Dla każdego sygnału istnieje standardowe zachowanie lub działanie i możliwe jest dostosowanie domyślnego zachowania za pomocą funkcji obsługi. Automatyczne zachowanie sygnału SIGKILL i SIGABRT nie mogło zostać zmodyfikowane lub zaniedbane.

Semestr: Zakończy to operację.

Rdzeń: Zostanie wygenerowany dokument zrzutu pamięci, a operacja zostanie zakończona.

Podpisz: Proces przeoczyłby sygnał.

Zatrzymać: Zatrzyma operację.

cd: Operacja zostanie utrzymana przed zatrzymaniem.

Obsługa sygnału:

Proces ma preferencje zachowania dla sygnału, gdy zostanie potwierdzony. Proces może zachowywać się następująco:

Sygnał jest automatycznie odrzucany, gdy zdefiniowane zachowanie sygnału zostanie przeoczone.

Używając metod takich jak signal lub sigaction, kod może zarejestrować funkcję obsługi. Nazywa się to łapaniem sygnału od przewodnika.

Jeśli sygnał nie jest traktowany lub zaniedbywany, może nastąpić standardowe działanie.

Możesz zdefiniować funkcję obsługi sygnału jako:

$ Int signal () int signum, void (*funk)(int))

Gdy przetwarzanie otrzyma sygnał sygnału, metoda signal() może wywołać metodę „func”'. Signal() odwraca wskaźnik do metody 'func', jeśli dobrze prosperuje lub zwracany jest wyjątek do errno i zamiast tego -1.

Wskaźnik „func” może mieć trzy wartości:

SIG_DFL: Jest to wskaźnik do standardowej metody SIG DFL(), zdefiniowanej w nagłówku.h dokument używany do uzyskania standardowego zachowania sygnału.

SIG_IGN: Jest to odniesienie do metody ignorowania SIG IGN(), określonej w nagłówku.h dokument.

Zdefiniowany przez użytkownika wskaźnik metody obsługi: Zdefiniowana przez użytkownika metoda obsługi typu void(*)(int) oznacza, że ​​kategoria zwracana jest nieważna, a jedynym argumentem jest int.

Utwórz nowy plik 'sygnał.c' i napisz w nim kod obsługi sygnału.

Połącz sygnał.plik c z gcc.

Podczas uruchamiania sygnału.c, mamy niekończącą się pętlę, która wykonuje się w głównej metodzie. Po naciśnięciu CTRL+C uruchomiono metodę obsługi i zatrzymano wykonywanie głównej metody. Przetwarzanie głównej metody kontynuowano po wykonaniu metody obsługi. Po naciśnięciu Ctrl+\ operacja kończy się.

Ignoruj ​​sygnał:

Aby przeoczyć sygnał, utwórz plik „sygnał”.c' i napisz w nim kod.

Zwiąż ignorowanie.plik c z gcc.

Uruchom sygnał.plik c. Naciśnij CTRL+C, tworzony jest sygnał SIGNIT; niemniej jednak zachowanie jest niezauważone, ponieważ metoda obsługi jest wyliczana do metody SIG_IGN().

Zarejestruj ponownie obsługę sygnału:

Aby ponownie zarejestrować procedurę obsługi sygnału, utwórz nowy plik „rereg”.c' i wpisz w nim poniższy kod:

Powiąż rereg.plik c z gcc.

Uruchom ponownie rejestr.plik c. Podczas pierwszego naciśnięcia CTRL+C podniesiono metodę obsługi i ponownie zarejestrowano procedurę obsługi sygnału w SIG_DFL. Po ponownym naciśnięciu CTRL+C wykonanie zostało zakończone.

Wysyłaj sygnały za pomocą Raise():

Utwórz plik 'wyślij.c 'i dodaj poniższy kod!. Do wysyłania sygnałów do metody wywołującej używana jest metoda raise().

Odnieś się do wysłania.plik c z gcc.

Proces wykorzystuje metodę raise() do samodzielnego przesyłania sygnału SIGUSR1.

Wyślij sygnały za pomocą Kill():

Dodaj poniższy kod w 'podbiciu.do'. Użyj metody kill(), aby wysłać sygnały do ​​grupy procesów.

Połącz podwyżkę.plik c z gcc.

Za pomocą metody kill() proces kieruje sygnał SIGUSR1 do wyżej wymienionego.

Interakcja rodzic-dziecko:

Aby obejrzeć interakcję rodzic-dziecko, napisz poniższy kod w pliku.

Połącz komunikację.plik c z gcc.

Fork()/ metoda generuje dziecko, przywraca zero do procesu potomnego, a identyfikator dziecka do rodzica.

Wniosek:

W tym przewodniku zobaczyliśmy, jak tworzyć, obsługiwać, wysyłać, ignorować, ponownie rejestrować i używać sygnału do interakcji między procesami w systemie Linux.

Remap your mouse buttons differently for different software with X-Mouse Button Control
Maybe you need a tool that could make your mouse's control change with every application that you use. If this is the case, you can try out an applica...
Microsoft Sculpt Touch Wireless Mouse Review
I recently read about the Microsoft Sculpt Touch wireless mouse and decided to buy it. After using it for a while, I decided to share my experience wi...
AppyMouse On-screen Trackpad and Mouse Pointer for Windows Tablets
Tablet users often miss the mouse pointer, especially when they are habitual to using the laptops. The touchscreen Smartphones and tablets come with m...