rava dostupa i raspolozhenie blokov, a obshchij indeks soderzhit nomer ustrojstva, nomer in- deksa na diske, tip fajla, razmer, informaciyu o vladel'ce i schetchik ssylok. Drugaya chastnaya informaciya, opisyvayushchaya otdel'nuyu fajlovuyu sistemu, soderzhit- sya v superbloke i strukture katalogov. Na Risunke 5.34 izobrazheny tablica obshchih indeksov v pamyati i dve tablicy chastnyh indeksov otdel'nyh fajlovyh sistem, odna dlya struktur fajlovoj sistemy versii V, a drugaya dlya indeksa udalennoj (setevoj) sistemy. Predpolagaetsya, chto poslednij indeks soderzhit dostatochno informacii dlya togo, chtoby identificirovat' fajl, nahodyashchijsya v udalennoj sisteme. U fajlovoj sistemy mozhet otsutstvovat' struktura, podob- naya indeksu; no ishodnyj tekst programm otdel'noj fajlovoj sistemy pozvolyaet sozdat' ob®ektnyj kod, udovletvoryayushchij semanticheskim trebovaniyam fajlovoj sistemy UNIX i naznachayushchij svoj "indeks", kotoryj sootvetstvuet obshchemu in- deksu, naznachaemomu yadrom. Fajlovaya sistema kazhdogo tipa imeet nekuyu strukturu, v kotoroj hranyatsya adresa funkcij, realizuyushchih abstraktnye dejstviya. Kogda yadru nuzhno obratit'- sya k fajlu, ono vyzyvaet kosvennuyu funkciyu v zavisimosti ot tipa fajlovoj sistemy i abstraktnogo dejstviya (sm. Risunok 5.34). Primerami abstraktnyh dejstvij yavlyayutsya: otkrytie i zakrytie fajla, chtenie i zapis' dannyh, vozv- rashchenie indeksa dlya komponenty imeni fajla (podobno namei i iget), osvobozh- denie indeksa (podobno iput), korrekciya indeksa, proverka prav dostupa, us- tanovka atributov fajla (prav dostupa k nemu), a takzhe montirovanie i demon- tirovanie fajlovyh sistem. V glave 13 budet proillyustrirovano ispol'zovanie sistemnyh abstrakcij pri rassmotrenii raspredelennoj fajlovoj sistemy. 5.18 SOPROVOZHDENIE FAJLOVOJ SISTEMY YAdro podderzhivaet celostnost' sistemy v svoej obychnoj rabote. Tem ne me- nee, takie chrezvychajnye obstoyatel'stva, kak otkaz pitaniya, mogut privesti k fatal'nomu sboyu sistemy, v rezul'tate kotorogo soderzhimoe sistemy utrachivaet svoyu soglasovannost': bol'shinstvo dannyh v fajlovoj sisteme dostupno dlya is- pol'zovaniya, no nekotoraya nesoglasovannost' mezhdu nimi imeet mesto. Komanda fsck proveryaet soglasovannost' dannyh i v sluchae neobhodimosti vnosit v faj- lovuyu sistemu ispravleniya. Ona obrashchaetsya k fajlovoj sisteme cherez blochnyj ili strokovyj interfejs (glava 10) v obhod tradicionnyh metodov dostupa k fajlam. V etom razdele rassmatrivayutsya nekotorye primery protivorechivosti dannyh, kotoraya obnaruzhivaetsya komandoj fsck. Diskovyj blok mozhet prinadlezhat' bolee chem odnomu indeksu ili spisku svobodnyh blokov. Kogda fajlovaya sistema otkryvaetsya v pervyj raz, vse dis- kovye bloki nahodyatsya v spiske svobodnyh blokov. Kogda diskovyj blok vybira- etsya dlya ispol'zovaniya, yadro udalyaet ego nomer iz spiska svobodnyh blokov i naznachaet blok indeksu. YAdro ne mozhet perenaznachit' diskovyj blok drugomu indeksu do teh por, poka blok ne budet vozvrashchen v spisok svobodnyh blokov. Takim obrazom, diskovyj blok mozhet libo nahodit'sya v spiske svobodnyh blo- kov, libo byt' naznachennym odnomu iz indeksov. Rassmotrim razlichnye situa- cii, mogushchie imet' mesto pri osvobozhdenii yadrom diskovogo bloka, prinadle- zhavshego fajlu, s vozvrashcheniem nomera bloka v superblok, nahodyashchijsya v pamya- ti, i pri vydelenii diskovogo bloka novomu fajlu. Esli yadro zapisyvalo na disk indeks i bloki novogo fajla, no pered vneseniem izmenenij v indeks prezhnego fajla na diske proizoshel sboj, oba indeksa budut adresovat' k odno- 130 mu i tomu zhe nomeru diskovogo bloka. Podobnym zhe obrazom, esli yadro perepi- syvalo na disk superblok i ego spiski svobodnyh resursov i pered perepis'yu starogo indeksa sluchilsya sboj, diskovyj blok poyavitsya odnovremenno i v spis- ke svobodnyh blokov, i v starom indekse. Esli blok otsutstvuet kak v spiske svobodnyh blokov, tak i v fajle, faj- lovaya sistema yavlyaetsya nesoglasovannoj, ibo, kak uzhe govorilos' vyshe, vse bloki obyazany gde-nibud' prisutstvovat'. Takaya situaciya mogla by proizojti, esli by blok byl udalen iz fajla i pomeshchen v spisok svobodnyh blokov v su- perbloke. Esli proizvodilas' zapis' prezhnego fajla na disk i sistema dala sboj pered zapis'yu superbloka, blok budet otsutstvovat' vo vseh spiskah, hranyashchihsya na diske. Indeks mozhet imet' schetchik svyazej s nenulevym znacheniem pri tom, chto ego nomer otsutstvuet vo vseh katalogah fajlovoj sistemy. Vse fajly, za isklyuche- niem kanalov (nepoimenovannyh), dolzhny prisutstvovat' v drevovidnoj struktu- re fajlovoj sistemy. Esli sistema dala sboj posle sozdaniya kanala ili obych- nogo fajla, no pered sozdaniem sootvetstvuyushchej etomu kanalu ili fajlu tochki vhoda v katalog, indeks budet imet' v pole schetchika svyazej ustanovlennoe znachenie, pust' dazhe on yavno ne prisutstvuet v fajlovoj sisteme. Eshche odna problema mozhet vozniknut', esli s pomoshch'yu funkcii unlink byla udalena svyaz' kataloga bez proverki udaleniya iz kataloga vseh soderzhashchihsya v nem svyazej s otdel'nymi fajlami. Esli format indeksa neveren (naprimer, esli znachenie polya tipa fajla ne opredeleno), znachit gde-to imeetsya oshibka. |to mozhet proizojti, esli admi- nistrator smontiroval fajlovuyu sistemu, kotoraya otformatirovana nepravil'no. YAdro obrashchaetsya k tem diskovym blokam, kotorye, kak kazhetsya yadru, soderzhat indeksy, no v dejstvitel'nosti okazyvaetsya, chto oni soderzhat dannye. Esli nomer indeksa prisutstvuet v zapisi kataloga, no sam indeks svobo- den, fajlovaya sistema yavlyaetsya nesoglasovannoj, poskol'ku nomer indeksa v zapisi kataloga dolzhen byt' nomerom naznachennogo indeksa. |to moglo by proi- zojti, esli by yadro, sozdavaya novyj fajl i zapisyvaya na disk novuyu tochku vhoda v katalog, ne uspela by skopirovat' na disk indeks fajla iz-za sboya. Takzhe eto mozhet sluchit'sya, esli process, udalyaya svyaz' fajla s katalogom, za- pishet osvobodivshijsya indeks na disk, no ne uspeet otkorrektirovat' katalog iz-za sboya. Vozniknovenie podobnyh situacij mozhno predotvratit', kopiruya na disk rezul'taty raboty v nadlezhashchem poryadke. Esli chislo svobodnyh blokov ili svobodnyh indeksov, zapisannoe v superb- loke, ne sovpadaet s ih kolichestvom na diske, fajlovaya sistema tak zhe yavlya- etsya nesoglasovannoj. Itogovaya informaciya v superbloke vsegda dolzhna soot- vetstvovat' informacii o tekushchem sostoyanii fajlovoj sistemy. 5.19 VYVODY |toj glavoj zavershaetsya pervaya chast' knigi, posvyashchennaya rassmotreniyu osobennostej fajlovoj sistemy. Glava poznakomila pol'zovatelya s tremya tabli- cami, prinadlezhashchimi yadru: tablicej pol'zovatel'skih deskriptorov fajla, sistemnoj tablicej fajlov i tablicej montirovaniya. V nej rassmotreny algo- ritmy vypolneniya sistemnyh funkcij, imeyushchih otnoshenie k fajlovoj sisteme, i vzaimodejstvie mezhdu etimi funkciyami. Issledovany nekotorye abstraktnye svojstva fajlovoj sistemy, pozvolyayushchie sisteme UNIX podderzhivat' fajlovye sistemy razlichnyh tipov. Nakonec, opisan mehanizm vypolneniya komandy fsck, kontroliruyushchej celostnost' i soglasovannost' dannyh v fajlovoj sisteme. 5.20 UPRAZHNENIYA 1. Rassmotrim programmu, privedennuyu na Risunke 5.35. Kakoe znachenie voz- vrashchaet kazhdaya operaciya read i chto pri etom soderzhitsya v bufere ? Opi- 131 shite, chto proishodit v yadre vo vremya vypolneniya kazhdogo vyzova read. 2. Vnov' vernemsya k programme na Risunke 5.35 i predpolozhim, chto operator lseek(fd,9000L,0); stoit pered pervym obrashcheniem k funkcii read. CHto ishchet process i chto pri etom proishodit v yadre ? 3. Process mozhet otkryt' fajl dlya raboty v rezhime dobavleniya zapisej v konec fajla, pri etom imeetsya v vidu, chto kazhdaya operaciya zapisi ras- polagaet dannye po adresu smeshcheniya, ukazyvayushchego tekushchij konec fajla. Takim obrazom, dva processa mogut otkryt' fajl dlya raboty v rezhime do- bavleniya zapisej v konec fajla i vvodit' dannye, ne opasayas' zateret' zapisi drug drugu. CHto proizojdet, esli process otkroet fajl v rezhime dobavleniya v konec, a zapisyvayushchuyu golovku ustanovit na nachalo fajla ? 4. Biblioteka standartnyh podprogramm vvoda-vyvoda povyshaet effektivnost' vypolneniya pol'zovatelem operacij chteniya i zapisi blagodarya buferiza- cii dannyh v biblioteke i sohraneniyu bol'shogo kolichestva modulej obra- shcheniya k operacionnoj sisteme, neobhodimyh pol'zovatelyu. Kak by vy rea- lizovali bibliotechnye funkcii fread i fwrite ? CHto dolzhny delat' bib- liotechnye funkcii fopen i fclose ? +------------------------------------------------------------+ | #include | | main() | | { | | int fd; | | char buf[1024]; | | fd = creat("junk",0666); | | lseek(fd,2000L,2); /* ishchetsya bajt s nomerom 2000 */ | | write(fd,"hello",5); | | close(fd); | | | | fd = open("junk",O_RDONLY); | | read(fd,buf,1024); /* chitaet nuli */ | | read(fd,buf,1024); /* schityvaet nechto, otlichnoe ot 0 */| | read(fd,buf,1024); | | } | +------------------------------------------------------------+ Risunok 5.35. Schityvanie nulej i konca fajla 5. Esli process chitaet dannye iz fajla posledovatel'no, yadro zapominaet znachenie bloka, prochitannogo s prodvizheniem, v indekse, hranyashchemsya v pamyati. CHto proizojdet, esli neskol'ko processov budut odnovremenno vesti posledovatel'noe schityvanie dannyh iz odnogo i togo zhe fajla ? +---------------------------------------------------------+ | #include | | main() | | { | | int fd; | | char buf[256]; | | | | fd = open("/etc/passwd",O_RDONLY); | | if (read(fd,buf,1024) < 0) | | printf("chtenie zavershaetsya neudachno\n"); | | } | +---------------------------------------------------------+ Risunok 5.36. CHtenie bol'shoj porcii dannyh v malen'kij bufer 132 6. Rassmotrim programmu, privedennuyu na Risunke 5.36. CHto proizojdet v rezul'tate vypolneniya programmy ? Obosnujte otvet. CHto proizoshlo by, esli by ob®yavlenie massiva buf bylo vstavleno mezhdu ob®yavleniyami dvuh drugih massivov razmerom 1024 elementa kazhdyj ? Kakim obrazom yadro us- tanavlivaet, chto prochitannaya porciya dannyh slishkom velika dlya bufera ? *7. V fajlovoj sisteme BSD razreshaetsya fragmentirovat' poslednij blok faj- la v sootvetstvii so sleduyushchimi pravilami: * Svobodnye fragmenty otslezhivayutsya v strukturah, podobnyh superbloku; * YAdro ne podderzhivaet pul ranee vydelennyh svobodnyh fragmentov, a razbivaet na fragmenty v sluchae neobhodimosti svobodnyj blok; * YAdro mozhet naznachat' fragmenty bloka tol'ko dlya poslednego bloka v fajle; * Esli blok razbit na neskol'ko fragmentov, yadro mozhet naznachit' ih razlichnym fajlam; * Kolichestvo fragmentov v bloke ne dolzhno prevyshat' velichinu, fiksiro- vannuyu dlya dannoj fajlovoj sistemy; * YAdro naznachaet fragmenty vo vremya vypolneniya sistemnoj funkcii write. Razrabotajte algoritm, prisoedinyayushchij k fajlu fragmenty bloka. Kakie izmeneniya dolzhny byt' sdelany v indekse, chtoby pozvolit' ispol'zovanie fragmentov ? Kakie preimushchestva s sistemnoj tochki zreniya predostavlyaet ispol'zovanie fragmentov dlya teh fajlov, kotorye ispol'zuyut bloki kos- vennoj adresacii ? Ne vygodnee li bylo by naznachat' fragmenty vo vremya vypolneniya funkcii close vmesto togo, chtoby naznachat' ih pri vypolne- nii funkcii write ? *8. Vernemsya k obsuzhdeniyu, nachatomu v glave 4 i kasayushchemusya raspolozheniya dannyh v indekse fajla. Dlya togo sluchaya, kogda indeks imeet razmer diskovogo bloka, razrabotajte algoritm, po kotoromu ostatok dannyh fajla perepisyvaetsya v indeksnyj blok, esli pomeshchaetsya tuda. Sravnite etot metod s metodom, predlozhennym dlya resheniya predydushchej problemy. *9. V versii V sistemy funkciya fcntl ispol'zuetsya dlya realizacii mehanizma zahvata fajla i zapisi i imeet sleduyushchij format: fcntl(fd,cmd,arg); gde fd - deskriptor fajla, cmd - tip blokiruyushchej operacii, a v arg ukazyvayutsya razlichnye parametry, takie kak tip blokirovki (zapisi ili chteniya) i smeshcheniya v bajtah (sm. prilozhenie). K blokiruyushchim operaciyam otnosyatsya * Proverka nalichiya blokirovok, prinadlezhashchih drugim processam, s ne- medlennym vozvratom upravleniya v sluchae obnaruzheniya takih blokiro- vok, * Ustanovka blokirovki i priostanov do uspeshnogo zaversheniya, * Ustanovka blokirovki s nemedlennym vozvratom upravleniya v sluchae ne- udachi. YAdro avtomaticheski snimaet blokirovki, ustanovlennye processom, pri zakrytii fajla. Opishite rabotu algoritma, realizuyushchego zahvat fajla i zapisi. Esli blokirovki yavlyayutsya obyazatel'nymi, drugim processam sle- duet zapretit' dostup k fajlu. Kakie izmeneniya sleduet sdelat' v ope- raciyah chteniya i zapisi ? *10. Esli process priostanovil svoyu rabotu v ozhidanii snyatiya s fajla bloki- rovki, voznikaet opasnost' vzaimnoj blokirovki: process A mozhet zablo- kirovat' fajl "one" i popytat'sya zablokirovat' fajl "two", a process B mozhet zablokirovat' fajl "two" i popytat'sya zablokirovat' fajl "one". Oba processa perejdut v sostoyanie, pri kotorom oni ne smogut prodol- zhit' svoyu rabotu. Rasshir'te algoritm resheniya predydushchej problemy takim obrazom, chtoby yadro moglo obnaruzhivat' situacii vzaimnoj blokirovki i preryvat' vypolnenie sistemnyh funkcij. Sleduet li poruchat' obnaruzhe- nie vzaimnyh blokirovok yadru ? 11. Do sushchestvovaniya special'noj sistemnoj funkcii zahvata fajla pol'zova- telyam prihodilos' pribegat' k uslugam parallel'no dejstvuyushchih proces- 133 sov dlya realizacii mehanizma zahvata putem vyzova sistemnyh funkcij, vypolnyayushchih elementarnye dejstviya. Kakie iz sistemnyh funkcij, opisan- nyh v etoj glave, mogli by ispol'zovat'sya ? Kakie opasnosti podstere- gayut pri ispol'zovanii etih metodov ? 12. Richi zayavlyal (sm. [Ritchie 81]), chto zahvata fajla nedostatochno dlya togo, chtoby predotvratit' putanicu, vyzyvaemuyu takimi programmami, kak redaktory, kotorye sozdayut kopiyu fajla pri redaktirovanii i perepisy- vayut pervonachal'nyj fajl po okonchanii raboty. Ob®yasnite, chto on imel v vidu, i prokommentirujte. 13. Rassmotrim eshche odin sposob blokirovki fajlov, predotvrashchayushchij razrushi- tel'nye posledstviya korrektirovki. Predpolozhim, chto v indekse soder- zhitsya novaya ustanovka prav dostupa, pozvolyayushchaya tol'ko odnomu processu v tekushchij moment otkryvat' fajl dlya zapisi i neskol'kim processam otk- ryvat' fajl dlya chteniya. Opishite realizaciyu etogo sposoba. +----------------------------------------------------------+ | main(argc,argv) | | int argc; | | char *argv[]; | | { | | if (argc != 2) | | { | | printf("vvedite: komanda imya kataloga\n"); | | exit(); | | } | | | | /* prava dostupa k katalogu: zapis', chtenie i is- | | polnenie razresheny dlya vseh */ | | /* tol'ko superpol'zovatel' mozhet delat' sleduyu- | | shchee */ | | if (mknod(argv[1],040777,0) == -1) | | printf("mknod zavershilas' neudachno\n"); | | } | +----------------------------------------------------------+ Risunok 5.37. Katalog, sozdanie kotorogo ne zaversheno *14. Rassmotrim programmu (Risunok 5.37), kotoraya sozdaet katalog s never- nym formatom (v kataloge otsutstvuyut zapisi s imenami "." i ".."). Poprobujte, nahodyas' v etom kataloge, vypolnit' neskol'ko komand, ta- kih kak ls -l, ls -ld, ili cd. CHto proizojdet pri etom ? 15. Napishite programmu, kotoraya vyvodit dlya fajlov, imena kotoryh ukazany v kachestve parametrov, informaciyu o vladel'ce, tipe fajla, pravah dos- tupa i vremeni dostupa. Esli fajl (parametr) yavlyaetsya katalogom, prog- ramma dolzhna chitat' zapisi iz kataloga i vyvodit' vysheukazannuyu infor- maciyu dlya vseh fajlov v kataloge. 16. Predpolozhim, chto u pol'zovatelya est' razreshenie na chtenie iz kataloga, no net razresheniya na ispolnenie. CHto proizojdet, esli katalog ispol'- zovat' v kachestve parametra komandy ls, zadannoj s opciej "-i" ? CHto budet, esli ukazana opciya "-l" ? Poyasnite svoi otvety. Otvet'te na vopros, sformulirovannyj dlya sluchaya, kogda est' razreshenie na ispolne- nie, no net razresheniya na chtenie iz kataloga. 17. Sravnite prava dostupa, kotorye dolzhny byt' u processa dlya vypolneniya sleduyushchih dejstvij, i prokommentirujte: * Dlya sozdaniya novogo fajla trebuetsya razreshenie na zapis' v katalog. * Dlya "sozdaniya" sushchestvuyushchego fajla trebuetsya razreshenie na zapis' v fajl. * Dlya udaleniya svyazi fajla s katalogom trebuetsya razreshenie na zapis' 134 v katalog, a ne v fajl. *18. Napishite programmu, kotoraya naveshchaet vse katalogi, nachinaya s tekushchego. Kak ona dolzhna upravlyat' ciklami v ierarhii katalogov ? 19. Vypolnite programmu, privedennuyu na Risunke 5.38, i ob®yasnite, chto pri etom proishodit v yadre. (Namek: vypolnite komandu pwd, kogda programma zakonchitsya). 20. Napishite programmu, kotoraya zamenyaet kornevoj katalog ukazannym kata- logom, i issledujte derevo katalogov, dostupnoe dlya etoj programmy. 21. Pochemu process ne mozhet otmenit' predydushchij vyzov funkcii chroot ? Iz- menite konkretnuyu realizaciyu processa takim obrazom, chtoby on mog me- nyat' tekushchee znachenie kornya na predydushchee. Kakie u etoj vozmozhnosti preimushchestva i neudobstva ? 22. Rassmotrim prostoj primer kanala (Risunok 5.19), kogda process zapisy- vaet v kanal stroku "hello" i zatem schityvaet +----------------------------------------------------------+ | main(argc,argv) | | int argc; | | char *argv[]; | | { | | if (argc != 2) | | { | | printf("nuzhen 1 argument - imya kataloga\n"); | | exit(); | | } | | | | if (chdir(argv[1]) == -1) | | printf("%s fajl ne yavlyaetsya katalogom\n",argv[1]);| | } | +----------------------------------------------------------+ Risunok 5.38. Primer programmy s ispol'zovaniem funkcii chdir ee. CHto proizoshlo by, esli by massiv dlya zapisi dannyh v kanal imel razmer 1024 bajta vmesto 6 (a ob®em schityvaemyh za odnu operaciyu dan- nyh ostavalsya ravnym 6) ? CHto proizojdet, esli poryadok vyzova funkcij read i write v programme izmenit', pomenyav funkcii mestami ? 23. CHto proizojdet pri vypolnenii programmy, illyustriruyushchej ispol'zovanie poimenovannyh kanalov (Risunok 5.19), esli funkciya mknod obnaruzhit, chto kanal s takim imenem uzhe sushchestvuet ? Kak etot moment realizuetsya yadrom ? CHto proizoshlo by, esli by vmesto podrazumevaemyh v tekste programmy odnogo schityvayushchego i odnogo zapisyvayushchego processov svyaz' mezhdu soboj cherez kanal popytalis' ustanovit' neskol'ko schityvayushchih i zapisyvayushchih processov ? Kak v etom sluchae garantirovalas' by svyaz' odnogo schityvayushchego processa s odnim zapisyvayushchim processom ? 24. Otkryvaya poimenovannyj kanal dlya chteniya, process priostanavlivaetsya do teh por, poka eshche odin process ne otkroet kanal dlya zapisi. Pochemu ? Ne mog by process uspeshno projti funkciyu open, prodolzhit' rabotu do togo momenta, kogda im budet predprinyata popytka chteniya dannyh iz ka- nala, i priostanovit'sya pri vypolnenii funkcii read ? 25. Kak by vy realizovali algoritm vypolneniya sistemnoj funkcii dup2 (iz versii 7), vyzyvaemoj sleduyushchim obrazom: dup2(oldfd,newfd); gde oldfd - fajlovyj deskriptor, kotoryj dubliruetsya deskriptorom newfd ? CHto proizoshlo by, esli by deskriptor newfd uzhe prinadlezhal ot- krytomu fajlu? *26. Kakie posledstviya imelo by reshenie yadra pozvolit' dvum processam od- novremenno smontirovat' odnu i tu zhe fajlovuyu sistemu v dvuh tochkah montirovaniya ? 135 27. Predpolozhim, chto odin process menyaet svoj tekushchij katalog na katalog "/mnt/a/b/c", posle chego drugoj process v kataloge "/mnt" montiruet fajlovuyu sistemu. Zavershitsya li funkciya mount uspeshno ? CHto proizoj- det, esli pervyj process vypolnit komandu pwd ? YAdro ne pozvolit funk- cii mount uspeshno zavershit'sya, esli znachenie schetchika ssylok v indekse kataloga "/mnt" prevyshaet 1. Prokommentirujte etot moment. 28. Pri ispolnenii algoritma peresecheniya tochki montirovaniya po imeni ".." v marshrute poiska fajla yadro proveryaet vypolnenie treh uslovij, svya- zannyh s tochkoj montirovaniya: chto nomer obnaruzhennogo indeksa sovpada- et s nomerom kornevogo indeksa, chto rabochij indeks yavlyaetsya kornem fajlovoj sistemy i chto imya komponenty marshruta poiska - "..". Pochemu neobhodimo proveryat' vypolnenie vseh treh uslovij ? Dokazhite, chto pro- verki lyubyh dvuh uslovij nedostatochno dlya togo, chtoby razreshit' pro- cessu peresech' tochku montirovaniya. 29. Esli pol'zovatel' montiruet fajlovuyu sistemu tol'ko dlya chteniya, yadro ustanavlivaet sootvetstvuyushchij flag v superbloke. Kak yadro mozhet vosp- repyatstvovat' vypolneniyu operacij zapisi v funkciyah write, creat, link, unlink, chown i chmod ? Kakogo roda informaciyu zapisyvayut v faj- lovuyu sistemu vse perechislennye funkcii ? *30. Predpolozhim, chto odin process pytaetsya demontirovat' fajlovuyu sistemu, v to vremya kak drugoj process pytaetsya sozdat' v fajlovoj sisteme no- vyj fajl. Tol'ko odna iz funkcij umount i creat vypolnitsya uspeshno. Podrobno rassmotrite voznikshuyu konkurenciyu. *31. Kogda funkciya umount proveryaet otsutstvie v fajlovoj sisteme aktivnyh fajlov, voznikaet odna problema, svyazannaya s tem, chto kornevoj indeks fajlovoj sistemy, naznachaemyj pri vypolnenii funkcii mount s pomoshch'yu algoritma iget, imeet schetchik ssylok s polozhitel'nym znacheniem. Kak funkciya umount smozhet ubedit'sya v otsutstvii aktivnyh fajlov i otchi- tat'sya pered kornem fajlovoj sistemy ? Rassmotrite dva sluchaya: * funkciya umount osvobozhdaet kornevoj indeks po algoritmu iput pered proverkoj aktivnyh indeksov. (Kak funkcii vernut' etot indeks obrat- no, esli budut obnaruzheny aktivnye fajly ?) * funkciya umount proveryaet otsutstvie aktivnyh fajlov do togo, kak os- vobodit' kornevoj indeks, i razreshaya kornevomu indeksu ostavat'sya aktivnym. (Naskol'ko aktivnym mozhet byt' kornevoj indeks ?) 32. Obratite vnimanie na to, chto pri vypolnenii komandy ls -ld kolichestvo svyazej s katalogom nikogda ne ravno 1. Pochemu ? 33. Kak rabotaet komanda mkdir (sozdat' novyj katalog) ? (Navodyashchij vop- ros: kakie nomera po zavershenii vypolneniya komandy imeyut indeksy dlya fajlov "." i ".." ?) *34. Ponyatie "simvolicheskie svyazi" imeet otnoshenie k vozmozhnosti ukazaniya s pomoshch'yu funkcii link svyazej mezhdu fajlami, prinadlezhashchimi k razlichnym fajlovym sistemam. S fajlom simvolicheskoj svyazi associirovan ukazatel' novogo tipa; soderzhimym fajla yavlyaetsya imya puti poiska togo fajla, s kotorym on svyazan. Opishite realizaciyu simvolicheskih svyazej. *35. CHto proizojdet, esli process vyzovet funkciyu unlink("."); Kakim budet tekushchij katalog processa ? Predpolagaetsya, chto process ob- ladaet pravami superpol'zovatelya. 36. Razrabotajte sistemnuyu funkciyu, kotoraya usekaet sushchestvuyushchij fajl do proizvol'nyh razmerov, ukazannyh v kachestve argumenta, i opishite ee rabotu. Realizujte sistemnuyu funkciyu, kotoraya pozvolyala by pol'zovate- lyu udalyat' segment fajla, raspolozhennyj mezhdu dvumya adresami, zadanny- mi v vide smeshchenij, i szhimat' fajl. Napishite programmu, kotoraya ne vy- zyvala by eti funkcii, no obladala by temi zhe funkcional'nymi vozmozh- nostyami. 37. Opishite vse usloviya, pri kotoryh schetchik ssylok v indekse mozhet prevy- shat' znachenie 1. 38. Zatragivaya temu abstraktnyh obrashchenij k fajlovym sistemam, otvet'te na vopros: sleduet li fajlovoj sisteme kazhdogo tipa imet' lichnuyu operaciyu blokirovaniya, vyzyvaemuyu iz obshchej programmy, ili zhe dostatochno obshchej operacii blokirovaniya ? 136