Instrukcja do laboratorium Systemów Operacyjnych
(semestr drugi)
wiczenie ósme
Ć
Temat: Operacje na plikach, zajmowanie plików
Opracowanie:
mgr in . Arkadiusz Chrobot
ż
dr in . Grzegorz ukawski
ż
Ł
Wprowadzenie
1. Niskopoziomowa obs uga plików, dost p
ł
ę wspó bie ny
ł
ż
do plików
Programista pisz cy
ą
programy dla rodowiska
ś
uniksowego ma do wyboru dwa
rodzaje obs ugi
ł
plików. Mo e
ż
się pos ugiwa
ł
ć niskopoziomowymi funkcjami
dostarczanymi przez system, lub podprogramami, które oferują biblioteki
wej cia
ś
– wyj cia
ś
wi kszo ci
ę
ś
j zyków
ę
programowania. Pierwsze rozwi zanie
ą
pozwala na bezpo redni
ś
dost p
ę
do plików (tzn. niebuforowany) przy u yciu
ż
deskryptorów plików. Pomimo pozornie ma ej
ł
funkcjonalno ci
ś
to w a nie
ł ś
ten
sposób wykonywania operacji wej cia
ś
– wyj cia
ś
jest zalecany je li
ś
z plikiem
pracuje kilka wspó bie nych
ł
ż
procesów lub w tków.
ą
Pos ugiwanie
ł
się funkcjami
systemowymi nie stanowi jednak samo w sobie rozwi zania
ą
problemu
wspó bie nego
ł
ż
dost pu
ę
do plików. Istnieją pomocnicze mechanizmy nazywane
zajmowaniem pliku, które pozwalają na zak adanie
ł
blokad uniemo liwiaj cych
ż
ą
dost p
ę
do plików lub fragmentów plików innym procesom. Są dwa rodzaje tych
mechanizmów: zajmowanie obowi zkowe
ą
(ang. mandatory) i zalecane (ang.
advisory). Pierwszy został wprowadzony do wersji System V Uniksa i jest
w czony
łą
do standardu POSIX. Drugi pojawił się w wersji BSD Uniksa.
Zajmowanie obowi zkowe
ą
pliku (zwane tak e
ż
narzuconym), wymusza na
systemie operacyjnym kontrolowanie, czy procesy nie naruszają na o onych
ł ż
na
plik blokad. Blokady w tym przypadku są zwi zane
ą
z plikiem, tzn. po
zako czeniu
ń
procesu nie są usuwane. Zajmowanie zalecane (zwane tak e
ż
doradczym) nie wymusza sprawdzania poprawno ci
ś
operacji na pliku przez
j dro
ą
systemu. O to muszą zadbać procesy odwo uj ce
ł
ą
się do pliku. Blokady te
zwi zane
ą
są z procesem
1
, a wi c
ę
po jego zako czeniu
ń
są usuwane. Linux
pozwala na stosowanie obu rodzajów zajmowania, aczkolwiek domy lnie
ś
stosowane jest zajmowanie zalecane. Aby móc pos ugiwa
ł
ć się zajmowaniem
obowi zkowym
ą
nale y
ż
zamontować system plików z odpowiednimi flagami
i odpowiednio skonfigurować prawa dost pu
ę
do plików. Istnieją dwa rodzaje
blokad: dzielone lub do czytania, które pozwalają kilku procesom czytać
wspó bie nie
ł
ż
z pliku (ca ego
ł
lub cz
ci),
ęś
ale zakazują zapisywania i blokady
wy czne
łą
lub do zapisu, które pozwalają tylko jednemu procesowi na zapis do
pliku (ca ego
ł
lub cz
ci).
ęś
Proces b d cy
ę ą
w a cicielem
ł ś
blokady mo e
ż zmienić jej
typ. Je eli
ż
na pliku lub jego obszarze istnieje blokada wspó bie na,
ł
ż
to inny
proces na ten sam plik lub obszar mo e
ż na o y
ł ż ć swoją blokadę do czytania, ale
nie mo e
ż na o y
ł ż ć blokady do zapisu. Je li
ś
na pliku lub obszarze pliku istnieje
blokada wy czna
łą
to aden
ż
proces nie mo e
ż na o y
ł ż ć na ten plik (obszar) adnej
ż
innej blokady.
1 Dok adniej z relacj proces – plik, w przypadku Linuksa jest ona zwi zana z obiektem pliku.
ł
ą
ą
2
2. Funkcje i struktury danych
funkcja open() – otwiera plik. Jako argumenty pobiera cie k
ś
ż ą dost pu
ę
do
pliku i flagi. Mo e
ż
również pobierać prawa dost pu,
ę
je li
ś
plik nie istnieje
i ma być utworzony.
Warto ci
ś ą zwracaną przez funkcję jest deskryptor
pliku. Szczegó y: man 2 open.
ł
funkcja create() – tworzy nowy plik i otwiera go do zapisu, czyli dubluje
cz
ciowo dzia anie open(). Szczegó y: man creat.
ęś
ł
ł
funkcje dup() i dup2() – pozwalają uzyskać kopię deskryptora pliku.
Deskryptor oryginalny i powsta y
ł w wyniku dzia ania
ł
dup() lub dup2() nie
dzielą jedynie ze sobą flagi close_on_exit. Szczegó y:
ł
man dup lub man
dup2.
funkcja read() – odczytuje z pliku okre lon
ś
ą ilość informacji. Jako
argumenty przyjmuje deskryptor pliku, adres zmiennej do której ma
zapisać informacje, oraz ilość informacji jaką ma przeczytać wyra on
ż
ą
w bajtach. Warto ci
ś ą zwracaną przez funkcję jest natomiast liczba
przeczytanych bajtów. Mo e
ż
zostać zastosowana również do odczytu
standardowego wej cia,
ś
którego deskryptor wynosi zero. Szczegó y:
ł
man
2 read.
funkcja write() – zapisuje dane do pliku. Przyjmuje takie same argumenty
jak read(), mo e
ż być u yta
ż
do zapisu na standardowe wyj cie
ś
(deskryptor
1) lub standardowe wyj cie
ś
diagnostyczne (deskryptor 2). Warto ci
ś ą
zwracaną przez funkcję jest ilość zapisanych bajtów. Szczegó y:
ł
man
2 write.
funkcja close() – zamyka plik zwi zany
ą
z przekazanym jej jako argument
deskryptorem. W razie niepowodzenia zwraca wartość -1 w przeciwnym
przypadku warto
0.
ść
funkcja lseek() – zmienia warto
wska nika pliku. Szczegó y: man lseek.
ść
ź
ł
funkcja flock() – zak ada
ł
lub usuwa blokadę z pliku. Jest zwi zana
ą
z mechanizmem zalecanego zajmowania. Blokadę mo na
ż
na o y
ł ż ć tylko
i wy cznie na ca o
pliku. Szczegó y: man 2 flock.
łą
ł ść
ł
funkcja lockf() – zwi zana
ą
z mechanizmem zajmowania obowi zkowego.
ą
3
W Linuksie stanowi interfejs na o ony
ł ż
na funkcję fcntl(). Szczegó y:
ł
man
lockf.
funkcja fcntl() – generalnie pozwala na manipulowanie deskryptorem
otwartego
pliku.
Pozwala
również
zak ada
ł
ć
blokady
zwi zane
ą
z zajmowaniem
obowi zkowym,
ą
lecz
domy lnie
ś
stosuje
zajmowanie
doradcze (podobnie jak lockf()). Pozwala na zajmowanie ci le
ś ś
okre lonych
ś
obszarów plików lub ca ych plików. Szczegó y: man fcntl.
ł
ł
Zadania
1. Napisz program, który przepisze z istniej cego
ą
pliku tekstowego czterdzie ci
ś
znaków z pocz tku i czterdzie ci znaków z ko ca do nowego pliku.
ą
ś
ń
2. Zademonstruj dzia anie funkcji replikuj cej deskryptory plików.
ł
ą
3. Zademonstruj dzia anie
ł
funkcji flock() na przyk adzie,
ł
w którym kilka procesów
wspó bie nych b dzie si ubiega o o mo liwo
zapisu lub odczytu z pliku.
ł
ż
ę
ę
ł
ż
ść
4. Powtórz zadanie trzecie u ywaj c fcntl() i blokuj c wybrane fragmenty pliku.
ż
ą
ą
5. Napisz program, który przeczyta i wypisze na ekran plik tekstowy o dowolnej
wielko ci.
ś
Nazwę
pliku
nale y
ż
przekazywać
jako
argument
wywo ania
ł
programu. W programie nie wolno korzysta z funkcji printf() ani pokrewnych.
ć
6. Napisz odpowiednik programu „cp”.
7. Napisz program, w którym dwa procesy b d
ę ą zapisywa y
ł
do jednego pliku,
a trzy b d
ę ą odczytywa y.
ł
Zastosuj zajmowanie zalecane do synchronizacji pracy
procesów.
8. Napisz program, który otworzy do odczytu wskazany plik tekstowy, a nast pnie
ę
wywo a
ł
funkcję fork(). Jeden z powsta ych
ł
procesów policzy sumę liczb
parzystych znalezionych w otwartym pliku, a drugi liczb nieparzystych.
9. Napisz dwa programy: pierwszy b dzie
ę
generował losowe liczby i zapisywał je
porcjami do pliku, drugi dzia aj c
ł ą wspó bie nie
ł
ż
z pierwszym b dzie
ę
odczytywał
je i szukał warto ci
ś
maksymalnej. Do blokowania fragmentów pliku nale y
ż u y
ż ć
funkcji fcntl().
10.Napisz program, w którym stworzysz cztery procesy. Ka dy
ż
z tych uzyska
kopię deskryptora do pojedynczego pliku, przy czym jeden proces b dzie
ę
do
tego pliku pisa , a pozosta e b d czyta y.
ł
ł
ę ą
ł
4