Do spisu tresci tematu 6
6.5 Zmiana biezacej pozycji w pliku
Spis tresci
Wprowadzenie
Do zmiany aktualnej pozycji w pliku sluzy funkcja lseek().
Dzieki niej nie jest wymuszony sekwencyjny dostep do danych. Za jej pomoca
mozna przesunac pozycje w pliku zarowno "w przod", jak i "w
tyl" oraz do konkretnej pozycji (liczac od poczatku, konca lub aktualnej
pozycji w pliku).
Opis dzialania
Funkcja otrzymuje jako parametry deskryptor pliku, pozycje w pliku oraz
parametr, za pomoca ktorego interpretuje sie pozycje.
- Na poczatku sprawdzana jest poprawnosc otrzymanego deskryptora pliku.
Sprawdzane jest, czy nie jest on wiekszy od dopuszczalnego (NR_OPEN),
czy w tablicy plikow w odpowiednim miejscu znajduje sie plik oraz czy odpowiada
mu i-wezel. Sprawdzana jest takze poprawnosc ostatniego parametru (musi
to byc liczba rowna 0, 1 lub 2). Odczytywana jest przy tym z tablicy systemowej
struktura dla danego pliku (o ile wogole istnieje). W przypadku ktoregokolwiek
z bledow funkcja konczy swe dzialanie z bledem.
- Nastepnie sprawdzane jest, czy system plikow, w jakim zapisany jest
aktualny, posiada wlasna procedure obslugi tej operacji. Jesli tak, jest
ona wywolywana i jej wynik zwracany jest jako wynik dzialania calej funkcji.
- W przeciwnym wypadku wykonywana jest standardowa obsluga. Korzysta
z niej miedzy innymi system EXT2, na ktorym sie opieralem.
- W zaleznosci od trzeciego parametru obliczana jest nowa pozycja w pliku:
- dla 0 - pozycja bezwzgledna, podana parametrem,
- dla 1 - pozycja wzgledem aktualnej pozycji w pliku
- dla 2 - pozycja wzgledem konca pliku
- Jezeli w wyniku tej opracji dostanie sie liczbe ujemna, funkcja konczy
zwracajac blad.
- W przeciwnym wypadku, jezeli nowa pozycja jest rozna od aktualnej,
ustawiana jest nowa pozycja w strukturze dla danego pliku (file->f_pos),
kasowany jest znacznik dla funkcji odpowiedzialnej za odczyt z wyprzedzeniem
(file->f_reada, patrz funkcja read()) oraz zmieniane
jest pole z numerem "wersji" pliku (file->f_version).
- Funkcja konczy dzialanie jako wynik zwracajac nowa pozycje w pliku.
Deklaracja, argumenty oraz wartosci zwracane przez funkcje
Deklaracja funkcji:
int sys_lseek(unsigned int fd, off_t offset, unsigned int origin);
Argumenty:
fd - deskryptor do pliku na ktorym operujemy
offset - nowa pozycja w pliku (byc moze wzgledna)
origin - parametr sluzacy interpretacji drugiego parametru.
Musi byc to liczba rowna 0, 1 lub 2. interpretacja odpowiednich wartosci
zostala omowiona w opisie dzialania.
Wyniki:
W przypadku powodzenia funkcja zwraca nowa pozycje w pliku, w przeciwnym
wypadku wartosc mniejsza od zera:
- Jezeli podany deskryptor pliku jest bledny, zwracane jest -EBADF.
- Jezeli bledna byla wartosc trzeciego parametru lub obliczona pozycja
w pliku byla mniejsza od 0, zwracana jest wartosc -EINVAL.
- Jezeli dany system plikow posiada wlasna procedure obslugi lseek(),
zwracany jest wynik dzialania tej funkcji.
Zrodla informacji
- Zrodla jadra:
Pytania i odpowiedzi
Na razie brak jednych i drugich..
Autor: Lukasz
Masko