table of contents
posix_fadvise(2) | System Calls Manual | posix_fadvise(2) |
NUME¶
posix_fadvise - predeclară un model de acces pentru datele din fișiere
BIBLIOTECA¶
Biblioteca C standard (libc, -lc)
SINOPSIS¶
#include <fcntl.h>
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
posix_fadvise():
_POSIX_C_SOURCE >= 200112L
DESCRIERE¶
Programele pot utiliza posix_fadvise() pentru a anunța intenția de a accesa în viitor datele unui fișier după un anumit model, permițând astfel nucleului să efectueze optimizările corespunzătoare.
Argumentul advice se aplică unei regiuni (care nu este neapărat existentă) care începe la offset și se extinde pe o lungime de len octeți (sau până la sfârșitul fișierului dacă len este 0) în cadrul fișierului la care face referire fd. fd nu este obligatoriu; el constituie doar o așteptare din partea aplicației.
Valorile admise pentru advice includ:
- POSIX_FADV_NORMAL
- Indică faptul că aplicația nu are nici o indicație „advice” de dat cu privire la modelul său de acces pentru datele specificate. În cazul în care nu se oferă niciun sfat pentru un fișier deschis, aceasta este presupunerea implicită.
- POSIX_FADV_SEQUENTIAL
- Aplicația se așteaptă să acceseze datele specificate în mod secvențial (cu citirea pozițiilor inferioare înaintea celor superioare).
- POSIX_FADV_RANDOM
- Datele specificate vor fi accesate în ordine aleatorie.
- POSIX_FADV_NOREUSE
- Datele specificate vor fi accesate o singură dată.
- Înainte de Linux 2.6.18, POSIX_FADV_NOREUSE avea aceeași semantică ca și POSIX_FADV_WILLNEED. Aceasta era probabil o eroare; începând cu Linux 2.6.18, acest fanion nu mai este operațional.
- POSIX_FADV_WILLNEED
- Datele specificate vor fi accesate în viitorul apropiat.
- POSIX_FADV_WILLNEED inițiază o citire fără blocaj a regiunii specificate în memoria cache de pagină. Cantitatea de date citite poate fi diminuată de către nucleu în funcție de încărcarea memoriei virtuale; (câțiva megaocteți vor fi de obicei pe deplin satisfăcători, iar mai mult este rareori util).
- POSIX_FADV_DONTNEED
- Datele specificate nu vor fi accesate în viitorul apropiat.
- POSIX_FADV_DONTNEED încearcă să elibereze paginile din memoria cache asociate cu regiunea specificată. Acest lucru este util, de exemplu, în timpul transmiterii în flux a fișierelor mari. Un program poate solicita periodic nucleului să elibereze datele din memoria cache care au fost deja utilizate, astfel încât paginile mai utile din memoria cache să nu fie eliminate în schimb.
- Solicitările de eliminare a paginilor parțiale sunt ignorate. Este preferabil să se păstreze datele necesare decât să se renunțe la datele inutile. Dacă aplicația cere ca datele să fie luate în considerare pentru a fi eliminate, atunci offset și len trebuie să fie aliniate la pagină.
- Implementarea poate încerca să scrie înapoi paginile „murdare” (scrise parțial) din regiunea specificată, dar acest lucru nu este garantat. Toate paginile „murdare” nescrise nu vor fi eliberate. Dacă aplicația dorește să se asigure că paginile „murdare” vor fi eliberate, trebuie să apeleze mai întâi fsync(2) sau fdatasync(2).
VALOAREA RETURNATö
În caz de succes, se returnează zero. În caz de eroare, se returnează un număr de eroare.
ERORI-IEȘIRE¶
- EBADF
- Argumentul fd nu este un descriptor de fișier valid.
- EINVAL
- A fost specificată o valoare nevalidă pentru advice.
- ESPIPE
- Descriptorul de fișier specificat se referă la o conductă sau FIFO; (ESPIPE este eroarea specificată de POSIX, dar înainte de Linux 2.6.16, Linux a returnat EINVAL în acest caz).
VERSIUNI¶
În Linux, POSIX_FADV_NORMAL stabilește fereastra de citire-anticipată la dimensiunea implicită pentru dispozitivul respectiv; POSIX_FADV_SEQUENTIAL dublează această dimensiune, iar POSIX_FADV_RANDOM dezactivează complet citirea-anticipată de fișiere. Aceste modificări afectează întregul fișier, nu doar regiunea specificată (dar alte gestionări de fișiere deschise pentru același fișier nu sunt afectate).
Diferențe între biblioteca C și nucleu¶
Numele funcției de învăluire din biblioteca C este posix_fadvise(). Apelul de sistem subiacent se numește fadvise64() (sau, pe unele arhitecturi, fadvise64_64()); diferența dintre cele două este că primul apel de sistem presupune că tipul argumentului len este size_t, în timp ce al doilea se așteaptă ca loff_t să fie acolo.
Variante specifice arhitecturii¶
Unele arhitecturi necesită ca argumentele pe 64 de biți să fie aliniate într-o pereche adecvată de registre (a se vedea syscall(2) pentru mai multe detalii). Pe astfel de arhitecturi, semnătura de apelare a posix_fadvise() prezentată în SINOPSIS ar forța irosirea unui registru ca umplutură între argumentele fd și offset. Prin urmare, aceste arhitecturi definesc o versiune a apelului de sistem care ordonează în mod corespunzător argumentele, dar care, în rest, este exact la fel ca posix_fadvise().
De exemplu, începând cu Linux 2.6.14, ARM are următorul apel de sistem:
long arm_fadvise64_64(int fd, int advice, loff_t offset, loff_t len);
Aceste detalii specifice arhitecturii sunt, în general, ascunse aplicațiilor de către funcția de învăluire glibc posix_fadvise(), care invocă apelul de sistem specific arhitecturii corespunzătoare.
STANDARDE¶
POSIX.1-2008.
ISTORIC¶
POSIX.1-2001.
Suportul pentru nucleu a apărut pentru prima dată în Linux 2.5.60; apelul de sistem subiacent se numește fadvise64(). Suportul pentru bibliotecă a fost furnizat începând cu glibc 2.2, prin intermediul funcției de învăluire posix_fadvise().
Începând cu Linux 3.18, suportul pentru apelul de sistem subiacent este opțional, în funcție de valoarea opțiunii de configurare CONFIG_ADVISE_SYSCALLS.
Tipul argumentului len a fost schimbat din size_t în off_t în POSIX.1-2001 TC1.
NOTE¶
Conținutul cache-ului tampon al nucleului poate fi șters prin intermediul interfeței /proc/sys/vm/drop_caches descrisă în proc(5).
Se poate obține o imagine instantanee a paginilor dintr-un fișier care se află în memoria cache tampon deschizând un fișier, cartografiindu-l cu mmap(2) și apoi aplicând mincore(2) la cartografiere.
ERORI¶
Înainte de Linux 2.6.6, dacă len era specificat ca fiind 0, atunci acest lucru era interpretat literal ca fiind „zero octeți”, în loc să însemne „toți octeții până la sfârșitul fișierului”.
CONSULTAȚI ȘI¶
fincore(1), mincore(2), readahead(2), sync_file_range(2), posix_fallocate(3), posix_madvise(3)
TRADUCERE¶
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
2 mai 2024 | Pagini de manual Linux (nepublicate) |