vypolnyaetsya komanda chmod. Parametr $@ ispol'- zovan kak oboznachenie vseh imen fajlov, ukazannyh v komandnoj stroke. Takoj sposob pozvolyaet vam vyzyvat' lock s neskol'kimi imenami fajlov. Iz poslednih shesti glav vy dolzhny priobresti mnozhestvo idej o tom, kak mozhno obezopasit' sredu, v kotoroj vy rabotaete, kak imet' delo s drugimi pol'zovatelyami i voobshche bolee produktivno ispol'zovat' vash rabochij den'. My gotovy dvigat'sya dal'she v ponimanii sistemy UNIX i issledovanii vnutrennej raboty fajlovoj sistemy, ustrojstv i kommu- nikacij.  * GLAVA 7. Ustrojstva i fajlovye sistemy *  TERMINALXNYE USTROJSTVA RABOTA S KLAVIATUROJ FAJLY termcap DISKOVYE USTROJSTVA FAJLOVYE SISTEMY ZAGRUZOCHNYJ DISK RAZMERNYE PARAMETRY c Bystraya ochistka ekrana mntf Montirovanie gibkogo diska v sistemnom dereve mntlook Poisk vseh montirovannyh fajlovyh sistem umntsys Razmontirovanie vseh fajlovyh sistem, krome kornevoj lrgf Sozdanie fajla maksimal'nogo razmera, dopustimogo v vashej sisteme USTROJSTVA I FAJLOVYE SISTEMY VVEDENIE Nizhe urovnya izvestnoj nam oblasti fajlovyh sistem nahoditsya mir ustrojstv i ih drajverov. V dannoj glave my issleduem nekotorye meto- dy, neobhodimye dlya raboty s terminalami, diskami i neposredstvenno fajlovymi sistemami. Programmnoe sredstvo 'c' illyustriruet dostup k terminalu na primere operacii bystroj ochistki ekrana. Sleduyushchie tri sredstva - mntf, mntlook i umntsys - imeyut delo s montirovaniem i raz- montirovaniem fajlovyh sistem. Nakonec, sredstvo lrgf pozvolit vam proverit' predely emkosti vashej fajlovoj sistemy. SISTEMA UNIX I APPARATURA Pered tem, kak uglubit'sya v sushchnost' voprosa, davajte obsudim ne- kotorye elementarnye fakty, kotorye my dolzhny pomnit' pri rassmotrenii vseh sostavlyayushchih sistemy UNIX. Serdcem apparatury yavlyaetsya central'- nyj processor (CPU), kotoryj ispolnyaet instrukcii, upravlyayushchie mashi- noj, i fakticheski osushchestvlyaet vsyu rabotu. Operacionnaya sistema neob- hodima dlya rukovodstva rabotoj, vypolnyaemoj central'nym processorom, i dlya obespecheniya interfejsa mezhdu nim i resursami, trebuemymi dlya togo, chtoby sdelat' chto-to poleznoe: operativnoj pamyat'yu, vneshnej pamyat'yu i drugimi periferijnymi ustrojstvami, takimi kak terminaly i printery. Operacionnaya sistema, osobenno takaya vysokorazvitaya, kak UNIX, imeet mnozhestvo utilit i harakternyh osobennostej, no sejchas rech' ne ob etom. Serdcem operacionnoj sistemy (v dannom sluchae UNIX) yavlyaetsya yadro (kernel). YAdro upravlyaet processami i rukovodit vypolnyaemoj rabo- toj. Ono takzhe yavlyaetsya svoego roda mostom mezhdu apparaturoj i vneshnim mirom. V dannoj glave my obratim vnimanie na osnovnye vzaimootnosheniya mezhdu yadrom, processami i apparaturoj. V konechnom itoge sistema dolzhna vzaimodejstvovat' s vneshnimi ust- rojstvami. Nalichie bazovyh znanij ob ustrojstvah ves'ma vazhno dlya pol- nogo ponimaniya togo, kak UNIX obshchaetsya s vneshnim mirom. Pri rabote s mashinoj mnogo vremeni tratitsya na peredachu dannyh v mashinu i iz nee, a eto znachit, chto neobhodimo imet' delo so mnozhestvom razlichnyh tipov ustrojstv, kazhdoe iz kotoryh imeet svoj "harakter" i osobennosti. K nashemu schast'yu, UNIX byl razrabotan tak, chtoby oblegchit' uprav- lenie dannymi i ustrojstvami nastol'ko, naskol'ko eto vozmozhno. K na- shemu neschast'yu, imeetsya, po vsej vidimosti, nesokratimyj ob®em znanij, kotorymi my dolzhny ovladet' obyazatel'no. Na ris. 7-1 pokazana obshchaya struktura operacionnoj sistemy UNIX. My vidim, chto so storony yadra ob- rashchenie ko vsem vneshnim periferijnym ustrojstvam vypolnyaetsya kak k fajlam ustrojstv. Kazhdyj tip ustrojstv imeet svoj sobstvennyj drajver i specificheskuyu arhitekturu, no obrashchenie k kazhdomu ustrojstvu vypol- nyaetsya odinakovymi metodami. My uvidim, kak ispol'zovat' razlichnye sposoby dostupa k ustrojstvam i opredelim, kakie sposoby naibolee ef- fektivny. Ris. 7-1 Model' sredy sistemy UNIX -------------------------------------------------------------- +-----------+ | | +------------+ | Magnitnaya | | Printer | | lenta | +------------+ +-----------+ /dev/lp0 lpn /dev/rmt0 .../dev/rmtn \ | | / \ | | / \ | | / \ \ | | | | / / +-------------------+------- /dev/fd0 fd:1,2 | +-------------+ |--- +-----------+ /dev/tty00----| | PROCESSOR | | |Gibkij disk| +--------+ -- | | YADRO | |--- +-----------+ | | / | +-------------+ |-------- fdn | |kran | +-------------------+ +--------+ / / | | | \ \ +--------+ / | \ |Klaviat.| ttynn /dev/hd01 hdnn +--------+ +----------+ fd:0 | | | ZHestkij | | disk | | | +----------+ -------------------------------------------------------------- UNIX obrashchaetsya k periferijnym ustrojstvam cherez "special'nye fajly". Imeetsya dva tipa special'nyh fajlov: blochnye i simvol'nye. Oba tipa imeyut svoe prednaznachenie i osobennosti. Blochnyj (naprimer, /dev/hd0) ispol'zuet buferizaciyu i pozvolyaet poluchit' dostup k bol'shim ob®emam dannyh na zhestkom diske. Simvol'nyj (naprimer, /dev/tty00 ili /dev/rfd0) ne ispol'zuet znachitel'nuyu buferizaciyu, a vypolnyaet obmen s ustrojstvom po odnomu simvolu za obrashchenie. Dazhe nesmotrya na osobye svojstva takih fajlov, dlya nih podderzhivaetsya vse tot zhe mehanizm za- shchity, chto i dlya vseh drugih fajlov v sisteme. Pervaya oblast', kotoruyu my rassmotrim - terminal'nye ustrojstva i rabota s nimi. Predstavlennye programmy vklyuchayut v sebya sredstvo pod nazvaniem 'c' dlya bystroj ochistki ekrana, a takzhe primer programmy, kotoraya schityvaet znacheniya nazhatyh klavish i vypolnyaet opros nazhatiya odnoj klavishi. My takzhe rassmotrim primer fajla opisaniya terminala (termcap), kotoryj obespechivaet dostupnye opredeleniya harakteristik terminala. Zatem my rassmotrim diskovye ustrojstva - zhestkie i gibkie diski. My uvidim, chto imeyutsya razlichnye sposoby prosmotra razdelov diska s ispol'zovaniem fajlov ustrojstv. V dopolnenie k rabote s ustrojstvami my rassmotrim fajlovye sistemy na zhestkom diske. Vsem nam izvestno, chto sistema UNIX sushchest- venno orientirovana na diski, poetomu chem bol'she my znaem o fajlovyh sistemah, tem luchshe dlya nas. Dlya bolee polnogo ponimaniya razdelov diska i fajlovyh sistem my predstavim tri programmnyh sredstva. Sredstvo lrgf proveryaet granichnye znacheniya parametrov fajlovoj sistemy putem sozdaniya fajla naibol'shego vozmozhnogo razmera v vashej sisteme. Sredstvo mntf obespechivaet udobnyj sposob montirovaniya i razmontirova- niya gibkih diskov. Nakonec, sredstvo mntlook vypolnyaet poisk nemonti- rovannyh fajlovyh sistem, kotorye predstavlyayut soboj potencial'nuyu opasnost'. TERMINALXNYE USTROJSTVA Drajvery terminal'nyh ustrojstv yavlyayutsya odnimi iz samyh slozhnyh drajverov ustrojstv. Prichina etogo zaklyuchaetsya v tom, chto sushchestvuet mnozhestvo urovnej programmnogo obespecheniya, kotorye podderzhivayut ha- rakteristiki interaktivnyh terminalov. Pri rabote terminala po posle- dovatel'noj linii svyazi neobhodima moshchnaya podderzhka dlya togo, chtoby oblegchit' ego ispol'zovanie. Razlichnye ustanovki, kotorye mozhet imet' terminal, programmiruyutsya komandami stty(1) i ioctl(2). Komanda termio(7) takzhe opisyvaet razlichnye aspekty protokola raboty termina- la. PROTOKOL OPERACIJ VVODA/VYVODA TERMINALA Protokol raboty terminala predstavlyaet soboj soglasovannyj nabor signalov, pozvolyayushchih sisteme pravil'no interpretirovat' vvodimye s klaviatury stroki. Protokol neobhodim po chetyrem prichinam. Pervoj yav- lyaetsya podderzhka vhodnoj obrabotki special'nyh simvolov, takih kak simvoly udaleniya i prekrashcheniya raboty programmy. Vo-vtoryh, nam neob- hodimo podderzhivat' obrabotku vyvodimoj informacii, naprimer, vstavku simvolov zaderzhki ili izmenenie posledovatel'nosti vozvrat karetki/pe- revod stroki. Tret'ej prichinoj yavlyaetsya podderzhka rezhimov neobrabotan- nogo i "kanonicheskogo" vvoda. |ti dva rezhima pozvolyayut pol'zova- tel'skim programmam poluchat' dannye ili po odnomu simvolu, ili po od- noj stroke. Poslednyaya prichina vvedeniya terminal'nogo protokola - zhela- nie sdelat' tak, chtoby pol'zovatel' mog sam izmenyat' parametry konfi- guracii terminala. Soderzhimoe terminal'noj podsistemy pokazano na ris. 7-2. Risunok razbit na tri chasti: sleva - oblast' pol'zovatelya, posredine - oblast' yadra i sprava - oblast' ustrojstva. |tot risunok pokazyvaet, kak pere- dayutsya dannye mezhdu terminalami i programmami pol'zovatelya. Ris. 7-2. Upravlenie protokolom terminala ------------------------------------------------------------------- Oblast' Oblast' yadra Oblast' pol'zovatelya ustrojstva Process +-------+ : : |Tekst | : +--------+ +--------+ +-------+ : dzrint() |-------| : ttread() |kanonich.| canon()|neobrab.| ttin()|priemn.| : +-----+ |Dannye | : /---|ochered' |<-------|ochered' |<------|bufer |<--|dbuf | | | : / +--------+ +--------+ / +-------+ : | | | +----+| : / struktura struktura / struktura : +-----+ | |ubuf||<---/ clist clist / ccblock : | +----+| : / : | +----+| : +--------- / ttxput() : | |ubuf||---- | : | +----+| : \ +-------+ <--+ +--------+ : +-----+ |-------| : \ |vyhodn.| |bufer | : |dbuf | |Stek | : \--->|ochered'|------->|peredachi|------------------->| | | | : +-------+ ttout()+--------+ dzxint() : +-----+ +-------+ : ttwrite() struktura struktura : clist ccblock /|\ | ------+ Granica drajvera ustrojstva ------------------------------------------------------------------- Kogda kakoj-libo process chitaet simvoly s ustrojstva, dannye na- chinayut dvigat'sya ot bufera drajvera ustrojstva, kotoryj nazyvaetsya dbuf. Iz etogo bufera dannye popadayut v priemnyj bufer, upravlyaemyj yadrom. Priemnyj bufer chitaetsya podprogrammoj yadra s imenem ttin(), i dannye pomeshchayutsya v strukturu clist, nazyvaemuyu neobrabotannoj oche- red'yu. (Slovo "neobrabotannaya" oznachaet, chto nad simvolami poka chto ne proizvodilos' nikakoj obrabotki.) V to zhe vremya simvoly takzhe pomeshcha- yutsya v vyhodnuyu ochered', chto pozvolyaet sisteme vypolnyat' eho-otobrazhe- nie simvolov po mere ih vvoda. Posle etogo podprogramma canon() prevrashchaet neobrabotannuyu oche- red' v kanonicheskuyu. ("Kanonicheskaya" oznachaet primenenie pravil, koto- rye v dannyj moment ustanovleny sistemoj dlya vypolneniya special'nyh funkcij nad strokoj teksta, naprimer dlya obrabotki simvola udaleniya.) Takaya obrabotka pozvolyaet preobrazovat' dannye pered tem, kak ih polu- chit process pol'zovatelya. Poslednej podprogrammoj yavlyaetsya ttread(), kotoraya chitaet simvoly iz kanonicheskogo bufera v bufer pol'zova- tel'skogo processa v oblasti dannyh processa. Kogda simvoly zapisyvayutsya iz processa pol'zovatelya na terminal, oni prodelyvayut pochti takoj zhe marshrut v obratnom napravlenii: ot ob- lasti processa k oblasti drajvera ustrojstva. Osnovnoe otlichie v podp- rogramme zapisi zaklyuchaetsya v tom, chto eti dannye prohodyat na odin bu- fer men'she. Ot processa pol'zovatelya simvoly peredayutsya v vyhodnuyu ochered' yadra podprogrammoj ttwrite(), a zatem v bufer peredachi s po- moshch'yu podprogrammy ttout(). Iz bufera peredachi oni peresylayutsya ne- posredstvenno v priemnyj bufer drajvera ustrojstva s pomoshch'yu podprog- rammy dzxint(). OPREDELENIE VVODIMYH SIMVOLOV Byvaet tak, chto my hotim uvidet', kakie simvoly vvodyatsya s klavi- atury. My mogli by dlya etogo napisat' programmu, no UNIX predostavlyaet vstroennuyu vozmozhnost' dlya etoj celi. |to komanda od - vos'merichnyj damp (octal dump). Takoe nazvanie ostalos' eshche s teh davnih vremen, kogda vos'merichnoe ischislenie shiroko primenyalos' pri otladke. K schast'yu, rezul'tat raboty komandy od mozhno poluchit' v simvol'nom, shestnadcatirichnom ili desyatichnom vide. Fokus ispol'zovaniya komandy od dlya proverki vhodnyh i vyhodnyh znachenij zak- lyuchaetsya v tom, chto od chitaet standartnoe ustrojstvo vvoda po umolcha- niyu, esli ne ukazan fajl. Naprimer, vyzov $ od -cx test string ^d ^d dast takoj rezul'tat: ------------------------------- | | 0000000 6574 7473 7320 7274 6e69 0a67 | t e s t s t r i n g \n | 0000014 | $ | Zdes' vyzov komandy od delaetsya bez ukazaniya imeni fajla v ko- mandnoj stroke i s primeneniem standartnogo vyvoda v kachestve vyvodno- go ustrojstva. My ispol'zuem opciyu -cx dlya togo, chtoby bajty interpre- tirovalis' kak simvoly ASCII, a sootvetstvuyushchie 16-bitovye slova otob- razhalis' v shestnadcatirichnom vide. Po mere togo, kak vy nabiraete sim- voly, oni otobrazhayutsya na ekrane, a komanda od sohranyaet ih v svoem bufere. V konce stroki nazhmite vozvrat karetki, zatem CTRL-D. Vvod CTRL-D zavershaet chtenie simvolov komandoj od i vydaet raspechatku, v kotoroj sverhu budut shestnadcatirichnye znacheniya, a snizu simvoly v ko- de ASCII. Obratite vnimanie, chto dva simvola, vyvodimye dlya kazhdogo shest- nadcatirichnogo slova, raspolagayutsya v obratnom poryadke po sravneniyu s dvumya bajtami, obrazuyushchimi eto slovo. Naprimer, slovo 6574 interpreti- ruetsya kak dva simvola, t i e, gde 65 - kod ASCII dlya simvola e, a 74 - ASCII-kod dlya simvola t. Dlya togo chtoby vyjti iz komandy od, vvedite eshche odin CTRL-D dlya prekrashcheniya blochnogo chteniya. Esli vy hotite eshche proveryat' simvoly, prodolzhajte ih vvodit'. Komanda od rabotaet neskol'ko zagadochno. Esli vy vvedete dostatochnoe kolichestvo simvolov, ona vydast na ekran informaciyu po nazhatiyu tol'ko lish' vozvrata karet- ki. No esli vy vveli vsego neskol'ko simvolov, trebuetsya nazhatie kak vozvrata karetki, TAK I CTRL-D dlya polucheniya rezul'tata na ekrane. Teper' my mozhem sdelat' odin fokus - izmenit' kanonicheskij sposob obrabotki pri chtenii simvolov komandoj od. |to pozvolit nam uvidet' effekt ot razlichnyh ustanovok protokola raboty. Dlya etogo prover'te tekushchie ustanovki vashego terminala. V versii System V ispol'zujte ko- mandu "stty -a", a v versii Berkeley vam nuzhno primenit' komandu "stty everything". System V vydaet gorazdo bol'she parametrov, chem Berkeley. (Naibolee populyarnye versii UNIX'a razrabotany i podderzhivayutsya sledu- yushchimi firmami: System V - firmoj AT&T Bell Laboratories, kotoraya v nastoyashchee vremya nazyvaetsya Unix System Laboratories; BSD (Berkeley Software Distribution) - Kalifornijskim universitetom v Berkli; XENIX - firmoj Microsoft.- Prim. perev.) Nizhe privoditsya primer iz XENIX: -------------------------- | | speed 9600 baud; line = 0; | intr = DEL; quit = ^|; erase = ^h; | kill = ^u; eof = ^d; eol = ^` | parenb -parodd cs7 -cstobp hupcl cread -clocal | -ignbrk brkint ignpar -parmrk -inpck istrip -inlcr -igncr icrnl -iuclc | ixon ixany -ixoff | isig icanon -xcase echo echoe echok -echonl -noflsh | opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel ff1 | Posle togo, kak my pocheshem golovu, my uvidim, chto tekushchij flag dlya kanonicheskoj obrabotki ustanovlen v sostoyanie "icanon". To est', my mozhem videt', chto on vklyuchen, poskol'ku net prefiksa v vide znaka minus (hotya eto ne yavlyaetsya strogim pravilom). CHto proishodit pri kanonicheskoj obrabotke? Simvol vozvrata na shag nazad (backspace) yavlyaetsya odnim iz vazhnyh voprosov. Kogda vy vvodite simvol CTRL-H, on postupaet v neobrabotannuyu ochered' kak literal'nyj simvol CTRL-H. Kogda programma canon() chitaet CTRL-H, ona ponimaet eto tak: "Izmenit' CTRL-H na simvol vozvrata na shag nazad, zapisat' probel na mesto simvola, zatem sdelat' eshche shag nazad." Pri eho -otobrazhenii vy poluchaete udalenie simvola na ekrane. Kogda kanonicheskaya obrabotka otklyuchena, vy posylaete CTRL-H kak obychnye simvoly. Vot primer togo, kak eto vyglyadit: ---------------------------- | | $ stty -icanon Otklyuchenie kanonicheskoj obrabotki | $ od -cx | test string^h^h^h^h^h^hcase | ^d... | | 0000000 6574 7473 7320 7274 6e69 0867 0808 0808 | t e s t s t r i n g \b \b \b \b \b | 0000020 6308 7361 0a65 0a04 0a0a 0a0a 0a0a 0a0a | \b c a s e \n 004 \n \n \n \n \n \n \n \n \n | Posle slova "string" vy vidite gruppu chisel 08, kotorye v ASCII-kode oboznachayut CTRL-H. |ti chisla 08 pokazyvayut vam, chto lite- ral'nye simvoly CTRL-H dejstvitel'no prisutstvuyut v ih "neobrabotan- noj" forme. Poskol'ku CTRL-H ne yavlyaetsya bol'she special'nym simvolom, komanda od rassmatrivaet ego podobno lyubomu drugomu simvolu. Zdes' voznikaet novaya problema: poskol'ku special'nye simvoly ne raspozna- yutsya, my poteryali vozmozhnost' zavershit' blochnoe chtenie vvodom simvola konca fajla (EOF). Kogda vvoditsya CTRL-D, on ponimaetsya prosto kak eshche odin simvol. Poetomu my dolzhny zapolnit' bufer komandy od, chtoby zastavit' ee vypolnit' damp. V nashem primere CTRL-D - eto simvol 004 posle simvolov case \n. Kstati, v sisteme Berkeley ispol'zuyutsya ustanovki "obrabotannaya" ("cooked") i "neobrabotannaya" ("raw") dlya stty, kotorye po sushchestvu sluzhat dlya teh zhe celej, chto "canon" i "-canon" v System V. DINAMICHESKOE PEREOPREDELENIE SIMVOLOV PRERYVANIYA Obratite vnimanie, chto v predydushchej raspechatke komandy stty -a prisutstvuyut opredeleniya simvolov "intr" i "quit". |to dve funkcii, kotorye preryvayut rabotu vashih rabotayushchih processov. Stroki intr i quit predstavlyayut soboj osobye funkcii, a ne prosto nazhatie klavishi. |ti funkcii mozhno naznachit' na lyubuyu klavishu klaviatury pri pomoshchi ko- mandy stty. Esli my izmenili znachenie "intr" na drugoj simvol, to etot novyj simvol prervet vashi processy. Vy dazhe mozhete ustanovit' v kachestve klavishi preryvaniya obychnyj simvol. Vot kak eto mozhno sdelat': $ stty intr x $ this is a junk stringx $ Kogda vy vvodite simvol x v konce stroki, to vsya vvedennaya stroka obryvaetsya i vy poluchaete novyj simvol priglasheniya. Dlya togo chtoby vernut'sya k obychnomu rezhimu raboty, vvedite v kachestve simvola prery- vaniya staryj simvol. Esli starym simvolom byl "delete", vy daete takuyu komandu: $ stty intr DEL CHto zhe v etom horoshego? |to pokazyvaet, naskol'ko gibko rabotaet komanda stty s terminalom, i mozhet byt' ispol'zovano v kachestve lichnoj mery bezopasnosti, chtoby sbit' s tolku cheloveka, kotoryj zahotel by proizvesti kakoj-libo besporyadok s vashego terminala. Kogda vam nuzhno na minutu otojti ot terminala, izmenite klyuch preryvaniya na kakoj-libo drugoj i zapustite komandnyj fajl vrode takogo: while : do : done |tot beskonechnyj cikl budet vypolnyat'sya postoyanno. Esli kto-ni- bud' popytaetsya prervat' etot process, ispol'zuya klavishu DEL, nichego ne proizojdet. Kogda vy vernetes', nazhmite novuyu klavishu preryvaniya. Ona prervet cikl, i vy poluchite simvol priglasheniya. Ochen' vazhnym yavlyaetsya takzhe simvol "eof". On sootvetstvuet koncu fajla (end of file), i obychno im yavlyaetsya CTRL-D. |to ob®yasnyaet, poche- mu vy vyhodite iz sistemy UNIX s pomoshch'yu CTRL-D. Kogda vy posylaete CTRL-D vashemu registracionnomu shell, vy tem samym govorite emu: "Shell, eto metka konca fajla dlya dannogo seansa raboty". Poskol'ku terminal rassmatrivaetsya kak fajl, CTRL-D zakryvaet fajl, a shell, ko- toryj rabotaet kak cikl vida "chitat' komandy s klaviatury, poka ne vstretitsya EOF", zavershaetsya, tem samym posylaya signal programme init. Programma init porozhdaet komandu getty po dannoj terminal'noj linii, kotoraya vyvodit na ekran priglashenie "login:" dlya ozhidaniya komandy ot sleduyushchego pol'zovatelya. Esli vy izmenite simvol konca fajla, vy bol'- she ne smozhete vyjti iz shell po CTRL-D. On budet vyvodit'sya na ekran tochno tak zhe, kak lyuboj drugoj simvol. Vot primer takih dejstvij: $ stty eof x $ x login: Teper' priznakom konca fajla yavlyaetsya obychnyj simvol x. Kogda vy vvodite simvol x, eto ravnosil'no vvodu CTRL-D, i vy vyhodite iz sistemy. Ochevidno, takie manipulyacii nezhelatel'ny, odnako eto pozvolya- et pokazat' tu bol'shuyu stepen' gibkosti, kotoruyu ispol'zuet UNIX pri prisvoenii razlichnyh funkcij raznym simvolam. FAJLY TERMINALXNYH USTROJSTV Fizicheski adresaciya terminalov proizvoditsya posredstvom fajlov ustrojstv v kataloge /dev. Kogda vy registriruetes' v sisteme, vam prisvaivaetsya opredelennyj nomer terminala, naprimer tty01. |tot nomer terminala v dejstvitel'nosti yavlyaetsya fajlom /dev/tty01. Esli vy vyzo- vete komandu tty UNIX, ona vyvedet polnoe marshrutnoe imya fajla togo terminal'nogo ustrojstva, za kotorym vy rabotaete. Fajly terminal'nyh ustrojstv vyglyadyat tak zhe, kak obychnye fajly, za isklyucheniem togo, chto komanda "ls -l" pokazyvaet, kak nazyvayutsya starshij i mladshij nomera ustrojstva, kotorye ne yavlyayutsya chast'yu obych- nyh fajlov. Starshij nomer yavlyaetsya indeksom v tablice cdevsw[], koto- raya soderzhit adres drajvera ustrojstva, ispol'zuemogo yadrom dlya danno- go tipa ustrojstva. Mladshij nomer identificiruet konkretnoe fizicheskoe ustrojstvo. |ti nomera poyavlyayutsya v posledovatel'nom poryadke dlya vseh ustrojstv, ispol'zuyushchih odin i tot zhe drajver. Tak vyglyadit tipichnyj spisok fajlov ustrojstv v sisteme XENIX: ---------------------------- | | crw--w--w- 1 russ tricks 0, 0 Jun 22 02:34 /dev/console | crw--w--w- 1 russ tricks 0, 1 Jun 22 00:41 /dev/tty02 | crw--w--w- 1 root tricks 0, 2 Jun 21 17:56 /dev/tty03 | crw--w--w- 1 root tricks 0, 3 Jun 21 05:47 /dev/tty04 | crw-rw-rw- 1 root root 0, 4 Feb 18 17:09 /dev/tty05 | crw-rw-rw- 1 root root 0, 5 Feb 18 17:09 /dev/tty06 | crw-rw-rw- 2 root root 5, 0 Jun 21 20:23 /dev/tty11 | crw--w--w- 2 root tricks 5, 8 Jun 22 02:20 /dev/tty12 | crw-rw-rw- 2 root root 5,128 Feb 18 17:09 /dev/tty13 | crw-rw-rw- 2 root root 5,136 Feb 18 17:09 /dev/tty14 | Po simvolu 'c' v pervom stolbce my vidim, chto eto simvol'nye ust- rojstva, a bity prav dostupa pokazyvayut, kto imeet dostup k etim faj- lam. Pervyj stolbec chisel (0 ili 5) yavlyaetsya starshim nomerom. Mladshie nomera v sleduyushchem stolbce obychno sleduyut v posledovatel'nom poryadke, no ne vsegda (kak vidno v dannom primere). V dopolnenie k ispol'zovaniyu absolyutnogo nomera vashego terminala, odno iz ustrojstv ispol'zuetsya v kachestve "logicheskogo", ili "rodovo- go" adresa vashego terminala. Ono ispol'zuet drugoj drajver ustrojstva, nazyvaetsya /dev/tty i primenyaetsya v sluchayah, kogda standartnyj vvod i standartnyj vyvod pereadresovyvayutsya v drugie fajly, a prikladnoj programme neobhodimo chitat' s klaviatury ili pisat' na ekran. Pri po- moshchi dostupa k fajlu /dev/tty obrazuetsya svyaz' s samim terminalom. Vy- bor ispol'zovaniya ustrojstva s imenem tty vmesto ustrojstva tty01 glavnym obrazom zavisit ot togo, kakaya stoit zadacha. Esli vam neobho- dimo imet' nezavisimuyu ot tipa terminala programmu, ispol'zujte /dev/tty. PRAVA DOSTUPA K TERMINALU Poskol'ku terminal'noe ustrojstvo yavlyaetsya fajlom, ono imeet re- zhimy prav dostupa tochno tak zhe, kak i vse drugie fajly. |ti rezhimy predstavlyayut soboj zashchitu dostupa k vashemu terminalu. Esli vse pol'zo- vateli imeyut pravo zapisi na vash terminal (eto oboznachaetsya kak rw--w--w-), to oni mogut zapisat' na vash ekran vse, chto ugodno, i vy nikogda ne uznaete, kto eto sdelal. Esli vy hotite predupredit' eto, to vypolnite komandu "chmod 600 `tty`", gde simvoly udareniya i obozna- chenie tty sootvetstvuyut marshrutnomu imeni vashego terminal'nogo fajla. Bolee prostoj v ispol'zovanii yavlyaetsya komanda UNIX'a mesg. Komanda "mesg n" zapreshchaet zapis' izvne na vash terminal. Vashi sobstvennye pro- cessy po-prezhnemu imeyut dostup na zapis'. Prava dostupa k terminalu svyazany takzhe s problemoj bezopasnosti, kotoruyu my rassmotrim v glave 9. Poka chto otmetim, chto vsyakij raz, kogda vy otkryvaete fajl (to li dlya chteniya, to li dlya zapisi), vam vozvrashchaetsya deskriptor fajla. Zatem vy mozhete ispol'zovat' etot desk- riptor fajla v sistemnom vyzove ioctl. Poluchenie etogo deskriptora fajla podobno polucheniyu klyucha k terminal'nomu interfejsu opredelennogo pol'zovatelya. Lyubye izmeneniya, proizvodimye s pomoshch'yu ioctl s dannym deskriptorom fajla, vyzyvayut nemedlennyj effekt, i narushitel' zashchity mozhet chitat' vse, chto zapisyvaetsya ili schityvaetsya s vashego terminala ili dazhe zastavit' vash terminal vypolnyat' komandy, kotorye prisvaivayut sebe nerazreshennye prava! Pol'zovatel', kotoryj rabotaet s etim termi- nalom, mozhet nikogda ne uznat', chto zhe proizoshlo ili kto eto sdelal. Drugim primerom podobnogo roda yavlyaetsya komanda write(1). Ona ispol'zuetsya dlya ustanovki svyazi po linii v real'nom rezhime vremeni, ili "boltovni". Ona obshchaetsya s terminalom putem vypolneniya zapisi v fajl ustrojstva. Izmenite bity prav dostupa, vyklyuchiv ih komandoj "mesg n", i nikto ne smozhet vypolnit' komandu write s vashim termina- lom. Takim sposobom vy mozhete "snyat' trubku telefona", kogda vy hoti- te, chtoby vam ne meshali. Vmeste s tem kto-nibud' mog by sdelat' takoe: $ while : > do > clear > /dev/tty00 > done & Pri etom sozdaetsya fonovyj beskonechnyj process (poka on ne budet prek- rashchen komandoj kill ili vyhodom iz sistemy), kotoryj posylaet pol'zo- vatelyu terminala tty00 simvoly ochistki ekrana. Kak tol'ko etot pol'zo- vatel' chto-nibud' nabiraet na ekrane, on tut zhe ochishchaetsya. Bol'shinstvo pol'zovatelej ne mogut dazhe ponyat', chto proishodit. Esli eto sluchitsya s vami, popytajtes' otklyuchit' prava dostupa k vashemu terminalu. Esli zhe tot, kto eto delaet, yavlyaetsya superpol'zovatelem (root), to nikakie prava dostupa ne smogut ostanovit' ego, poskol'ku superpol'zovatel' ne imeet ogranichenij po pravam dostupa k fajlam. V etom sluchae voznikaet problema dlya sistemnogo administratora! Eshche odna strannaya veshch' nablyudaetsya v sluchae, kogda kto-libo posy- laet chto-to na vash terminal komandoj write, a vy otklyuchaete prava dostupa. Komanda write po-prezhnemu imeet dostup k vashemu terminalu, poka ona ne zakroet ustrojstvo. Posle zakrytiya ona bol'she ne imeet prav dlya otkrytiya ustrojstva. Predstavlyaetsya strannym fakt, chto posle polucheniya dostupa k terminalu posleduyushchee zapreshchenie prava dostupa ne okazyvaet nikakogo vozdejstviya do teh por, poka vy ne prekratite rabo- tu s terminalom. OTMETKI O VREMENI DOSTUPA K TERMINALU Eshche odnim atributom terminalov, kotoryj vyzvan tem, chto terminaly - eto fajly, yavlyayutsya daty modifikacii, dostupa i obnovleniya. Kazhdyj fajl v sisteme imeet eti tri daty, kotorye soderzhatsya v ego indeksnom deskriptore (v sekundah) v vide DLINNYH (long) chisel. |ti daty mogut soderzhat' nekotoruyu interesnuyu informaciyu. Kak by- lo otmecheno pri opisanii komandnogo fajla activ v predydushchej glave, data modifikacii predstavlyaet soboj poslednij moment vremeni, kogda pol'zovatel' chto-to nabiral na svoej klaviature. Drugie daty tozhe koe-chto oznachayut, no oni ne tak chasto ispol'zuyutsya. OBRABOTKA TERMINALOM VVODIMOJ INFORMACII Kak uzhe obsuzhdalos' ranee, po umolchaniyu drajver terminala rabota- et v kanonicheskom rezhime, t.e. v rezhime postrochnoj obrabotki. Kogda vy vvodite simvoly, drajver ozhidaet, poka vy nazhmete vozvrat karetki, posle chego peredaet dlya obrabotki vsyu stroku. Esli vy rabotaete ne v kanonicheskom rezhime, to kazhdyj simvol peredaetsya dlya obrabotki ne- posredstvenno posle vvoda. Naglyadnym primerom takogo rezhima raboty yav- lyaetsya redaktor vi. Vy nazhimaete po odnoj klavishe dlya dvizheniya kurso- ra, udaleniya simvolov i t.d., poetomu redaktor vi, ochevidno, dolzhen poluchat' kazhdyj simvol srazu zhe, kak tol'ko nazhata klavisha. Kakim obrazom eto delaetsya v programme? Priem staryj i chasto ispol'zuetsya v UNIX, hotya i ne ochen' horosho opisan v dokumentacii. Ta- kogo roda informaciyu mozhno dobyt' putem prosmotra bol'shogo kolichestva tekstov programm. Neobhodimo otmetit', chto etot priem luchshe vsego ra- botaet v programmah na yazyke Si. Komandnye fajly, napisannye na yazyke shell, mogut ispol'zovat' dlya etoj celi komandu stty, no rezul'tat bu- det ne odin i tot zhe. Sleduyushchij fragment programmy na yazyke Si otklyu- chaet kanonicheskuyu obrabotku, zatem chitaet simvoly i vyvodit ih na ek- ran. 1 #include 3 struct termio tsav, tchg; 5 main (argc, argv) 6 { 7 int c; 9 if (ioctl (0, TCGETA, &tsav) == -1) { 10 perror("can't get original settings"); nevozmozhno poluchit' ishodnye ustanovki 11 exit(1); 12 } 14 tchg = tsav; 16 tchg.c_lflag &= ~(ICANON | ECHO); 17 tchg.c_cc[VMIN] = 1; 18 tchg.c_cc[VTIME] = 0; 20 if (ioctl (0, TCSETA, &tchg) == -1) { 21 perror("can't initiate new settings"); nevozmozhno zadat' novye ustanovki 22 } 24 while (1) 25 { 26 c = getchar(); 28 if (c == 'x') 29 break; 31 putchar(c); 32 } 34 if (ioctl(0, TCSETA, &tsav) == -1) { 35 perror("can't reset original settings"); nevozmozhno vernut' ishodnye ustanovki 36 exit(3); 37 } 38 } U nas est' dve "terminal'nye" struktury dannyh, odna iz kotoryh soderzhit ishodnye ustanovki, a drugaya - ustanovki, kotorye my izmenyaem i zapisyvaem. Pervyj sistemnyj vyzov ioctl poluchaet informaciyu ob ustanovkah terminala. Zatem my prisvaivaem eti znacheniya izmenyaemoj strukture (stroka 14). Modifikacii terminal'nogo interfejsa my vypol- nyaem v strokah 16-18. Stroka 16 otklyuchaet kanonicheskuyu obrabotku i eho-otobrazhenie simvolov. Stroka 17 ustanavlivaet, chto minimal'noe ko- lichestvo nazhatij na klavishi ravno odnomu. Stroka 18 opredelyaet, chto vremya ozhidaniya dlya povtornogo chteniya dannyh ravno 0. Po sushchestvu, eto blochnoe chtenie po odnomu simvolu. Novye znacheniya terminal'nyh harakteristik ustanavlivayutsya v stro- ke 20. V etot moment rezhim raboty terminala menyaetsya. Cikl while chita- et, proveryaet i vyvodit simvoly. Tol'ko pri vvode simvola x cikl za- vershaetsya, terminal ustanavlivaetsya v pervonachal'noe sostoyanie, i programma zakanchivaet rabotu. Kak my uzhe zametili, operaciya chteniya zdes' yavlyaetsya blochnoj. |to znachit, chto programma ozhidaet, poka vy vvedete simvol. Esli vy nichego ne vvodite, programma nahoditsya v beskonechnom cikle ozhidaniya. Kakim obrazom my izmenyaem rezhim chteniya s blochnogo na posimvol'nyj? |tot vopros ekvivalenten takomu voprosu: "Kak oprosit' klaviaturu v UNIX?". Opros yavlyaetsya ves'ma vazhnym priemom dlya nekotoryh primene- nij. Opros rabotaet primerno tak: "Posmotret' na klaviaturu. Esli vve- den simvol, poluchit' ego i kakim-to obrazom obrabotat'. V protivnom sluchae prodolzhat' delat' to, chto vy delali. Posle istecheniya intervala vremeni, opredelennogo programmoj, proverit' klaviaturu snova." Takim obrazom, esli pol'zovatel' ne nazhimaet na klavishi, programma prodolzha- et rabotu, a ne ozhidaet, poka chto-nibud' budet nazhato na klaviature. Dlya vypolneniya takoj raboty nam nuzhno neskol'ko bolee podrobno rassmotret' terminal'nyj interfejs. Kak bylo otmecheno ranee, terminal predstavlyaet soboj fajl. |to znachit, chto on dolzhen obladat' vsemi obychnymi svojstvami fajlov - vozmozhnost'yu otkrytiya, zakrytiya, chteniya, zapisi i t.d. My takzhe videli, chto terminaly imeyut protokol raboty, kotoryj mozhet byt' izmenen komandoj stty. My videli, chto dlya polucheniya odnogo simvola s klaviatury ispol'zuetsya protokol raboty. Teper' my uvidim, chto dlya vypolneniya oprosa vy dolzhny ispol'zovat' tehniku, ko- toraya otnositsya k fajlam, a ne ioctl. Sekret zdes' v tom, chtoby otkryt' terminal'nyj fajl, izmenyaya re- zhim ego otkrytiya. Zatem dlya polucheniya odnogo simvola ispol'zuetsya tot zhe tekst, chto i v predydushchem sluchae - tem samym opros dostignut. Vot tekst programmy: 1 #include 2 #include 4 struct termio tsav, tchg; 6 main (argc, argv) 7 { 8 int c; 10 /* change the terminal based on file primitives */ izmenit' rezhim terminala s pomoshch'yu fajlovyh primitivov 11 close(0); 12 if (open("/dev/tty",O_RDWR|O_NDELAY) == -1) { 13 perror("can't open tty"); nevozmozhno otkryt' tty 14 exit(1); 15 } 17 /* change the terminal based on line disciplines */ izmenit' rezhim terminala s pomoshch'yu protokola raboty 18 if (ioctl (0, TCGETA, &tsav) == -1) { 19 perror("can't get original settings"); nevozmozhno poluchit' ishodnye ustanovki 20 exit(2); 21 } 23 tchg = tsav; 25 tchg.c_lflag &= ~(ICANON | ECHO); 26 tchg.c_cc[VMIN] = 1; 27 tchg.c_cc[VTIME] = 0; 29 if (ioctl (0, TCSETA, &tchg) == -1) { 30 perror(can't initiate new settings"); nevozmozhno zadat' novye ustanovki 31 } 33 while (1) 34 { 35 putchar('.'); 36 c = getchar(); 38 if (c == 'x') 39 break; 41 putchar(c); 42 } 44 if (ioctl(0, TCSETA, &tsav) == -1) { 45 perror("can't reset original settings"); nevozmozhno vernut' ishodnye ustanovki 46 exit(3); 47 } 48 } Osnovnoe izmenenie proizvoditsya v strokah 11-15. Zakrytie fajla s nulevym deskriptorom (kotoryj oboznachaet standartnoe ustrojstvo vvoda) zakryvaet standartnyj vvod. Zatem my snova otkryvaem fajl /dev/tty. Znachenie deskriptora fajla ravno nulyu, tak chto my perenaznachili stan- dartnyj vvod na novoe ustrojstvo. Fokus v tom, chto pri otkrytii fajla ispol'zuetsya rezhim, nazyvaemyj NODELAY. |to oznachaet, chto kogda vypol- nyaetsya chtenie po dannomu deskriptoru fajla (t.e. chtenie standartnogo vvoda), vmesto ozhidaniya vvoda vypolnyaetsya prosmotr, est' li tam chto-nibud', a zatem rabota prodolzhaetsya. V beskonechnom cikle stroka 35 pechataet tochku. Kogda vy zapuskaete etu programmu, na ekran vyvoditsya tochka, kak tol'ko programma popadaet v cikl. Esli vy zhdete, to prodolzhayut vyvodit'sya tochki. Kak tol'ko vy nazhmete klavishu, vypolnitsya eho-otobrazhenie simvola v promezhutke mezhdu vyvodom tochek. |to demonstriruet, chto programma rabotaet v to vremya, kogda vy nichego ne delaete. VOZMOZHNOSTI TERMINALOV Teper', kogda my imeem ponyatie o harakteristikah terminal'nyh in- terfejsov, davajte perejdem k vozmozhnostyam terminalov. VOZMOZHNOSTI - eto te funkcii, kotorye vypolnyaet apparatura terminala. Esli my znaem etu informaciyu, my mozhem sozdat' spisok vozmozhnyh funkcij i ispol'zo- vat' ego, naprimer, dlya raboty redaktora vi. |to osushchestvlyaetsya pri pomoshchi special'nogo fajla dannyh termcap (terminal capabilities - voz- mozhnosti terminala), kotoryj opisyvaet vozmozhnosti terminala. Bol'shinstvo iz sushchestvuyushchih tipov terminalov uzhe zaneseny v fajl termcap. |to fajl /etc/termcap. Fajl termcap i redaktor vi proishodyat iz sistemy Berkeley. Takaya kombinaciya okazalas' nastol'ko effektivnoj, chto byla perenesena v System V. V bolee pozdnej System V Release 3 fajl termcap uzhe ne ispol'zuetsya, ego zamenyaet fajl terminfo firmy AT&T. My primenyali fajl terminfo sovmestno s komandnym fajlom today v glave 5, no podrobnoe obsuzhdenie terminfo vyhodit za predely nashej knigi. V sisteme Berkeley fajl termcap po-prezhnemu ostaetsya standar- tom, i on zasluzhivaet bolee detal'nogo rassmotreniya. Imeetsya dokumentaciya po termcap, no ne dumajte, chto vy iz nee mnogo uznaete. V dokumentacii privodyatsya imena i odnostrochnye opisaniya podderzhivaemyh funkcij, no net informacii o tom, kak formirovat' iz nichego zapisi etogo fajla. Samoe luchshee, chto my mozhem posovetovat', eto vzyat' imeyushchuyusya zapis' i izmenit' ee. V kachestve primera my privodim zapis' fajla termcap dlya komp'yute- ra Apple II. |to opisanie rasprostraneno v razlichnyh formah, no nash primer otnositsya k videoplate Videx UltraTerm dlya Apple II+. Zametim, chto vozmozhnosti, predostavlyaemye fajlom termcap, yavlyayutsya obychno podm- nozhestvom teh vozmozhnostej, kotorye fakticheski predostavlyaet apparatu- ra. V chastnosti, videoplata v komp'yutere Apple vypolnyaet nekotorye funkcii, kotorye ne umeet delat' fajl termcap, naprimer kombinacii nastroechnyh bitov dlya izmeneniya videoatributov. Samoe bol'shee, chto my mozhem sdelat' s videoatributami posredstvom fajla termcap, eto vklyu- chit' ili vyklyuchit' inversnoe otobrazhenie. S drugoj storony, nekotorye tipy apparatury ne obladayut vsemi vozmozhnostyami, obespechivaemymi fajlom termcap. Naprimer, odnoj iz funkcij, kotoroj nedostaet v Apple, yavlyaetsya funkciya prokrutki ("scroll reverse"). Apparatura ne delaet etogo, poetomu i v termcap net neobhodimosti imet' opisanie etoj funkcii. Vmesto skrollinga (prokrutki) vniz, otobrazhaemyj na ekrane tekst prodolzhaet vyvodit'sya v verhnej stroke. Dlya togo, chtoby poluchit' predstavlenie o tom, kak termcap soot- nosit obshchie harakteristiki terminala s konkretnymi vozmozhnostyami, sravnim terminaly Apple i vt52. Dve sootvetstvuyushchie zapisi v termcap imeyut mnogo pohozhih funkcij, no sovershenno raznye kody dlya ih vypolne- niya. Privedem primer soderzhimogo fajla termcap: a2|aii|Apple II with UltraTerm :\ :bl=^G:\ :bs:\ :cd=^K:\ :ce=^]:\ :cl=^L:\ :cm=^^%r%+ %+ :\ :co#80:\ :cr=^M:\ :do=^J:\ :ho=^Y:\ :kb=^H:\ :kd=^J:\ :kl=^H:\ :kr=^\\:\ :ku=^_:\ :le=^H:\ :li#24:\ :nd=^\\:\ :nl=^J:\ :se=^O:\ :so=^N:\ :up=^_: V tabl. 7-1 predstavlen spisok funkcij fajla termcap s sopostav- leniem terminalov Apple i vt52. Esli kakaya-libo funkciya otsutstvuet u odnogo ili drugogo terminala, eto otmechaetsya slovom "net". Tablica 7-1 Terminal'nye vozmozhnosti i ih konkretnye znacheniya ------------------------------------------------------------- Funkciya Apple II vt52 ------------------------------------------------------------- bl - zvukovoj signal ^G ^G (bell) bs - vozvrat na shag po kodu ^H da da (can backspace with ^H) cd - ochistka do konca ekrana ^K \EJ (clear to end of display) ce - ochistka do konca stroki ^] \EK (clear to end of line) cl - ochistka vsego ekrana ^L \EH\EJ (clear entire screen) cm - dvizhenie kursora ^^%r%+ %+ \EY%+ %+ (cursor motion) co - chislo pozicij v stroke #80 #80 (number of columns in a line) cr - vozvrat karetki ^M ^M (carriage return) do - sdvig na stroku vniz ^J ^J (down one line) ho - kursor v nachalo ekrana (bez komandy cm) ^Y \EH (home cursor) kb - kod klavishi backspace ^H ^H (sent by backspace key) kd - kod klavishi "strelka vniz" ^J \EB (sent by down arrow key) kl - kod klavishi "strelka vlevo" ^H \ED (sent by left arrow key) kr - kod klavishi "strelka vpravo" ^\\ \EC (sent by right arrow key) ku - kod klavishi "strelka vverh" ^_ \EA (sent by up arrow key) le - kursor vlevo ^H ^H (cursor left) li - chislo