.\" -*- coding: UTF-8 -*-
.\" Copyright (C) Markus Kuhn, 1996
.\" and Copyright (C) Linux Foundation, 2008, written by Michael Kerrisk
.\"     <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: GPL-2.0-or-later
.\"
.\" 1996-04-10  Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>
.\"             First version written
.\" Modified, 2004-10-24, aeb
.\" 2008-06-24, mtk
.\"     Minor rewrites of some parts.
.\"     NOTES: describe case where clock_nanosleep() can be preferable.
.\"     NOTES: describe CLOCK_REALTIME versus CLOCK_NANOSLEEP
.\"     Replace crufty discussion of HZ with a pointer to time(7).
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH nanosleep 2 "12 lutego 2023 r." "Linux man\-pages 6.03" 
.SH NAZWA
nanosleep \- usypia z wysoką rozdzielczością
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <time.h>\fP
.PP
\fBint nanosleep(const struct timespec *\fP\fIreq\fP\fB,\fP
\fB              struct timespec *_Nullable \fP\fIrem\fP\fB);\fP
.fi
.PP
.RS -4
Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)):
.RE
.PP
\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*req\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.
.PP
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).
.PP
Do podawania interwałów czasowych z dokładnością nanosekundową, używana jest
struktura \fBtimespec\fP(3).
.PP
Wartość pola nanosekund musi być w zakresie [0, 999999999].
.PP
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 uśpieniu 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 STANDARDY
POSIX.1\-2001, POSIX.1\-2008.
.SH UWAGI
Jeśli interwał podany w \fIreq\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.
.PP
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.
.PP
.\" 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
.PP
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, względny interwał, niezależnie od nowej lub starej wartości zegara.
.RE
.SS "Stare zachowanie"
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 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.
.PP
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
Autorami polskiego tłumaczenia niniejszej strony podręcznika są:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.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 .
