lseek(2)

NUME
lseek - repoziționarea indicatorului de poziție pentru citirea/scrierea fișierului

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

DESCRIERE
lseek() repoziționează indicatorul poziției de fișier al descrierii fișierului deschis asociat cu descriptorul de fișier fd la argumentul offset în conformitate cu directiva whence după cum urmează:

SEEK_SET
    Indicatorul de poziție al fișierului este definit la offset octeți.

SEEK_CUR
    Indicatorul de poziție al fișierului este definit la locația sa curentă plus offset octeți.

SEEK_END
    Indicatorul de poziție al fișierului este definit la dimensiunea fișierului plus offset octeți.

lseek() permite ca indicatorul de poziție al fișierului să fie stabilit dincolo de sfârșitul fișierului (dar acest lucru nu modifică dimensiunea fișierului). Dacă ulterior se scriu date în acest punct, citirile ulterioare ale datelor din spațiu (o „gaură”) returnează octeți nuli („\0”) până când datele sunt scrise efectiv în spațiu.

  Căutarea datelor și a găurilor din fișiere
Începând cu Linux 3.1, Linux acceptă următoarele valori suplimentare pentru whence:

SEEK_DATA
    Ajustează indicatorul de poziție al fișierului la următoarea locație din fișier mai mare sau egală cu offset care conține date. Dacă offset indică date, atunci indicatorul de poziție al fișierului este stabilit la offset.

SEEK_HOLE
    Ajustează indicatorul de poziție al fișierului la următoarea gaură din fișier mai mare sau egală cu offset. Dacă offset indică mijlocul unei găuri, atunci indicatorul de poziție al fișierului este stabilit la offset. Dacă nu există nicio gaură după offset, atunci indicatorul de poziție al fișierului este ajustat la sfârșitul fișierului (de exemplu, există o gaură implicită la sfârșitul oricărui fișier).

În ambele cazuri de mai sus, lseek() eșuează dacă offset indică după sfârșitul fișierului.

Aceste operații permit aplicațiilor să cartografieze găurile dintr-un fișier dispers alocat. Acest lucru poate fi util pentru aplicații precum instrumentele de copie de rezervă a fișierelor, care pot economisi spațiu la crearea copiilor de rezervă și pot păstra găurile, dacă dispun de un mecanism de descoperire a găurilor.

În sensul acestor operații, o gaură este o secvență de zerouri care (în mod normal) nu a fost alocată în spațiul de stocare subiacent al fișierului. Cu toate acestea, un sistem de fișiere nu este obligat să raporteze găurile, astfel încât aceste operații nu sunt un mecanism garantat pentru cartografierea spațiului de stocare alocat efectiv unui fișier; (în plus, o secvență de zerouri care a fost scrisă efectiv în spațiul de stocare subiacent poate să nu fie raportată ca o gaură). În cea mai simplă punere în aplicare, un sistem de fișiere poate susține aceste operații făcând ca SEEK_HOLE să returneze întotdeauna poziția de la sfârșitul fișierului și făcând ca SEEK_DATA să returneze întotdeauna offset (adică, chiar dacă locația la care se referă offset este o gaură, se poate considera că aceasta constă din date care sunt o secvență de zerouri).

Macrocomanda de testare a caracteristicilor _GNU_SOURCE trebuie definită pentru a obține definițiile SEEK_DATA și SEEK_HOLE din <unistd.h>.

Operațiile SEEK_HOLE și SEEK_DATA sunt acceptate pentru următoarele sisteme de fișiere:

•   Btrfs (începând cu Linux 3.1)

•   OCFS (începând cu Linux 3.2)

•   XFS (începând cu Linux 3.5)

•   ext4 (începând cu Linux 3.8)

•   tmpfs(5) (începând cu Linux 3.8)

•   NFS (începând cu Linux 3.18)

•   FUSE (începând cu Linux 4.5)

•   GFS2 (începând cu Linux 4.15)

VALOAREA RETURNATĂ
La finalizarea cu succes, lseek() returnează locația indicatorului de poziție rezultată, măsurată în octeți de la începutul fișierului. În caz de eroare, este returnată valoarea (off_t) -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EBADF
    fd nu este un descriptor de fișier deschis.

EINVAL
    whence nu este valid. Sau: poziția fișierului rezultat ar fi negativă sau dincolo de sfârșitul unui dispozitiv explorabil.

ENXIO
    whence este SEEK_DATA sau SEEK_HOLE, iar offset se află dincolo de sfârșitul fișierului sau whence este SEEK_DATA și offset se află într-o gaură la sfârșitul fișierului.

EOVERFLOW
    Poziția din fișier rezultată nu poate fi reprezentată într-un off_t.

ESPIPE
    fd este asociat cu o conductă, un soclu sau o FIFO (conductă cu nume).

VERSIUNI
În Linux, utilizarea lseek() pe un dispozitiv de terminal eșuează cu eroarea ESPIPE.

STANDARDE
POSIX.1-2024.

ISTORIC
4.3BSD, SVr4, POSIX.1-1988.

SEEK_DATA
SEEK_HOLE
    Solaris 10, FreeBSD 7.0, DragonFly BSD 2.3.1, POSIX.1-2024.

NOTE
Consultați open(2) pentru o discuție a relației dintre descriptorii de fișiere, descrierile de fișiere deschise și fișiere.

Dacă fanionul de stare a fișierului O_APPEND este activat la descrierea fișierului deschis, atunci un write(2) întotdeauna mută indicatorul de poziție al fișierului la sfârșitul fișierului, indiferent de utilizarea lseek().

Unele dispozitive sunt incapabile de căutare și POSIX nu specifică care dispozitive trebuie să ofere suport pentru lseek().

CONSULTAȚI ȘI
dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(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 (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.