.\" -*- coding: UTF-8 -*- .\" Copyright 1996, Markus Kuhn .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH nanosleep 2 "8 lutego 2026 r." "Linux man\-pages 6.18" .SH NAZWA nanosleep \- usypia z wysoką rozdzielczością .SH BIBLIOTEKA Standardowa biblioteka C (\fIlibc\fP,\ \fI\-lc\fP) .SH SKŁADNIA .nf \fB#include \fP .P \fBint nanosleep(const struct timespec *\fP\fIduration\fP\fB,\fP \fB struct timespec *_Nullable \fP\fIrem\fP\fB);\fP .fi .P .RS -4 Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)): .RE .P \fBnanosleep\fP(): .nf _POSIX_C_SOURCE >= 199309L .fi .SH OPIS \fBnanosleep\fP() zawiesza wykonywanie wywołującego wątku, dopóki nie upłynie co najmniej czas podany w \fI*duration\fP albo dopóki nie zostanie dostarczony sygnał, który wyzwoli przywołanie procedury obsługi w wątku wywołującym lub który zakończy proces. .P Jeśli wywołanie zostanie przerwane przez procedurę obsługi sygnału, \fBnanosleep\fP zwróci \-1, ustawi \fIerrno\fP na wartość \fBEINTR\fP i zapisze pozostały czas do do struktury wskazywanej przez \fIrem\fP, o ile \fIrem\fP nie było równe NULL. Wartość \fI*rem\fP można wykorzystać do ponownego wywołania \fBnanosleep\fP() i dokończenia zadanej pauzy (jednak zob. UWAGI). .P Do podawania interwałów czasowych z dokładnością nanosekundową, używana jest struktura \fBtimespec\fP(3). .P Wartość pola nanosekund musi być w zakresie [0, 999999999]. .P W porównaniu ze \fBsleep\fP(3) i \fBusleep\fP(3), \fBnanosleep\fP ma następujące zalety: oferuje wyższą rozdzielczość do określania czasu pauzy; POSIX.1 wyraźnie określa, że nie wpływają na nie sygnały; pozwala na łatwiejszą kontynuację uśpienia po przerwaniu przez procedurę obsługi sygnału. .SH "WARTOŚĆ ZWRACANA" Po udanym spauzowaniu na żądany czas, \fBnanosleep\fP() zwróci 0. Jeśli wywołanie przerwano przez procedurę obsługi sygnału lub wystąpi błąd, zwróci \-1 i ustawi \fIerrno\fP wskazując błąd. .SH BŁĘDY .TP \fBEFAULT\fP Problem z kopiowaniem informacji z przestrzeni użytkownika. .TP \fBEINTR\fP Pauza została przerwana sygnałem, dostarczonym wątkowi (zob. \fBsignal\fP(7)). Pozostały czas uśpienia został zapisany do \fI*rem\fP, więc wątek może łatwo wywołać ponownie \fBnanosleep\fP() i dokończyć pauzę. .TP \fBEINVAL\fP Wartość z pola \fItv_nsec\fP nie była w zakresie [0, 999999999] lub \fItv_sec\fP było ujemne. .SH WERSJE .\" See also http://thread.gmane.org/gmane.linux.kernel/696854/ .\" Subject: nanosleep() uses CLOCK_MONOTONIC, should be CLOCK_REALTIME? .\" Date: 2008-06-22 07:35:41 GMT POSIX.1 określa, że \fBnanosleep\fP() powinno odmierzać czas zegarem \fBCLOCK_REALTIME\fP (czasu rzeczywistego). Linux dokonuje tego jednak za pomocą zegara \fBCLOCK_MONOTONIC\fP (czasu monotonicznego). Prawdopodobnie nie ma to znaczenia, gdyż norma POSIX.1 wobec \fBclock_settime\fP(2) podaje, że skoki czasu w \fBCLOCK_REALTIME\fP nie powinny wpływać na \fBnanosleep\fP(): .RS .P Ustawienie wartości zegara \fBCLOCK_REALTIME\fP za pomocą \fBclock_settime\fP(2) nie powinno mieć wpływu na wątki, które są zablokowane w oczekiwaniu na usługę czasu względnego, opartą na tym zegarze, w tym funkcję \fBnanosleep\fP(). Te usługi czasu powinny zatem wygasać, gdy upłynie żądany okres, niezależnie od nowej lub starej wartości zegara. .RE .SH STANDARDY POSIX.1\-2024. .SH HISTORIA POSIX.1\-2001. .P Aby wspierać aplikacje wymagające znacznie bardziej dokładnych pauz (np. aby sterować sprzętem o krytycznych zależnościach czasowych), \fBnanosleep\fP() radziło sobie z pauzami do 2 milisekund w ten sposób, że oczekiwało z zajętością, z mikrosekundową precyzją, gdy było wywoływane przez wątek, działający według polityki czasu rzeczywistego, takiej jak \fISCHED_FIFO\fP czy \fISCHED_RR\fP. To specjalnie rozszerzenie zostało usunięte w Linuksie 2.5.39, dlatego nie jest już dostępne od jądra Linux 2.6.0. .SH UWAGI Jeśli \fIduration\fP nie jest dokładnie wielokrotnością rozdzielczości przedmiotowego zegara (zob. \fBtime\fP(7), to interwał ten zostanie zaokrąglony w górę, do następnej wielokrotności. Co więcej, po zakończenia pauzy, wciąż może wystąpić zwłoka przez ponownym zwolnieniem procesora w celu ponownego wykonania wątku wywołującego. .P Fakt, że \fBnanosleep\fP() pauzuje na interwał względny może być problematyczny, jeśli wywołanie jest ponownie restartowane po otrzymaniu sygnałów przerwania, ponieważ czas pomiędzy każdym restartem i przerwaniem wywołania, spowoduje przesunięcie czasu, w jakim pauza się ostatecznie zakończy. Problemu tego można uniknąć, używając \fBclock_nanosleep\fP(2) z bezwzględną wartością czasu. .SH USTERKI Jeśli program przechwytujący sygnały i używający \fBnanosleep\fP() będzie otrzymywał sygnały z dużą częstością, to przydzielanie zasobów powoduje opóźnienia i błędy zaokrąglenia w obliczeniach, dotyczących interwału pauzy oraz zwracanej wartości \fIremain\fP, które dokonuje jądro, co oznacza, że wartość \fIremain\fP może systematycznie \fIrosnąć\fP po kolejnych restartach wywołania \fBnanosleep\fP(). Aby uniknąć tego typu problemów, należy korzystać z \fBclock_nanosleep\fP(2) ze znacznikiem \fBTIMER_ABSTIME\fP, aby pauzować do terminu określonego bezwzględnie. .P W Linuksie 2.4, jeśli \fBnanosleep\fP() zostanie zatrzymane sygnałem (np. \fBSIGTSTP\fP), to wywołanie zawodzi z błędem \fBEINTR\fP po tym, jak wątek zostanie wznowiony sygnałem \fBSIGCONT\fP. Jeśli wywołanie systemowe zostanie później zrestartowane, to czas jaki wątek spędził w stanie zatrzymanym \fInie\fP jest liczony do czasu pauzy. Problem naprawiono w Linuksie 2.6.0 i kolejnych jądrach. .SH "ZOBACZ TAKŻE" \fBclock_nanosleep\fP(2), \fBrestart_syscall\fP(2), \fBsched_setscheduler\fP(2), \fBtimer_create\fP(2), \fBsleep\fP(3), \fBtimespec\fP(3), \fBusleep\fP(3), \fBtime\fP(7) .PP .SH TŁUMACZENIE Tłumaczenie niniejszej strony podręcznika: Przemek Borys , Andrzej Krzysztofowicz i Michał Kułach . .PP Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .