sync_file_range(2)

NUME
sync_file_range - sincronizează un segment de fișier cu discul

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#define _GNU_SOURCE         /* Consultați feature_test_macros(7) */
#define _FILE_OFFSET_BITS 64
#include <fcntl.h>

int sync_file_range(int fd, off_t offset, off_t nbytes,
                    unsigned int flags);

DESCRIERE
sync_file_range() permite un control precis la sincronizarea fișierului deschis la care se referă descriptorul de fișier fd cu discul.

offset este octetul de început al intervalului de fișiere care urmează să fie sincronizat. nbytes specifică lungimea intervalului care urmează să fie sincronizat, în octeți; dacă nbytes este zero, atunci toți octeții de la offset până la sfârșitul fișierului sunt sincronizați. Sincronizarea se face în unități de dimensiune a paginii de sistem: offset este rotunjit în jos la limita paginii; (offset+nbytes-1) este rotunjit în sus la limita paginii.

Argumentul mască de biți flags poate include oricare dintre următoarele valori:

SYNC_FILE_RANGE_WAIT_BEFORE
    Așteaptă scrierea tuturor paginilor din intervalul specificat care au fost deja trimise controlorului dispozitivului pentru scriere înainte de a efectua orice operație de scriere.

SYNC_FILE_RANGE_WRITE
    Inițiază scrierea tuturor paginilor murdare din intervalul specificat care nu sunt în prezent trimise pentru scriere. Rețineți că chiar și acest lucru poate bloca dacă încercați să scrieți mai mult decât dimensiunea cozii de solicitări.

SYNC_FILE_RANGE_WAIT_AFTER
    Așteaptă scrierea tuturor paginilor din interval după efectuarea oricărei operații de scriere.

Specificarea flags ca 0 este permisă, ca o operație fără efect.

  Atenție
Acest apel de sistem este extrem de periculos și nu trebuie utilizat în programe portabile. Niciuna dintre aceste operații nu scrie metadatele fișierului. Prin urmare, cu excepția cazului în care aplicația efectuează strict suprascrieri ale blocurilor de disc deja instanțiate, nu există garanții că datele vor fi disponibile după o blocare. Nu există o interfață de utilizator care să indice dacă o scriere este pur și simplu o suprascriere. Pe sistemele de fișiere care utilizează semantica copiere la scriere (de exemplu, btrfs), suprascrierea blocurilor alocate existente este imposibilă. Atunci când se scrie în spațiul prealocat, multe sisteme de fișiere necesită, de asemenea, apeluri către alocatorul de blocuri, pe care acest apel de sistem nu le sincronizează pe disc. Acest apel de sistem nu golește cache-urile de scriere pe disc și, prin urmare, nu oferă nicio integritate a datelor pe sistemele cu cache-uri de scriere pe disc volatile.

  Câteva detalii
SYNC_FILE_RANGE_WAIT_BEFORE și SYNC_FILE_RANGE_WAIT_AFTER vor detecta orice erori de In/Ieș sau condiții ENOSPC și le vor returna apelantului.

Combinații utile ale biților flags sunt:

SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE
    Se asigură că toate paginile din intervalul specificat care erau murdare când a fost apelată funcția sync_file_range() sunt plasate sub scriere. Aceasta este o operație de scriere inițială pentru integritatea datelor.

SYNC_FILE_RANGE_WRITE
    Începe scrierea tuturor paginilor murdare din intervalul specificat care nu sunt în prezent în curs de scriere. Aceasta este o operatie asincronă de golire pe disc. Aceasta nu este potrivită pentru operații de integritate a datelor.

SYNC_FILE_RANGE_WAIT_BEFORE (sau SYNC_FILE_RANGE_WAIT_AFTER)
    Așteaptă finalizarea scrierii tuturor paginilor din intervalul specificat. Această opțiune poate fi utilizată după o operație anterioară SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE pentru a aștepta finalizarea acelei operații și a obține rezultatul acesteia.

SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER
    Aceasta este o operație de scriere pentru integritatea datelor care va asigura că toate paginile din intervalul specificat care erau murdare când a fost apelată sync_file_range() sunt salvate pe disc.

VALOAREA RETURNATĂ
În caz de succes, sync_file_range() returnează 0; în caz de eșec, returnează -1 și errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EBADF
    descriptor-fișier nu este un descriptor de fișier valid.

EINVAL
    flags specifică un bit nevalid; sau offset sau nbytes nu este valid.

EIO Eroare de In/Ieș.

ENOMEM
    Memorie insuficientă.

ENOSPC
    Spațiu pe disc insuficient.

ESPIPE
    fd se referă la altceva decât un fișier obișnuit, un dispozitiv bloc sau un director.

VERSIUNI

  sync_file_range2()
Unele arhitecturi (de exemplu, PowerPC, ARM) necesită ca argumentele pe 64 de biți să fie aliniate într-o pereche adecvată de registre. Pe astfel de arhitecturi, semnătura apelului sync_file_range() prezentată în SINOPSIS ar forța irosirea unui registru ca umplutură între argumentele fd și offset. (A se vedea syscall(2) pentru detalii.) Prin urmare, aceste arhitecturi definesc o apelare de sistem diferită care ordonează argumentele în mod adecvat:

    int sync_file_range2(int fd, unsigned int flags,
                         off_t offset, off_t nbytes);

Comportamentul acestui apel de sistem este în rest identic cu cel al sync_file_range().

STANDARDE
Linux.

ISTORIC
Linux 2.6.17.

  sync_file_range2()
Un apel de sistem cu această semnătură a apărut pentru prima dată pe arhitectura ARM în Linux 2.6.20, cu numele arm_sync_file_range(). A fost redenumit în Linux 2.6.22, când a fost adăugat apelul de sistem analog pentru PowerPC. Pe arhitecturile care oferă suport glibc, glibc încorporează în mod transparent sync_file_range2() sub numele sync_file_range().

NOTE
_FILE_OFFSET_BITS trebuie definit ca fiind 64 în codul care preia adresa sync_file_range, dacă codul este destinat să fie portabil pe platformele tradiționale x86 și ARM pe 32 de biți, unde lățimea off_t este implicit de 32 de biți.

CONSULTAȚI ȘI
fdatasync(2), fsync(2), msync(2), sync(2)

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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.