Sygnały poz

Sygnały poz

„Podczas jazdy na poboczu, co robisz, gdy masz spotkanie z czerwonym sygnałem? Przestajesz jeździć na chwilę, aby poczekać na twoją kolej, aż sygnał zmieni zielony. Podobnie, gdy sygnał ma pomarańczowy kolor, nadal jeździsz i nigdy się nie zatrzymujesz. Sygnały POSIX działają tak samo jak sygnał drogowy. Biblioteka sygnałów POSIX wymyśliła bardzo prostą funkcję, którą należy wykorzystać w kodzie C do generowania sygnałów, sprawić, że twoje programy czekają na ich wykonanie i wiele innych. Ten artykuł pokazałby wszystkie te funkcje sygnału. Zaczynaliśmy nasze przykłady od tworzenia i otwarcia pliku C."

Przykład 01

W pierwszym poxu sygnałów zademonstrujemy użycie funkcji prostej sygnału () do utworzenia i wywołania sygnału. Dlatego używamy sygnału.Biblioteka h w celu wykorzystania funkcji sygnału, stdio.Biblioteka H jest używana do standardowych funkcji wyjściowych i wejściowych oraz UNISTD.Biblioteka H służy do używania struktur zdefiniowanych przez użytkownika, i.mi., Funkcje. Kod zawiera prostą funkcję obsługiwanej o nazwie „Uchwyt” z argumentem typu liczb całkowitych „S.„Ta zmienna„ S ”będzie działać jako sygnał. Zawiera prostą instrukcję PrintF, aby wysłać dla użytkownika sygnał „Zatrzymaj się”.

Funkcja main () zaczyna się od utworzenia sygnału za pomocą funkcji „sygnału” tutaj, używając jej opcji „sigint” do zainicjowania sygnału i funkcji „uchwytu” do użycia tej funkcji jako obsługi sygnału. Pętla „for” zaczyna się od „1”, ale nie ma końca, ja.mi., Zwiększy się, ale nigdy się nie zatrzyma, dopóki nie zrobisz tego sam, wychodząc z programu. Pętla zawiera instrukcję printf z C do wyświetlenia, że ​​jesteśmy obecnie w funkcji Main (). Wykorzystując skrót Ctrl+C, możemy wywołać funkcję uchwytu (), aby wyświetlić komunikat sygnałowy.

Na każdej iteracji pętli „for” śpi przez 5 sekund, a następnie zwiększa. Wykonajmy nasz kod sygnału C po prawidłowym zapisaniu i usunięciu jego błędów.

#włączać
#włączać
#włączać
Uchwyt void (int s)
printf ("\ nstop… \ n");

int main ()
sygnał (sigint, uchwyt);
dla (int i = 1 ;; i ++)
printf („%D: Main… \ n”, i);
sen (5);
powrót 0;

Po uruchomieniu tego programu z kompilatorem „C” i wykonaj go za pomocą „.A/.Zapytanie out, zobaczysz nieskończone wykonanie wątku main ().

Kiedy naciskaliśmy „Ctrl+C”, aby wywołać funkcję obsługi sygnału, funkcja uchwytu () jest wykonywana i wyświetlała „Stop” w tej chwili. Następnie kontrola ponownie trafia do metody Main () i ponownie zaczyna wykonywać instrukcję printf za pomocą Infinite „For” pętli. Wciśnąliśmy klawisz skrót „Ctrl+Z”, aby mocno zatrzymać ten program.

Powiedzmy, że chcesz zignorować sygnał wywołany przez użytkownika. Można to zrobić za pomocą parametru SIG_IGN funkcji funkcji Signal (). Używamy tego samego kodu z niewielką zmianą funkcji sygnału (). Korzystając z tej funkcji, gdy użytkownik wywołuje sygnał za pomocą skrótu „Ctrl+C”, program zignoruje sygnał i kontynuuje wykonywanie wątku funkcji Main (). Po prostu szybko zapiszmy i wykonajmy ten program, aby zobaczyć dane wyjściowe.

#włączać
#włączać
#włączać
int main ()
sygnał (sigint, sig_ign);
dla (int i = 1 ;; i ++)
printf („%D: ignorowanie sygnału… \ n”, i);
sen (5);
powrót 0;

Po wykonaniu tego kodu instrukcja funkcji main () printf () nadal wykonuje się nawet po użyciu skrótu „CTRL+C”. Więc na końcu zatrzymaliśmy program.

Przykład 02

Jeśli chcesz automatycznie podnieść sygnał dla programu C bez korzystania z klawisza skrótu CTRL+C, możesz to zrobić również, używając funkcji Raise () biblioteki sygnałów. Dlatego zaktualizowaliśmy kod z pierwszego przykładu i ponownie dodaliśmy funkcję uchwytu (). Funkcja main () zaczyna się od tworzenia sygnału za pomocą funkcji sygnału (), przekazując ją opcję „Sigusr1” z funkcją „Uchwyt” w parametrach. Ta opcja SIGUSSR1 jest kluczem do generowania automatycznego sygnału. Pętla „dla” śpi przez 10 sekund po wykonaniu instrukcji PrintF, a następnie wywołuje funkcję Racid () z opcją Sigusr1, aby wygenerować automatyczny sygnał, wywołując funkcję „Uchwyt”. Otóż ​​to; Jesteśmy gotowi na teraz wykonanie tego programu.

#włączać
#włączać
#włączać
Uchwyt void (int s)
printf („\ nraise… \ n”);
sen (5);

int main ()
sygnał (sigusr1, uchwyt);
dla (int i = 1 ;; i ++)
printf („%D: Main… \ n”, i);
sen (10);
Raise (sigusr1);
powrót 0;

Po udanej kompilacji wykonanie ma miejsce. GPT main () gpt jest wykonywany, a program śpi przez 10 sekund, gdy jest w pętli.

Po 10 sekundach wywołano funkcję podniesienia w celu wygenerowania automatycznego sygnału, wywołując funkcję uchwytu. Wykonanie śpi przez następne 5 sekund w funkcji uchwytu.

Kontrola jest zwrócona do funkcji Main () „pętla”, a proces ten trwa, dopóki nie wyjdziesz z programu, używając skrótu CTRL+Z.

Podobnie jak Twój automatyczny sygnał do programu, możesz również zabić sygnał po jego wywołaniu i wysłać sygnał do grupy przetwarzania. Innymi słowy, funkcja „zabijania” biblioteki sygnałów POSIX została użyta do wysyłania powiadomień do grupy programu. Dlatego zaktualizowaliśmy nasz program główny wraz z jego funkcją uchwytu w powyższym kodzie obrazu. Obiekt PID_T służy do utworzenia identyfikatora „P” dla procesu. Funkcja sygnału () jest tutaj wywoływana, aby utworzyć sygnał za pomocą funkcji uchwytu () zdefiniowanego wcześniej z funkcji głównej.

Funkcja getpid () jest wywoływana w pętli „dla”, aby uzyskać identyfikator procesu tego wątku i zapisać go na zmiennej „p”. Ten identyfikator procesu „P” jest przekazywany do funkcji „Kill” wraz z opcją Sigusr1 w celu zabicia sygnału i wysłania jego raportu do grupy postępów. Następnie program śpi przez 8 sekund i drukuje „z powrotem w Main”, podczas gdy pętla trwa.

#włączać
#włączać
#włączać
Uchwyt void (int s)
printf ("\ nstop… \ n");

int main ()
PID_T P;
sygnał (sigusr1, uchwyt);
dla (int i = 1 ;; i ++)
printf („%D: Main… \ n”, i);
p = getpid ();
Kill (P, Sigusr1);
sen (8);
printf („powrót w main \ n”);
powrót 0;

Funkcja jest wykonywana, wysyła sygnał do grupy procesowej i śpi przez 8 sekund.

„Powrót główny” został wykonany, a pętla kontynuowała to samo przetwarzanie.

Wniosek

Ten przewodnik pokazał użycie funkcji sygnałowych w programie C, aby zwiększyć wydajność środowiska pracy. W tym celu wypróbowaliśmy funkcję Posix Signal (), Kill () Funkcja i Raise () wraz z opcjami SIGINT, SIG_IGN i SIGUSR1 w funkcjach.