Jak używać sigalrm i funkcji alarmowej w języku c?

Jak używać sigalrm i funkcji alarmowej w języku c?
alarm() Funkcja służy do generowania Sigalrm sygnał po określonej ilości czasu, który upłynął. W tym artykule pokażemy, jak używać alarm() funkcja i Sigalrm sygnał w Linux. Więc zacznijmy.

Składnia

niepodpisany alarm (niepodpisany int sekundy)

Funkcja jest zdefiniowana w unistd.H plik nagłówka.

Argumenty

Funkcja bierze jeden argument, sekundy. Po sekundy minęły sekundy od czasu żądania alarm() funkcja, Sigalrm Sygnał jest generowany. Domyślne zachowanie po otrzymaniu Sigalrm to zakończenie procesu. Ale możemy złapać i poradzić sobie z sygnałem. Zobacz szczegóły obsługi sygnału.

alarm() Funkcja zwróci wartość nie zerową, jeśli wcześniej ustawiono inny alarm, a wartość to liczba sekund pozostałych dla poprzedniego zaplanowanego alarmu z powodu dostarczonego. W przeciwnym razie alarm() zwróci zero.

Przykład 1.C:

#włączać
#włączać
#włączać
void sig_handler (int signum)
printf („Funkcja Handler Inside \ n”);

int main ()
sygnał (sigalrm, sig_handler); // rejestruj moduł obsługi sygnału
alarm (2); // Zaplanowany alarm po 2 sekundach
dla (int i = 1 ;; i ++)
printf („%d: wewnętrzna funkcja główna \ n”, i);
sen (1); // Opóźnienie na 1 sekundę

powrót 0;

Na zrzucie ekranu wyjścia Przykład 1.C, Program jest uruchamiany za pomocą polecenia czasu, abyśmy mogli uzyskać przegląd czasu wykonywania programu. Zauważyliśmy, że w funkcji głównej nazywamy alarm() funkcja, zaplanowana na 2 sekundy. Tak więc dla pętli jest wykonywane, po 2 sekundach funkcji SIG_HANDLER i wykonanie funkcji głównej jest zatrzymywane. Po wykonaniu funkcji SIG_HANDLER, w głównej funkcji wykonania pętli jest wznawiane. Tutaj używamy funkcji snu do opóźnienia, abyśmy mogli zrozumieć przepływ wykonania. Pętla dla nieskończonej pętli, kiedy naciśniemy klawisz przerwania (Ctrl+C), wykonanie zatrzyma się.

Generowanie Sigalrm za pomocą sygnał() Funkcji nie można ułożyć. Tylko jeden Sigalrm pokolenie można zaplanować. Kolejne wezwania sygnał() Funkcja Zresetuj budzik procesu wywołania.

Przykład2.C :

#włączać
#włączać
#włączać
void sig_handler (int signum)
printf („Funkcja Handler Inside \ n”);

int main ()
sygnał (sigalrm, sig_handler); // rejestruj moduł obsługi sygnału
alarm (4); // Zaplanowany alarm po 4 sekundach
alarm (1); // Zaplanowany alarm po 1 sekundach
dla (int i = 1 ;; i ++)
printf („%d: wewnętrzna funkcja główna \ n”, i);
sen (1); // Opóźnienie na 1 sekundę

powrót 0;

Na zrzucie ekranu wyjścia Przykład2.C, Widzimy, że program wykonał ponad 7 sekund, ale pierwszy alarm, który został zaplanowany po 4 sekundach, nie wywołuje funkcji obsługi. Drugi alarm, który został zaplanowany po 1 sekundzie, jest zresetowany alarm.

Jeśli wartość sekund argumentu wynosi zero, wówczas każde wcześniej zrobione żądanie alarmu jest anulowane.

Przykład3.C:

#włączać
#włączać
#włączać
void sig_handler (int signum)
printf („Funkcja Handler Inside \ n”);

int main ()
sygnał (sigalrm, sig_handler); // rejestruj moduł obsługi sygnału
alarm (2); // Zaplanowany alarm po 2 sekundach
alarm (0); // anulował poprzedni alarm
dla (int i = 1 ;; i ++)
printf („%d: wewnętrzna funkcja główna \ n”, i);
sen (1); // Opóźnienie na 1 sekundę

powrót 0;

Na zrzucie ekranu wyjścia Przykład3.C, Widzimy, że pierwszy alarm, który został zaplanowany po 2 sekundach, jest anulowany z powodu drugiego alarmu na 0 sekundy.

W Przykład4.C Zobaczymy, jak ciągle możemy ustawić alarm na co 2 sekundy.

Przykład4.C:

#włączać
#włączać
#włączać
void sig_handler (int signum)
printf („Funkcja Handler Inside \ n”);
alarm (2); // Zaplanuj nowy alarm po 2 sekundach

int main ()
sygnał (sigalrm, sig_handler); // rejestruj moduł obsługi sygnału
alarm (2); // Zaplanuj pierwszy alarm po 2 sekundach
dla (int i = 1 ;; i ++)
printf („%d: wewnętrzna funkcja główna \ n”, i);
pauza(); // Oczekiwanie, aż sygnał zostanie obsługiwany

powrót 0;

Na zrzucie ekranu wyjścia Przykład4.C, Widzimy, że alarm jest ciągły co 2 sekundy. Zresetujemy alarm w funkcji SIG_HANDLER.

W Przykład5.C Zobaczymy, jak możemy opóźnić zaplanowany alarm. Użyjemy sygnału SIGINT do przerwania. Gdy użytkownik typu ctrl+c w klawiaturze, Sigint Sygnał wygeneruje.

Przykład5.C:

#włączać
#włączać
#włączać
void sig_handler (int signum)
if (signum == sigalrm) // moduł obsługi sygnału dla sigalrm
printf („Funkcja Handlera Inside dla sigalrm \ n”);
alarm (2);

if (signum == sigint) // moduł obsługi sygnału dla sigint
printf ("\ nsnoozing przez 5 sekund… \ n");
alarm (5);


int main ()
sygnał (sigalrm, sig_handler); // rejestracja obsługi sygnału dla sigalrm
sygnał (sigint, sig_handler); // rejestruj obsługę sygnałów dla sigint
alarm (2); // Zaplanuj pierwszy alarm po 2 sekundach
dla (int i = 1 ;; i ++)
printf („%d: wewnętrzna funkcja główna \ n”, i);
pauza(); // Oczekiwanie, aż sygnał zostanie obsługiwany

powrót 0;

Na zrzucie ekranu wyjścia Przykład5.C, Widzimy, że gdy typ użytkownika Ctrl+C alarm zostanie zresetowany 5 sekund. W tym programie wykorzystaliśmy tylko jedną funkcję obsługi dla dwóch różnych sygnałów, ale w funkcji obsługi sprawdzono, że dla którego sygnału jest wywoływana funkcja modułu obsługi.

Wniosek:

Widzieliśmy więc, jak można ustawić funkcję alarmu dla sygnału wyzwalającego, jak zresetować alarm, jak anulować już zaplanowany alarm.