itm zagruzki sistemy 221 ra. Porozhdennyj nulevym novyj process, process 1, zapuskaetsya v tom zhe rezhi- me i sozdaet svoj pol'zovatel'skij kontekst, formiruya oblast' dannyh i pri- soedinyaya ee k svoemu adresnomu prostranstvu. On uvelichivaet razmer oblasti do nadlezhashchej velichiny i perepisyvaet programmu zagruzki iz adresnogo prost- ranstva yadra v novuyu oblast': eta programma teper' budet opredelyat' kontekst processa 1. Zatem process 1 sohranyaet registrovyj kontekst zadachi, "vozvra- shchaetsya" iz rezhima yadra v rezhim zadachi i ispolnyaet tol'ko chto perepisannuyu programmu. V otlichie ot nulevogo processa, kotoryj yavlyaetsya processom sis- temnogo urovnya, vypolnyayushchimsya v rezhime yadra, process 1 otnositsya k pol'zova- tel'skomu urovnyu. Kod, ispolnyaemyj processom 1, vklyuchaet v sebya vyzov sis- temnoj funkcii exec, zapuskayushchej na vypolnenie programmu iz fajla "/etc/init". Obychno process 1 imenuetsya processom init, poskol'ku on otvecha- et za inicializaciyu novyh processov. Kazalos' by, zachem yadru kopirovat' programmu, zapuskaemuyu s pomoshch'yu fun- kcii exec, v adresnoe prostranstvo processa 1 ? On mog by obratit'sya k vnut- rennemu variantu funkcii pryamo iz yadra, odna- ko, po sravneniyu s uzhe opisannym algoritmom eto bylo by gorazdo trudnee rea- lizovat', ibo v etom sluchae funkcii exec prishlos' by proizvodit' analiz imen fajlov v prostranstve yadra, a ne v prostranstve zadachi. Podobnaya detal', trebuyushchayasya tol'ko dlya processa init, uslozhnila by programmu realizacii fun- kcii exec i otricatel'no otrazilas' by na skorosti vypolneniya funkcii v bo- lee obshchih sluchayah. Process init (Risunok 7.31) vystupaet dispetcherom processov, kotoryj po- rozhdaet processy, sredi vsego prochego pozvolyayushchie pol'zovatelyu registriro- vat'sya v sisteme. Instrukcii o tom, kakie processy nuzhno sozdat', schityvayut- sya processom init iz fajla "/etc/inittab". Stroki fajla vklyuchayut v sebya identifikator sostoyaniya "id" (odnopol'zovatel'skij rezhim, mnogopol'zovatel'- skij i t. d.), predprinimaemoe dejstvie (sm. uprazhnenie 7.43) i specifikaciyu programmy, realizuyushchej eto dejstvie (sm. Risunok 7.32). Process init pros- matrivaet stroki fajla do teh por, poka ne obnaruzhit identifikator sostoya- niya, sootvetstvuyushchego tomu sostoyaniyu, v kotorom nahoditsya process, i sozdaet process, ispolnyayushchij programmu s ukazannoj specifikaciej. Naprimer, pri za- puske v mnogopol'zovatel'skom rezhime (sostoyanie 2) process init obychno po- rozhdaet getty-processy, upravlyayushchie funkcionirovaniem terminal'nyh linij, vhodyashchih v sostav sistemy. Esli registraciya pol'zovatelya proshla uspeshno, getty-process, projdya cherez proceduru login, zapuskaet na ispolnenie regist- racionnyj shell (sm. glavu 10). Tem vremenem process init nahoditsya v sosto- yanii ozhidaniya (wait), nablyudaya za prekrashcheniem sushchestvovaniya svoih potomkov, a takzhe "vnuchatyh" processov, ostavshihsya "sirotami" posle gibeli svoih rodi- telej. Processy v sisteme UNIX mogut byt' libo pol'zovatel'skimi, libo upravlya- yushchimi, libo sistemnymi. Bol'shinstvo iz nih sostavlyayut pol'zovatel'skie pro- cessy, svyazannye s pol'zovatelyami cherez terminaly. Upravlyayushchie processy ne svyazany s konkretnymi pol'zovatelyami, oni vypolnyayut shirokij spektr sistemnyh funkcij, takih kak administrirovanie i upravlenie setyami, razlichnye periodi- cheskie operacii, buferizaciya dannyh dlya vyvoda na ustrojstvo postrochnoj pe- chati i t.d. Process init mozhet porozhdat' upravlyayushchie processy, kotorye budut sushchestvovat' na protyazhenii vsego vremeni zhizni sistemy, v razlichnyh sluchayah oni mogut byt' sozdany samimi pol'zovatelyami. Oni pohozhi na pol'zovatel'skie processy tem, chto oni ispolnyayutsya v rezhime zadachi i pribegayut k uslugam sis- temy putem vyzova sootvetstvuyushchih sistemnyh funkcij. Sistemnye processy vypolnyayutsya isklyuchitel'no v rezhime yadra. Oni mogut porozhdat'sya nulevym processom (naprimer, process zameshcheniya stranic vhand), kotoryj zatem stanovitsya processom podkachki. Sistemnye processy pohozhi na upravlyayushchie processy tem, chto oni vypolnyayut sistemnye funkcii, pri etom oni obladayut bol'shimi vozmozhnostyami prioritetnogo vypolneniya, poskol'ku lezhashchie v ih osnove programmnye kody yavlyayutsya sostavnoj chast'yu yadra. Oni mogut obra- shchat'sya k strukturam dannyh i algoritmam yadra, ne pribegaya k vyzovu sistemnyh funkcij, otsyuda vytekaet ih isklyuchitel'nost'. Odnako, oni ne obladayut takoj 222 +------------------------------------------------------------+ | algoritm init /* process init, v sisteme imenuemyj | | "process 1" */ | | vhodnaya informaciya: otsutstvuet | | vyhodnaya informaciya: otsutstvuet | | { | | fd = open("/etc/inittab",O_RDONLY); | | while (line_read(fd,buffer)) | | { | | /* chitat' kazhduyu stroku fajlu */ | | if (invoked state != buffer state) | | continue; /* ostat'sya v cikle while */ | | /* najden identifikator sootvetstvuyushchego sostoyaniya | | */ | | if (fork() == 0) | | { | | execl("process ukazan v bufere"); | | exit(); | | } | | /* process init ne dozhidaetsya zaversheniya potomka */ | | /* vozvrat v cikl while */ | | } | | | | while ((id = wait((int*) 0)) != -1) | | { | | /* proverka sushchestvovaniya potomka; | | * esli potomok prekratil sushchestvovanie, rassmatri- | | * vaetsya vozmozhnost' ego perezapuska */ | | /* v protivnom sluchae, osnovnoj process prosto pro- | | * dolzhaet rabotu */ | | } | | } | +------------------------------------------------------------+ Risunok 7.31. Algoritm vypolneniya processa init +------------------------------------------------------------+ | Format: identifikator, sostoyanie, dejstvie, specifikaciya | | processa | | Polya razdeleny mezhdu soboj dvoetochiyami | | Kommentarii v konce stroki nachinayutsya s simvola '#' | | | | co::respawn:/etc/getty console console #Konsol' v mashzale| | 46:2:respawn:/etc/getty -t 60 tty46 4800H #kommentarii | +------------------------------------------------------------+ Risunok 7.32. Fragment fajla inittab zhe gibkost'yu, kak upravlyayushchie processy, poskol'ku dlya togo, chtoby vnesti iz- meneniya v ih programmy, pridetsya eshche raz perekompilirovat' yadro. 7.10 VYVODY V dannoj glave byli rassmotreny sistemnye funkcii, prednaznachennye dlya raboty s kontekstom processa i dlya upravleniya vypolneniem processa. Sistem- naya funkciya fork sozdaet novyj process, kopiruya dlya nego soderzhimoe vseh ob- lastej, podklyuchennyh k roditel'skomu processu. Osobennost' realizacii funk- cii fork sostoit v tom, chto ona vypolnyaet inicializaciyu sohranennogo regist- 223 rovogo konteksta porozhdennogo processa, takim obrazom etot process nachinaet vypolnyat'sya, ne dozhidayas' zaversheniya funkcii, i uzhe v tele funkcii nachinaet osoznavat' svoyu prednaznachenie kak potomka. Vse processy zavershayut svoe vy- polnenie vyzovom funkcii exit, kotoraya otsoedinyaet oblasti processa i posy- laet ego roditelyu signal "gibel' potomka". Process-roditel' mozhet sovmestit' moment prodolzheniya svoego vypolneniya s momentom zaversheniya processa-potomka, ispol'zuya sistemnuyu funkciyu wait. Sistemnaya funkciya exec daet processu voz- mozhnost' zapuskat' na vypolnenie drugie programmy, nakladyvaya soderzhimoe is- polnyaemogo fajla na svoe adresnoe prostranstvo. YAdro otsoedinyaet oblasti, ranee zanimaemye processom, i naznachaet processu novye oblasti v sootvetst- vii s potrebnostyami ispolnyaemogo fajla. Sovmestnoe ispol'zovanie oblastej komand i nalichie rezhima "sticky-bit" dayut vozmozhnost' bolee racional'no is- pol'zovat' pamyat' i ekonomit' vremya, zatrachivaemoe na podgotovku k zapusku programm. Prostym pol'zovatelyam predostavlyaetsya vozmozhnost' poluchat' privi- legii drugih pol'zovatelej, dazhe superpol'zovatelya, blagodarya obrashcheniyu k uslugam sistemnoj funkcii setuid i setuid-programm. S pomoshch'yu funkcii brk process mozhet izmenyat' razmer svoej oblasti dannyh. Funkciya signal daet pro- cessam vozmozhnost' upravlyat' svoej reakciej na postupayushchie signaly. Pri po- luchenii signala proizvoditsya obrashchenie k special'noj funkcii obrabotki sig- nala s vneseniem sootvetstvuyushchih izmenenij v stek zadachi i v sohranennyj re- gistrovyj kontekst zadachi. Processy mogut sami posylat' signaly, ispol'zuya sistemnuyu funkciyu kill, oni mogut takzhe kontrolirovat' poluchenie signalov, prednaznachennyh gruppe processov, pribegaya k uslugam funkcii setpgrp. Komandnyj processor shell i process nachal'noj zagruzki init ispol'zuyut standartnye obrashcheniya k sistemnym funkciyam, proizvodya nabor operacij, v dru- gih sistemah obychno vypolnyaemyh yadrom. Shell interpretiruet komandy pol'zo- vatelya, perenaznachaet standartnye fajly vvoda-vyvoda dannyh i vydachi oshibok, porozhdaet processy, organizuet kanaly mezhdu porozhdennymi processami, sinhro- niziruet svoe vypolnenie s etimi processami i formiruet kody, vozvrashchaemye komandami. Process init tozhe porozhdaet razlichnye processy, v chastnosti, up- ravlyayushchie rabotoj pol'zovatelya za terminalom. Kogda takoj process zavershaet- sya, init mozhet porodit' dlya vypolneniya toj zhe samoj funkcii eshche odin pro- cess, esli eto vytekaet iz informacii fajla "/etc/inittab". 7.11 UPRAZHNENIYA 1. Zapustite s terminala programmu, privedennuyu na Risunke 7.33. Pereadre- sujte standartnyj vyvod dannyh v fajl i sravnite rezul'taty mezhdu so- boj. +------------------------------------+ | main() | | { | | printf("hello\n"); | | if (fork() == 0) | | printf("world\n"); | | } | +------------------------------------+ Risunok 7.33. Primer modulya, soderzhashchego vyzov funkcii fork i obra- shchenie k standartnomu vyvodu 2. Razberites' v mehanizme raboty programmy, privedennoj na Risunke 7.34, i sravnite ee rezul'taty s rezul'tatami programmy na Risunke 7.4. 3. Eshche raz obratimsya k programme, privedennoj na Risunke 7.5 i pokazyvayu- shchej, kak dva processa obmenivayutsya soobshcheniyami, ispol'zuya sparennye ka- naly. CHto proizojdet, esli oni popytayutsya vesti obmen soobshcheniyami, is- pol'zuya odin kanal ? 4. Vozmozhna li poterya informacii v sluchae, kogda process poluchaet neskol'- 224 ko signalov prezhde chem emu predostavlyaetsya vozmozhnost' otreagirovat' na nih nadlezhashchim obrazom ? (Rassmotrite sluchaj, kogda process podschityva- et kolichestvo poluchennyh signalov o preryvanii.) Est' li neobhodimost' v reshenii etoj problemy ? 5. Opishite mehanizm raboty sistemnoj funkcii kill. 6. Process v programme na Risunke 7.35 prinimaet signaly tipa "gibel' po- tomka" i ustanavlivaet funkciyu obrabotki signalov v ishodnoe sostoyanie. CHto proishodit pri vypolnenii programmy ? 7. Kogda process poluchaet signaly opredelennogo tipa i ne obrabatyvaet ih, yadro dampiruet obraz processa v tom vide, kotoryj byl u nego v moment polucheniya signala. YAdro sozdaet v tekushchem kataloge processa fajl s ime- nem "core" i kopiruet v nego prostranstvo processa, oblasti komand, dannyh i steka. Vposledstvii pol'zovatel' mozhet tshchatel'no izuchit' damp obraza processa s pomoshch'yu standartnyh sredstv otladki. Opishite algo- ritm, kotoromu na Vash vzglyad dolzhno sledovat' yadro v processe sozdaniya fajla "core". CHto nuzhno predprinyat' v tom sluchae, esli v tekushchem kata- loge fajl s takim imenem uzhe sushchestvuet ? Kak dolzhno vesti sebya yadro, kogda v odnom i tom zhe kataloge dampiruyut svoi obrazy srazu neskol'ko processov? 8. Eshche raz obratimsya k programme (Risunok 7.12), opisyvayushchej, kak odin process zabrasyvaet drugoj process signalami, kotorye prinimayutsya ih adresatom. Podumajte, chto proizoshlo by v tom sluchae, esli by algoritm obrabotki signalov byl pererabotan v lyubom iz sleduyushchih napravlenij: +------------------------------------------------------------+ | #include | | int fdrd,fdwt; | | char c; | | | | main(argc,argv) | | int argc; | | char *argv[]; | | { | | if (argc != 3) | | exit(1); | | fork(); | | | | if ((fdrd = open(argv[1],O_RDONLY)) == -1) | | exit(1); | | if (((fdwt = creat(argv[2],0666)) == -1) && | | ((fdwt = open(argv[2],O_WRONLY)) == -1)) | | exit(1); | | rdwrt(); | | } | | rdwrt() | | { | | for (;;) | | { | | if (read(fdrd,&c,1) != 1) | | return; | | write(fdwt,&c,1); | | } | | } | +------------------------------------------------------------+ Risunok 7.34. Primer programmy, v kotoroj process-roditel' i process-potomok ne razdelyayut dostup k fajlu * yadro ne zamenyaet funkciyu obrabotki signalov do teh por, poka pol'zo- vatel' yavno ne potrebuet etogo; 225 * yadro zastavlyaet process ignorirovat' signaly do teh por, poka pol'zo- vatel' ne obratitsya k funkcii signal vnov'. 9. Pererabotajte algoritm obrabotki signalov tak, chtoby yadro avtomaticheski perenastraivalo process na ignorirovanie vseh posleduyushchih postuplenij signalov po vozvrashchenii iz funkcii, obrabatyvayushchej ih. Kakim obrazom yadro mozhet uznat' o zavershenii funkcii obrabotki signalov, vypolnyayushchej- sya v rezhime zadachi ? Takogo roda perenastrojka priblizila by nas k traktovke signalov v sisteme BSD. *10. Esli process poluchaet signal, nahodyas' v sostoyanii priostanova vo vremya vypolneniya sistemnoj funkcii s dopuskayushchim preryvaniya prioritetom, on vyhodit iz funkcii po algoritmu longjump. YAdro proizvodit neobhodimye ustanovki dlya zapuska funkcii obrabotki signala; kogda process vyjdet iz funkcii obrabotki signala, v versii V eto budet vyglyadet' tak, slov- no on vernulsya iz sistemnoj funkcii s priznakom oshibki (kak by prervav svoe vypolnenie). V sisteme BSD sistemnaya funkciya v etom sluchae avtoma- ticheski perezapuskaetsya. Kakim obrazom mozhno realizovat' etot moment v nashej sisteme? +------------------------------------------------------------+ | #include | | main() | | { | | extern catcher(); | | | | signal(SIGCLD,catcher); | | if (fork() == 0) | | exit(); | | /* pauza do momenta polucheniya signala */ | | pause(); | | } | | | | catcher() | | { | | printf("process-roditel' poluchil signal\n"); | | signal(SIGCLD,catcher); | | } | +------------------------------------------------------------+ Risunok 7.35. Programma, v kotoroj process prinimaet signaly tipa "gibel' potomka" 11. V tradicionnoj realizacii komandy mkdir dlya sozdaniya novoj vershiny v dereve katalogov ispol'zuetsya sistemnaya funkciya mknod, posle chego dvazh- dy vyzyvaetsya sistemnaya funkciya link, privyazyvayushchaya tochki vhoda v kata- log s imenami "." i ".." k novoj vershine i k ee roditel'skomu katalogu. Bez etih treh operacij katalog ne budet imet' nadlezhashchij format. CHto proizojdet, esli vo vremya ispolneniya komandy mkdir process poluchit sig- nal ? CHto esli pri etom budet poluchen signal SIGKILL, kotoryj process ne raspoznaet ? |tu zhe problemu rassmotrite primenitel'no k realizacii sistemnoj funkcii mkdir. 12. Process proveryaet nalichie signalov v momenty perehoda v sostoyanie pri- ostanova i vyhoda iz nego (esli v sostoyanii priostanova process naho- dilsya s prioritetom, dopuskayushchim preryvaniya), a takzhe v moment perehoda v rezhim zadachi iz rezhima yadra po zavershenii ispolneniya sistemnoj funk- cii ili posle obrabotki preryvaniya. Pochemu process ne proveryaet nalichie signalov v moment obrashcheniya k sistemnoj funkcii ? *13. Predpolozhim, chto posle ispolneniya sistemnoj funkcii process gotovitsya k vozvrashcheniyu v rezhim zadachi i ne obnaruzhivaet ni odnogo neobrabotannogo signala. Srazu posle etogo yadro obrabatyvaet preryvanie i posylaet pro- 226 cessu signal. (Naprimer, pol'zovatelem byla nazhata klavisha "break".) CHto delaet process posle togo, kak yadro zavershaet obrabotku preryvaniya? *14. Esli processu odnovremenno posylaetsya neskol'ko signalov, yadro obraba- tyvaet ih v tom poryadke, v kakom oni perechisleny v opisanii. Sushchestvuyut tri sposoba reagirovaniya na poluchenie signala - priem signalov, zaver- shenie vypolneniya so sbrosom na vneshnij nositel' (dampirovaniem) obraza processa v pamyati i zavershenie vypolneniya bez dampirovaniya. Mozhno li ukazat' nailuchshij poryadok obrabotki odnovremenno postupayushchih signalov ? Naprimer, esli process poluchaet signal o vyhode (vyzyvayushchij dampirova- nie obraza processa v pamyati) i signal o preryvanii (vyhod bez dampiro- vaniya), to kakoj iz etih signalov imelo by smysl obrabotat' pervym ? 15. Zapomnite novuyu sistemnuyu funkciyu newpgrp(pid,ngrp); kotoraya vklyuchaet process s identifikatorom pid v gruppu processov s no- merom ngrp (ustanavlivaet dlya processa novuyu gruppu). Podumajte, dlya kakih celej ona mozhet ispol'zovat'sya i kakie opasnosti tait v sebe ee vyzov. 16. Prokommentirujte sleduyushchee utverzhdenie: po algoritmu wait process mozhet priostanovit'sya do nastupleniya kakogo-libo sobytiya i eto ne otrazilos' by na rabote vsej sistemy. 17. Rassmotrim novuyu sistemnuyu funkciyu nowait(pid); gde pid - identifikator processa, yavlyayushchegosya potomkom togo processa, kotoryj vyzyvaet funkciyu. Vyzyvaya funkciyu, process tem samym soobshchaet yadru o tom, chto on ne sobiraetsya dozhidat'sya zaversheniya vypolneniya svoe- go potomka, poetomu yadro mozhet po okonchanii sushchestvovaniya potomka srazu zhe ochistit' zanimaemoe im mesto v tablice processov. Kakim obrazom eto realizuetsya na praktike ? Ocenite dostoinstva novoj funkcii i sravnite ee ispol'zovanie s ispol'zovaniem signalov tipa "gibel' potomka". 18. Zagruzchik modulej na Si avtomaticheski podklyuchaet k osnovnomu modulyu na- chal'nuyu proceduru (startup), kotoraya vyzyvaet funkciyu main, prinadlezha- shchuyu programme pol'zovatelya. Esli v pol'zovatel'skoj programme otsutst- vuet vyzov funkcii exit, procedura startup sama vyzyvaet etu funkciyu pri vyhode iz funkcii main. CHto proizoshlo by v tom sluchae, esli by i v procedure startup otsutstvoval vyzov funkcii exit (iz-za oshibki zagruz- chika) ? 19. Kakuyu informaciyu poluchit process, vypolnyayushchij funkciyu wait, esli ego potomok zapustit funkciyu exit bez parametra ? Imeetsya v vidu, chto pro- cess-potomok vyzovet funkciyu v formate exit() vmesto exit(n). Esli programmist postoyanno ispol'zuet vyzov funkcii exit bez parametra, to naskol'ko predskazuemo znachenie, ozhidaemoe funkciej wait ? Dokazhite svoj otvet. 20. Ob®yasnite, chto proizojdet, esli process, ispolnyayushchij programmu na Ri- sunke 7.36 zapustit s pomoshch'yu funkcii exec samogo sebya. Kak v takom sluchae yadro smozhet izbezhat' vozniknoveniya tupikovyh situacij, svyazannyh s blokirovkoj indeksov ? +----------------------------------+ | main(argc,argv) | | int argc; | | char *argv[]; | | { | | execl(argv[0],argv[0],0); | | } | +----------------------------------+ Risunok 7.36 21. Po usloviyu pervym argumentom funkcii exec yavlyaetsya imya (poslednyaya kom- ponenta imeni puti poiska) ispolnyaemogo processom fajla. CHto proizojdet v rezul'tate vypolneniya programmy, privedennoj na Risunke 7.37 ? Kakov budet effekt, esli v kachestve fajla "a.out" vystupit zagruzochnyj mo- 227 dul', poluchennyj v rezul'tate translyacii programmy, privedennoj na Ri- sunke 7.36 ? 22. Predpolozhim, chto v yazyke Si podderzhivaetsya novyj tip dannyh "read-only" (tol'ko dlya chteniya), prichem process, pytayushchijsya zapisat' informaciyu v pole s etim tipom, poluchaet otkaz sistemy zashchity. Opishite realizaciyu etogo momenta. (Namek: sravnite eto ponyatie s ponyatiem "razdelyaemaya ob- last' komand".) V kakie iz algoritmov yadra potrebuetsya vnesti izmeneniya ? Kakie eshche ob®ekty mogut byt' realizovany analogichnym s oblast'yu obra- zom ? 23. Kakie izmeneniya imeyut mesto v algoritmah open, chmod, unlink i unmount pri rabote s fajlami, dlya kotoryh ustanovlen rezhim "sticky-bit" ? Kakie dejstviya, naprimer, sleduet predprinyat' v otnoshenii takogo fajla yadru, kogda s fajlom razryvaetsya svyaz' ? 24. Superpol'zovatel' yavlyaetsya edinstvennym pol'zovatelem, imeyushchim pravo na zapis' v fajl parolej "/etc/passwd", blagodarya chemu soderzhimoe fajla predohranyaetsya ot umyshlennoj ili sluchajnoj porchi. Programma passwd daet pol'zovatelyam vozmozhnost' izmenyat' svoj sobstvennyj parol', zashchishchaya ot izmenenij chuzhie zapisi. Kakim obrazom ona rabotaet ? +-----------------------------------------------------+ | main() | | { | | if (fork() == 0) | | { | | execl("a.out",0); | | printf("neudachnoe zavershenie funkcii exec\n");| | } | | } | +-----------------------------------------------------+ Risunok 7.37 *25. Poyasnite, kakaya ugroza bezopasnosti hraneniya dannyh voznikaet, esli setuid-programma ne zashchishchena ot zapisi. 26. Vypolnite sleduyushchuyu posledovatel'nost' komand, v kotoroj "a. out" - imya ispolnyaemogo fajla: +-----------------------------------------------------+ | main() | | { | | char *endpt; | | char *sbrk(); | | int brk(); | | | | endpt = sbrk(0); | | printf("endpt = %ud posle sbrk\n", (int) endpt); | | | | while (endpt--) | | { | | if (brk(endpt) == -1) | | { | | printf("brk s parametrom %ud zavershilas' | | neudachno\n",endpt); | | exit(); | | } | | } | | } | +-----------------------------------------------------+ Risunok 7.38 228 chmod 4777 a.out chown root a.out Komanda chmod "vklyuchaet" bit setuid (4 v 4777); pol'zovatel' "root" tradicionno yavlyaetsya superpol'zovatelem. Mozhet li v rezul'tate vypolne- niya etoj posledovatel'nosti proizojti narushenie zashchity informacii ? 27. CHto proizojdet v processe vypolneniya programmy, predstavlennoj na Ri- sunke 7.38 ? Poyasnite svoj otvet. 28. Bibliotechnaya podprogramma malloc uvelichivaet oblast' dannyh processa s pomoshch'yu funkcii brk, a podprogramma free osvobozhdaet pamyat', vydelennuyu podprogrammoj malloc. Sintaksis vyzova podprogramm: ptr = malloc(size); free(ptr); gde size - celoe chislo bez znaka, oboznachayushchee kolichestvo vydelyaemyh bajt pamyati, a ptr - simvol'naya ssylka na vnov' vydelennoe prostranst- vo. Prezhde chem poyavit'sya v kachestve parametra v vyzove podprogrammy free, ukazatel' ptr dolzhen byt' vozvrashchen podprogrammoj malloc. Vypol- nite eti podprogrammy. 29. CHto proizojdet v processe vypolneniya programmy, predstavlennoj na Ri- sunke 7.39 ? Sravnite rezul'taty vypolneniya etoj programmy s rezul'ta- tami, predusmotrennymi v sistemnom opisanii. +-----------------------------------------------------+ | main() | | { | | int i; | | char *cp; | | extern char *sbrk(); | | | | cp = sbrk(10); | | for (i = 0; i < 10; i++) | | *cp++ = 'a' + i; | | sbrk(-10); | | cp = sbrk(10); | | for (i = 0; i < 10; i++) | | printf("char %d = '%c'\n",i,*cp++); | | } | +-----------------------------------------------------+ Risunok 7.39. Primer programmy, ispol'zuyushchej podprogrammu sbrk 30. Kakim obrazom komandnyj processor shell uznaet o tom, chto fajl ispolnya- emyj, kogda dlya vypolneniya komandy sozdaet novyj process ? Esli fajl ispolnyaemyj, to kak uznat', sozdan li on v rezul'tate translyacii ishod- noj programmy ili zhe predstavlyaet soboj nabor komand yazyka shell ? V kakom poryadke sleduet vypolnyat' proverku ukazannyh uslovij ? 31. V komandnom yazyke shell simvoly ">>" ispol'zuyutsya dlya napravleniya vyvo- da dannyh v fajl s ukazannoj specifikaciej, naprimer, komanda: run >> outfile otkryvaet fajl s imenem "outfile" (a v sluchae otsutstviya fajla s takim imenem sozdaet ego) i zapisyvaet v nego dannye. Napishite prog- rammu, v kotoroj ispol'zuetsya eta komanda. 32. Processor komandnogo yazyka shell proveryaet kod, vozvrashchaemyj funkciej exit, vosprinimaya nulevoe znachenie kak "istinu", a lyuboe drugoe znache- nie kak "lozh'" (obratite vnimanie na nesoglasovannost' s yazykom Si). Predpolozhim, chto fajl, ispolnyayushchij programmu na Risunke 7.40, imeet imya "truth". Poyasnite, chto proizojdet, kogda shell budet ispolnyat' sleduyu- shchij nabor komand: while truth 229 +------------------+ | main() | | { | | exit(0); | | } | +------------------+ Risunok 7.40 do truth & done 33. Vopros po Risunku 7.29: V svyazi s chem voznikaet neobhodimost' v sozda- nii processov dlya konvejernoj obrabotki dvuhkomponentnoj komandy v uka- zannom poryadke ? 34. Napishite bolee obshchuyu programmu raboty osnovnogo cikla processora shell v chasti obrabotki kanalov. Imeetsya v vidu, chto programma dolzhna umet' obrabatyvat' sluchajnoe chislo kanalov, ukazannyh v komandnoj stroke. 35. Peremennaya sredy PATH opisyvaet poryadok, v kotorom shell'u sleduet prosmatrivat' katalogi v poiskah ispolnyaemyh fajlov. V bibliotechnyh funkciyah execlp i execvp perechislennye v PATH katalogi prisoedinyayutsya k imenam fajlov, krome teh, kotorye nachinayutsya s simvola "/". Vypolnite eti funkcii. *36. Dlya togo, chtoby shell v poiskah ispolnyaemyh fajlov ne obrashchalsya k teku- shchemu katalogu, superpol'zovatel' dolzhen zadat' peremennuyu sredy PATH. Kakaya ugroza bezopasnosti hraneniya dannyh mozhet vozniknut', esli shell popytaetsya ispolnit' fajly iz tekushchego kataloga ? 37. Kakim obrazom shell obrabatyvaet komandu cd (sozdat' katalog) ? Kakie dejstviya predprinimaet shell v processe obrabotki sleduyushchej komandnoj stroki: cd pathname & ? 38. Kogda pol'zovatel' nazhimaet na klaviature terminala klavishi "delete" ili "break", vsem processam, vhodyashchim v gruppu registracionnogo shell'a, terminal'nyj drajver posylaet signal o preryvanii. Pol'zova- tel' mozhet imet' namerenie ostanovit' vse processy, porozhdennye shell'om, bez vyhoda iz sistemy. Kakie usovershenstvovaniya v svyazi s etim sleduet proizvesti v tele osnovnogo cikla programmy shell (Risunok 7.28) ? 39. S pomoshch'yu komandy nohup command_line pol'zovatel' mozhet otmenit' dejstvie signalov o "zavisanii" i o zaver- shenii (quit) v otnoshenii processov, realizuyushchih komandnuyu stroku (command_line). Kak eta komanda budet obrabatyvat'sya v osnovnom cikle programmy shell ? 40. Rassmotrim nabor komand yazyka shell: nroff -mm bigfile1 > big1out & nroff -mm bigfile2 > big2out i vnov' obratimsya k osnovnomu ciklu programmy shell (Risunok 7.28). CHto proizojdet, esli vypolnenie pervoj komandy nroff zavershitsya ran'she vto- roj ? Kakie izmeneniya sleduet vnesti v osnovnoj cikl programmy shell na etot sluchaj ? 41. CHasto vo vremya vypolneniya iz shell'a neprotestirovannyh programm poyav- lyaetsya soobshchenie ob oshibke sleduyushchego vida: "Bus error - core dumped" (Oshibka v magistrali - soderzhimoe pamyati sbrosheno na vneshnij nositel'). Ochevidno, chto v programme vypolnyayutsya kakie-to nedopustimye dejstviya; otkuda shell uznaet o tom, chto emu nuzhno vyvesti soobshchenie ob oshibke ? 42. Processom 1 v sisteme mozhet vystupat' tol'ko process init. Tem ne me- nee, zapustiv process init, administrator sistemy mozhet tem samym izme- nit' sostoyanie sistemy. Naprimer, pri zagruzke sistema mozhet vojti v odnopol'zovatel'skij rezhim, oznachayushchij, chto v sisteme aktiven tol'ko konsol'nyj terminal. Dlya togo, chtoby perevesti process init v sostoyanie 230 2 (mnogopol'zovatel'skij rezhim), administrator sistemy vvodit s konsoli komandu init 2 . Konsol'nyj shell porozhdaet svoe otvetvlenie i zapuskaet init. CHto imelo by mesto v sisteme v tom sluchae, esli by aktiven byl tol'ko odin pro- cess init ? 43. Format zapisej v fajle "/etc/inittab" dopuskaet zadanie dejstviya, svya- zannogo s kazhdym porozhdaemym processom. Naprimer, s getty-processom svyazano dejstvie "respawn" (vozrozhdenie), oznachayushchee, chto process init dolzhen vozrozhdat' getty-process, esli poslednij prekrashchaet sushchestvova- nie. Na praktike, kogda pol'zovatel' vyhodit iz sistemy process init porozhdaet novyj getty-process, chtoby drugoj pol'zovatel' mog poluchit' dostup k vremenno bezdejstvuyushchej terminal'noj linii. Kakim obrazom eto delaet process init ? 44. Nekotorye iz algoritmov yadra pribegayut k prosmotru tablicy processov. Vremya poiska dannyh mozhno sokratit', esli ispol'zovat' ukazateli na: roditelya processa, lyubogo iz potomkov, drugoj process, imeyushchij togo zhe roditelya. Process obnaruzhivaet vseh svoih potomkov, sleduya snachala za ukazatelem na lyubogo iz potomkov, a zatem ispol'zuya ukazateli na drugie processy, imeyushchie togo zhe roditelya (cikly nedopustimy). Kakie iz algo- ritmov vyigrayut ot etogo ? Kakie iz algoritmov nuzhno ostavit' bez izme- 231