nanosleep(2) System Calls Manual nanosleep(2) NAZWA nanosleep - usypia z wysoka rozdzielczoscia BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int nanosleep(const struct timespec *duration, struct timespec *_Nullable rem); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): nanosleep(): _POSIX_C_SOURCE >= 199309L OPIS nanosleep() zawiesza wykonywanie wywolujacego watku, dopoki nie uplynie co najmniej czas podany w *duration albo dopoki nie zostanie dostarczony sygnal, ktory wyzwoli przywolanie procedury obslugi w watku wywolujacym lub ktory zakonczy proces. Jesli wywolanie zostanie przerwane przez procedure obslugi sygnalu, nanosleep zwroci -1, ustawi errno na wartosc EINTR i zapisze pozostaly czas do do struktury wskazywanej przez rem, o ile rem nie bylo rowne NULL. Wartosc *rem mozna wykorzystac do ponownego wywolania nanosleep() i dokonczenia zadanej pauzy (jednak zob. UWAGI). Do podawania interwalow czasowych z dokladnoscia nanosekundowa, uzywana jest struktura timespec(3). Wartosc pola nanosekund musi byc w zakresie [0, 999999999]. W porownaniu ze sleep(3) i usleep(3), nanosleep ma nastepujace zalety: oferuje wyzsza rozdzielczosc do okreslania czasu pauzy; POSIX.1 wyraznie okresla, ze nie wplywaja na nie sygnaly; pozwala na latwiejsza kontynuacje uspienia po przerwaniu przez procedure obslugi sygnalu. WARTOSC ZWRACANA Po udanym spauzowaniu na zadany czas, nanosleep() zwroci 0. Jesli wywolanie przerwano przez procedure obslugi sygnalu lub wystapi blad, zwroci -1 i ustawi errno wskazujac blad. BLEDY EFAULT Problem z kopiowaniem informacji z przestrzeni uzytkownika. EINTR Pauza zostala przerwana sygnalem, dostarczonym watkowi (zob. signal(7)). Pozostaly czas uspienia zostal zapisany do *rem, wiec watek moze latwo wywolac ponownie nanosleep() i dokonczyc pauze. EINVAL Wartosc z pola tv_nsec nie byla w zakresie [0, 999999999] lub tv_sec bylo ujemne. WERSJE POSIX.1 okresla, ze nanosleep() powinno odmierzac czas zegarem CLOCK_REALTIME (czasu rzeczywistego). Linux dokonuje tego jednak za pomoca zegara CLOCK_MONOTONIC (czasu monotonicznego). Prawdopodobnie nie ma to znaczenia, gdyz norma POSIX.1 wobec clock_settime(2) podaje, ze skoki czasu w CLOCK_REALTIME nie powinny wplywac na nanosleep(): Ustawienie wartosci zegara CLOCK_REALTIME za pomoca clock_settime(2) nie powinno miec wplywu na watki, ktore sa zablokowane w oczekiwaniu na usluge czasu wzglednego, oparta na tym zegarze, w tym funkcje nanosleep(). Te uslugi czasu powinny zatem wygasac, gdy uplynie zadany okres, niezaleznie od nowej lub starej wartosci zegara. STANDARDY POSIX.1-2024. HISTORIA POSIX.1-2001. Aby wspierac aplikacje wymagajace znacznie bardziej dokladnych pauz (np. aby sterowac sprzetem o krytycznych zaleznosciach czasowych), nanosleep() radzilo sobie z pauzami do 2 milisekund w ten sposob, ze oczekiwalo z zajetoscia, z mikrosekundowa precyzja, gdy bylo wywolywane przez watek, dzialajacy wedlug polityki czasu rzeczywistego, takiej jak SCHED_FIFO czy SCHED_RR. To specjalnie rozszerzenie zostalo usuniete w Linuksie 2.5.39, dlatego nie jest juz dostepne od jadra Linux 2.6.0. UWAGI Jesli duration nie jest dokladnie wielokrotnoscia rozdzielczosci przedmiotowego zegara (zob. time(7), to interwal ten zostanie zaokraglony w gore, do nastepnej wielokrotnosci. Co wiecej, po zakonczenia pauzy, wciaz moze wystapic zwloka przez ponownym zwolnieniem procesora w celu ponownego wykonania watku wywolujacego. Fakt, ze nanosleep() pauzuje na interwal wzgledny moze byc problematyczny, jesli wywolanie jest ponownie restartowane po otrzymaniu sygnalow przerwania, poniewaz czas pomiedzy kazdym restartem i przerwaniem wywolania, spowoduje przesuniecie czasu, w jakim pauza sie ostatecznie zakonczy. Problemu tego mozna uniknac, uzywajac clock_nanosleep(2) z bezwzgledna wartoscia czasu. USTERKI Jesli program przechwytujacy sygnaly i uzywajacy nanosleep() bedzie otrzymywal sygnaly z duza czestoscia, to przydzielanie zasobow powoduje opoznienia i bledy zaokraglenia w obliczeniach, dotyczacych interwalu pauzy oraz zwracanej wartosci remain, ktore dokonuje jadro, co oznacza, ze wartosc remain moze systematycznie rosnac po kolejnych restartach wywolania nanosleep(). Aby uniknac tego typu problemow, nalezy korzystac z clock_nanosleep(2) ze znacznikiem TIMER_ABSTIME, aby pauzowac do terminu okreslonego bezwzglednie. W Linuksie 2.4, jesli nanosleep() zostanie zatrzymane sygnalem (np. SIGTSTP), to wywolanie zawodzi z bledem EINTR po tym, jak watek zostanie wznowiony sygnalem SIGCONT. Jesli wywolanie systemowe zostanie pozniej zrestartowane, to czas jaki watek spedzil w stanie zatrzymanym nie jest liczony do czasu pauzy. Problem naprawiono w Linuksie 2.6.0 i kolejnych jadrach. ZOBACZ TAKZE clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2), timer_create(2), sleep(3), timespec(3), usleep(3), time(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.18 8 lutego 2026 r. nanosleep(2)