nanosleep(2) System Calls Manual nanosleep(2) NUME nanosleep - somn de inalta rezoluie BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #include int nanosleep(const struct timespec *req, struct timespec *_Nullable rem); Cerine pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultai feature_test_macros(7)): nanosleep(): _POSIX_C_SOURCE >= 199309L DESCRIERE nanosleep() suspenda execuia firului apelant pana cand se scurge cel puin timpul specificat in *req sau pana la livrarea unui semnal care declaneaza invocarea unui gestionar in firul apelant sau care termina procesul. In cazul in care apelul este intrerupt de un gestionar de semnal, nanosleep() returneaza -1, stabilete errno la EINTR i scrie timpul ramas in structura indicata de rem, cu excepia cazului in care rem este NULL. Valoarea lui *rem poate fi apoi utilizata pentru a apela din nou nanosleep() i pentru a finaliza pauza specificata (dar vedei seciunea NOTE). Structura timespec(3) este utilizata pentru a specifica intervale de timp cu o precizie de o nanosecunda. Valoarea campului nanosecunde trebuie sa fie cuprinsa in intervalul [0, 999999999]. In comparaie cu sleep(3) i usleep(3), nanosleep() are urmatoarele avantaje: ofera o rezoluie mai mare pentru specificarea intervalului de somn; POSIX.1 specifica in mod explicit ca nu interacioneaza cu semnalele; i faciliteaza sarcina de reluare a unui somn care a fost intrerupt de un gestionar de semnal. VALOAREA RETURNATA In cazul in care se reuete sa doarma pentru intervalul de timp solicitat, nanosleep() returneaza 0. Daca apelul este intrerupt de un gestionar de semnal sau intampina o eroare, atunci returneaza -1, cu errno configurata pentru a indica eroarea. ERORI-IEIRE EFAULT Problema cu copierea informaiilor din spaiul utilizatorului. EINTR Pauza a fost intrerupta de un semnal care a fost transmis firului (a se vedea signal(7)). Timpul de somn ramas a fost scris in *rem, astfel incat firul sa poata apela din nou cu uurina nanosleep() i sa continue cu pauza. EINVAL Valoarea din campul tv_nsec nu era cuprinsa in intervalul [0, 999999999] sau tv_sec era negativa. VERSIUNI POSIX.1 specifica faptul ca nanosleep() trebuie sa masoare timpul in raport cu ceasul CLOCK_REALTIME. Cu toate acestea, Linux masoara timpul folosind ceasul CLOCK_MONOTONIC. Probabil ca acest lucru nu conteaza, deoarece specificaia POSIX.1 pentru clock_settime(2) spune ca modificarile discontinue in CLOCK_REALTIME nu ar trebui sa afecteze nanosleep(): Fixarea valorii ceasului CLOCK_REALTIME prin clock_settime(2) nu are niciun efect asupra firelor care sunt blocate in ateptarea unui serviciu de timp relativ bazat pe acest ceas, inclusiv asupra funciei nanosleep(); ... In consecina, aceste servicii de timp expira atunci cand se scurge intervalul relativ solicitat, indiferent de valoarea noua sau veche a ceasului. STANDARDE POSIX.1-2008. ISTORIC POSIX.1-2001. Pentru a sprijini aplicaiile care necesita pauze mult mai precise (de exemplu, pentru a controla anumite echipamente hardware cu timp critic), nanosleep() ar putea gestiona pauze de pana la 2 milisecunde prin ateptare ocupata cu precizie de microsecunde atunci cand este apelat de un fir programat conform unei politici de timp real precum SCHED_FIFO sau SCHED_RR. Aceasta extensie speciala a fost eliminata in Linux 2.5.39 i, prin urmare, nu este disponibila in Linux 2.6.0 i in nucleele ulterioare. NOTE In cazul in care intervalul specificat in req nu este un multiplu exact al granularitaii (fineii) ceasului de baza (a se vedea time(7)), atunci intervalul va fi rotunjit la urmatorul multiplu. In plus, dupa ce se termina somnul, este posibil sa mai existe o intarziere pana cand CPU devine liber pentru a executa din nou firul de apelare. Faptul ca nanosleep() doarme pentru un interval relativ poate fi problematic daca apelul este reluat in mod repetat dupa ce a fost intrerupt de semnale, deoarece timpul dintre intreruperi i reluarea apelului va duce la o deriva in momentul in care somnul se termina in cele din urma. Aceasta problema poate fi evitata prin utilizarea clock_nanosleep(2) cu o valoare absoluta a timpului. ERORI Daca un program care capteaza semnale i utilizeaza nanosleep() primete semnale la o rata foarte mare, atunci intarzierile de programare i erorile de rotunjire in calcularea de catre nucleu a intervalului de somn i a valorii remain returnate inseamna ca valoarea remain poate crete constant la reporniri succesive ale apelului nanosleep(). Pentru a evita astfel de probleme, utilizai clock_nanosleep(2) cu fanionul TIMER_ABSTIME pentru a dormi la un termen limita absolut. In Linux 2.4, daca nanosleep() este oprit de un semnal (de exemplu, SIGTSTP), atunci apelul eueaza cu eroarea EINTR dupa ce firul este reluat de un semnal SIGCONT. Daca apelul de sistem este repornit ulterior, atunci timpul pe care firul l-a petrecut in starea de oprire nu este contabilizat in intervalul de ateptare. Aceasta problema este rezolvata in Linux 2.6.0 i in nucleele ulterioare. CONSULTAI I clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2), timer_create(2), sleep(3), timespec(3), usleep(3), time(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 nanosleep(2)