Konspektai

Programavimas Unix OS

9.8   (2 atsiliepimai)
Programavimas Unix OS 1 puslapis
Programavimas Unix OS 2 puslapis
Programavimas Unix OS 3 puslapis
Programavimas Unix OS 4 puslapis
Programavimas Unix OS 5 puslapis
Programavimas Unix OS 6 puslapis
Programavimas Unix OS 7 puslapis
Programavimas Unix OS 8 puslapis
Programavimas Unix OS 9 puslapis
Programavimas Unix OS 10 puslapis
Programavimas Unix OS 11 puslapis
Programavimas Unix OS 12 puslapis
Programavimas Unix OS 13 puslapis
Programavimas Unix OS 14 puslapis
Programavimas Unix OS 15 puslapis
Programavimas Unix OS 16 puslapis
Programavimas Unix OS 17 puslapis
Programavimas Unix OS 18 puslapis
Programavimas Unix OS 19 puslapis
Programavimas Unix OS 20 puslapis
www.nemoku.lt
www.nemoku.lt
Aukščiau pateiktos peržiūros nuotraukos yra sumažintos kokybės. Norėdami matyti visą darbą, spustelkite peržiūrėti darbą.
Ištrauka

1. Įvadas 1.1. Apie šį kursą Šis kursas skirtas kompiuterių mokslo trečio–ketvirto kursų studentams. Reikalingas programavimo principų supratimas bei C programavimo kalbos bei standartinės bibliote- kos žinojimas. Pageidautina pažintis su Unix vartotojo aplinka. Išklausęs šį kursą, studentas turėtų mokėti naudotis Unix programuotojo aplinkos įrankiais bei sugebėti rašyti programas panaudojančias Unix sistemų procesų valdymo, gijų, tinklo bei tarpprocesinio bendravimo paslaugas. 1.2. Tipografiniai susitarimai Šiame konspekte ls(1), bind(2) ir sprintf(3) pavidalo užrašai reiškia ko- mandas, sistemines ir bibliotekines funkcijas. Skaičius skliausteliuose — man vadovo skyriaus numeris. Interaktyvių sesijų iliustracijose riebiu šriftu spausdinamos vartotojo įvedamos ko- mandos, o normaliu — programų spausdinami duomenys, pavyzdžiui: root@fleksija:˜# id uid=0(root) gid=0(root) groups=0(root) 2. Unix pradmenys 2.1. Istorija Parengiant šį skyrių buvo remtasi [HHU], [BSD], bei [TAOUP]. Unix raida prasidėjo 1969 metais AT&T Bell Labs, kai Ken Thompson ant jau atgyve- nusios PDP-7 mašinos asembleriu pradėjo kurti operacinę sistemą, besiremdamas Multics projekto patirtimi ir bandydamas apjungti sėkmingus sprendimus iš kitų operacinių siste- mų. 1972–1974 metais Thompson kartu su Dennis Ritchie perrašė Unix’ą C kalba. Nuo to laiko prasidėjo šito garsaus dueto (t.y Unix ir C, o ne Thompsono ir Ritchie) pasaulio užkariavimas. Unix perrašymas C kalba buvo revoliucinis žingsnis. Unix buvo kaipmat perkelta į keletą kitų architekt ūrų, o tai atv̇erė naujas galimybes: vienoda aplinka besikeičiant aparat ūrai. Iki tol praktiškai su kiekvienu aparat ūros atnaujinimu vartotojai gaudavo ir visiškai naują aplinką. Kadangi tuo metu AT&T buvo telefonų kompanija, dėl antimonopolinių įstatymų jai buvo draudžiama uždirbinėti pinigus iš programų k ūrimo, toḋel į Unix nebuvo ži ūrima kaip į verslo šaltinį. 1975 m. AT&T pasi ūl̇e Unix kartu su išeities tekstais universitetams už labai mažą kainą. 1979m. Version Seven licencija universitetams kainavo $100, tuo tarpu kai valstybinėms ir komercinėms įmonėms licencija kainavo $21000. Apie 1977 m. UCB (Kalifornijos universitetas Berklyje) pasi ūl̇e savo Unix variantą, BSD (Berkeley Software Distribution). 1978 UCB nusipirko VAX’ą1 ir parašė virtualios 1DEC VAX (Virtual Address eXtention) — vienas iš pirmųjų, ir bene populiariausias, minikompiuteris su 32 bitų adresų erdve ir aparatine atminties apsauga. 4 atminties posistemę jam. Po to UCB gavo kontraktą iš DARPA2 ir suk ūṙe tinklo palai- kymą, greitą failų sistemą, bei padarė kitus patobulinimus. 1983 išėjus sistema 4.2BSD užtemdė net komercines USL Unix versijas. Po kurio laiko (1986) AT&T inkorporavo Berklio patobulinimus į savo sistemą (Sys- tem III ir System V), ir komercinis pasaulis vėl persimetė prie AT&T versijos. Bet BSD k ūrimas nesustojo. 1991 metais Berklis išval̇e BSD išeities tekstus nuo AT&T kodo ir išleido rezultatą Net/2 pavadinimu. Po to sekė 4.4BSD, atsišakojo Net/Free/OpenBSD projektai, bylinėjimasis su AT&T, ir galų gale išėjo 4.4BSD-Lite, kuri yra dabartinių BSD sistemų pagrindas. 1984 m. buvęs MIT (Masačiusetso technologijos instituto) dirbtinio intelekto labo- ratorijos darbuotojas Richard M. Stallman (RMS) užsibrėžė tikslą sukurti laisvą Unix kloną – GNU sistemą. Pirmiausia buvo sukurti Emacs tekstų redaktorius, bazinės Unix komandos, C kompiliatorius ir kiti programavimo įrankiai. GNU projektas stokojo tik branduolio. Ši niša netikėtai buvo užpildyta atsiradus Linux. Kaip visiškai atskiras projektas 1991 metais suomių studento Linus Torvalds buvo pradėtas kurti Linux branduolys. Kai darbas buvo viešai išleistas su GNU GPL licencija, aplink jį susidarė gyvybinga bendruomenė, kuri tobulina ir palaiko Linux branduolį. Su- dėjus Linux kartu su GNU ir BSD vartotojo programomis išėjo visai funkcionalus Unix klonas. Kai kurie žmonės sako, kad tai yra dabartiniu metu progresyviausias Unix’as. Neabejotina, kad jis sulaukia daugiausia spaudos ir IT industrijos gigantų dėmesio. 2.2. Standartai Kas yra Unix? Operacinė sistema? Jei taip, tai kuri iš to daugelio atšakų ir variantų? Vienas iš poži ūrių yra tas, kad Unix — tai ne konkreti sistema, o apibendrinta sąsaja — tiek vartotojo, tiek programinė. Prisilaikant tokios pozicijos, Linux irgi yra Unix. Visgi kai kurios komercinės organizacijos teigia, kad Unix yra prekybinis ženklas ir tik sertifikuotos sistemos gali b ūti taip vadinamos. Yra dvi pagrindinės Unix šakos — BSD ir SysV. Jos tarpusavyje skiriasi daugeliu smulkmenų. Kiekvienas gamintojas taip pat turėjo savo Unix’o versiją, ir tai sudarė ne- patogumų. Buvo imtasi daugelio pastangų standartizuoti Unix. Ką dabar iš to turim, tai POSIX standartai. • POSIX.1 — taikomųjų programų API standartas. • POSIX.2 — vartotojo aplinka, standartinės komandos. • POSIX.1b — realaus laiko ir tarpprocesinio bendravimo interfeisai. • POSIX.1c — lygiagretaus programavimo interfeisai. Yra ir daugiau POSIX standartų, bet kai kurie dar visai neratifikuoti, kiti neprigiję gyvenime. Dar yra X/Open grupės standartai (XPG3, XPG4), kurie yra ANSI C ir POSIX standartų patikslinimai. Šiuolaikinė POSIX standartų redakcija yra neformaliai vadinama POSIX 2003, o ofi- cialiai žinoma kaip The Single UNIX Specification V. 3, ISO/IEC 9945:2003 bei IEEE Std. 1003.1, 2003 redakcija. Ji yra laisvai prieinama Internete [POSIX]. 2DARPA (Defence Advanced Research Projects Agency) yra JAV kariškių agent ūra, suk ūrusi Interneto pagrindus. 5 2.3. Unix ypatumai Unix, ko gero, yra pirmoji sistema taip plačiai panaudojusi failo sąvoką. Praktiškai bet koks objektas operacinėje sistemoje yra arba procesas arba failas3. Kas turima omeny šiuo posakiu? Apžvelgsime, kokie yra galimi failų tipai. Bet pirma reikia suprasti, kas yra Unix failų sistema. Visi failai „sudėti“ į hierarchinę katalogų strukt ūrą. Katalogų medis turi tikvieną šak- nį. Nėra jokių A:, B:, C: skirtingiems įrenginiams. Kai norima prieiti prie failų sistemos kokiame nors įrenginyje, ta failų sistema turi p ūti prijungiama (primontuojama) prie ko- kio nors katalogo mount(8) komanda (t.y. mount(2) sistemine funkcija). Prijungta failų sistema perdengia visą to katalogo, prie kurio ji buvo prijungta, turinį. Todėl daž- niausiai failų sistemos montuojamos ant tuščių katalogų. Kartais sukuriamos direktorijos /mnt/* skirtingoms failų sistemoms laikinai montuoti. Kaip yra saugomas failas failų sistemoje? Svarbiausia sąvoka yra i-mazgas (angl. inode, nuo “index node”, indeksinis mazgas). I-mazgas yra svarbiausias failo blokas, kuris laiko metainformaciją apie failą. I-mazge yra laikomi failo tipas, priėjimo teisės, savininkas, grupė, didysis ir mažasis įrenginio numeris (turi prasmės tik įrenginio failo tipui), paskutinio kreipimosi, paskutinio modifikavimo ir paskutinio i-mazgo modifikavi- mo laikai. Failo vardas nėra laikomas inode’e, bet laikomas kataloguose. Visi i-mazgai yra sunumeruoti ir failų sistema juos gali surasti pagal numerį4. Paprastai, maksimalus i-mazgų skaičius yra fiksuotas ir nustatomas failų sistemos suk ūrimo metu. Platesnį failų sistemos paaiškinimą galite rasti The Linux Kernel LDP knygoje [TLK]. 2.3.1. Failų tipai Taigi, štai kokie failų tipai yra Unix sistemose: Paprastas failas yra visiems pažįstamas vardą turintis duomenų rinkinys. Katalogas yra ne kas kita, kaip failas, laikantis i-mazgų numerių ir failų vardų lentelę. Katalogai kuriami mkdir(2) sistemine funkcija. Paprastomis failų operacijomis prie katalogo turinio prieiti negalima, tam yra specialios funkcijos opendir(3), readdir(3), closedir(3) ir t.t. Įrenginiai. Tai yra tokie objektai failų sistemoje, kurie patys duomenų nelaiko, bet sutei- kia sąsają su kažkokiais draiveriais sistemos branduolyje (Kaip PRN MS DOS’e). Pagal darbo su įrenginiu pob ūdį, įrenginių failai skirstomi į nuoseklius (angl. cha- racter device) ir blokinius (angl. block device). Nuoseklaus įrenginio pavyzdžiu galėtų b ūti terminalo įrenginys, o blokinio — magnetinių diskų įrenginys. Iš pir- mojo galima skaityti ir rašyti po vieną baitą, o pastarasis skaito ir rašo informaciją mažiausiai po vieną bloką, dažniausiai 512 baitų. Be to, blokiniuose įrenginiuose galima kreiptis į bet kurį bloką, o nuosekliuose įrenginiuose gali ir neb ūti laisvo adresavimo galimybės. 3Iš konteksto iššokanti išimtis yra tinklo interfeisai. Jie turi vardus savo erdvėje, nors savo esme yra panaš ūs į įrenginių failus. Šis tr ūkumas, visgi, yra ištaisytasPlan 9 sistemoje. 4Visgi išorinis API surasti failą pagal jo i-mazgo numerį neegzistuoja. Galima gauti tiktai turimo failo i-mazgo numerį. 6 Įrenginio failas yra priskiriamas konkrečiam draiveriui pagal įrenginio tipą (nuo- seklus arba blokinis) bei didįjį ir mažąjį įrenginio numerį, kurie laikomi įrenginio failo i-mazge. Įprasta, kad visi įrenginių failai sudėti /dev kataloge. Be įrenginių, atitinkančių tikrus aparatinius įrenginius, yra ir „virtual ūs“ įrenginiai, tokie kaip/dev/null bei /dev/zero. Pirmasis iš karto praneša apie failo pabaigą, kai bandoma iš jo skaityti, bei sėkmingai priima viską, kas į jį rašoma, o antrasis grąžina nulių seką, kai iš jo skaitoma. alga@fleksija:˜$ dd if=/dev/zero of=/dev/null bs=1K count=1024 1024+0 records in 1024+0 records out 1048576 bytes transferred in 0.002828 seconds (370787333 bytes/sec) Ši komanda perkopijuoja 1 MB nulių. Šio kopijavimo greitis parodo branduolio vi- dines sąnaudas darbui su failais, kadangi jokio fizinio įvedimo-išvedimo ši komanda nevykdo. Įrenginių failai kuriami komanda mknod(1), bei sistemine funkcija mknod(2). Pavyzdžiui, minėti įrenginių failai gali b ūti sukurti tokiomis komandomis: root@fleksija:˜# mknod /dev/zero c 1 3 root@fleksija:˜# mknod /dev/zero c 1 5 root@fleksija:˜# ls -l /dev/null /dev/zero crw-rw-rw- 1 root root 1, 3 Aug 30 18:21 /dev/null crw-rw-rw- 1 root root 1, 5 Aug 30 18:21 /dev/zero Kaip galima pastebėti, komanda ls -l išveda įrenginio failo tipą (b arba c) eilutės pradžioje, bei įrenginio didįjį ir mažąjį numerį vietoj failo dydžio. Nuorodos. Simbolinė nuoroda (angl. symbolic link, symlink) tiesiog pratęsia kelią, ku- riuo reikia kreiptis (gali b ūti failas ar katalogas). Pavyzdžiui, tarkime, yra tokia nuoroda: alga@fleksija:˜$ ls -l /usr/lib/X11 lrwxrwxrwx 1 root root 16 Sep 11 20:53 /usr/lib/X11 -> ../X11R6/lib/X11 Tada kreipiantis į failą /usr/lib/X11/xkb/symbols/lt iš tiesų bus kreipia- masi į /usr/lib/../X11R6/lib/X11/symbols/lt, arba, normalizavus šį kelią, į /usr/X11R6/lib/X11/symbols/lt. Simbolinės nuorodos kuriamos komanda ln su raktu -s. Pavyzdžiui, norint sukurti aukščiau parodytą nuorodą, reikia įvykdyti tokias komandas: root@fleksija:˜# ln -s ../X11R6/lib/X11 /usr/lib/X11 Programose simbolinėms nuorodoms kurti yra naudojama symlink(2) sisteminė funkcija. Yra ir kitas nuorodų tipas, vadinamos kietos nuorodos (angl. hard link). Jos ku- riamos komanda ln be rakto -s, bei sistemos funkcija link(2). Šios nuorodos, skirtingai nuo simbolinių, nėra ypatingas failo tipas, tai tiktai nauji įrašai direktori- jose, rodantys į tą patį i-mazgą. 7 Paminėtina, kad ir sisteminė funkcija failo ištrynimui vadinasi unlink(2). Ši funkcija pašalina failą iš katalogo, o jis ištrinamas iš disko tik tuo atveju, jei jo kietų nuorodų skaičius tampa lygus nuliui. alga@fleksija:˜$ echo turinys > pvz alga@fleksija:˜$ ls -l pvz* -rw-rw-r-- 1 alga alga 8 Dec 13 22:19 pvz alga@fleksija:˜$ ln pvz pvz2 alga@fleksija:˜$ ls -l pvz* -rw-rw-r-- 2 alga alga 8 Dec 13 22:19 pvz -rw-rw-r-- 2 alga alga 8 Dec 13 22:19 pvz2 alga@fleksija:˜$ chmod o-r pvz2 alga@fleksija:˜$ ls -l pvz* -rw-rw---- 2 alga alga 8 Dec 13 22:19 pvz -rw-rw---- 2 alga alga 8 Dec 13 22:19 pvz2 alga@fleksija:˜$ rm pvz alga@fleksija:˜$ ls -l pvz* -rw-rw---- 1 alga alga 8 Dec 13 22:19 pvz2 Failo kietų nuorodų skaičius yra rodomas ls -l komandos išvedamos informaci- jos antrame stulpelyje. Pastebėkime, kad visos to paties failo nuorodos turi bendrą priėjimo teisių ir priėjimo laiko informaciją, nes ji yra laikoma i-mazge. Įvardinti konvejeriai (angl. named pipes). Kitaip vadinami FIFO. Konvejeris — virtu- alus kanalas, kurį vienas procesas gali atsidaryti rašymui, o kitas — skaitymui. Kol nebus kas nors įrašyta, skaitytojas blokuosis. Rašytojas taip pat blokuosis, kai užsi- pildys konvejerio buferis. Įvardinti konvejeriai taip pat kuriami sistemine funkcija mknod(2) arba komanda mknod(1): alga@fleksija:˜$ mknod fifo p alga@fleksija:˜$ ls -l fifo prw-rw-r-- 1 alga alga 0 Dec 13 22:04 fifo alga@fleksija:˜$ echo "Laba diena" > fifo Tada atskirame komandų interpretatoriuje galima paleisti procesą, kuris skaitytų iš šio įvardinto konvejerio: alga@fleksija:˜$ cat fifo Laba diena Komanda echo "Laba diena" pasibaigs tik tada, kai bus paleista komanda cat fifo. Lizdai (sockets). Tai yra tarpprocesinio bendravimo ir tinklo API pasireiškimas. Šio tipo failai — AF_UNIX protokolų šeimos lizdai. Jų atsiradimą galima pailiustruoti šia Python programėle: #!/usr/bin/env python from socket import socket, AF_UNIX, SOCK_STREAM sock = socket(AF_UNIX, SOCK_STREAM) sock.bind("/tmp/lizdas") sock.close() Šią programą įvykdžius failų sistemoje atsiras lizdo failas: 8 alga@fleksija:˜$ ls -l /tmp/lizdas srwxrwxr-x 1 alga alga 0 Nov 17 00:21 /tmp/lizdas Plačiau apie lizdus bus kalbama 6 skyriuje. Labiausiai failo sąvokos platumą pavaizduoja skirtingų virtualių failų sistemų egzista- vimas. Tai yra /proc failų sistema, NFS, Portal failų sistema ir t.t. /proc failų sistema atrodo kaip paprastų tekstinių failų ir katalogų rinkinys, bet iš tiesų jos failai yra gene- ruojami branduolio kai į juos kreipiamasi. Juose pateikiama pagal proceso ID sutvarkyta informacija apie procesus, o taip pat informacija apie branduolio skirtingų posistemių b ūklę. Per kai kuriuos/proc failų sistemos failus galima ir derinti tų posistemių veik- lą į juos rašant. Linux 2.6 versijoje papildoma informacija iškelta į atskirą /sys failų sistemą. NFS (Network File System) yra Sun firmos sukurta tinklinė failų sistema optimizuota greičiui, naudojanti UDP protokolą perdavimui, bei teisėtai susilaukusi tokių pravardžių, kaip No File Security, Nightmare File System ir taip toliau. PortalFS yra BSD sistemų draiveris, leidžiantis vartotojui pateikti savo „failų siste- mos“ kodo realizaciją ir tokiu b ūdu pateikti bet kokią informaciją per standartinį failų sistemos interfeisą. 2.4. Filosofija Unix yra idėjiškai stipri ir konceptualiai vieninga tradicija. Panagrinėkime, ką apie ją kalba jos pradininkai [TAOUP]. Doug McIlroy, konvejerių išradėjas, apie Unix filosofiją rašė taip: (i) Stenkis, kad kiekviena programa darytų vieną dalyką gerai. Naujam darbui kurk naujai, užuot painiojęs senas programas pridėdamas naujas gali- mybes. (ii) Tikėkis, kad kiekvienos programos išvestis taps kitos, dar nežinomos, programos įeitimi. Nevelk išvesties nereikalinga informacija. Venk griežtų stulpelinių ar dvejetainių įvesties formatų. Nereikalauk interaktyvios įvesties. (iii) Projektuok ir kurk programas, net operacines sistemas, kad jas galima b ūtų pabandyti kuo ankšciau, geriausiai — savaičių bėgyje. Nedvejodamas išmesk nerangias dalis ir pastatyk jas iš naujo. (iv) Naudok įrankius, o ne nekvalifikuotą pagalbą, programavimo darbui palengvinti, net jei teks nukrypti nuo kelio tam, kad sukurtum įrankius, be to, tikėkis dalį jų išmesti, kai baigsi jais naudotis. Vėliau jis tai apibendrino taip: Štai Unix filosofija: rašyk programas, kurios daro vieną dalyką ir daro jį gerai. Rašyk programas, kurios dirba kartu. Rašyk programas, kurios apdo- roja tekstinius srautus, nes tai universalioji sąsaja. Rob Pike, C programavimo ekspertas, pateikia kiek kitą perspektyvą: 9 Taisyklė 1. Neįmanoma nuspėti, kur programa leis laiką. Greitaveikos siaurumos (bottlenecks) atsiranda stebinančiose vietose, taigi nebandyk spė- lioti ir optimizuoti, kol neįrodei, kad toje vietoje tikrai yra siauruma. Taisyklė 2. Matuok. Neoptimizuok greičiui, kol nematavai, ir net tada neoptimizuok, jei nei viena programos dalis neužgožia likusių. Taisyklė 3. Gudr ūs algoritmai l̇eti, kai n yra mažas, o n dažniausiai yra mažas. Kol nežinai, kad n dažnai bus didelis, neb ūk gudrus. (Net jei žinai, kad n bus didelis, naudok taisyklę 2). Taisyklė 4. Gudr ūs algoritmai turi daugiau klaidų, nei paprasti, ir juos daug sunkiau įgyvendinti. Naudok paprastus algoritmus ir paprastas duome- nų strukt ūras. Taisyklė 5. Duomenys dominuoja. Jei pasirinkai teisingas duomenų struk- t ūras ir gerai suorganizavai dalykus, algoritmai dažniausiai bus akivaizd ūs. Duomenų strukt ūros, o ne algoritmai, yra svarbiausi programavime. Taisyklė 6. Taisyklės 6 nėra. Ketvirtąją taisyklę glausčiausiai išreiškė Unix suk ūṙejas Ken Thompson: Abejoji — naudok grubią jėgą. (When in doubt, use brute force.) Naudinga taip pat pažvelgti, ką apie Unix stovyklą sakė žmonės iš kitų „kult ūrų“. Joel Spolsky, garsus Windows programuotojas rašantis straipsnius apie programavimą ir programų inžineriją, pastebi, kad Unix tradicijoje stengiamasi palengvinti gyvenimą programuotojui, o Windows tradicijoje yra pirmiausia galvojama apie galutinį vartotoją [Spolsky]: Tarkime, paimate Unix programuotoją ir Windows programuotoją ir duo- date kiekvienam užduotį sukurti tą pačią programą vartotojui. Unix progra- muotojas sukurs komandinės eilutės ar tekstinės sąsajos branduolį, ir, vėliau, kaip pagerinimą, sukurs grafinę sąsają, kuri valdys branduolį. Tokiu b ūdu, pagrindinės programos funkcijos bus prieinamos kitiems programuotojams, kurie galės kviesti programą komandinėje eilutėje ir skaityti rezultatus teksti- niu pavidalu. Windows programuotojas bus linkęs pradėti grafine sąsaja, ir tik vėliau, kaip pagerinimą, pridės skriptų kalbą, kuri leis automatizuoti grafinę sąsają. Tai yra adekvatu kult ūroje, kur 99,999% vartotojų ṅera programuoto- jai ir nenori jais tapti. Kaip priešpastatymą idealistinei Lisp „teisingo dalyko“ kult ūrai žymus Lisp prog- ramuotojas Richard P. Gabriel pateikė karikat ūrizuotą Unix k ūrimo vertybių sistemą — „blogiau yra geriau“ [WIB]: • Paprastumas — projektas (design) turi b ūti paprastas, tiek jo įgyvendinimas, tiek sąsaja. Svarbiau, kad b ūtų paprastas įgyvendinimas, o ne sąsaja. Projektuojant, paprastumas yra svarbiausias dalykas. • Korektiškumas — projektas turi b ūti korektiškas visais stebimais aspektais. Svar- biau b ūti paprastam, nei korektiškam. 10 • Nuoseklumas (consistency) — projektas neturi b ūti per daug nenuoseklus. Nuosek- lumas gali b ūti paaukotas vardan paprastumo kai kuriais atvejais, bet geriau tiesiog išmesti tas projekto dalis, kurios apdoroja retesnes sąlygas, negu įvelti įgyvendini- mo sudėtingumą ar nenuoseklumą. • Pilnumas — projektas turi padengti tiek svarbių situacijų, kiek yra praktiška. Visi sveikai numatomi atvejai turi b ūti padengti. Pilnumas gali b ūti aukojamas vardan bet kurios kitos vertybės. Tiesą sakant, pilnumas turi b ūti aukojamas, kada įgy- vendinimo paprastumas yra pavojuje. Nuoseklumas gali b ūti aukojamas siekiant pilnumo, jei išlaikomas paprastumas, ypatingai bevertis sąsajos nuoseklumas. Parafrazuojant šiuos principus, paprastas 90% sprendimas yra geriau už sudėtingą ir labai sunkiai įgyvendinamą 99,9% sprendimą. Jų autorius per daugelį metų taip ir neapsisprendė, ar „blogiau yra geriau“ yra tiesa ar ne. 2.5. Kalbos pasirinkimas Unix šeimos sistemose ypač gausu instrumentinių priemonių. Dažniausiai tą patį tiks- lą galima pasiekti skirtingomis priemonėmis, taigi kiekvienam uždaviniui reikia pasirinkti tinkamiausią įrankį. Iš visų programavimo kalbų Unix sistemoje, be abejo, svarbiausios yra C ir apvalkalo kalba. Tai yra skirtingi poliai — žemo lygio efektyvi sisteminė kalba ir aukšto lygio vartotojo komandų interpretatorius. Tarpe tarp jų skirtingas nišas ar ištisas sritis užima visokios interpretuojamos kalbos. Sistemos programavimas, draiveriai, programos, reikalaujančios greičio yra rašomos C kalba. C privalumai — universalumas, portabilumas. C kompiliatorius yra praktiškai kiekvienoje Unix mašinoje. Galima rasti bibliotekų skirtingiausioms sritims, nuo XML manipuliavimo iki skaitinių algoritmų. Visgi, C yra ne geriausias įrankis mažoms pagalbi- nėms priemonėms dėl savo žemo abstrakcijos lygio, kompiliuojamos kalbos prigimties ir kitų priežasčių. Net didelėse programose, kuriose vykdymo greitis nėra svarbiausias rei- kalavimas, verta pagalvoti apie alternatyvas C, turint galvoje šios kalbos saugumo prob- lemas, silpną moduliarizacijos laipsnį ir kitus tr ūkumus. Priemonės, automatizuojančios keleto komandų paleidimą, manipuliacijos failais, at- sarginių kopijų darymas, sistemos administravimo pagalbinės priemonės ir panaš ūs daly- kai yra rašomi apvalkalo (angl. shell) skriptais. Apvalkalas yra ne tik komandinis varto- tojo interfeisas, bet ir aukšto lygio kalbos interpretatorius, pateikiantis primityvus darbui su failais, procesais bei paprastoms manipuliacijoms teksto eilutėmis. Apvalkalo skrip- tais įmanoma padaryti labai daug dalykų, net labai sudėtingas programas, bet jei shell skriptas išauga ilgesnis, nei kokios 100 eilučių kodo, yra verta pamąstyti apie kitą kalbos pasirinkimą. Tarp C/C++ ir apvalkalo skripto yra daugybė kitų interpretuojamų programavimo kal- bų — Python, Perl, TCL/Tk, Ruby, AWK ir t.t. Jos visos turi savo stipriąsias ir silpnąsias puses, o taip pat stipriai persidengia savo taikymo sritimis. Pastaruoju metu Unix taiko- mųjų programų pasaulyje paplito ir Java, tačiau jinai nesi ūlo objektyvių pranašumų prieš, tarkime, Python. Platesnės diskusijos šia tema si ūlau ieškoti [TAOUP] ketvirtame skyriuje. 11 3. Instrumentinės priemonės Šiame skyriuje kalbama apie programuotojo darbo įrankius Unix pavidalo sistemose. 3.1. man — pagrindinis informacijos šaltinis Kaip j ūs jau tikriausiai žinote, lengviausiai pasiekiama dokumentacija apie beveik bet kurią komandą ar funkciją yra man vadovai. Patogumo dėlei tie vadovai suskaidyti į skyrius. Linux sistemose man vadovų skyriai yra tokie: 1 Vartotojo komandos (ls(1)); 2 Sistemos iškvietimai (open(2)); 3 Skirtingų API funkcijos (fopen(3)); 4 Įrenginiai ir draiveriai (zero(4)); 5 Failų formatai (passwd(5)); 6 Žaidimai (fortune(6)); 7 Kiti (latin1(7), ip(7)); 8 Sistemos administravimo komandos (mount(8)). Toks paskirstymas nėra taisyklė, skirtingose sistemose sekcijos 4, 5, 6 ir 7 b ūna su- kaitaliotos, o taip pat kartais b ūna ir papildomų skyrių. man(1) komanda naudotis yra pakankamai paprasta: man komanda Dažniausiai to pakanka, bet kartais norisi puslapio iš kitos sekcijos, negu duoda man — pvz. mknod(2) vietoj mknod(1). Tada galima nurodyti sekciją: man 2 mknod man -S 2:3 mknod 3.2. Redaktoriai Ko gero, svarbiausias programuotojo įrankis yra teksto redaktorius. Unix’e jų yra daug ir įvairių. Labiausiai paplitę, be abejo, yra emacs ir vi. vi yra pirmas Unix’e vizualus (full-screen) redaktorius. Jo pranašumas prieš konku- rentus yra tas, kad jis yra visose Unix sistemose. Ne be keistenybių, bet lengvas, greitas ir „įsiprogramuojantis į pirštus.“ Labai keistas naujokams. Bet vis viena rekomenduoju išmokti juo naudotis. Emacs yra daugiau negu redaktorius. Emacs labiau yra Unix integruota programa- vimo aplinka. Didesnė dalis redaktoriaus logikos parašyta Elisp’u — LISP dialektu. Iš Emacs galima paleidinėti skirtingas programas: make, debugerius, apvalkalą. Yra skir- tingų programų Elisp’u — žiniatinklio naršyklė, IRC klientas, el. pašto klientas, naujienų skaityklė, failų tvarkyklė ir t.t. Turi integruotą dokumentacijos sistemą. Palaiko sintaksės spalvinimą ir specialius režimus begalei skirtingų failų tipų. Emacs turi labai lanksčią ir 12 visaapimančią vartotojo interfeisą, na o jei jo nepakanka, galima imtis k ūrybos Elisp’u. Bet tikriausiai tai, ko jums reikia, jau yra parašyta. B ūtent Emacs redaktoriumi J ūsų autorius dabar rašo šitą konspektą. Be šių dviejų priešingų programų, Unix’ams yra parašyta labai daug teksto redaktorių. Paprasčiausi b ūtųpico, jo laisvas klonas nano, joe, jed. Naujokams iš DOS/Windows pasaulio rekomenduočiau mcedit, kuris labai panašus į įprastus Norton Commander ar FAR vidinius redaktorius. Be tradicinių redaktorių yra ir keletas IDE projektų. Yra perkelta net komercinių IDE. Bet tarp profesionalių programuotojų jie nėra paplitę ir tikriausiai niekada ir nebus. 3.3. gcc C kompiliatorius Unix sistemose tradiciškai vadinamas cc, o GNU C kompiliatorius iškviečiamas komanda gcc. Kaip b ūtinas parametras kompiliatoriui turi b ūti perduotas išeities teksto failo (failų) vardas. Jei neperduoti kitų parametrų, išeities tekstas bus su- kompiliuotas į vykdomąjį failą a.out. [alga@peleda t]$ cat hello.c main() { printf("Hello world!\n"); } [alga@peleda t]$ gcc hello.c [alga@peleda t]$ ls a.out* hello.c [alga@peleda t]$ ./a.out Hello world! Taip pat galima nurodyti tokius parametrus: -c Tik kompiliuoti, iš failas.c sukompiliuoja failas.o objektinį modulį -o failas Nurodo, kad galutinis produktas (objektinis modulis arba vykdomasis fai- las) turi b ūti pavadintasfailas. -O Nurodo optimizacijos lygį. -O nurodo optimizuoti, -O0 nurodo neoptimizuoti, o -O2 nurodo stiprią optimizaciją. -W (gcc specifiška) Nurodo, kokie perspėjimai (warnings) turėtų b ūti išvedami.-Wall reiškia rodyti visus svarbius perspėjimus. -pedantic Nurodo pedantiškai sekti ANSI C reikalavimus ir išvesti perspėjimus ne- atitikimo standartui atveju. [alga@peleda t]$ gcc -Wall -pedantic hello.c -o hello hello.c:1: warning: return-type defaults to ‘int’ hello.c: In function ‘main’: hello.c:2: warning: implicit declaration of function ‘printf’ hello.c:3: warning: control reaches end of non-void function [alga@peleda t]$ ls a.out* hello* hello.c -S Sustoti prieš asembliavimo stadiją. Asemblerinis tekstas išvedamas į failą fai- las.s 13 -E Sustoti po preprocesavimo. Preprocesuotas kodas išvedamas į standartinį išvedimą. -I Nurodo include path, t.y. kelią, kuriame ieškomi antraščių (header) failai. -L Nurodo library path, t.y. kelią, kuriame ieškomi bibliotekų failai. -l Linkeriui perduodama opcija. Dažniausiai tai b ūna dinaminių bibliotekų vardai. 3.4. make make yra programa, skirta automatizuoti kompiliavimo procesą. Kai projektą sudaro vos daugiau, nei pora failų, rankinis kompiliavimo komandų rašymas gali pakankamai įgrysti, o surašius jas į apvalkalo skriptą kaskart b ūtų be reikalo perkompiliuojami failai, kurie nepasikeitė. make pagal tam tikrą taisyklių rinkinį, dalis kurių yra įsi ūta į pǎcią programą, o dalį galima nurodyti, seka, kokie produktai (targets) priklauso nuo pasikeitusių išeities failų, ir perkompiliuoja tik tai, ko reikia. Programos veikimas reguliuojamas specialiu failu, vadinamu Makefile arba makefile. Jame nurodomi skirtingi kintamieji (makroko- mandos), išeities tekstų failai, rezultatai ir taisyklės, kokiais žingsniais gauti rezultatus iš išeities failų. Pademonstruokim pavyzdžiu. Turime nedidelę programėlę. Jos išeities tekstą sudaro tokie failai: [alga@peleda lines]$ ls *.[ch] balls.h handlers.c hiscore.c lines.h rules.c child.c handlers.h hiscore.h menu.c rules.h child.h hello.c lines.c menu.h smallballs.h Jos Makefile’as yra pateiktas iliustracijoje 15 puslapyje. Taigi, kaip galite atspėti paži ūṙeję į šį pavyzdį, makrokomandos apibrėžimas atrodo kaip vardas = reikšmė Makrokomandos panaudojimas atrodo, kaip $(vardas) Na, o taisyklė atrodo taip: tikslas: priklausomybės −→ komanda −→ komanda −→ · · · Be to, net tradicinis BSD make palaiko neišreikštines taisykles (kaip ta .c.o, t.y. kaip iš *.c failo gauti *.o), kintamųjų pakeitimą pagal šabloną (kaip $(SRC:.c=.h)), o GNU Make turi dar daugiau galingų savybių, kaip patobulinti šablonai ir vidinės funk- cijos (kaip ta $(shell ...)). Daugiau informacijos apie GNU Make, jos parametrus, sintaksę, vidines funkcijas ir kita galite sužinoti make info puslapyje: info make. 14 # Makefile for lines # # Kaip jau pastebėjote, komentaras yra bet kas nuo # simbolio ‘#’ iki eilutės pabaigos # # −→ reiškia TAB simbolį. 8 tarpai čia netiks! # Čia yra makrokomandų apibrėžimai CC = gcc CFLAGS = $(shell gtk-config --cflags ) -g -Wall LIBS = $(shell gtk-config --libs ) SRC = lines.c rules.c child.c handlers.c \ menu.c hiscore.c HDR = $(SRC:.c=.h) OBJS = $(SRC:.c=.o) # Čia yra pirmoji taisyklė. Ji nurodo, kad # targetas ‘all’ priklauso nuo targetų tags ir lines all: tags lines lines: $(OBJS) −→ $(CC) $(LIBS) $(OBJS) -g -o lines .c.o: $*.c $(HDR) # Štai šitą taisyklę make žino pats: #−→ $(CC) $(CFLAGS) -c $*.c # Nurodom, kad visi išeities teksto failai priklauso # nuo visų antraščių $(SRC): $(HDR) # Šita taisyklė skirta išvalyti visokias šiukšles clean: −→ rm -f *.o lines *~ core TAGS # TAGS yra duomenys vi ir emacs redaktoriams apie # tai, kur rasti skirtingų C funkcijų ir kintamųjų # apibrėžimus tags: TAGS TAGS: $(SRC) $(HDR) −→ etags $(SRC) $(HDR) # EOF 1 pav. Makefile pavyzdys 15 3.5. indent indent yra gana paprasta programėlė, kurios vienintelis tikslas – gražinti C išeities kodų formatavimą. Atsirado BSD sistemose, GNU, kaip visada, si ūlo savo patobulintą versiją, kuri pilnai emuliuoja ir originaliosios elgesį. indent turi labai daug opcijų kiekvienam kodo formatavimo aspekto nustatymui, bet yra ir keletas iš anksto paruoštų režimų. Opcijos -orig, -gnu ir -kr įjungia atitin- kamai originalaus BSD indent’o, GNU ir K&R formatavimo stilių. 3.6. gdb Tai yra debugeris (angl. debugger) su patogia komandinės eilutės sąsaja. Nors GDB interfeisas ir gali b ūti neįprastas programuotojui su Windows grafinių de- bugerių patirtimi, bet savo funkcionalumu GDB nenusileidžia kitiems debugeriams. Ir jo komandinis interfeisas, beje, yra patogus ir efektyvus, kai su juo susipažįsti. Norint efektyviai naudotis debugeriu reikia, žinoma, kad debuginama programa b ūtų sukompiliuota su opcija -g. Nors, iš debugerio galima išlupti naudos net jei sukompi- liuota buvo ir be -g. Pagal nutylėjimą į vykdomuosius failus visgi įtraukiama simbolių informacija, bet ji gali b ūti „atsegama“ paleidžiant komandąstrip. Kitais žodžiais, su - g j ūs gausite visus simbolių vardus ir eilǔcių numerių informaciją, be jos gausite funkcijų vardus, o po strip komandos iškvietimo galėsite operuoti tiktai adresais. Elementariausias debugerio pritaikymas — pomirtinė analizė. Kai „l ūžta“ kokia nors programa, yra sugeneruojamas core failas. Tai yra programos atminties dump’as. Pri- klausomai nuo apvalkalo nustatymų, core failas gali b ūti ir negeneruojamas. Maksima- lus sukuriamo core failo dydis yra reguliuojamas apvalkalo komanda ulimit. 3.7. strace Šis įrankis trasuoja visus debuginamos programos sistemos kvietimus ir išveda juos gražiu pavidalu. Parodo simbolines argumentų ir grąžinamų rezutatų reikšmes. Nepa- keičiamas įrankis, jei kokia nors programa „l ūžta“ ḋel nepaaiškinamų priežasčių, o jos išeities tekstų nėra. strace komandos išvedamos informacijos pavyzdį galite surasti iliustracijoje 17 pus- lapyje. Naudinga opcija yra -o failas, kuri nukreipia visą išvedamą informaciją į fai- lą. Tokiu b ūdu programos išvedami pranešimai nepaskęstastrace informacijos sraute. strace turi dar daug visokių opcijų išvedamos informacijos kontroliavimui. strace praverčia, jei norime, pavyzdžiui, sužinoti, kokius failus atidarinėja progra- ma. Kokia tvarka yra nuskaitomi konfig ūracijos failai, ar kas nors panašaus. Tada tiesiog strace rezultatus perfiltruojam grep komanda: alga@peleda:∼/unix$ strace -o log true alga@peleda:∼/unix$ grep open log | less 3.8. automake, autoconf ir libtool [AAL] Šitie įrankiai yra skirti palengvinti portabilių programų rašymą. Šio įrankių rinkinio panaudojimas juokais vadinamas „autokonfiskacija“. Idealiai, „autokonfiskuota“ 16 [alga@peleda unix]$ strace true execve("/bin/true", ["true"], [/* 57 vars */]) = 0 brk(0) = 0x8049cd4 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=19688, ...}) = 0 mmap(NULL, 19688, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40015000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 fstat(3, st_mode=S_IFREG|0755, st_size=4223971, ...) = 0 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\204"..., 4096) = 4096 mmap(NULL, 1025596, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4001a000 mprotect(0x4010d000, 30268, PROT_NONE) = 0 mmap(0x4010d000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xf2000) = 0x4010d000 mmap(0x40111000, 13884, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40111000 close(3) = 0 mprotect(0x4001a000, 995328, PROT_READ|PROT_WRITE) = 0 mprotect(0x4001a000, 995328, PROT_READ|PROT_EXEC) = 0 munmap(0x40015000, 19688) = 0 personality(PER_LINUX) = 0 getpid() = 1338 brk(0) = 0x8049cd4 brk(0x8049d0c) = 0x8049d0c brk(0x804a000) = 0x804a000 open("/usr/share/locale/locale.alias", O_RDONLY) = 3 fstat(3, st_mode=S_IFREG|0644, st_size=2174, ...) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40015000 read(3, "# Locale name alias data base.\n#"..., 4096) = 2174 brk(0x804b000) = 0x804b000 read(3, "", 4096) = 0 close(3) = 0 munmap(0x40015000, 4096) = 0 open("/usr/share/i18n/locale.alias", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/lt/LC_COLLATE", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=29524, ...}) = 0 mmap(NULL, 29524, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40115000 close(3) = 0 open("/usr/share/locale/lt/LC_CTYPE", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=10428, ...}) = 0 mmap(NULL, 10428, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40015000 close(3) = 0 _exit(0) = ? 2 pav. strace panaudojimo pavyzdys 17 programa kompiliuojasi bet kurioje Unix pavidalo platformoje. autoconf ir auto- make pagal specifikacijas sugeneruoja configure skriptą, kuris išanalizuoja reikiamas sistemos savybes, patikrina, ar egzistuoja reikiamos bibliotekos, ir sugeneruoja Make- file’us, atitinkančius aplinką ir config.h, perduodantį programai #define’us, pra- nešančius apie atrastas aplinkos ypatybes. 3.9. Konfig ūracijos valdymo sistemos Konfig ūracijos valdymas yra svarbi veikla bet kokiame programiniame projekte. Kar- tais prireikia grįžti prie ankstesnės versijos, jei kokie nors eksperimentai nepavyksta. Jei projekte dirba keletas žmonių, jiems reikia derinti savo veiksmus ir daryti savo darbo dalį taip, kad ji integruotųsi su kolegų darbu. Kai išleidžiama laida, programos vystymasis nuskuba tolyn, o surastos klaidos turi b ūti taisomos tiek stabilioje laidoje, tiek v̇eliausioje vystomoje versijoje. Visais šiais atvejais padeda konfig ūracijos valdymo sistemos, kitaip dar vadinamos išeities tekstų valdymo sistemomis arba versijų valdymo sistemomis. 3.9.1. Istorinė perspektyva Senais laikais Berklyje atsirado konfig ūracijos valdymo sistema SCCS, v̇eliau ją pa- keitė RCS. Tai yra klasikinės versijų kontrolės sistemos, veikiančios štai kokiu principu. Yra saugykla, kurioje laikomi versijuoti failai. Jei programuotojas nori padaryti pakeitimą tokiam failui, jis pasiima jį iš sistemos (check out), pamodifikuoja ir vėl grąžina į saugyklą (check in). Kol programuotojas dirba su failu, failas saugykloje yra užblokuotas (locked), t.y. joks kitas programuotojas negali pasiimti (check out) to failo. Tokiu b ūdu kiekvieną failą kiekvienu metu modifikuoja tik vienas žmogus. Grąžinant failą į konfig ūracijos val- dymo sistemą jis užregistruojamas kaip nauja versija. Sistema leidžia išsiimti perži ūrai bet kokią failo versiją, o taip pat leidžia greitai pasiimti visų pasikeitusių failų vėliausias versijas, kitais žodžiais susisinchronizuoti su versijų valdymo sistemos saugykla. Dažniausiai versijuoti failai laikomi taupiu formatu, kai laikoma viena pagrindinė failo versija, o kitos versijos laikomos tiesiog kaip pakeitimai nuo pagrindinės. 3.9.2. CVS CVS (Concurrent Versions System) atsirado apie 1991 metus ir pirmiausia buvo rea- lizuota, kaip apvalkalo skriptų rinkinys RCS sistemos pagrindu. Vėliau apvalkalo skriptai buvo pakeisti C programomis, bet pradinė logika išliko. CVS veikimas remiasi prielaida, kad net jei keli žmonės dirba ties vienu failu, jų mo- difikavimai retai konfliktuoja. CVS neblokuoja failų, su kuriais dirbama. Tiesiog prieš grąžinant failus į repozitoriją, jų pakeitimai yra suliejami su pakeitimais, padarytais po paskutinio sinchronizavimo. Jei visgi įvyksta konfliktas, jis paliekamas spręsti progra- muotojui, kuris sinchronizuoja savo darbinę failų kopiją su sistemos saugykloje esančia vėliausia versija. Be to, CVS turi ir kitų naudingų ir plačiai naudojamų savybių, kaip darbas per tinklą, versijų šakos ir t.t. Šiuo metu daugelis atviro kodo projektų naudoja CVS serverius su anonimine prieiga grupinio darbo organizavimui ir šviežiausio kodo platinimui. 18 3.9.3. CVS alternatyvos CVS sistema turi ir pastebimų tr ūkumų. Pagrindiniai jų — versijuotų failų neįmano- ma pervadint neprarandant jų istorijos, šakų sinchronizavimas ar suliejimas yra neintui- tyvus, kruopštus ir skausmingas netgi patyrusiems CVS vartotojams. Šie CVS tr ūkumai yra sprendžiami CVS alternatyvose — Subversion ir Arch. Subversion yra sistema labai panaši į CVS, kuri leidžia kopijuoti ir pervadinti versi- juotus failus, bei turi labai efektyvias operacijas darbui su šakomis. Arch, savo ruožtu, yra naujomis koncepcijomis turtinga sistema, leidžianti lengvą sinchronizaciją tarp šakų, net tarp skirtingų saugyklų. Subversion prisilaiko CVS modelio su viena centrine versijų saugykla, su kuria dirba visi programuotojai, o Arch si ūlo kiekvienam programuotojui laikyti savo saugyklą, joje vykdyti darbą su versijuota sistema, bei karts nuo karto keistis pakeitimais su kolegomis. Arch leidžia programuotojui, pavyzdžiui, savaitgalį gamtoje padirbėti, po kiekvieno logi- nio žingsnio išsaugant naują versiją, o parvažiavus į biurą sulieti savo pakeitimus po vieną su kanonine programos versija. Subversion ar CVS, šiuo atveju, verstų programuotoją vi- sus savo savaitgalio pakeitimus registruoti kaip vieną versiją, kas rizikinga konfliktais. Subversion išlaiko CVS darbo modelį ir turi panašias komandas, tai yra lengvai iš- mokstama žmogui, kuris moka dirbti su CVS, o Arch su CVS turi mažai bendro, išskyrus abstrakčius veikimo principus. 4. Perl, AWK ir sed Dažnai prireikia pamanipuliuoti tekstu paprastesniais b ūdais, nei rankinis redagavi- mas tekstų redaktoriumi. Paprasčiausias tokio dalyko pavyzdys b ūtų registracijos failų (angl. log files) filtravimas, ataskaitų sudarymas. Kartais reikia atlikti kokius nors pa- prastus dalies formatuotos tekstinės informacijos išrinkimo, kokių nors žodžių pakeitimo veiksmus ir panašiai. Šio skyriaus antraštėje išvardintos priemonės kaip tik skirtos pana- šiems darbams. Perl yra interpretuojama kalba, kuri buvo kuriama kaip pagerintas apvalkalas, bet ap- augo daugeliu sintaksės savybių bei bibliotekų, ir tapo bendro pob ūdžio interpretuojama kalba. Jai labiausiai tinkantys epitetai — eklektiška, intuityvi, nenuosekli. Perl kalbos motto – There’s more than one way to do it (TMTOWTDI) (tai padaryti yra daugiau nei vienas b ūdas). Perl yra sistemų administratorių kanoninis įrankis, bet yra ir programuotojų, kurie visas paprastesnes (iki 500 eilučių) programas rašo Perl’u. Taigi, dabar panagrinėsim, kas per priemonės yra sed, awk ir perl ir su kuo jos valgomos. Pirmiausia, reikia suprasti šablono (angl. pattern, regex) sąvoką. 4.1. Šablonai Šablonai (angl. regex, regexp, regular expression) yra labai galingas įrankis teksto apdorojimui. Tai yra išraiškos, kurių atitikčių galima ieškoti tekste, norint surasti kokią nors vietą, nustatyti kokio nors informacijos vieneto ribas faile. Regex šablonų sintaksė yra standartizuota POSIX standartų, bet skirtingose priemonėse gali skirtis metasimbolių pateikimo b ūdas. Pasviręs br ūkšnys (\) arba paverčia paprastus simbolius metasimboliais arba atvirkščiai metasimbolius verčia paprastais simboliais). 19 Žemiau pateikiama supaprastinta regex šablonų sintaksė. A-Z, a-z, 0-9 ir kiti paprastos raidės reiškia kaip tik tai. Paprastas raides. Pavyzdžiui, šabloną ana tenkina žodis banana. . Taškas yra šablonas, galintis reikšti bet kokį simbolį. Pavyzdžiui, šablonas a.a atitinka žodžius banana, aaa, bet ne baa, manna. [A-Z123] Kvadratiniuose skliaustuose išvardina simbolių aibė reiškia bet kokį vieną tos aibės simbolį. Br ūkšniu galima nurodyti simbolių sekas jų pilnai neišrašant. Pavyz- džiui, a[nm]a atitinka žodžius mama, banana, bet ne tata. [ˆA-Z345] Jei po kvadratinių skliaustų pirmas simbolis yra stogelis, visas šablonas reiš- kia ne išvardintų simbolių aibę, o jos papildinį. [[:space:]], [[:alpha:]] ir kiti. Šitie daiktai reiškia skirtingas

Daugiau informacijos...

Šį darbą sudaro 12208 žodžiai, tikrai rasi tai, ko ieškai!

Turinys
  • 1. Įvadas..4
  • 1.1. Apie šį kursą . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
  • 1.2. Tipografiniai susitarimai . . . . . . . . . . . . . . . . . . . . . . . . . . 4
  • 2. Unix pradmenys4
  • 2.1. Istorija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
  • 2.2. Standartai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
  • 2.3. Unix ypatumai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
  • 2.3.1. Failų tipai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
  • 2.4. Filosofija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
  • 2.5. Kalbos pasirinkimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
  • 3. Instrumentinės priemonės..12
  • 3.1. man — pagrindinis informacijos šaltinis . . . . . . . . . . . . . . . . . . 12
  • 3.2. Redaktoriai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
  • 3.3. gcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
  • 3.4. make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
  • 3.5. indent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
  • 3.6. gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
  • 3.7. strace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
  • 3.8. automake, autoconf ir libtool . . . . . . . . . . . . . . . . . . . 16
  • 3.9. Konfig ūracijos valdymo sistemos . . . . . . . . . . . . . . . . . . . . . . 18
  • 3.9.1. Istorinė perspektyva . . . . . . . . . . . . . . . . . . . . . . . . 18
  • 3.9.2. CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
  • 3.9.3. CVS alternatyvos . . . . . . . . . . . . . . . . . . . . . . . . . . 19
  • 4. Perl, AWK ir sed 19
  • 4.1. Šablonai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
  • 4.2. sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
  • 5. Procesų valdymas 21
  • 5.1. Kas yra procesas? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
  • 5.2. struct task_struct . . . . . . . . . . . . . . . . . . . . . . . . . 21
  • 5.3. Procesų API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
  • 5.3.1. fork(2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
  • 5.3.2. exec*(3) šeima . . . . . . . . . . . . . . . . . . . . . . . . . 22
  • 5.3.3. wait(2) ir waitpid(2) . . . . . . . . . . . . . . . . . . . . 22
  • 5.3.4. Procesų uid ir gid . . . . . . . . . . . . . . . . . . . . . . . . 22
  • 5.3.5. Sesijos ir procesų grupės . . . . . . . . . . . . . . . . . . . . . . 23
  • 5.3.6. Demonizacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
  • 5.4. Signalai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
  • 5.5. Kaip gaudyti signalus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
  • 5.5.1. signal(2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
  • 5.5.2. BSD semantika vs. SysV semantiką. . . . . . . . . . . . . . . . . 25
  • 5.5.3. sigaction(2) . . . . . . . . . . . . . . . . . . . . . . . . . . 25
  • 5.6. Kaip siųsti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
  • 6. Lizdai 26
  • 6.1. Lizdai su ryšio nustatymu . . . . . . . . . . . . . . . . . . . . . . . . . . 27
  • 6.2. Lizdai be ryšio nustatymo . . . . . . . . . . . . . . . . . . . . . . . . . . 28
  • 6.3. Unix domeno lizdai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
  • 7. System V IPC 29
  • 7.1. Pranešimai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
  • 7.2. Semaforai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
  • 7.3. Bendra atmintis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
  • 8. POSIX gijos (ptheads) 31
  • 8.1. Gijų realizacijos Unix sistemose . . . . . . . . . . . . . . . . . . . . . . 32
  • 8.1.1. Sun Solaris 2.x . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
  • 8.1.2. LinuxThreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
  • 8.2. NPTL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
  • 8.2.1. BSD pthreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
  • 8.3. Gijų valdymo funkcijos . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
  • 8.4. Mutexų valdymo funkcijos . . . . . . . . . . . . . . . . . . . . . . . . . 34
  • 8.5. Sąlygos kintamųjų valdymo funkcijos . . . . . . . . . . . . . . . . . . . 34
  • 8.6. Specifiniai gijų duomenys . . . . . . . . . . . . . . . . . . . . . . . . . . 35
  • 9. Žodynėlis..36
  • Rodyklė..36
  • Literatūra39

★ Klientai rekomenduoja


Šį rašto darbą rekomenduoja mūsų klientai. Ką tai reiškia?

Mūsų svetainėje pateikiama dešimtys tūkstančių skirtingų rašto darbų, kuriuos įkėlė daugybė moksleivių ir studentų su skirtingais gabumais. Būtent šis rašto darbas yra patikrintas specialistų ir rekomenduojamas kitų klientų, kurie po atsisiuntimo įvertino šį mokslo darbą teigiamai. Todėl galite būti tikri, kad šis pasirinkimas geriausias!

Detali informacija
Darbo tipas
Šaltiniai
✅ Šaltiniai yra
Failo tipas
PDF dokumentas (.pdf)
Apimtis
39 psl., (12208 ž.)
Darbo duomenys
  • Informacinių technologijų konspektas
  • 39 psl., (12208 ž.)
  • PDF dokumentas 127 KB
  • Lygis: Universitetinis
  • ✅ Yra šaltiniai
www.nemoku.lt Atsisiųsti šį konspektą
Privalumai
Pakeitimo garantija Darbo pakeitimo garantija

Atsisiuntei rašto darbą ir neradai jame reikalingos informacijos? Pakeisime jį kitu nemokamai.

Sutaupyk 25% pirkdamas daugiau Gauk 25% nuolaidą

Pirkdamas daugiau nei vieną darbą, nuo sekančių darbų gausi 25% nuolaidą.

Greitas aptarnavimas Greitas aptarnavimas

Išsirink norimus rašto darbus ir gauk juos akimirksniu po sėkmingo apmokėjimo!

Atsiliepimai
www.nemoku.lt
Dainius Studentas
Naudojuosi nuo pirmo kurso ir visad randu tai, ko reikia. O ypač smagu, kad įdėjęs darbą gaunu bet kurį nemokamai. Geras puslapis.
www.nemoku.lt
Aurimas Studentas
Puiki svetainė, refleksija pilnai pateisino visus lūkesčius.
www.nemoku.lt
Greta Moksleivė
Pirkau rašto darbą, viskas gerai.
www.nemoku.lt
Skaistė Studentė
Užmačiau šią svetainę kursiokės kompiuteryje. :D Ką galiu pasakyti, iš kitur ir nebesisiunčiu, kai čia yra viskas ko reikia.
Palaukite! Šį darbą galite atsisiųsti visiškai NEMOKAMAI! Įkelkite bet kokį savo turimą mokslo darbą ir už kiekvieną įkeltą darbą būsite apdovanoti - gausite dovanų kodus, skirtus nemokamai parsisiųsti jums reikalingus rašto darbus.
Vilkti dokumentus čia:

.doc, .docx, .pdf, .ppt, .pptx, .odt