Do
spisu treści tematu 6
6.5.7 Zmiana bieżącej pozycji w pliku - funkcja
lseek()
Spis treści
Wstęp
Funkcja lseek() służy do ustawiania bieżącej
pozycji w pliku, a więc, za razem, niesekwencyjne na nim działanie. Taki
sposób pracy z plikiem nie jest w pełni zgodny z ogólnymi zasadami operacji
na plikach (które nawet w nazwie są "sekwencyjne"), ale może okazać się
bardzo przydatny, szczególnie, że Linux oferuje kilka wariantów korzystania
zeń; można przesuwać się w pliku naprzód lub w tył względem początku pliku,
jego końca lub aktualnej pozycji.
Opis algorytmu
Na początku funkcja sprawdza poprawność parametrów, którymi są: deskryptor
pliku, liczba, której znaczenie zależy od wartości trzeciego parametru
- trybu zmiany położenia w pliku. Sprawdzane jest mianowicie to, czy deskryptor
mieści się w zakresie tablicy deskryptorów (tzn. czy jest nie większy niż
stała NR_OPEN), czy w tablicy deskryptorów
na podanym miejscu znajduje się plik i czy odpowiada jemu jakiś i-węzeł.
Następnie sprawdzana jest poprawność ostatniego z parametrów wywołania.
W przypadku niespełnienia co najmniej jednego z tych warunków zwracany
jest błąd.
Następnie, jeśli rozpatrywany system plików ma własną funkcję ustawiania
pozycji w pliku, to jest ona wywoływana. W przeciwnym przypadku (a przy
systemie EXT2 jest włanie "przeciwny przypadek" - EXT2 korzysta z przeznaczonej
do tego celu funkcji domyślnej).
Teraz, w zależności od wartości trzeciego parametru dokonywane jest
ustawienie znacznika na nowa pozycję (poprzez dodanie liczb). Może się
na jeden z trzech sposobów:
-
nowa pozycja jest pozycja bezwzględna, czyli liczona od poczatku pliku.
-
nowa pozycja jest liczona względem aktualnej pozycji w pliku.
-
nowa pozycja jest liczona względem końca pliku.
Jeśli obliczona w ten sposób pozycja jest ujemna, to funkcja zwraca błąd.
Gdy obliczona, nowa pozycja w pliku jest różna od poprzedniej, to uaktualniane
jest odpowiednie pole w tablicy plików, a znacznik dla funkcji czytania
z wyprzedzeniem jest ustawiany na 0.
Wynikiem działania funkcji jest numer nowej, bieżącej pozycji w pliku.
Źródła informacji
Projekt
Linux - funkcja lseek()
Autor: Adam Kieżun