| lseek(2) | System Calls Manual | lseek(2) |
lseek - zmienia pozycję przesunięcia pliku do odczytu/zapisu
Standardowa biblioteka C (libc, -lc)
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
lseek zmienia przesunięcie opisu otwartego pliku (OFD), powiązanego z deskryptorem pliku fd na wartość podaną w argumencie offset, zgodnie z dyrektywą whence w następujący sposób:
lseek umożliwia ustawienie przesunięcia w pliku poza istniejący plik (jednak nie zmienia to rozmiaru pliku). Jeśli później w tym miejscu zostaną zapisane jakieś dane, to kolejne odczyty danych z luki (dziury) zwrócą bajty null („\0”), aż do czasu, gdy dane zostaną rzeczywiście w tej luce zapisane.
Od Linuksa 3.1, Linux obsługuje następujące dodatkowe wartości whence:
W obu powyższych przypadkach lseek() zawiedzie, jeśli offset wskazuje poza koniec pliku.
Opisywane operacje pozwalają aplikacjom na lokalizowanie dziur w rzadko (elastycznie) alokowanych plikach. Może okazać się przydatne w aplikacjach takich jak narzędzia kopii zapasowej, które mogą zaoszczędzić miejsce przy tworzeniu kopii zapasowej, przy zachowaniu dziur, jeśli posiadają mechanizm do ich odkrywania.
Do celów tych operacji, za dziurę uważa się sekwencję zer, która (normalnie) nie byłaby przydzielona w przedmiotowym nośniku pliku. Jednak system plików nie ma obowiązku informowania o dziurach, tak więc operacje te nie są pewnym mechanizmem wyszukiwania przestrzeni rzeczywiście przydzielonej plikowi (co więcej, sekwencja zer, która rzeczywiście została zapisana na przedmiotowym nośniku może nie zostać zgłoszona jako dziura). W najprostszej implementacji, system plików może obsługiwać te operacje w ten sposób, że SEEK_HOLE zawsze zwróci przesunięcie końca pliku, a SEEK_DATA zawsze zwróci offset (tj. nawet gdy położenie, do którego odnosi się offset jest dziurą, może być rozważane jako składające się z danych będących sekwencją zer).
Konieczne jest zdefiniowana makra _GNU_SOURCE, aby pozyskać definicje SEEK_DATA i SEEK_HOLE z <unistd.h>.
Operacje SEEK_HOLE i SEEK_DATA są obsługiwane w następujących systemach plików:
Po pomyślnym zakończeniu lseek() zwraca ustawione przesunięcie, liczone w bajtach od początku pliku. W razie wystąpienia błędu, zwracana jest wartość (off_t) -1 oraz ustawiane jest errno w sposób wskazujący rodzaj błędu.
W Linuksie, użycie lseek() na urządzeniu terminala zawiedzie z błędem ESPIPE.
POSIX.1-2008.
POSIX.1-2001, SVr4, 4.3BSD.
SEEK_DATA i SEEK_HOLE są niestandardowymi rozszerzeniami obecnymi również w Solarisie, FreeBSD i DragonFly BSD; proponuje się włączenie ich do następnej rewizji POSIX (Issue 8).
W podręczniku open(2) opisano relacje pomiędzy deskryptorami pliku, opisami otwartego pliku (OFD) i plikami.
Jeśli znacznik statusu O_APPEND jest ustawiony na opisie otwartego pliku (OFD), to write(2) zawsze przenosi przesunięcie pliku na koniec pliku, niezależnie od użycia lseek().
Niektóre urządzenia nie obsługują tego typu operacji, a POSIX nie opisuje, które urządzenie muszą obsługiwać lseek().
dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3)
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
| 15 czerwca 2024 r. | Linux man-pages 6.9.1 |