lseek(2) System Calls Manual lseek(2) NAZWA lseek - zmienia pozycje przesuniecia pliku do odczytu/zapisu BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include off_t lseek(int fd, off_t offset, int whence); OPIS lseek zmienia przesuniecie opisu otwartego pliku (OFD), powiazanego z deskryptorem pliku fd na wartosc podana w argumencie offset, zgodnie z dyrektywa whence w nastepujacy sposob: SEEK_SET Przesuniecie pliku jest ustawiane na offset bajtow. SEEK_CUR Przesuniecie pliku jest ustawiane na aktualna pozycje plus offset bajtow. SEEK_END Przesuniecie pliku jest ustawiane na rozmiar pliku plus offset bajtow. lseek() allows the file offset to be set beyond the end of the file (but this does not change the size of the file). If data is later written at this point, subsequent reads of the data in the gap (a "hole") return null bytes ('\0') until data is actually written into the gap. Szukanie danych i dziur w pliku Od Linuksa 3.1, Linux obsluguje nastepujace dodatkowe wartosci whence: SEEK_DATA Dopasowuje przesuniecie pliku do nastepnego polozenia w pliku, wiekszego lub rownego przesunieciu offset, ktore zawiera dane. Jesli offset wskazuje na dane, to przesuniecie pliku jest ustawiane na offset. SEEK_HOLE Dopasowuje przesuniecie pliku do nastepnej dziury w pliku, wiekszej lub rownej przesunieciu offset. Jesli offset wskazuje wewnatrz dziury, to przesuniecie pliku jest ustawiane na offset. Jesli po offset nie wystepuje dziura, to przesuniecie pliku jest dopasowane do konca pliku (tj. wystepuje domniemana dziura na koncu kazdego pliku). W obu powyzszych przypadkach lseek() zawiedzie, jesli offset wskazuje poza koniec pliku. Opisywane operacje pozwalaja aplikacjom na lokalizowanie dziur w rzadko (elastycznie) alokowanych plikach. Moze okazac sie przydatne w aplikacjach takich jak narzedzia kopii zapasowej, ktore moga zaoszczedzic miejsce przy tworzeniu kopii zapasowej, przy zachowaniu dziur, jesli posiadaja mechanizm do ich odkrywania. Do celow tych operacji, za dziure uwaza sie sekwencje zer, ktora (normalnie) nie bylaby przydzielona w przedmiotowym nosniku pliku. Jednak system plikow nie ma obowiazku informowania o dziurach, tak wiec operacje te nie sa pewnym mechanizmem wyszukiwania przestrzeni rzeczywiscie przydzielonej plikowi (co wiecej, sekwencja zer, ktora rzeczywiscie zostala zapisana na przedmiotowym nosniku moze nie zostac zgloszona jako dziura). W najprostszej implementacji, system plikow moze obslugiwac te operacje w ten sposob, ze SEEK_HOLE zawsze zwroci przesuniecie konca pliku, a SEEK_DATA zawsze zwroci offset (tj. nawet gdy polozenie, do ktorego odnosi sie offset jest dziura, moze byc rozwazane jako skladajace sie z danych bedacych sekwencja zer). Konieczne jest zdefiniowana makra _GNU_SOURCE, aby pozyskac definicje SEEK_DATA i SEEK_HOLE z . Operacje SEEK_HOLE i SEEK_DATA sa obslugiwane w nastepujacych systemach plikow: o Btrfs (od Linuksa 3.1) o OCFS (od Linuksa 3.2) o XFS (od Linuksa 3.5) o ext4 (od Linusa 3.8) o tmpfs(5) (od Linuksa 3.8) o NFS (od Linuksa 3.18) o FUSE (od Linuksa 4.5) o GFS2 (od Linuksa 4.15) WARTOSC ZWRACANA Po pomyslnym zakonczeniu lseek() zwraca ustawione przesuniecie, liczone w bajtach od poczatku pliku. W razie wystapienia bledu, zwracana jest wartosc (off_t) -1 oraz ustawiane jest errno w sposob wskazujacy rodzaj bledu. BLEDY EBADF fd nie jest deskryptorem otwartego pliku. EINVAL whence jest nieprawidlowe. Albo: wynikowe przesuniecie pliku byloby ujemne lub poza koncem przeszukiwalnego urzadzenia. ENXIO whence wynosi SEEK_DATA lub SEEK_HOLE, a offset jest poza koncem pliku albo whence wynosi SEEK_DATA, a offset jest w dziurze na koncu pliku. EOVERFLOW Wynikowego przesuniecia pliku nie da sie przedstawic w off_t. ESPIPE fd jest zwiazany z potokiem, gniazdem, lub FIFO. WERSJE W Linuksie, uzycie lseek() na urzadzeniu terminala zawiedzie z bledem ESPIPE. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4, 4.3BSD. SEEK_DATA i SEEK_HOLE sa niestandardowymi rozszerzeniami obecnymi rowniez w Solarisie, FreeBSD i DragonFly BSD; proponuje sie wlaczenie ich do nastepnej rewizji POSIX (Issue 8). UWAGI W podreczniku open(2) opisano relacje pomiedzy deskryptorami pliku, opisami otwartego pliku (OFD) i plikami. Jesli znacznik statusu O_APPEND jest ustawiony na opisie otwartego pliku (OFD), to write(2) zawsze przenosi przesuniecie pliku na koniec pliku, niezaleznie od uzycia lseek(). Niektore urzadzenia nie obsluguja tego typu operacji, a POSIX nie opisuje, ktore urzadzenie musza obslugiwac lseek(). ZOBACZ TAKZE dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 15 czerwca 2024 r. lseek(2)