Funkcja Sleep() w języku C

Funkcja Sleep W Jezyku C



Kiedy tworzymy programy wymagające interakcji z użytkownikiem, zdarzają się przypadki, w których konieczne jest dostosowanie czasów systemowych, aby aplikacja była czytelna i łatwa w użyciu.

Na przykład, jeśli tworzymy aplikację konsolową, w której musimy poinformować użytkownika o zadaniach, które będą wykonywane w kolejności, komunikaty informacyjne powinny utrzymywać się przez rozsądny czas, aby użytkownik miał czas je przeczytać, zanim zostaną usunięte i program przechodzi do następnego polecenia.

W tym artykule Linuxhint dowiesz się, jak używać funkcji Sleep() do tworzenia opóźnień w czasie rzeczywistym. Pokażemy Ci składnię i opis tej funkcji, a także opcje udostępniane przez POSIX w celu tworzenia opóźnień o ułamkach krótszych niż sekunda. Następnie na praktycznych przykładach, kodach i obrazkach pokażemy jak opóźnić wykonanie programu i wpływ sygnałów na tę funkcję.








Składnia funkcji Sleep() w języku C



niepodpisany wew spać ( niepodpisany wew sek )

Opis funkcji Sleep() w języku C

Funkcja Sleep() powoduje uśpienie procesu lub wątku na czas w sekundach określony w argumencie wejściowym „sec”, który jest liczbą całkowitą bez znaku. Po wywołaniu funkcji Sleep() proces wywołujący pozostaje w stanie uśpienia do momentu upłynięcia limitu czasu lub otrzymania sygnału.



Ta funkcja jest często używana do wymuszania dużych opóźnień przekraczających 1 sekundę w wykonywaniu procesów w czasie rzeczywistym. W przypadku opóźnień mniejszych niż 1 sekunda POSIX udostępnia funkcję rozdzielczości mikrosekundowej, usleep(), która wykorzystuje to samo wywołanie metody co funkcja Sleep(). Dla opóźnień mniejszych niż 1 mikrosekunda dostępna jest również funkcja nanosleep() z rozdzielczością 1 nanosekundy, ale z inną metodą wywołania, w której wykorzystuje ona struktury „timespec” jako argumenty wejściowe do ustawienia czasu opóźnienia.





Jeśli funkcja Sleep() wykorzystała cały określony czas, jako wynik zwraca 0. Jeśli wykonanie zostanie przerwane przez nadejście sygnału przed upływem określonego czasu, zwraca liczbę sekund pozostałą do tego czasu.

Funkcja Sleep() jest zdefiniowana w nagłówku „unistd.h”. Aby z niego skorzystać, musimy uwzględnić ten plik w kodzie w następujący sposób:



#include

Jak wprowadzić opóźnienia w procesie za pomocą funkcji Sleep().

W tym przykładzie tworzymy timer składający się z nieskończonej pętli, w której wypisujemy w konsoli poleceń komunikat „Czas, który upłynął”, a następnie sekundy, które upłynęły od procesu. Każda z tych pętli jest powtarzana co 2 sekundy ze względu na opóźnienie spowodowane funkcją Sleep().

Aby to zrobić, bierzemy pusty plik z rozszerzeniem „.c” i dodajemy w nim nagłówki „stdio.h” i „unistd.h”. Następnie otwieramy pustą funkcję main() i definiujemy w niej zmienne sekundy typu int, które wykorzystamy jako licznik czasu, który upłynął.

Po wstawieniu nagłówków i zadeklarowaniu zmiennej otwieramy nieskończoną pętlę i używamy w niej funkcji printf() w celu wyświetlenia komunikatu i wartości czasu. W następnej linii zwiększamy zmienną czasu o 2, a następnie wywołujemy funkcję Sleep() z wartością 2 jako argumentem wejściowym. W ten sposób cykl ten powtarza się co sekundę i otrzymujemy licznik, który wyświetla na ekranie upływający czas. Przyjrzyjmy się teraz kodowi tej aplikacji. Zobaczmy pełny kod tego przykładu:

#include
#include

próżnia główny ( )
{
wew sekundy = 0 ;
chwila ( 1 )
{
drukuj ( „Czas, który upłynął: %i \N ' , sekundy ) ;
sekundy += 2 ;
spać ( 2 ) ;
}

}

Poniżej zobaczymy obraz z kompilacją i wykonaniem tego kodu. Jak widzimy, co 2 sekundy program wypisuje na ekranie sekundy, które upłynęły od wykonania procesu.

Wpływ sygnałów na funkcję Sleep().

W tym przykładzie chcemy zaobserwować wpływ sygnałów na proces uśpiony za pomocą funkcji Sleep(). W tym celu tworzymy prostą aplikację składającą się z funkcji main() i procedury obsługi sygnału 36.

W pierwszej linii funkcji main() deklarujemy pozostałą zmienną typu int, w której przechowujemy wartość zwracaną przez funkcję Sleep(). Następnie używamy funkcji Signal(), aby powiązać procedurę obsługi z sygnałem 36. W następnej linii wyświetlamy PID procesu, którego następnie używamy do wysłania sygnału z drugiej powłoki do procesu. Na koniec wywołujemy funkcję Sleep() i ustawiamy jej argument wejściowy na 60 sekund, czyli wystarczająco długo, aby wysłać sygnał z drugiej powłoki. Pozostałą zmienną wysyłamy jako argument wyjściowy do funkcji Sleep().

Procedura obsługi dołączona do sygnału 36 składa się z wiersza kodu, w którym funkcja printf() wypisuje komunikat „Pozostały czas:”, po którym następuje wartość zwracana przez funkcję Sleep() w momencie dotarcia sygnału do procesu. Tutaj spójrzmy na kod tego przykładu.

#include
#include
#include
#include

próżnia treser ( wew pozostały ) ;

próżnia główny ( )
{
wew pozostały ;
sygnał ( 36 , treser ) ;
drukuj ( „Identyfikator procesu: %i \N ' , zwariować ( ) ) ;
pozostały = spać ( 60 ) ;
}

próżnia treser ( wew pozostały )

{
drukuj ( „Pozostały czas: %i \N ' , pozostały ) ;
}

Poniższy obraz, który widzimy, pokazuje kompilację i wykonanie tego kodu:

Aby zobaczyć wpływ sygnałów w tym procesie, kompilujemy ten kod i uruchamiamy go. Następnie z drugiego terminala wysyłamy sygnał o następującej składni:

zabić - n sygnał PID

Poniższy obraz, który widzimy, pokazuje wykonanie kodu w poprzedniej konsoli i skutki nadejścia sygnału wysyłanego z kolejnej konsoli. Jak widać, sygnał stłumił działanie funkcji Sleep(), budząc proces:

Wniosek

W tym artykule Linuxhint pokazaliśmy, jak używać funkcji Sleep(), aby uśpić proces na określoną liczbę sekund. Pokazaliśmy Ci także składnię oraz opis funkcji i metody jej wywołania.

Korzystając z praktycznych przykładów, fragmentów kodu i obrazków, pokazaliśmy, jak uśpić proces i jaki wpływ na proces uśpienia ma przybycie sygnału za pomocą funkcji Sleep().