Professional Documents
Culture Documents
Kompletno o Linux HRV
Kompletno o Linux HRV
Kompletno o Linux HRV
Zagreb, 2004.
"...the number of UNIX installations has grown to 10, with more expected..." - Dennis Ritchie and Ken Thompson, June 1972 "... When BTL withdrew from the project, they needed to rewrite an operating system (OS) in order to play space war on another smaller machine (a DEC PDP-7 [Programmed Data Processor] with 4K memory for user programs). The result was a system which a punning colleague called UNICS (UNiplexed Information and Computing Service)--an 'emasculated Multics'; no one recalls whose idea the change to UNIX was"
2/1275
3/1275
Sadraj
1. 2. 3. 4. 5. 6. 7. 8. 9. GNU FILOZOFIJA I GNU LICENCA (Draen Hudoletnjak) STRUKTURA UNIXA (Marijela Napast) SHELL (Andrija Martinovi) SH I BASH (Sinia Julijan) C SHELL, T C-SHELL (Marijana Ladan-Pelivanovi) SHELL PROGRAMIRANJE (SHELL I BASH) (Predrag Jovanovi) BASH ADVANCED SHELL PROGRAMIRANJE (Marko Vukovi) REGEX (Manuel Vidonis, Zoran Zorii) VI EDITOR (Mario Strini)
6 30 42 72 111 138 160 179 213 230 263 273 305 322 343 370 396 419 435 469 509 527 556
10. EMACS (Matko Peji) 11. LOGIN I ID (Maja Mehinagi) 12. TELNET I SSH (Nina ugaj) 13. ARHIVIRANJE NA UNIX RAUNALIMA (Frane Gjeldum) 14. UNIX DEVICES, MOUNTING DEVICES (Davorin ajnovi) 15. AWK I SED (Branimir ivkovi) 16. SED (Tomislav Grgec) 17. GCC COMPILER (Kreimir Heimovi) 18. GDB, THE GNU SOURCE LEVEL DEBUGGER (Janko Rade) 19. GNU MAKE (Marko Ferk) 20. CVS SUSTAV ZA VERZIONIRANJE (Damir Jajeti, Tomislav Domanovac) 21. IDE (Ivan Podhraki) 22. ECLIPSE (Maja ugaj, eljko afar, Damir uric) 23. PIPE I FIFO (Goran Jurii)
4/1275
24. FORK (Krasnodar Krajnik) 25. PROCESI I UPRAVLJANJE PROCESIMA (Vedran Dedu, Vanja Harambua) 26. SIGNALI (Krunoslav Zeman) 27. FORK PROCESI (Igor opec) 28. SOCKETS, UNIX DOMAIN, NETWORK (Matija upen) 29. TCP/IP (Saa Dragi) 30. TCP/IP API (Ivan Bri, Neven Kmeti) 31. UDP-USER DATAGRAM PROTOKOL (Majk Jednakovi) 32. FILE, DIRECTORY AND INODE PROGRAMMING (Boris Ivanievi) 33. INETD I TCPD (Jurica Boikovi) 34. INTERNET SERVICES (Goran Vlahovi) 35. RPC REMOTE PROCEDURE CALL (Dario Dugi) 36. RLOGIN RSH (Zvonimir Jankovi) 37. SAMBA I NFS (Marija Bili) 38. X WINDOW SYSTEM (Jakov Mihaljevi) 39. KDE (Adriana Mihalinec, Domagoj vegelj) 40. UNIX DESKTOP SYSTEM (Marina Petrovska) 41. DNS I DHCP (Daniel Van Schepdael) 42. INTERNET HISTORY (Dario Benko) 43. UVOD U PERL (Amir Kos) 44. PERL Practical Extraction and Report Language (Tamara Krutman,Ante Penava) 45. PYTHON (Ana Babi) 46. INTERPRETERI TCL/TK (Marijan Poljak) DISTRIBUCIJE LINUXA/UNIX 47. (Elizabeta Velkavrh, Alja Pavli-Raver, Eliot Karlo Pavleti) 48. KOMPAJLIRANJE KERNELA (Saa Protulipac)
578 610 638 662 672 691 718 776 796 815 827 858 876 886 917 926 970 996 1016 1033 1090 1138 1173
1214 1244
5/1275
Draen Hudoletnjak
6/1275
UVOD
Pria o GNU-u poinje otprilike 1971. sa Richardom Stallmanom koji je tada poeo raditi za MIT na njihovom Artificial Intelligence Lab (Labaratorij za Umjetnu Inteligenciju). Tamo je postao dio "software-sharing" zajednice koja je ve postojala mnogo godina. Razmjena softvera je bilo neto to je staro kao i sama raunala i u to doba je to bila normalna stvar, pomo kolegi. No oni su otili korak dalje. AI Lab je koristio operacijski sustav ITS (the Incompatible Timesharing System) kojeg su dizajnirali i u assembleru napisali njihovi programeri (hakeri *) za Digitalov PDP-10. Kao dio tima Stallmanov posao je bio poboljavanje tog sustava. Oni svoj softver tada jo nisu zvali "slobodan softver" (free software) jer taj termin tada nije postojao ali u biti je to bio, jer kad god bi netko sa nekog drugog sveuilita ili neke kompanije elio portati i koristiti njihov program, oni su im to dopustili. Ideja je bila, ako netko koristi nekakav nepoznat i zanimljiv program, uvijek ga moe traiti da vidi njegov izvorni kod (source code) kako bi ga mogao itati, mijenjati ili uzeti dijelove tog programa i iskoristiti ih za neki novi program. No situacija se je drastino promijenila poetkom 80-tih kad je Digital prestao proizvoditi PDP-10 seriju. Njegova arhitektura, koja je bila elegantna i mona u 60-tima se nije mogla "prirodno" proiriti da koristi vei adresni prostor koji je bio primjenjiv u 80-tima. To je znailo da je gotovo sav softver koji radi pod ITS-om postao neupotrebljiv. Neto prije toga hakerska zajednica IT Laba se raspala. 1981. osnovana je tvrtka Symbolics koja je zaposlila gotovo sve hakere iz AI Laba tako da preostala zajednica nije mogla funkcionirati. Kad je 1982. AI Lab kupio novi PDP-10, njihovi administratori su se odlucili za Digitalov operacijski sustav umjesto ITS-a. Moderna raunala toga doba (VAX, 68020) su imali svoje operacijske sustave ali nijedan od njih nije bio slobodan softver. Za svaki, makar dobili samo izvrnu datoteku, morao se je potpisati obvezujui ugovor. To je znailo da je prvi korak u koritenju raunala obeanje da nee pomoi svom susjedu. Pravilo koje su uveli tvorci "vlasnikog" softvera bilo je, "Ako dijeli softver sa susjedom, pirat si. Ako eli bilo to promijeniti, moli nas da ti to napravimo". To je neto to se Stallmanu nikako nije svialo i naao se je pred moralnom dvojbom. Prikljuiti se svijetu "vlasnikog" softvera i potpisati obvezujui ugovor kojim obeaje da nee pomagati kolegama ili potpuno napustiti raunalni svijet i raditi neto drugo. Umjesto toga, kao pravi programer traio je neko tree rijeenje. Razmiljao je da li postoji neki program ili programi koje bi on mogao napisati da zajednica ponovno oivi. Zakljuio je da mu za poetak treba operacijski sustav jer je to kljuni program za koritenje nekog
7/1275
raunala. Sa slobodnim operacijskim sustavom ponovno se je mogla osnovati zajednica hakera koji bi slobodno suraivali i izmjenjivali svoje ideje. Zajednica kojoj bi se svatko mogao pridruiti. Obzirom da je on do tada radio na razvoju operacijskih sustava, imao je znanja i iskustva da to napravi a osjeao se i izabranim za taj posao. Odluio je napraviti OS kompatibilan sa Unixom kako bi bio prenosiv i kako bi dotadanji korisnici Unixa mogli lako prijei na njega. Sljedei hakersku filozofiju odabrao je ime GNU, kao rekurzivno za "GNU Nije Unix" (GNU's Not Unix). Shvatio je da naziv "operacijski sustav" ne znai samo kernel ve da to ime ukljuuje i dodatne stvari kao to su komandne linije, assembleri, kompajleri, interpreteri, debuggeri, tekst editori i jo mnogo toga. Budui da su tadanji operacijski sustavi (ITS, Multics, VMS, Unix) imali sve to, on je odluio da i GNU mora imati sve to. Znajui tono to hoe, u sijenju 1984. dao je otkaz na MIT-u i poeo pisati GNU softver. Odlazak iz MIT-a je je bio nuan jer da je ostao, MIT je mogao GNU proglasiti svojim proizvodom i time bi Stallmanova ideja o slobodnom operacijskom sustavu pala u vodu kao i ponovno oivljavanje hakerske zajednice. Sreom, profesor Winston, tadanji ef MIT AI Laba je dozvolio Stallmanu da nastavi koristiti njihove labose i njihovu opremu. Time je GNU operacijski sustav od nekakve same ideje postao stvaran projekt i moe se rei da je to stvarni poetak svega vezanog uz GNU.
* Rije haker (hacker) u znaenju "onaj koji probija zastite" je pogreka koju su stvorili mediji i koji taj pojam pogreno koriste. Pravi hakeri ne priznaju to znaenje. Po njima je haker onaj koji voli programirati i uiva u tome. Zato ja u tekstu dalje koristim i koristiti u taj pojam za to, pozitivno znaenje.
8/1275
GNU OS Poetci
Kratko prije nego je zapoeo GNU projekt, Stallman je uo za "Free University Compiler Kit" poznat takoer i pod nazivom "VUCK". Taj kompajler je podravao vie programskih jezika, ukljuujui C i Pascal te je imao podrku za razne platforme. Stallman je kontaktirao autora VUCK-a i pitao ga moe li dodati taj kompajler u GNU projekt. Odgovor je bio negativan. Stoga je Stallman odluio da prvi program kojeg e napraviti bude viejezini (multi-language), vieplatformni (multi-platform) kompajler. Nadajui se da nee sam morati napisati cijeli kompajler, nabavio je source kod Pastel kompajlera. To je bio vieplatformski kompajler napisan na Lawrence Livermore Lab-u. Podravao je i bio napisan u proirenoj verziji Pascala te bio zamiljen kao sistem-programski jezik. Stallman mu je dodao C frontend i poeo ga prebacivati na Motorolino 68000 raunalo. No morao je odustati jer je otkrio da taj kompajler treba nekoliko megabajta memorije za stack a dostupni 68000 sistemi dozvoljavaju samo 64 kB. Zbog toga je odluio iz poetka napisati svoj kompajler bez da upotrijebi ista od koda Pastel kompajlera. Uspio je jedino upotrijebiti C frontend koji je sam napisao. Taj kompajler je danas poznat kao GCC no njega je dovrio kasnije. Prije toga je radio na GNU Emacsu.
9/1275
GNU Emacs
Stallman je rad na GNU Emacsu poeo u rujnu 1984. i ve poetkom 1985. GNU Emacs je postao upotrebljiv program. To mu je omoguilo da koristi Unix sustave za editiranje bez potrebe da naui vi ili ed. Do tada je koristio druge sustave za editiranje texta. Popularnost GNU Emacsa je rasla i Stallman se pitao kako distribuirati svoj softver. Zato ga je stavio na anonimni server na MIT-u koji je on sam koristio. No kako u to vrijeme nisu svi bili na internetu, Stallman je razmiljao kako svima omoguiti da dou do kopije Emacsa. Obzirom da nije radio traio je nain kako da zaradi novac na slobodnom softveru. Zbog toga je objavio da e poslati kopiju na traci svakome tko mu plati 150$ za nju. Time je Stallman zapoeo distribuciju slobodnog softvera, preteu dananjih kompanija koje distribuiraju cjelokupne Linux-bazirane GNU sustave.
10/1275
ljudima da surauju i imao je etiku prednost jer je potivao slobodu korisnika. Naravno, obzirom da su na GNU projektu sudjelovali iskusni hakeri, koristili su standarde koji su se pokazali dobrima u praksi. Dodatno, odbacili su Unixovu filozofiju koritenja malo memorije time to nisu podrali 16 bitno adresiranje (znali su da e 32 bitni strojevi postati norma kad GNU bude dovren). Nisu se trudili smanjiti potronju memorije dokle god ne bi prelazila megabajt. Kako je GNU projekt napredovao i sve vei broj sistemskih komponenti je naen ili napisan, napravljena je lista stvari koje jo nedostaju. Ta lista, danas poznata kao "GNU task list" je upotrebljena da se regrutiraju programeri koji e napisati dijelove koji nedostaju. Takoer su na listu dodane i neke stvari koje Unix nije imao a oni su mislili da bi potpuno kompletan sustav trebao imati. ak su i igre dodane kao kljune stvari. Vano je napomenuti da, budui da su oni GNU OS radili potpuno "od nule" da je svaki komad softvera koji je napisan bio testiran na Unixu (GNU OS jo nije postojao). To je znailo da se ve tada taj softver mogao koristiti na Unix sustavima. Druga dobra stvar je da se novi OS razvijao tako da bude potpuno kompatibilan sa Unixom. Sve to je imao Unix napisala je i GNU zajednica s time da je GNU varijanta u pravilu bila monija i pouzdanija. To je privuklo dodatne pokrovitelje i negdje oko 1990. GNU OS je bio gotovo dovren. Falila je jo samo jedna, kljuna stvar - kernel.
11/1275
Linux
Stallmanova prvotna ideja je bila da sami razviju svoj kernel (GNU HURD). Odluili su ga implementirati kao kolekciju serverskih procesa koji se vrte na Machu. Mach je mikrokernel koji su razvili na Carnegie Mellon University i University of Utah. GNU HURD (krdo gnua) bi bila kolekcija servera koja radi na Machu i obavlja razne poslove kao Unix kernel. Jedan od razloga zbog ega je odabrana takva arhitektura je bio da se izbjegne najtei dio posla, debugiranje kernela bez debugera namijenjenog za to. Taj dio posla je u Machu ve bio obavljen a HURD servere su mogli debugirati sa GDB-om. No poetak razvoja HURD-a je kasnio jer su ekali da Mach bude izdan kao slobodan softver, kao to su im obeali a i pokazalo se da je debugiranje HURD servera koji se pokreu kao tredovi i koji meusobno komuniciraju porukama prilino teak i zahtjevan posao. Posao na HURD-u se zbog toga otegnuo godinama. Paralelno s njima, Linus Torvalds je radio na Unix kompatibilnom kernelu kojeg je objavio na internetu 1991. godine. Nazvao ga je Linux. Negdje 1992. ukomponirali su Linux u dotad nedovreni GNU ime je stvoren komplenti slobodni operacijski sustav. Nazvali su ga GNU/Linux to predstavlja sloenicu od "kombinacija GNU sustava sa Linux kernelom". Ta verzija GNU OS-a je stekla golemu popularnost i danas ju veina ljudi poznaje samo pod imenom Linux iako je Linux samo dio tog OS-a (njegov kernel).
12/1275
pojedincu ili organizaciji, da koristi taj program na bilo kojoj vrsti raunala, za bilo kakav posao, i bez potrebe da kontaktira autora ili neku drugu instituciju. Prilikom distribucije slobodnog softvera, bilo svog ili kopije mora se pored izvrne (executable) verzije, priloiti i izvorni kod. To je zbog slobode da svatko ima pravo modificirati i poboljavati program. Dakle pristup izvornom kodu je kjuna osobina slobodnog softvera. Da bi sve ove slobode vrijedile uvijek, one moraju biti neopozive tako dugo dok ne napravite neto pogreno. Ako onaj koji razvije neki softver ima pravo ukinuti licencu bez da ste vi napravili neto to bi mu dalo razlog, onda taj softver nije slobodan softver. Meutim, odreena pravila u vezi distribucije slobodnog softvera su prihvatljiva, ako nisu u suprotnosti sa osnovnim slobodama. Na primjer, copyleft (pojednostavljeno reeno) je pravilo da kad redistribuirate program, ne moete dodati ogranienja kojima biste zabranili ostalim ljudima njihove centralne slobode. To pravilo nije u sukobu sa centralnim slobodama nego ih zapravo titi. Prema tome, vi moete platiti da dobijete kopiju slobodnog softvera ili moete nabaviti kopiju besplatno. No nevezano na to kako ste doli do svoje kopije, uvijek imate slobodu kopirati i mijenjati taj program, imate ak i slobodu prodavati kopije. Slobodan softver ne znai ne-komercijalan softver. Slobodan softver mora biti dostupan za komercijalnu upotrebu, komercijalni razvoj i komercijalnu distribuciju. Komercijalni razvoj slobodnog softvera vie nije neuobiajen, takav slobodan softver je postao vrlo vaan. Pravila kako pakirati modificiranu verziju su prihvatljiva ako ne spreavaju vau slobodu da izdate modificiranu verziju. Pravila koja kau "ako va program napravite dostupnim na ovaj nain, morate ga napraviti dostupnim i na neki drugi nain" takoer mogu biti prihvatljiva uz prethodni uvjet. Ovakvo pravilo vam ipak ostavlja izbor da uope ne distribuirate program. Takoer je prihvatljivo da se u licenci trai da ako distribuirate modificiranu verziju programa, da autor trai da mu poaljete kopiju. U tom sluaju duni ste mu je poslati. Kad se govori o slobodnom softveru, najbolje je izbjegavati termine tipa "besplatan softver" jer ti termini oznaavaju cijenu a ne slobodu (ponovno zbog vieznanosti engleske rijei "free"). Na kraju, kriteriji poput ovih do sad nabrojanih u ovoj definiciji slobodnog softvera zahtijevaju paljivo razmiljanje prilikom njihove interpretacije. Prilikom odluke da li neka licenca zadovoljava kriterije kao licenca slobodnog softvera, sudi se prema tim kriterijima i gleda se da li zadovoljava njihov duh kao i tone rijei. Ako ta licenca sadri bilo kakve zabrane (nesvjesne), odbacuje se ak i ako se ne oekuje problem s tim kriterijem.
14/1275
Ponekad licenca zahtjeva puno premiljanja, ukljuujui razgovore s odvjetnikom, prije nego se odlui da li licenca zadovoljava kriterije. Sve ovo se radi da slobodan softver ostane doista slobodan.
15/1275
Kao korisnici raunala danas, dosta nas koristi vlasniki softver. Ako nas prijatelj zamoli da mu snimimo kopiju tog programa, pogreno bi bilo odbiti ga. Suradnja je vanija od copyrighta. No takve "underground" aktivnosti ne ine dobro drutvo. Pojedinac bi trebao ivjeti otvoreno i ponosno te rei "ne" vlasnikom softveru. Svatko bi trebao moi suraivati otvoreno s drugim ljudima koji koriste softver. Svatko bi trebao imati pravo nauiti kako neki program radi i ako je potrebno popraviti njegov rad. To je razlog zato nam treba slobodan softver.
16/1275
Ovaj dijagram (napravio Chao-Kuei) objanjava razliite kategorije softvera. Slobodan softver (free software) to je slobodan softver je objanjeno u tekstu do sada, kratka definicija glasi: slobodan softver je softver koji dolazi sa dozvolom da ga svatko smije koristiti, kopirati, distribuirati (bilo izvornu ili modificiranu verziju) besplatno ili uz naknadu. U biti, to znai da takav softver mora dolaziti sa izvornim kodom. Ako je program slobodan onda ga se potencijalno moe ukljuiti u slobodan operacijski sustav kao to je GNU ili neku od slobodnih verzija GNU/Linuxa. Neke kompanije svoj softver zovu "free" no ne u smislu slobode nego cijene. ("Free" znai slobodan ali i besplatan). Zbog toga treba prouiti licencu s kojom takav softver dolazi da se vidi tono na to se taj pojam odnosi. Slobodan softver je obino pouzdaniji od ne-slobodnog. Open source softver Pojam "open source" vie-manje znai isto to i slobodan softver. Meutim kriterij koji neki softver mora zadovoljavati da bi bio open source je neto blai, dozvoljene su neke restrikcije koje u FSF-u smatraju previe ogrniavajuim.
17/1275
Public domain softver Public domain softver je softver za kojeg ne postoje vlasnika prava. Ako je izvorni kod u public domain onda je to poseban sluaj non-copylefted slobodnog softvera, to znai da neke verzije ili modifikacije moda uope nisu slobodne. Ako je samo izvrna datoteka u public domain a source kod nije onda to nije slobodan softver jer on podrazumijeva da mora biti dostupan izvorni kod. Veina slobodnog softvera nije public domain, nego na njemu postoje vlasnika prava koja pak daju legalno pravo svima da koriste slobodno taj program. Copylefted softver Copylefted softver je slobodan softver iji uvjeti distribucije ne dozvoljavaju distributeru dodavanje nikakvih novih, dodatnih ogranienja prilikom distribucije ili modifikacije softvera. To znai da svaka kopija tog softvera, makar i modificirana, mora biti slobodna. Copylefted je generalni koncept, da bi ga ostvarili morate koristiti specifian skup distribucijskih pravila. Iako se moe postii raznim licencama preporuka je koristiti "GNU General Public License" jer dvije razliite licence mogu biti nekompatibilne to znai da bi spajanje takvih programa bilo nezakonito. Non-copylefted free software Non-copylefted free software dolazi sa dozvolom da se dalje distribuira i modificira ali se takoer mogu dodavati i nove restrikcije. Softver koji dolazi na takav nain moe imati verzije koje uope nisu slobodne. Softverske kompanije mogu kompajlirati takav softver sa ili bez modifikacija i prodavati ga kao vlasniki softver. GPL-covered software GPL-covered software je softver koji je pokriven sa "GNU General Public License". GNU projekt veinu svog softvera distribuira kao takav softver. The GNU system GNU sustav je potpun unixoidni operacijski sustav. Sastoji se od hrpe programa i ukljuuje sav GNU softver kao i mnogo drugih paketa kao to su X Window System i TeX koji nisu GNU softver. Budui da je svrha GNU-a da bude slobodan, svaki njegov dio mora biti slobodan. GNU programi
18/1275
Termin "GNU program" je ekvivalent terminu "GNU softver". Neki program je GNU program ako je GNU softver. Takoer se koristi i termin "GNU paket". GNU softver GNU softver je softver izdan pod nadlenosti GNU projekta. Veina GNU softvera je copylefted, no ne sav. Bitno je da je sav GNU softver slobodan (free) softver. Dio GNU softvera su napisali ljudi iz FSF-a no veinu su napisali volonteri. Ne-slobodan (non-free) softver Non-free softver je softver koji nije slobodan. To ukljuuje "semi-free" softver i vlasniki softver. Semi free softver Semi free softver je softver koji nije slobodan ali dolazi sa dozvolom pojedincima da koriste, kopiraju, distribuiraju i mijenjaju program za neprofitne svrhe. Etiki je semi-free sofver bolji od vlasnikog softvera no svejedno stvara probleme jer se ne moe upotrijebiti kao dio slobodnog operacijskog sustava. Vlasniki (proprietary) softver Vlasniki softver je softver koji nije niti slobodan (free) niti semi-free. Njegovo koritenje, redistribuiranje ili modifikacija su zabranjeni ili zahtijevaju posebnu dozvolu. Freeware Termin "freeware" nema jasnu prihvaenu definiciju. Obino se koristi za softver koji dozvoljava redistribuciju ali ne dozvoljava mijenjanje i izvorni kod mu nije dostupan. Takav softver nije slobodan (free) softver, to su dva potpuno razliita termina. Shareware Shareware je softver koji dolazi sa dozvolom da ga se redistribuira ali svatko tko ga nastavi koristiti mora platiti licencnu naknadu. Shareware nije ni slobodan niti semi-free softver. Dva su razloga: shareware ne dolazi sa izvornim kodom, znai ne moe ga se mijenjati te shareware ne dolazi sa dozvolom da ga se instalira i koristi bez da ga se plati, ak niti u nekomercijalne svrhe.
19/1275
Privatni softver Privatni ili "prilagoeni" softver je softver razvijen za jednog korisnika (tipino organizacija ili kompanija). Taj ga korisnik uva i koristi za svoje potrebe i ne distribura ga. Privatni softver je slobodan softver u jednostavnom smislu da ako je jedinstven, korisnik ima sva prava na njega. No, dublje gledajui, nema smisla razmiljati o privatnom softveru na nain je li on slobodan ili nije. Komercijalni softver Komercijalni softver je softver razvijen sa ciljem da se na njemu zaradi novac. Komercijalni softver i vlasniki (proprietary) softver nisu ista stvar. Veina komercijalnog softvera je vlasniki softver ali postoji i komercijalni softver koji je slobodan isto kao to postoji neslobodni (non-free) ne-komercijalni softver. Vana stvar je naglasiti da je mogu slobodan komercijalni softver. Zato ne bi smo trebali govoriti komercijalni softver kad mislimo na vlasniki sofver.
20/1275
Predgovor
Licence veine programa nastoje vam oduzeti slobodu da ih dijelite i mijenjate. Tomu nasuprot, GNU Opa javna licenca jami vam slobodu dijeljenja i mijenjanja slobodnih programa -- kako bi program bio slobodan za sve svoje korisnike. Ova Opa javna licenca vrijedi za vei dio programa Free Software Foundationa i bilo koji drugi program iji se autor obvee na njeno koritenje. (Neke druge programe Free Software Foundationa pokriva GNU Opa javna licenca za knjinice.) I vi je moete primjeniti na svoje programe. Kada govorimo o slobodnim programima, govorimo o slobodi, a ne cijeni. Naa Opa javna licenca je stvorena kako bi vam zajamila slobodu distribuiranja primjeraka slobodnih programa (i, ako elite, naplaivanje toga), primanje izvornog koda ili mogunost da ga dobijete, mogunost mijenjanja programa ili koritenja njegovih dijelova u novim slobodnim programima; te saznanje da to moete uiniti. Kako bi zatitili vaa prava, moramo postaviti ogranienja koja zabranjuju bilo kome poricanje ovih prava ili zahtjev da ih se odreknete. Ova ogranienja predstavljaju odreene odgovornosti za vas ako distribuirate ili mijenjate primjerke programa. Na primjer, ako distribuirate primjerke takvog programa, besplatno ili ne, primateljima morate dati sva prava koja imate i sami. Takoer, oni moraju dobiti izvorni kod ili mogunost njegova dobivanja. A vi ih morate obavijestiti o ovim uvjetima kako bi znali svoja prava. Vaa prava titimo u dva koraka: 1. stavljajui autorska prava na program, te 2. nudei vam ovu licencu koja vam omoguava zakonito umnaanje, distribuiranje i/ili mijenjanje programa.
21/1275
Takoer, zbog zatite svakog autora i nas, elimo biti sigurni da svi razumiju da za ovakve slobodne programe nema jamstva. Ako program netko promijeni i poalje dalje, elimo da njegovi primatelji znaju kako ono to su dobili nije izvornik, kako bilo kakvi problemi u takvoj verziji ne bi utjecali na ugled izvornog autora. Na kraju, svakom slobodnom programu stalno prijete patenti. elimo izbjei opasnost individualnog licenciranja od strane redistributora slobodnog programa, to bi program uinilo vlasnitvom. Da to sprijeimo, razjasnili smo kako svaki patent mora biti licenciran za svaiju slobodnu uporabu ili uope ne biti licenciran. Slijede tone obveze i uvjeti za umnaanje, distribuiranje i mijenjanje.
22/1275
Ove potrebe vrijede za promijenjeno djelo u cjelini. Ako raspoznatljivi dijelovi tog djela nisu izvedeni iz Programa, i mogu se sami razumno smatrati nezavisnim i odvojenim djelima, onda ova Licenca, i njeni uvjeti, ne vrijede za te dijelove kada ih distribuirate kao zasebna djela. Ali ako distribuirate iste dijelove kao dio cjeline koja je djelo zasnovano na Programu, distribucija te cjeline mora zadovoljavati uvjete ove Licence, ije dozvole drugima koji su je licencirali vrijede za cjelinu, odnosno svaki njen dio bez obzira tko ga je napisao. Dakle, ovom dijelu nije namjera da dobije prava ili da pobija vaa prava na djelo koje ste vi napisali u cjelini; namjera mu je poboljati pravo nadzora distribucije izvedenih ili skupljenih djela zasnovanih na Programu. Takoer, sama integracija drugog djela nezasnovanog na Programu s Programom (ili djelom zasnovanim na Programu) na mediju pohranjivanja ili distribucije ne dovodi to drugo djelo u doseg ove Licence. 3. Smijete umnaati i distribuirati Program (ili djelo na njemu zasnovano, po Dijelu 2.) u objektnom kodu ili izvrnom obliku pod uvjetima Dijela 1. i 2. ako uinite jedno od sljedeeg: a) Popratite ga potpunim odgovarajuim strojno itljivim izvornim kodom, koji mora biti distribuiran pod uvjetima Dijela 1. i 2. na mediju po izboru koritenom za razmjenu programa; ili b) Popratite ga pisanom ponudom, koja vrijedi barem tri godine, da ete svakoj treoj stranci dati, za cijenu ne veu od vaeg troka fizikog vrenja distribucije izvornog koda, potpunu strojno itljivu kopiju odgovarajueg izvornog koda, koju e se distribuirati pod uvjetima Dijela 1. i 2. na mediju po izboru koritenom za razmjenu programa; ili c) Popratite ga informacijama koje ste vi primili o ponudi za distribuciju odgovarajueg izvornog koda. (Ova mogunost vrijedi samo za nekomercijalnu distribuciju i samo ako ste primili program u objektnom kodu ili izvrnom obliku s takvom ponudom, prema prethodnom Odlomku b.) Pod izvornim kodom za djelo mislimo na eljeni oblik djela za njegovo mijenjanje. Za izvrno djelo, potpuni izvorni kod odnosi se na izvorni kod svih modula koje ono sadri, uz datoteke koje definiraju svako ukljueno suelje, uz skripte za nadzor prevoenja i instalacije izvrne datoteke. Meutim, kao posebna iznimka, distribuirani izvorni kod ne mora ukljuiti bilo to to se obino distribuira (bilo u izvornom kodu, bilo u izvrnom obliku) s glavnim dijelovima (prevodioc, jezgra, itd.) operacijskog sustava na kojem izvrna datoteka radi, osim ako sam taj dio prati izvrnu datoteku. Ako se izvrna datoteka ili objektni kod distribuira omoguavanjem pristupa kopiji na odreenom mjestu, onda se omoguavanje jednakog pristupa izvornom kodu smatra distribucijom izvornog koda, iako se drugi ne prisiljavaju na umnaanje izvornog koda zajedno s objektnim. 4. Ne smijete umnaati, mijenjati, podlicencirati ili distribuirati Program osim kako je izraeno u ovoj Licenci. Bilo kakav pokuaj umnaanja, mijenjanja, podlicenciranja ili distribuiranja Programa je nezakonit, i odmah ponitava vaa prava prema ovoj Licenci. Meutim, strankama koje su od vas dobile kopije ili prava pod ovom Licencom nee biti ponitene licence, dok zadovoljavaju sve uvjete. 5. Ne morate prihvatiti ovu Licencu, poto ju niste potpisali. Meutim, nita vam drugo ne jami dozvolu za mijenjanje ili distribuciju Programa ili iz njega izvedenih djela. Te su radnje zakonom zabranjene ako ne prihvatite ovu Licencu. Prema tome, mijenjanjem ili distribuiranjem Programa (ili djela na njemu zasnovanog), pokazujete svoj pristanak na ovu Licencu, i sve njene obveze i uvjete za umnaanje, distribuiranje i mijenjanje Programa ili djela na njemu zasnovanih.
23/1275
6. Svaki put kada ponovo distribuirate Program (ili bilo koje djelo zasnovano na Programu), primatelj automatski prima licencu od izvornog vlasnika za umnaanje, distribuiranje ili mijenjanje Programa prema ovim obvezama i uvjetima. Ne smijete nametnuti bilo kakva daljnja ogranienja na primateljevo koritenje ovdje zajamenih prava. Niste odgovorni za traenje zadovoljavanja ove Licence od drugih stranaka. 7. Ako vam se, kao posljedicu sudske presude ili tube za krenje patenta ili iz bilo kojeg drugog razloga (ne samo to se tie patenata), nameu obveze (bilo sudskim nalogom, nagodbom, ili drukije) u kontradikciji s uvjetima ove Licence, to ne znai da smijete kriti uvjete ove Licence. Ako ne moete distribuirati tako da zadovoljavate istodobno i svoje obveze pod ovom Licencom i sve ostale odgovarajue obveze, onda kao posljedicu uope ne smijete distribuirati Program. Na primjer, ako patentna licenca ne doputa slobodnu redistribuciju Programa svima koji njegove kopije dobiju izravno ili neizravno od vas, onda je jedini nain na koji moete zadovoljiti i nju i ovu Licencu prestanak distribuiranja Programa. Ako se bilo koji dio ovog Dijela dri nevaeim ili neprovedivim pod bilo kakvim okolnostima, namjena je Dijela da vrijedi i Dio u cjelini namijenjen je da vrijedi u drugim okolnostima. Ovom Dijelu nije svrha da vas potakne na krenje patenata ili drugih prava na vlasnitvo ili na njihovo pobijanje; jedina mu je svrha zatita integriteta distribucijskog sustava slobodnih programa, kojeg implementira javna praksa. Mnogi ljudi su velikoduno pridonijeli velikom broju programa distribuiranim kroz taj sustav pouzdajui se u dosljednu primjenu tog sustava; na autoru/donatoru je odluka da li e programe distribuirati nekim drugim sustavom i korisnik licence ne moe mu nametati svoj izbor. Namjera ovog Dijela je razjanjavanje onoga za to se vjeruje da su posljedice ostatka Licence. 8. Ako je distribucija i/ili koritenje Programa u nekim dravama ogranieno bilo patentima bilo sueljima na koje se polau autorska prava, izvorni vlasnik autorskih prava koji je Program stavio pod ovu Licencu moe dodati eksplicitno zemljopisno ogranienje distribucije izuzimajui takve drave, i inei distribuciju dozvoljenom samo u ili meu dravama koje nisu izuzete. U tom sluaju, ova Licenca ukljuuje ogranienje kao da je napisano u tijelu ove Licence. 9. Free Software Foundation s vremena na vrijeme moe objaviti promijenjene i/ili nove verzije Ope javne licence. Takve nove verzije bit e duhom sline sadanjoj, no mogu se razlikovati u detaljima kako bi se rijeili novi problemi ili brige. Svakoj verziji se daje razliit broj verzije. Ako Program navodi broj verzije ove Licence koja za njega vrijedi i "bilo koja kasnija verzija", smijete potovati obveze i uvjete te verzije ili bilo koje kasnije verzije koju je objavio Free Software Foundation. Ako Program ne odreuje broj verzije ove Licence, smijete odabrati bilo koju verziju ikad izdanu od strane Free Software Foundationa. 10. Ako elite ukljuiti dijelove Programa u druge besplatne programe iji se uvjeti distribucije razlikuju, piite autoru i traite njegovu dozvolu. Za programe ija autorska prava ima Free Software Foundation, piite Free Software Foundationu; ponekad radi toga radimo iznimke. U odluivanju e nas voditi dva cilja uvanja slobode svih izvedenica iz naeg programa i promicanje dijeljenja i ponovnog koritenja programa openito. NEMA JAMSTVA 11. POTO JE PROGRAM LICENCIRAN BESPLATNO, ZA PROGRAM NEMA JAMSTVA, U MJERI DOPUTENOJ PRIMJENJIVIM ZAKONOM. OSIM AKO JE DRUKIJE IZRAENO NAPISMENO, VLASNICI AUTORSKIH PRAVA I/ILI DRUGE
24/1275
STRANKE PROGRAM DAJU "KAKAV JEST" BEZ JAMSTVA BILO KOJE VRSTE, IZRAENOG ILI PODRAZUMIJEVANOG, UKLJUUJUI, ALI NE SAMO NJIH, PODRAZUMIJEVANA JAMSTVA TRGOVINSKE PRIKLADNOSTI I ODGOVARANJA ODREENOJ SVRSI. SVI RIZICI VEZANI ZA KVALITETU I BRZINU PROGRAMA OSTAJU NA VAMA. AKO SE PROGRAM POKAE NEVALJANIM, VI SNOSITE SVE TROKOVE POTREBNOG ODRAVANJA, POPRAVLJANJA I ISPRAVLJANJA. 12. NI U KOJEM SLUAJU, OSIM NUNO PO PRIMJENJIVOM ZAKONU ILI NAGODBOM NAPISMENO, BILO KOJI VLASNIK AUTORSKIH PRAVA, ILI BILO KOJA DRUGA STRANKA KOJA SMIJE MIJENJATI I/ILI REDISTRIBUIRATI PROGRAM KAKO JE DOZVOLJENO GORE, NEE BITI VAMA ODGOVORAN ZA TETE, UKLJUUJUI OPE, POSEBNE, SLUAJNE ILI POSLJEDINE TETE PROIZALE IZ KORITENJA ILI NEMOGUNOSTI KORITENJA PROGRAMA (UKLJUUJUI, ALI NE SAMO NJIH, GUBITAK PODATAKA ILI INJENJE PODATAKA NETONIM ILI GUBITKE VAS ILI DRUGIH STRANAKA ILI NEUSPJEH PROGRAMA DA RADI S BILO KOJIM DRUGIM PROGRAMOM), AK I AKO JE TAKAV VLASNIK ILI DRUGA STRANKA UPOZORENA NA MOGUNOST TAKVIH TETA. KRAJ OBVEZA I UVJETA
25/1275
26/1275
ZAKLJUAK
GNU pokret je pokrenut iz jednostavog razloga - elje za slobodom, elje da se napravi neto pozitivno, neto od ega e svi imati koristi. Ljudi koji su to gurali imali su teak zadatak ispred sebe, napraviti slobodan operacijski sustav. Nisu imali neograniena materijalna sredstva za to, nisu imali ni obeanje da ih novac eka na kraju tog dugog puta. Imali su samo znanje i veliku volju. Malo po malo, kako se je sve vie ljudi ukljuivalo u pokret, uspjeli su doi do svog cilja (iako ne ba onako kako su imali u planu na poetku). Nastao je GNU/Linux. Svijet je dobio slobodni operacijski sustav (u nekim verzijama). Je li on bolji ili loiji od drugih? O tome postoje podjeljena miljenja no to nije vano. Vano je da je on slobodan to znai da ako netko smatra da neto ne valja i da moe bolje, ima slobodu to sam napraviti. To mu je omogueno time to ima izvorni kod i time to mu GNU licenca pod kojom dolazi osigurava to pravo. Druga stvar koja je proistekla iz tog pokreta je pojam slobodan (free) softver. Pokazalo se da je taj softver u pravilu bolji i pouzdaniji od vlasnikog (proprietary) softvera. Razlog je ponovno taj to slobodan softver dolazi sa izvornim kodom. Dostupnost izvornog koda omoguuje bilo kome da proui taj softver i samim time se bugovi bre pronalaze. Takoer, sloboda da se mijenja kod omoguuje bilo kome da prilagodi program upravo svojim potrebama. Time se dobija velika baza gotovog softvera u kojoj svatko moe nai neto korisno za sebe, pogotovo ako sam nije vian programiranju. Kakva je budunost GNU pokreta i slobodnog softvera? To je teko pitanje. S jedne strane imamo velike kompanije sa mnogo novca koje na razne naine ele zaustaviti slobodan softver koji je zbog svoje kvalitete postao ozbiljan konkurent njihovim loim poluproizvodima, a potpuno je besplatan. Ide se ak tako daleko da se pokuava uvesti patent na softverske algoritme to je po mom miljenju totalno apsurdno i glupo, da ne kaem opasno. Apsurdna je sama ta ideja da se neto tako apstraktno kao to je znanje, moe smatrati materijalnim dobrom i polagati prava na to. Drugi problem GNU pokreta i slobodnog softvera je taj to se izdavanjem programa kao slobodnog (pod GNU GPL) ne moe obogatiti budui da svatko tko jednom dodje do programa tako izdanog, moe ga dalje distribuirati bez ikakve naknade autoru. Iako postoje naini da se i takav softver unovi (donacije, posebne prilagodbe
27/1275
softvera i sl.) zarada nikada nije i ne moe biti ni blizu onoj koja se okree u vlasnikom softveru. Kod nekih drava (ukljuujui i Hrvatsku) veliki problem u prihvaanju slobodnog softvera je i vrlo razvijena kultura piratsva. U zemljama gdje piratsvo nije tako raireno slobodan softver je dobar izbor i zbog svoje cijene (besplatan je). Tamo gdje je piratski softver normalna stvar, jedina prednost slobodnog softvera je to sto dolazi sa izvornim kodom, ali ta prednost veini korisnika nije bitna jer samo rijetki imaju znanje to iskoristiti. Na kraju, nebitno kakva budunost eka slobodan softver, on je sada tu. Poeo je kao ideja jednog ovjeka, tekom mukom i uz puno odricanja napravio je poetak, pridruili su mu se i drugi i stvar je krenula. Danas za gotovo sve to postoji kao vlasniki softver postoji i verzija slobodnog softvera, koji budui da je nastao iz ljubavi prema programiranju a ne zbog novca, je obino bolji i kvalitetniji. Zbog toga svi mi imamo mogunost izbora (jo kad bi se i igre izdavale pod GNU licencom kao slobodan softver, gdje bi nam bio kraj). :)
28/1275
NAPOMENE
Materijal i ideje za ovaj seminar sam naao uglavnom na web stranici http://www.gnu.org ili linkovima koji su postavljeni tamo. Zbog prirode teme, nisam mogao pisati samo injenice nego je velik dio rada zapravo stav i razmiljanje jednog ovjeka, Richarda Stallmana (osim zakljuka koji je iskljuivo moje miljenje o svemu tome). Najvei problem mi je bio prevoenje nekih rijei koje u hrvatskom jeziku nemaju zamjenu ili ako i imaju, runo zvue. Zbog toga sam neke rijei ostavio u izvornom, engleskom obliku. Prijevod GNU licence (pod 4.1) sam kopirao takoer sa http://www.gnu.org jer ja i tako to ne mogu bolje prevesti a i bilo bi suvino prevoditi kad prijevod ve postoji.
29/1275
Marijela Napast
STRUKTURA UNIXA
30/1275
OPERACIJSKI SUSTAV
Svako raunalo ima operacijski sustav. Operacijski sustav je program koji kontrolira rad svih ostalih dijelova raunala, kako hardvera, tako i softvera. Najvanije je to nam doputa da koristimo sve mogunosti koje nam pruaju razni programi. Detaljno govorei Unix nije samo jedan operacijski sustav, on je obitelj operacijskih sustava. Razliiti proizvoai proizvode svoje verzije Unixa. Iako su sve verzije jako sline, postoje male razlike koje mogu uzrokovati probleme. Najoitiji primjer je raspored sustava datoteka i tono odreeni format nekih naredbi. Jedna od velikih prednosti Unixa za programere je to da su svi najbolje napisani korisniki programi neovisni od hardvera to ih ini lako itljivim novim sistemima. Unix je viekorisniki i viezadani operacijski sustav. Tako moe istovremeno postojati vie korisnika povezanih na sistem i svaki od njih moe imati pokrenuto vie programa. Korisnici velikom prednou Unixa smatraju mogunost istovremenog koritenja vie programa jer tako ne gube vrijeme na ekanje da se jedan posao zavri kako bi mogao zapoeti novi. Unix se koristi na radnim stanicama i viekorisnikim serverima. Na X terminalima i radnim stanicama X Windows predstavlja grafiko suelje izmeu korisnika i Unixa. Ali ipak poznavanje Unixa je potrebno za operacije koje nisu pokrivene grafikim programom, ili kad ne postoji X Windows sistem npr. u telnet sessionu.
Slika 1.
31/1275
KERNEL
Kernel kao to govori i njegovo ime je jezgra svakog Unix sistema i oitava se prilikom svakog pokretanja sistema i vezan je uz sam pokretaki dio programa. Rukuje sa cijelim izvornim sistemom i prezentira nam ga zajedno sa svakim spojenim korisnikim sustavom. Zadaa kernela je da dri procese i korisnike odvojenima i regulira pristup hardveru sistema, ukljuujui i procesor, memoriju, disk i druge ulazno izlazne ureaje. Kernel direktno komunicira sa hardverom i omoguava koritenje korisnikih programa. Ti korisniki programi ne trebaju znati nita o hardveru. Oni samo trebaju znati na koji nain komunicirati s kernelom i traiti od njega da izvri eljenu operaciju. Oni komuniciraju s kernelom kroz skup standardnih sistemskih poziva. Ti sistem pozivi trae od kernela da izvri operacije kao to su: otvaranje, zatvaranje, itanje, pisanje, povezivanje, izvravanje, startanje ili promjenu zapisa zbrojeva, mijenjanje vlasnitva nad datotekom ili direktorijem, promjene u novi direktorij, stvaranje procesa, determiniranje procesa, omoguavanje pristupa hardver ureajima i postavljanje granica izvornom sistemu. Najjednostavnije reeno kernel na naredbu korisnika ukljuuje i iskljuuje dio sistema. Npr. ako traimo da nam raunalo ispie sve datoteke unutar direktorija naredbom ls, onda kernel nareuje raunalu da s diska uita sve datoteke u traenom direktoriju i ispie ih na ekran. Neke od osnovnih funkcije kernela su: rukovanje s memorijom sustava i alociranje memorije za svaki proces rasporeivanje rada procesora kako bi rezultati rada svakog korisnika bili to uspjeniji organiziranje prenaanja podataka iz jednog djela raunala u drugi dio prihvaanje instrukcija od strane shella i njihovo predstavljanje iznuivanje dozvola pristupa koje su na snazi u datotenom sustavu Da bi se prikazao primjer na koji shell i kernel rade zajedno pretpostavimo da korisnik utipka naredbu rm moja_datoteka (koja ima uinak brisanja datoteke moja_datoteka). Shell trai datoteku koja sadri program rm i zatim postavlja zahtjev kernelu kroz sistemske pozive da izvri program rm na mojoj_datoteci. Kad proces rm moja_datoteka zavri, shell tad vraa korisniku znak unixa % to ukazuje na to da eka na nove naredbe. Da bismo locirali kernel potrebno je znati da root direktorij sadri oboje, pokretaki (boot) program i kernel za sistem. Ime kernel datoteke varira od proizvoaa do proizvoaa,
32/1275
ali obino ukljuuje skup slova: nix da bi ga se moglo pronai sa tzv. Wildcard znakovima. Npr.: ls /*nix* -rwxr----- 1 root 1558734 Sep 24 1992 /vmunix
Ova lista definira svaku datoteku u root direktoriju sa skupom slova nix u njihovu imenu. U ovom primjeru ispisuje vmunix to je zajedniko ime za kernel file.
33/1275
SISTEMSKI POZIVI
Sistemski pozivi su suelje izmeu kernela i korisnikih programa koji se pokreu na vrhu njega. Korisnici koji rukuju samo s shellom, tekst editorima ili drugim aplikacijskim programima nemaju potrebu znati mnogo o sistemskim pozivima, ali pravo poznavanje poziva je najvanije za Unix programere. Sistemski pozivi su jedini nain na koji se moe pristupiti opcijama kernela, kao to je sustav datoteka, mehanizam viezadanosti i meuprocesno komuniciranje. Sistemski pozivi definiraju ono to je Unix, jer sve ostalo tj. subrutine i naredbe se grade na toj osnovi. Neki od njih su povezani sa podacima koje korisnici ne smiju mijenjati. Postavlja se pitanje kako programeri pristupaju sistemskim pozivima. Ne postoji razlika izmeu sistemskog poziva i bilo kojeg drugog poziva funkcije. Npr. sistemski poziv read moe se postaviti ovako: amt = read (fd, buf, numbytes) ; Implementacija subrutine read varira u raznim oblicima Unixa. Obino je to asemblerski jezik koji koristi instrukciju stroja dizajniranu tono za sistemski poziv, a nije direktno izvriva iz C programa. Danas je pametno pretpostaviti da su sistemski pozivi jednostavno C subrutine, ali moramo biti svjesni da s obzirom na to da sistemski pozivi ulaze u promjenu konteksta (od korisnika do kernela i natrag), potrebno je mnogo vie vremena nego za obinu sistemsku subrutinu za koju proces posjeduje svoj adresni prostor. Veina sistemskih poziva vraa neku vrijednost. U navedenom primjeru poziv read vraa broj bita. Da bi ukazao na greku sistemski poziv vraa vrijednost koja se ne moe zamijeniti s tonim podatkom i obino je to 1. Zbog toga bi navedeni primjer trebao biti kodiran na sljedei nain: If ((amt= read(fd, buf, numbytes)) == -1) { printf(Read failed\n) ; exit (1) ; } Primjeujemo da je exit takoer sistemski poziv, ali on ne moe vratiti greku. Postoji vie razloga zbog kojih sistemski pozivi koji vraaju 1 nisu uspjeli obaviti traeni posao. Globalna varijabla errno sadri kod koji ukazuje na razlog. Errno sadri tone podatke samo
34/1275
ako sistemski poziv doista vrati 1. Ne moemo koristiti errno da bi smo ustanovili da li je do greke uope dolo. Sistemska rutina perror uzima za svoj argument string i daje string, kolonu i opis razloga greke pohranjenog u errnu. Nain na koji koristimo opisane funkcije prikazuje primjer: If ((amt= read(fd, buf, numbytes)) == -1) { perror (read) ; exit (1) ; } Kao izlaz moemo dobiti sljedei tekst: file does not exist on an error. Na stranicama za pomo moemo pronai deklaraciju za svaki poziv. Tu je prikazano koji tip vrijednosti poziv vraa, koji tip argumenata uzima i koje datoteke moramo ukljuiti za koritenje odreenog sistemskog poziva. Slijedi primjer za poziv read(). #include <unistd.h> #include <sys/types.h> #include <sys/uio.h> int read(int d, char *buf, int nbytes) Read() pokuava proitati nbytes podataka iz objekta referenciranog deskriptorom
datoteke d u spremnik buf. Ako je poziv uspjean, vraa toan broj proitanih bita inae vraa 1 i postavlja globalnu varijablu errno koja pokazuje na greku. Prvi dio koda pokazuje koje datoteke moraju biti ukljuene, a onda je napisana sama deklaracija sistemskog poziva. int read(int d, char *buf, int nbytes) Read() uzima 3 argumenta : int koji je nazvan sa d, pokaziva na znak nazvan buf i jo jedan int nazvan nbytes. Read() vraa int kao rezultat. Imena argumenata odreujemo sami. Jo jedan jednostavan primjer sistemskog poziva je vremenski sistemski poziv:
35/1275
Time vraa vrijeme u sekundama od 01.01.1970. Ako je argument timep razliit od nule tono vrijeme se pohranjuje u integer na koji pokazuje. Neki od sistemskih poziva najnie razine su: kreiraj otvori zatvori iskljui itaj pii trai Neki od sistemskih poziva za kontroliranje procesa su: razdvoji ekaj izvri izai signal Sistemski pozivi za IPC su: pipe dup
36/1275
SHELL
Svaki put kad se ukljuujemo u Unix sistem, program za ukljuivanje provjerava nau ifru i korisniko ime i smjeta nas u program koji se zove shell (ljuska). Shell djeluje kao suelje izmeu korisnika i kernela. Shell je dio korisnikog programa, a ne dio kernela. Shell omoguuje izvravanje nekih procesa u pozadini. Shell je prevoditelj naredbi (command line interpreter(CLI)). Moemo vidjeti njegov pokaziva na ekranu obino u obliku imena raunala na kojem radimo kojeg slijedi znak %. Po elji korisnik sam moe promijeniti taj pokazni znak. Da bismo napravili na eljeni posao unaamo naredbe na mjesto tog pokazivaa odnosno komandne linije koja se nalazi odmah iza pokazivaa. Shell funkcionira kao prevoditelj naredbi, uzima svaku naredbu i da bi bila obraena prosljeuje ju kernelu. On tada prikazuje rezultat operacija na ekranu. Da bismo saznali koji shell koristimo treba nam informacija koja se nalazi u shell okrunoj varijabli. Naredba echo $SHELL ispisuje vrijednost te varijable. Da bismo otkrili koji shell upravo koristimo potrebno je znati posljednji dio imena, pa tako postoje sljedee mogunosti: Ime: /.../sh /.../csh /.../tcsh /.../ksh /.../bash Shell: Bourne shell C shell TC shell Korn shell Bourne Again SHell
Najee se koriste dva shella; Bourne shell (sh) i C shell (csh). Moemo koristiti razliite shellove upisivanjem imena shella na mjesto pokazivaa, pa emo tako upisati npr. imeshella% csh da bismo pokrenuli C shell, ili imeshella% sh da bismo pokrenuli Bourne shell. Na shell u koji nas sustav odmah ukljuuje moemo promijeniti koritenjem naredbe chsh. Da bismo napustili odreeni shell koristimo naredbu imeshella% exit. Razliiti shellovi izvravaju razliit broj funkcija. Shell provodi sljedee funkcije: a) stvara okruje susretljivo naim potrebama Nae radno okruje je definirano svaki puta kad se spojimo ili zapoinjemo rad s novim shellom. Okruje je definirano vrijednostima koje shell nalazi u inicijalizacijskim datotekama koje se uvijek itaju prilikom pokretanja. Okruje moemo promijeniti promjenom tih
37/1275
datoteka i postavljanjem novih vrijednosti u varijable. Svaki shell rukuje na drugaiji nain sa svojim inicijalizacijskim datotekama. esto koritene varijable za radno okruje su: IME EDITOR PAGER PATH PRINTER SHELL TERM TZ b) npr. mail programa Postavlja pager koji e biti koriten od drugih programa, npr. mana za ispisivanje man stranica Odreuje direktorije kroz koje e shell traiti da bi pronaao odreenu naredbu. Direktoriji se pretrauju redom kojim se pojavljuju Odreuje printer koji e sluiti za ispis svih dokumenata koji e mu biti poslani lpr naredbom Postavlja glavni shell Odreuje tip terminala za programe kao to su editor i pager Postavlja vremensku zonu u kojoj se nalazimo manipulira povijeu naredbi OPIS Postavlja editor koji e biti koriten od strane drugih programa,
Shell uva listu naredbi koje smo upisivali. Ako trebamo ponoviti naredbu, koristimo strelice da bismo se pomicali gore i dolje po listi. c) automatski zavrava linije naredbi Utipkavanjem djela imena naredbe, naziva datoteke ili direktorija i pritiskom na Tab, tcsh shell e zavriti ostatak imena automatski. Ako shell pronae vie od jednog imena koje poinje tim slovima ut e se beep to ukazuje na to da je potrebno utipkati jo nekoliko slova prije ponovnog pritiskanja Taba. d) e) f) pie shell skripte definira naredbene aliase editira zajednike linije
38/1275
PROGRAMI
Sve u Unixu je ili datoteka ili proces. Proces je program za izvravanje identificiran jedinstvenim PID-om(Process identifier). Datoteka je kolekcija podataka stvorenih od korisnika koritenjem tekst editora, compilera,itd. Primjeri datoteka su: dokument ( izvjetaj, esej) tekst programa napisan u nekom viem jeziku instrukcije razumljive direktno stroju i nerazumljive prosjenom korisniku, npr. kolekcija binarnih brojeva (executable ili izvrni file) direktorij koji sadri informacije o svojem sadraju koje mogu biti skup drugih direktorija ili poddirektorija i obinih datoteka Okruje aplikacija sastoji se od: shella maila tekst editora (vi, emacs, jove) tekst procesa (nroff, troff, TeX) kontrolnog koda za izvorni sistem (SCCS) razvojnih opcija (as, ld, cpp, cc) drugih opcija (who, date, wc, grep, comp) Programi i naredbe komuniciraju s kernelom kako bi se izvrile funkcije koje je pokrenuo korisnik. Programi su obino grupirani po kategorijama, pa tako npr. imamo programe koje koristimo za pisanje, programe koje koristimo za programiranje ili programe koji slue kao poslovne aplikacije. Sistemski programi su najee binarni i kompajliraju se od C izvornog koda. Smjeteni su na mjesta kao /bin, /usr/bin, /usr/local/bin, /usr/ucb, idr. Oni izvode funkcije na koje nas asocira sama pomisao na Unix, kao to su sh, csh, date, who, more idr. Sve datoteke su grupirane u strukturu direktorija. Sustav datoteka je ureen prema hijerarhijskoj strukturi, kao izokrenuto drvo. Vrh hijerarhije se tradicionalno naziva root i obiljeava se s kosom crtom -/.
39/1275
Slika2: Svaki vor predstavlja ili datoteku ili direktorij datoteka, a svaki sljedei sadri druge datoteke i direktorije. Datoteku ili direktorij odreujemo po njegovu imenu, ili punom ili apsolutnom imenu ili jednom relativnom za lokaciju. Puno ime zapoinje s rootom(/), i zatim slijede grane datotenog sustava svaka odvojena s kosom crtom (/), sve dok ne dosegnemo eljenu datoteku. Npr. /home/condron/source/xntp Relativno ime specificira ime relativno drugom imenu, a uobiajeno se odnosi upravo na onaj direktorij u kojem se trenutno nalazimo. Dva posebna direktorij ulaza su: direktorij u kojem se trenutno nalazimo roditeljski direktorij direktorija u kojem se nalazimo Npr. ako se nalazimo u /home/frank i elimo specificirati viu razinu moemo koristiti: ../condron/source/xntp To ukazuje da je prvo potrebno ii jedan nivo direktorija iznad i onda se spustiti kroz condorn direktorij kojeg slijedi source direktorij i onda xntp. Svaki direktorij i datoteka su izlistani u svojem roditeljskom direktoriju. U sluaju root direktorija roditeljski direktorij je on sam. Direktorij je datoteka koja sadri tablicu s imenima datoteka koja se nalaze u njemu i svako ime datoteke pridruuje inode broju u listi. Inode je specijalna datoteka dizajnirana da ju kernel moe itati kako bi dobio informacije o svakoj
40/1275
datoteci. Odreuje dozvole nad datotekama, vlasnitvo, datum stvaranja, zadnjeg pristupa i promjene, te fiziku lokaciju blokova podataka na disku koji sadre datoteku. Sistemu nije potrebna nikakva posebna struktura za podatke koji se nalaze u datoteci. Datoteka moe biti ASCII ili binarna ili kombinacija i moe prezentirati tekstualne podatke, shell skriptu, kod za program, tablicu direktorija, junk ili bilo to drugo. Ne postoji zaglavlje, naslovna informacija ili EOF znak kao dio datoteke. Svaki Unix sustav ima svoju strukturu dozvola. Slijedi jednostavno objanjenje dozvola nad datotekama na serveru temeljenom na Unixu. Svaka stvorena datoteka ili direktorij imaju: a) vlasnika to je obino osoba koja je stvorila datoteku vlasnik datoteke ili direktorija moe davati razliita doputenja b) grupu kako vie korisnika moe biti povezano u korisniku grupu, postoji grupno vlasnitvo vezano za pojedinu datoteku ili direktorij c) ostalo (svijet) svi ostali korisnici, u ovom sluaju bilo tko spojen na Internet Postoje 3 naina zatite datoteka i direktorija a) r ((Read) - itaj) korisnik koji ima dozvolu itanja datoteke i moe zakljuati sadraj te datoteke korisnik koji ima dozvolu itanja nad direktorijem moe saznati koje se datoteke nalaze u direktoriju (ako se trae detaljne informacije o datotekama unutar direktorija, direktorij mora imati execute dozvolu) b) datoteke korisnik koji ima dozvolu pisanja nad direktorijem moe mijenjati sadraj tog direktorija c) x ((Execute)-Izvri) korisnik koji ima dozvolu izvravanja nad datotekom moe koristiti ime te datoteke kao Unix naredbu korisnik koji ima dozvolu izvravanja nad direktorijem moe kopirati direktorije w ((Write) - Pii) korisnik koji ima dozvolu pisanja nad datotekom moe mijenjati sadraj te
41/1275
Andrija Martinovi
SHELL
42/1275
UVOD
U doba nastanka i razvijanja UNIX operativnog sistema, 1970-tih i 1980-tih, raunala nisu bila toliko mona koliko su danas, tako da nije postojalo grafiko suelje (GUI). Prvi ulazno / izlazni ureaji bili su terminali i teleprinteri. Postojali su (viekorisniki) multiuser serveri na koje se bilo mogue spojiti putem terminala i moglo se raditi u tekstualnom nainu rada, komandnoj liniji (CLI), tj. SHELL-u. I danas je ostalo popularno raditi u shell-u, ne samo zbog povijesnih razloga, nego i praktinih. Unix korisnicima je gotovo nezamislivo raditi bez shell-a, tj. terminala. Terminali su i danas prisutni u raznim ustanovama i poduzeima, nije potreban dodatan software da bi se dodao jo jedan terminal, a vano je napomenuti i da je mogue i osobno raunalo koristiti kao obian terminal. Nakon logiranja korisnik moe raditi u shell-u. Danas u standardnim distribucijama (ne onima za specijalne namjene) sve ee se korisnik nakon startanja nae automatski u grafikom okruenju - XWindows, tako da terminal niti ne vidi. Naravno, u bilo kojem trenutku moe aktivirati ili terminal ili X-e (npr. Alt+F2). Dakle, Shell je tekstualno okruenje pomou kojega korisnik komunicira sa operacijskim sustavom, po defaultu koristei tastaturu (kao input) i monitor (kao output). Korisnik instrukcije zadaje u obliku znakovnih komandi, a shell ima zadatak prevoditi te komande u instrukcije razumljive OS-u.
43/1275
SHELL
Shell je korisniki program kao i svaki drugi.
Shell je komandni interpreter UNIX operativnog sistema i moe se promatrati kao sloj koji se nalazi izmeu kernela i korisnika. Interaktivan je s obzirom da ima direktnu komunikaciju sa korisnikom. On dobiva korisnike zahtjeve, interpretira ih i predaje kernelu na izvravanje. Shell je komandni interpreter, tj. jo jedan sloj kojim je hardware raunala sakriven od korisnika.
44/1275
Shell ili CLI (Command Line Interpreter) je suelje izmeu korisnika i operativnog sustava (UNIX-a), tj program koji interpretira ono to se napie u komandnoj liniji. Prvo to korisnik vidi kad se UNIX digne je login: pa password:. Nakon uspjenog logiranja OS dodijeli UID (user ID) i GID (primary group ID) i doemo do shell-a. Trebali bi biti u svome (HOME) direktoriju ako postoji ili u ROOT (/) direktoriju. U komandnu liniju, iji defaultni prompt moe izgledati: $ ili # (kod Bourne shell-a) ili % (kod C shell-a), upisuju se naredbe. Te komande mogu biti built-in, tj. ve ugraene tako da se izvravaju direktno iz shell-a , ili se mogu indirektno pozivati iz nekih drugih programa. Ugraene naredbe su razliite kod razliitih verzija shell-ova. Iako su verzije UNIX-a sline, ipak postoje odreene razlike izmeu verzija. Kompatibilne verzije (sh, bash, ksh) i posebna vrsta c shell-a (csh, tcsh). U veini verzija UNIX operativnog sustava obino su na raspolaganju sljedee vrste shell-ova: SHELL Bourne Shell KRATAK OPIS /bin/sh - jednostavan za koritenje, fleksibilan, sa ugraenim programskim jezikom. /bin/rsh - reducirana verzija Bourne Shell-a. /bin/csh - komandni interpreter i programski jezik koji podrava komandni buffer, kontrolu poslova i sintaksu C-like. /bin/ksh - dodatne mogunosti u odnosu na Bourne Shell./bin/rksh reducirana verzija Korn shell-a. /bin/tcsh - unaprjeena verzija C shell-a. Ima bolje editiranje komandnih linija, kompletiranje imena fajlova, ponavljanja komandi.
C Shell
Korn Shell
Turbo C Shell
45/1275
Dakle, UNIX OS se sastoji od: jezgre (kernel) zajednikih programa ljuske (shell) viih programskih jezika razliitih namjenskih programa Sada emo malo detaljnije objasniti kernel i shell.
46/1275
KERNEL (JEZGRA)
Kernel UNIX operativnog sistema kontrolira pristup raunaru, upravlja fajl sistemom, resursima raunara, diskovima, trakama, tampaima, komunikacionim linijama i drugim ureajima. Na slici dat je pregled funkcija Kernel-a.
Za kernel (jezgru) moemo rei da je centralni dio operacijskog sustava koji se uitava pri podizanju sustava, a upravlja raunalnim sklopovljem, radom procesora i dodjelom memorije. Poznavanje jezgre operacijskog sustava nije nuno za koritenje raunala. Nedostupna je obinom korisniku koji moe komunicirati s jezgrom samo preko poziva sustavu.
47/1275
LJUSKA (SHELL)
Ljuska je tuma ( tzv. interpreter ) naredbi i slui kao veza izmeu korisnika i UNIX-a. Svaki korisnik ima odvojenu kopiju ljuske pa prema tome one mogu biti razliite za svakog korisnika. Kod pokretanja operacijskog sustava UNIX, proces init izvodi proces getty za svaku aktivnu liniju terminala. Prilikom prijave korisnika UNIX-u, odvijaju se sljedee akcije: -getty oslukuje liniju i kada otkrije na njoj skup znakova zakljuen znakom za kraj retka, pokree novi proces login, prenese mu proitane znakove i nestaje -login zavrava proces prijave korisnika UNIX-u (ime korisnika i njegova lozinka te provjera identiteta) i ako je sve u redu, provjerava zadnje polje u datoteci etc/passwd za prijavljenog korisnika. To polje je ime ljuske koja e zamijeniti proces login: ime: ime: passwd: broj1: broj2: tekst:maticno kazalo:ime_ljuske Ljuska je interpreter naredbi. Njezini zadaci su: Primanje korisnikih naredbi Pokretanje korisnikih programa i komunikacija sa jezgrom Prikazivanje rezultata na zaslonu Prilikom spajanja na raunalo, po uspjenoj identifikaciji, nalazimo se u poetnoj ljusci
48/1275
49/1275
strukture i elemente nekog programskog jezika, preporuka je napisati program u jednom od raspoloivih programskih jezika. UNIX-ove ljuske imaju i nedostatke: Ne izvode se pretjerano brzo. Programi napisani u jednoj od ljusaka su tekst datoteke pa se kao takve i raspodjeljuju, a otean je i sigurnosni mehanizam (problem bitova setuid i sticky). Vii programski jezici ( C, Pascal, Fortran, LISP itd.) omoguavaju korisniku izradu vlastitih programskih aplikacija unutar UNIX okruenja. Razliiti namjenski programi (koji se koriste pod UNIX OS) su programi za dizajniranje, obradu teksta, matematike proraune itd. Dobra strana u ovom suparnitvu je u tome to sve ljuske mogu istodobno postojati na jednoj UNIX-ovoj instalaciji, a na krajnjim korisnicima je da odlue koju e koristiti. Ljuske sh i csh su sastavni dijelovi gotovo svih inaica UNIX-a, a ostale ljuske su negdje prisutne, a negdje ih treba dodatno instalirati. Dva su osnovna naina koritenja ljuske: interaktivni rad koritenjem preusmjeravanja i ulanavanja pojedinih naredaba skupna (eng. batch) obrada u kojoj se naredbe itaju iz datoteke (eng. shell script).
50/1275
Uz pomo VI (ili nekog drugog tekst editora) napie se skripta. Ako prva linija poinje sa # onda je C shell scripta. U suprotnom, script se tretira kao Bourne shell script. izvravanje: /bin/csh [-vx] script_name args ... -v -x ili: % chmod +x script_name % script_name args ... Skripte se koriste kada je interaktivni rad teak i previe zamren te kada zahtjeva mnoge komplicirane akcije koje se ponavljaju. ispisuje linije skripte koje se izvravaju ispisuje komande koje se izvravaju
51/1275
STARTANJE SHELL-A
Shell se starta kao i svaki drugi program, programskom naredbom. UNIX je graen tako da u operaciji boot procesa ukljui i startanje Shell-a, zapravo to je zadnji korak u boot procesu. Odmah po ukljuivanju raunala boot proces obavlja niz radnji kako bi kontrolu predao u ruke korisnicima, i pod boot procesom podrazumijevamo u ovom kontekstu tri osnovne faze. Prva faza je uitavanje jezgre odnosno alociranje raunarskih ureaja i kad se jednom starta kernel on ostaje u memoriji tokom itavog rada raunara odnosno do nestanka napona u memoriji. Druga faza je identifikacija korisnika kako bi bila mogua dodjela kontrolnih prava korisniku i u tu svrhu se pozivaju dva programa a to su getty i login. Prvi ima funkciju obezbjeivanja portova odnosno komunikacijskih kanala prema korisniku. Ti kanali se oznaavaju kao tty sa rednim brojem iza toga. getty prima string sa tastature od korisnika i prosljeuje ga programu login koji odreuje na osnovu tog stringa za koji pretpostavlja da je korisniko ime (Username) korisnika kontrolna prava (permissions), zatim se zahtjeva od korisnika da zada sljedei string koji e od login-a biti prepoznat kao korisnika lozinka (password). Ako password ne odgovara postojeem korisniku ili korisnik nije definiran na toj maini onda login ponovno vraa kontrolu programu getty, a ako je identifikacija validna onda program login starta sljedei program koji izmeu ostalog slui za izolaciju jezgra od korisnika a to je Shell. U svrhu ostvarivanja to vee sigurnosti sistema startanje Shell-a moe biti uskraeno odnosno onemogueno. Tu opet postoje opcije pomou kojih se odreuje koji e se program odmah nakon logiranja startati. To moe biti neki text procesor ili neki spreadsheet program tako da korisnik nema pravo upravljanja fajlovima koji nisu odgovarajueg formata za taj program, i poslije iskljuivanja tog programa sistem korisnika vraa ponovo na identifikaciju. Koji program e biti startan odreuje se u fajlu /etc/passwd koji sadri, izmeu ostalog, logine, kriptirane passworde, UID, GID, Ime korisnika, itd. Dva fajla, koja u stvari predstavljaju shell skripte, se izvravaju u toku login procedure. To su .login i .cshrc i oba se nalaze na HOME direktorijumu korisnika. Prvi se izvrava iz login programa koji obavlja autorizaciju korisnika (provjera login imena i passworda). Ako je autorizacija obavljena uspjeno, sam login program starta shell korisnika. Slino, kao login, shell izvrava svoj start-up fajl. Start-up fajl C shell-a je .cshrc. Oba spomenuta start-up fajla slue za inicijalno automatsko izvravanje odreenih komandi, definiranje aliasa, varijabli,
52/1275
radne okoline, i slino. Razlika izmeu .login i .cshrc fajla je ta sto se .login izvrava prvi i to prije startanja shell-a, ali to obino nije znaajno Tipian sadraj .cshrc fajla: # Definicija aliasa # alias ls "ls -CF" alias ll "ls -al" alias la "ls -a alias hi "history" alias xdvi "xdvi -geometry 730x860+30-1 -s 4 -paper a4" alias snns "snns -mono" # # Definiranje varijabli shell-a # set history=40 set filec set prompt="`hostname` \!% " set path=($path /usr/TeX/bin ~srle/bin /usr/local/spice/bin) # # Varijable okoline # setenv SPICE_LIB_DIR /usr/local/spice/lib # # Ostalo # umask 077
53/1275
PRIJAVLJIVANJE SA TERMINALA
Da bi se koristile mogunosti udaljenog raunala, potrebno se na njega prijaviti. Da bi ta prijava bila prijava bila jednaka kao da je raunalo lokalno, koriste se dva protokola: TELNET (virtual terminal protocol) i RLOGIN (Remote Login Protocol). Prijavljivanje sa terminala (preko serijske veze) i konzole (kada X-i nisu pokrenuti) osigurava getty program. init pokree posebnu instancu (kopiju) getty-a za svaki terminal za koji je dozvoljeno prijavljivanje. getty uitava ime korisnika i pokree login program koji uitava ifru korisnika. Ako su korisniko ime i ifra ispravni login pokree shell. Shell je tada korisnikova radna okolina; moe biti tekstualna, Bourne komandni shell ili ak grafiki shell - X-i...) . Kada shell program zavri svoj rad npr. korisnik se odjavi, ili ako je login prekinuo izvravanje zbog neispravnog korisnikog imena ili lozinke, init ovo registrira i pokree novu instancu getty-a. Kernel ne zna nita o prijavama jer sve potrebne poslove obave sistemski programi.
54/1275
Sintaksa naredbi
Kada login ukljui Shell na ekranu se ispisuje komandni prompt koji obino poinje sa znakom $ ili % ili ako je rije o Superuser-u # sharp sign. Iza toga se nalazi komandna linija (kako se jo i naziva) odnosno komandni input, pa se od korisnika zahtjeva zadavanje komande da bi je Shell pokuao interpretirati. Sintaksna pravila nalau format u obliku komande i argumenata: $ naredba argumenti naredba je neka izvrna datoteka kao npr. naredba, alat, shell, skripta, itd. Naredba mora biti executable odnosno user mora imati pravo na izvraanje te komande, pravo x u listi prava koju ima svaka datoteka u UNIX-oidima. Veina komandi oekuje argumente u sljedeoj formi:
55/1275
opcije imena_fileova Na primjer: $ ls la example1.c tulip.o ovo su ukupno tri argumenta. Prvi je opcija a druga dva su imena fileova. Naredbe definiraju akcije na UNIX-u. Svaku naredbu jedinstveno odreuje njeno ime i argumenti. Zadaci shella su izmeu ostalog i uklanjanje suvinih informacija kao to su nepotrebni razmaci izmeu argumenata , itd. U komandama se mogu koristiti univerzalni znakovi *,[] , ?. UNIX je CASE SENSITIVE operativni sistem, odnosno string otkucan VELIKIM i malim slovima nema isto znaenje. Na slici je prikazan dijagram toka izvravanje naredbi.
Neki znakovii koji se sa tastature dobivaju kombiniranjem kontrolnih i standardnih tipki imaju specijalna znaenja. Najznaajniji su:
< Ctrl > S < Ctrl > Q < Ctrl > D < Ctrl > C < Ctrl > Z
-izlaz na ekranu se privremeno zaustavlja. -izlaz na ekranu se nastavlja. -najjednostavniji nain odjavljivanja sa sistema. -prekid procesa. -privremeno zaustavljanje procesa.
56/1275
Sve komande UNIX-a se, prema svojim funkcijama, mogu svrstati u neku od sljedeih klasa: obrada teksta -tekst editori (ed, ex, vi), spell checker, tekst formateri i slino, upravljanje podacima -kreiranje, organizacija i brisanje fajlova i direktorijuma, elektronske komunikacije -vise programa (write, mail) koji omoguavaju razmjenu poruka meu korisnicima, programska okolina -mogunost definiranja komforne programske okoline koritenjem razliitih uslunih programa, razvojno okruenje -kompajleri i interpreteri raznih programskih jezika, linkeri, debageri,... ostali usluni programi -grafika podrka, X Windows.
57/1275
Drugi nain zadavanja vie naredbi u jednu komandnu liniju je startanje konkurentnih naredbi: $ named & apachectl start & mysqld & startx & netscape ova komandna linija starta pet programa od toga etiri u pozadini. Procesi startani u pozadini ne zarobljavaju komandni prompt ve se odvijaju u pozadini a prompt ostaje slobodan za zadavanje daljnjih naredbi. Kljuni znak je & i stavlja se iza naredbe koja pokree program koji elimo startati u pozadini. To su obino neki servisi jer nema potrebe da servis zauzme jedan komandni prompt.
ovo moe biti predugaak text da bi stao u jednu komandnu liniju znak \ je tzv. backslash karakter. Echo naredba ispisuje tekst na standardni output. Kao to ve spomenuo shell uklanja sve nepotrebne razmake (space caracter) tako da je tekst ispisan bez velikih razmaka kao u komandnoj liniji. Shell vidi komandu kao string i dijeli ime programa i argumente pomou razmaka ma koliko veliki oni bili, a kraj komande prepoznaje po newline karakteru. Newline karakter se generira kada pritisnemo enter na tastaturi. Na samom programu je da razlui to je opcija a to neki drugi argument. Prelamanje se vri upotrebom backslash karaktera tako to se pie kada ponestane mjesta za itavu komandu i poslije toga pritisnemo enter. Backslash je zapravo tzv. escape karakter. Poslije njega svi karakteri se tretiraju literalno. Ovdje se mora biti paljiv jer ako poslije backslasha ne doe
58/1275
newline ve recimo space pa onda newline backslash nee prelomiti liniju i shell e pokuati interpretirati ono to je prethodno ukucano.
Literalna interpretacija
Kao to sam gore naveo backslash je escape karakter. Bilo koji znak se odmah iza njega tretira literalno. Kao recimo newline. Ali ako elimo da nam echo vrati rezultat tono onakav kakvog smo ga napisali, odnosno ako elimo da veliki razmaci budu tretirani kao takvi, onda se koristimo escape karakterima kao to su ( ) i ( ): $ echo ovo je text sa ovo je text sa prevelikim razmacima
prevelikim
razmacima
znak ( ) se koristi za izbjegavanje grupa specijalnih znakova. Ali ako elimo koristiti neke specijalne karaktere sa njihovim funkcionalnim znaenjem onda se koristi ( ) escape karakter: $ echo moj home direktorij je $HOME
59/1275
izlistati navedeni fajl i ugasiti raunar. $ ls l fajl || ls -la ako prvi dio komande vrati zero druga komanda ls se nee pokrenuti a ako vrati nonzero komanda e izlistati sve u aktivnom direktoriju. Uslovna izvrenja su omoguena upotrebom uslovnih iskaza && i || .
&& ||
Znak ! ukoliko je napisan ispred i spaceom odvojen od naredbe predstavlja negaciju pa se moe kombinirati sa gore navedenim u svrhu ispunjavanja skoro svih situacija uslovnog izvrenja. Treba napomenuti da ako se znak ! napie odmah ispred naredbe bez odvajanja spaceom to znai da shell treba da izvri tu naredbu sa istim argumentima sa kojima je zadnji put bila pozvana: $ telnet 212.69.23.100 e uspostaviti konekciju sa hostom na toj IP adresi, a ako nakon toga ponovo pokrenemo telnet: $ !telnet uinit e isto, barem e to pokuati.
60/1275
Iniciranje Programa
Kada shell okona interpretaciju komande onda pokuava inicirati izvravanje programa. Jezgra izvrava program ali shell inicira njegovo izvravanje. Koko bi inicirao izvravanje shell pretrauje PATH standardnu varijablu u potrazi za direktorijem koji sadri odgovarajuu naredbu i starta subshell da pokrene program. Za razliku od shell-a podshell moe da sam mijenja radni direktorij ali nakon izvrenja naredbe shell ostaje u direktoriju u kojem je bio kada je pokrenuo program.
trebao da pretrai. Ovdje mu je reeno gdje da trai podatke za obradu. U drugom primjeru shell mu je samo proslijedio podatke za obradu pa stoga program nije ni znao odakle su podaci doli.
Pipeline konekcija
Pipeline je standardni kanal na koji podaci ulaze ili izlaze. Pa je zato konekcija pipelinea vrsta redirekcije inputa i outputa. Pomou ove konekcije na lagan nain je mogue output jednog programa preusmjeriti ka standardnom inputu drugog. Takoer ovakve konekcije su zadatak shella i obrauju se prije samog izvrenja programa: $ ls la | wc l 26 u ovom primjeru program ls ne alje podatke na standardni output nego ih je shell preusmjerio u standardni input programa wc. Krajnji rezultat je broj linija koji je trebao ls da ispie na ekran.
62/1275
Upravljanje varijablama
Shell ima ugraenu mogunost da alocira memoriju u vidu varijabli. Zapravo, mnoge stvari u shellu su rijeene uz pomo varijabli. itavo ureenje interfacea se u shellu moe uraditi pomou varijabli: $ MOJDIR=/home/mozaik je jedan od naina definiranja varijabli, zapravo najee koriteni. Sintaksa je dakle: ime_nestandardne_varijable, znak_jednakosti, sadraj. U gore navedenom sluaju varijabla MOJDIR sadri string /home/mozaik.: $ echo $MOJDIR /home/mozaik karakter $ odmah ispred imena varijable MOJDIR oznaava da se radi o varijabli jer bi u protivnom komanda : $ echo MOJDIR vratila rezultat: MOJDIR Mogua je i supstitucija imena datoteka pomou varijabli tipa: $ ls a $MOJDIR ova komanda bi izlistala sve datoteke iz direktorija /home/mozaik.
63/1275
64/1275
$# $$
Sadri broj argumenata proslijeenih aktualnoj naredbi. Sadri process ID aktualnog procesa. Sadri exit status posljednje zavrene naredbe. Programi po svom zavravanju
$?
vraaju nulu (zero) ukoliko je proces uspjeno okonan a ostale vrijednosti (nonzero) ako nije. Ali ne moraju svi programi potovati ova pravila.
$* $n $@
Sadri sve argumente proslijeene programu. Gdje je n neki integer sadri odreen argument po redoslijedu. Tako je $0 sama naredba bez argumenata, $1 prvi argument, $2 drugi, $3 trei, itd Isto to i $*
Standardne varijable su osnova za kontrolu okoline i bash koristi veliki broj standardnih varijabli. Sluajno mijenjanje njihovih vrijednosti dovodi do izmjene radne okoline kako na nivou tako i na nivou sistema pa je zbog toga mogu i pad djela sistema u smislu onesposobljavanja sistemskih bash skripti. Neke od standardnih shell varijabli je nemogue promijeniti premda su one read-only ali sam pokuaj koritenja istih bi dovelo do neeljenih mijenjanja vrijednosti pa je zbog toga na kraju data lista standardnih varijabli bash-a.
65/1275
Environment varijable
Postoje globalne i lokalne (shell) environment varijable. Globalne se definiraju pri logiranju i kod novih aplikacija, a lokalne se koriste samo u shell-u i ne mogu biti koritene u drugim procesima. Popis svih globalnih environment varijabli dobije se naredbom env ili printenv. Ponitavaju se sa unsetenv (C shell), tj. unset (Bourne shell) naredbom. Primjer: $ printenv _=/usr/bin/printenv MANPATH=/usr/share/man/%L:/usr/share/man:/usr/contrib/man/%L:/usr/contrib/man:/ n PATH=/usr/bin:/usr/ccs/bin:/usr/contrib/bin:/opt/nettladm/bin:/opt/fc/bin:/opt/. NAME=ime COLUMNS=80 EDITOR=vi LOGNAME=andrija MAIL=/var/mail/andrija ERASE=^H SHELL=/usr/bin/sh
66/1275
Dodjeljivanje vrijednosti globalnoj varijabli: $ NAME=ime; export NAME Dodjeljivanje vrijednosti lokalnoj varijabli: $ name=ime Trenutna vrijednost varijable: $name ili ${name}
67/1275
FUNKCIJE SHELL-A
Primarne funkcije Shell-a su ostvarivanje interakcije korisnika sa jezgrom, a sve u svrhu sigurnosti datoteka na raunalu. Zato je to tako? Naime Jezgra je takoer u neku ruku interpreter odnosno ono prevodi podatke koje dobije od programa procesorske instrukcije razumljive samo raunarskom hardveru. Podatke (instrukcije) koje dobiva kernel su razumljive samo jezgri i bilo bi gotovo nemogue da ovjek ui te instrukcije napamet i da ih onda sam prenosi kernelu. Shell je program koji prevodi zahtjeve za kontrolu sistema kao to su auriranje datoteka na sistemu, administraciju OS-a itd. Od usera se zahtjeva pridravanje odreenih sintaksnih pravila i razumijevanje logike koje se Shell pridrava. Neovisno od vrste Shell-a svi imaju zajednike osnovne funkcije: Interpretacija komandne linije (Command line interpretation) Iniciranje programa (Program Initation) Preusmjeravanje Inputa i Outputa (Input Output redirection) Lanano povezivanje komandi (Pipeline connection ) Supstitucija Imena Datoteka (Substitutions of Filenames) Upravljanje varijablama (Maintenace of Variables) Kontrola radne okoline (Enviroment Control) Programiranje skripti (Shell programming)
68/1275
> >> < << | & ; * ? [] () `` "" '' \ $var $$ $0 $n $* # bg break cd continue
Redirekcija na izlaz Dodati u file Redirekcija na ulaz "ovaj" dokument (redirekcija na ulaz) Pipe izlaz. Startanje procesa u pozadini Separator naredbi u istoj liniji Zamijeni bilo koji znak u fajlu Zamijeni jedan znak u fajlu Zamijeni bilo koji znak unutar zadanog intervala Izvri u subshell-u. Substitut izlaza uz naredbu Dio quote (mogu i varijable i komande). Cijela quote Quote slijedee znakove Upotrijebi vrijednost za varijablu Process id. Command name. n-ti argument (0<n<9). Svi argumenti kao jedna rije Poetak komentara Pozadinsko izvravanje Prekid loop izraza Promjena direktorija Nastavak loop programa
69/1275
Simbol/ comanda
Znaenje/akcija
echo eval exec fg jobs kill newgrp shift stop suspend time umask unset wait
Prikai na izlazu (npr. ekran) Evaluiraj argument Izvri Foreground izvravanje Prikai aktivne procese Terminiraj proces Promijeni u novu grupu Shift-aj poziciju parametara Suspendiraj proces u pozadini Suspendiraj proces u foreground-u Vrijeme naredbe Postavi dozvole nad fileom Obrii varijablu ili funkciju ekaj dok zavri proces u pozadini
70/1275
Praenje signala
Da
Da
Da
Ne
Da
Da
Ne
Da
Da
Ne
Da
Da
Ne
Da
Da
Ne
Da
Ne
71/1275
Sinia Julijan
SH I BASH
72/1275
UVOD
Prva stvar s kojom se korisnici susreu na UNIX/LINUX operativnom sistemu je command shell ili ljuska. Shell je termin za tekstualno okruenje pomou kojega korisnik komunicira sa sistemom koristei se tastaturom (input) i monitorom (output). Korisnik instrukcije sistemu zadaje u vidu znakovnih naredbi. Izvorni UNIX System Shell poznat pod imenima sh ili Bourne shell tokom godina doivio je mnogo nadogradnji tako da danas postoji vie inaica shell-a (csh, tcsh, bash, ksh, psh, zsh) od kojih svaka nudi odreena poboljanja u odnosu na standardni sh shell. Uobiajeni shell u Linux operacijskom sustavu je bash (Bourne Again Shell) i svi daljnji primjeri odnositi e se veinom na bash ili sh shell. Ako niste sigurni koji shell program koristi vaa distribucija, ukucajte sljedee:
echo $SHELL
73/1275
POVIJEST SHELLA
Prva vani shell bio je Bourne shell, koji je dobio ime po svom kreatoru Steve Bourneu. Ovaj shell je bio ukljuen u prvu popularnu verziju Unixa, verziju 7 iz 1979. godine. Bourne shell je na sistemu poznat kao sh. Pored svih promjena kroz koje je Unix proao, Bourne shell je jo ostao popularan i gotovo nepromijenjen. Mnogi alati i administracijske funkcije oslanjaju se na ovaj shell. Prvo iroko rasprostranjeno alternativno okruenje bio je C shell ili csh. Ovo je okruenje napisao Bill Joy sa Sveuilita Kalifornije na Berkleyu kao dio Berkley Software distribution (BSD) verzije Unix sistema, koja je izala nekoliko godina poslije verzije 7. Ova ljuska je ukljuena u sve trenutne verzije Unixa. C shell dobio je ime po slinosti naredbi sa C programskim jezikom. Na ovaj nain Unix programeri mogu mnogo lake savladati ovu ljusku. Osim dvije prethodno navedene ljuske popularnom je postala i Korn ljuska. Ta je ljuska komercijalni produkt koji ujedinjuje najbolje karakteristike Bourne i C ljuski uz jo mnoge mogunosti.
74/1275
75/1275
OPENITO O UNIXU
Osnovni principi u Unixu: Portabilan napisan u C programskom jeziku Dostupan za iroki spektar raunala od malih desktop raunala do velikih superraunala Vrlo dobar i pouzdan operativni sustav Programsko okruje je vrlo bogato i produktivno Filozofija iza Unix sistema Programi sa jednostavnim input/output sueljem Programi su kreirani kao mali nezavisni moduli Vrlo velika mogunost kombiniranja vie programa izlaz jednog programa postaje ulaz drugog (pipe). Programi su pisani u C(C++) programskom jeziku kao i sam operacijski sustav i vrlo su dobro integrirani u sustav. Sve u Unix sustavu je datoteka - B.W. Kernighan Tipovi datoteka: obine datoteke tekst, programi.... direktoriji su takoer datoteke i to takve koje sadre imena datoteka koje posjeduju specijalne datoteke devices, pipes (da i ureaji su datoteke, pipe-ove emo spomenuti kasnije) Unix ima monorootnu (samo jedan root) strukturu file sustava (za razliku od MSDOS, Windows gdje ima vie root-ova npr. C:\, D:\ itd).
76/1275
77/1275
78/1275
Relativni ../ ~/
dir1/dir2/
ls [options] [dir dir ...] opcije a l F R .... pwd cd[dir] df du mkdir dir rm file....
ispisuje radni direktorij mijenja radni direktorij trai disk ispisuje iskoritenost prostora na disku stvara novi direktorij brie file ili ak cijelo stablo direktorija
cp file1 file2..... target kopira datoteke mv file1 file2..... target cat [file1 file2...] more file1 file2.... file file... tail file ... premjeta datoteke prikaz datoteka prikaz datoteka stranu po stranu doznaje tip datoteke prikazuje zadnji dio datoteke
79/1275
Kada radite na Unix sustavu niste preputeni sami sebi. Za svaku naredbu postoje help stranice tzv. man pages, koje objanjavaju kako radi program, sintaksa ... imena autora, e-mail adresa za prijavu eventualnih greaka u programu podaci o copyright-u ili bolje copyleft-u te man stranice vezane uz trenutnu, koje bi moda trebali proitati.
Openito
man k keyword - daje listu man stranica u ukljuujui i kljune rijei
A kako bismo potraili vie informacija o samoj man naredbi? Jednostavno: man man
Ovo je primjer prikaza na ekranu nakon upisa naredbe: man ls da biste mogli pregledati stranu po stranu : man ls | more
80/1275
LS(1)
FSF
LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of cftuSUX nor --sort. -a, --all do not hide entries starting with .
AUTHOR
Written by Richard Stallman and David MacKenzie.
REPORTING BUGS
Report bugs to <bug-fileutils@gnu.org>.
COPYRIGHT
Copyright (C) 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
SEE ALSO
The full documentation for ls is maintained as a Texinfo manual. If the info and ls programs are properly installed at your site, the command info ls should give you access to the complete manual. ls (fileutils) 4.1 March 2002 LS(1)
81/1275
82/1275
UNIX SHELL
Shell ili ljuska je korisniki program kojemu je osnovna namjena olakati interakciju korisnika i sustava. To je zapravo naredbeni interpreter koji izvrava naredbe koje korisnik unosi pomou tipkovnice. Shell nije dio UNIX/LINUX jezgre, ali ju koristi za pokretanje programa, kreiranje datoteka itd. Osim to je naredbeni interpreter, shell se koristi i kao skriptni jezik za pisanje shell skripata, koje automatiziraju odreene korisnike radnje. Ako povuemo paralelu s MSDOS operacijskim sustavom shell moemo usporediti s COMMAND.COM programom, a shell skripte su sline .bat datotekama. Mogunosti koje prua shell: podeavanje okruja pisanje shell skripti command history (pamti uneene naredbe tokom sessiona) command aliases (definiranje novog imena za postojeu komandu) command editing Shell je samo program i s obzirom na to postoje vie razliitih verzija: Bourne shell (sh) dostupan na svim Unix sustavima C shell (csh) shell sa C sintaksom TC shell (tcsh) ukratko kao C shell sa emacs stilom command editing-a Korn Shell (ksh) novi shell standard, unaprijeeni Bourne shell emacs ili vi stil command editing-a Bourne Afain Shell (bash) spoj C i Korn shell kompatibilan sa Bourne shell-om Defaultni shell specificiran je u /etc/passwd datoteci. Kao to sam spomenuo na poetku, ako elite saznati u kojem shell-u radite utipkajte:
echo $SHELL
83/1275
Razni shell-ovi se pozivaju razliitim naredbama (naravno, ako su instalirani): sh, bash, ch, tcsh... exit - naputa pokrenuti shell
Promjenu defaultnog login shell-a radimo sa naredbom (npr. u bash) chsh /bin/bash
84/1275
[nnn] zamjenjuje bilo koji od znakova u uglatim zagradama [!nnn] zamjenjuje sve znakove osim onih u uglatim zagradama [n-m] zamjenjuje bilo koji znak u zadanom rasponu Primjer: ls [fF]ile[0-3] mogui ispisi: File0 file0 File1 file1 File2 file2
*(Vie o regularni izrazima s primjerima moete proitati u seminaru Regular expresions kolega Manuela Vidonisa i Zorana Zoriia)
85/1275
echo Radni direktorij je 'pwd' ispisuje Radni direktorij je /home/user Kako koristiti specijalne znakove? \ prima slijedei znak kakav je, bez interpretiranja
'.........' prima cijeli izraz bez interpretiranja .... Primjer: echo \\ ispisuje expandira samo znakove $ ' !
86/1275
87/1275
Mnoge komande u Unix shell-u uzimaju ulaz sa standardnog ulaza (tipkovnica) i alju podatke na standardni izlaz (monitor). Primjer: sort 1 3 2 ^D(EOF- End Of File) 1 2 3 Preusmjeravanje standardnog izlaza: cat a.txt b.txt prikazuje datoteke a.txt i b.txt na standardnom izlazu cat a.txt b.txt > c.txt preusmjerava standardni izlaz u datoteku c.txt cat c.txt >> d.txt preusmjerava standardni izlaz i dodaje na kraj datoteke d.txt
88/1275
89/1275
Primjer: alias ll=ls l alias l=ls -F alias rm=rm -i alias unalias ime prikaz svih aliasa brie alias
90/1275
Openito, tcsh i bash shell-ovi su pogodniji za command editing od csh shell-a sh(Bourne shell) nema command editing.
Procesi
Svaka komanda pozove program i pokree ga. Za vrijeme dok je on pokrenut, zovemo ga proces. Unix je multitasking Sustav, to znai da moe pokretati vie procesa istovremeno. Ako neki proces pokrene potproces, onda njega nazivamo roditeljski (parent) proces, a proces kojeg je on pokrenuo dijete (child) proces. Sukladno tome imamo PPID (parent proces ID) i PID. Kako da vidimo te procese? ps prikazuje trenutne procese
91/1275
Podaci o procesima: PID TT STAT TIME proces ID jedinstveni cijeli broj procesu pridruen terminal status procesa R runnable, T stopped, I idle, W swapped out, ... vrijeme procesora koje je koristio proces
COMMAND ime komande koja je pokrenula proces Osim na normalan nain, proces se moe izvravati i u pozadini: foreground i background
Zamislite da ste zadali Unix sustavu procesorski zahtjevan i dugotrajan posao. Za vrijeme procesiranja shell je zauzet (nema prompta dok se proces ne zavri) i vi ne moete dalje raditi na raunalu. Da bi se izbjegle takve situacije, takvi procesi se stavljaju da rade u pozadini, dok vi dalje nastavljate svoj rad normalno. Kako se proces stavlja u pozadinu ? Openito: command & [1] 276 Komanda je zapoela izvravanje, ID procesa je vraen i shell je spreman primiti novu komandu.
92/1275
Suspendiranje foreground procesa proces ulazi u stanje stopped : ^Z [stopped] Stavljanje procesa zapoetog u foregroundu u background: ^Z bg Stavljanje background procesa u foreground: fg [process -id] Ubijanje procesa: kill [-9] process id ...
93/1275
94/1275
Kada elimo vidjeti stanje neke varijabli piemo: echo $ime_varijable Primjer: echo $PATH .:/user/openwin/bin:/user/local/bin:/user/bin Postavljanje enviroment varijabli na neku vrijednost (razliito u raznim shell-ovima): setenv name value export name=value Primjer: setenv EDITOR emacs export EDITOR=emacs - csh i tcsh - sh i bash -csh i tcsh - sh i bash
Postavke varijabli mogu se spremiti u datoteke .login ili u alternativnu .*shrc (.shrc, .bshrc, .cshrc, .tcshrc) datoteku te se kasnije mogu referirati na ve prikazan nain. Openito enviroment i shell varijable, koje imaju isto ime, su razliite i neovisne, osim to moda imaju jednake inicijalne vrijednosti. Ipak postoje iznimke: Svaki put kada shell varijable home, user i term promjene vrijednost dotine enviroment varijable HOME, USER i TERM poprimaju iste vrijednosti. Obrnuti proces nema efekta. path i PATH specificiraju direktorije u kojima se nalaze komande. Obje varijable predstavljaju istu listu direktorija i kojeg god da promijenimo, promijenit e se vrijednost onog drugog.
95/1275
Shell varijable su sline enviroment varijablama, ali se za razliku od njih ne prenose iz child procesa. Definiranje shell varijabli ( takoer razliito u raznim shell-ovima): set name=value set name=(value1 value2 value3) name=value (sh, bash) (csh, tcsh)
vrlo su vani shell programerima (komandni argumenti) trenutni radni direktorij Staza do home direktorija (ime home direktorija) lista direktorija koji sadravaju komandne programe Va login shell kod koji pokazuje stupanj uspjenosti prijanjih komandi tip terminala koji koristite
Primjer podeavanje prompta: prompt="$cwd \> " /home/user > Kao prompt prikazat e se trenutni direktorij moe smanjiti koritenje pwd komande, a moe ga se postaviti na bilo koji drugi tekst prompt="Bok $LOGNAME, kaj ima novo \>" Bok Janica, kaj ima novo > - ako Janica koristi Unix
96/1275
Ekspandiranje varijabli
echo $PATH PATH=/usr/local/bin:/usr/bin:/usr/openwin/bin PATH=.:$PATH:$HOME/bin echo $PATH PATH=.:/usr/local/bin:/usr/bin:/usr/openwin/bin:/home/user/bin * user oznaava bilo kojeg usera Primijetite kako smo definirali novu vrijednost varijable PATH. Nova vrijednost varijable PATH je '.:' plus stara vrijednost varijable PATH plus ':' plus vrijednost varijable HOME plus '/bin', gdje se plus koristi kao znak za konkatenaciju. Varijable u kombinaciji sa ostalim tekstom moraju se odvojiti vitiastim zagradama: datoteka=${LOGNAME}_datoteka
97/1275
Dobar nain podeavanja vaeg okruja je da uvijek dodajete nove komande. Osim ako stvarno znate to radite nemojte nikada potpuno zamijeniti njihov sadraj. S obzirom da se .login ita samo jedanput tokom jednog session-a, njegov smisao je da postavi uvjete koji e vaiti za cijeli session te da odradi akcije bitne samo prilikom login-a. .shrc ili .bshrc se koriste za postavljanje uvjeta i odraivanje akcija prigodne za shell i njegove instance. to gdje staviti? (openito) .shrc ili .bshrc sve definicije shell varijabli, osim path varijable bolje je koristiti export PATH (enviroment varijabla) alias komande umask komandu ostale komande koje trebaju biti izvrene za svaku instancu shell-a .login export komande (ukljuujui gore navedenu PATH) kommande koje treba izvriti samo jednom (prilikom logina) npr. stty, mesg,limit komande koje generiraju output
98/1275
Nakon to napravite izmjene u datotekama nee se vidjeti njihov efekt do slijedeeg logina. Promjene u .shrc ili .bshrc moete provesti i ranije: % source .cshrc
find .-print | grep '^Unix' - trai sve datoteke koje zapoinju sa Unix grep v Unix datoteka Neke korisne opcije: -C -h -l -v -x broji linije ne prikazuj ime datoteke izlistaj samo datoteke koje sadravaju linije sa zadanim uvjetom prikai linije koje ne zadovoljavaju uvjet prikai one linije koje u potpunosti zadovoljavaju uvjet - prikai sve linije koje ne match-aju Unix
99/1275
Regularni izrazi za grep: c \c ^ $ [....] [^....] . r* r+ bilo koji ne specijalni znak iskljui svako specijalno interpretiranje znaka c poetak linije kraj linije bilo koji znak u rasponu bilo koji znak van raspona bilo koji znak nula ili vie ponavljanja r jedno ili vie ponavljanja r
100/1275
*(vie o awk-u moete proitati u seminaru kolege Branimira ivkovia awk i sed).
101/1275
PROGRAMIRANJE U SHELL-U
Kao to moete pokretati komande u shell-u tako moete koristiti njegov ugraeni programski jezik za pisanje vlastitih komandi i programa. Kreiranje i pokretanje shell skripte: Iskoristite neki od tekst editora da biste kreirali skriptu: emacs ime_datoteke vi ime_datoteke Kad ste zavrili sa radom u editoru dodajte dozvolu za izvravanje: chmod u=rwx ime_datoteke chmod +x ime_datoteke Pokrenite skriptu: ./ime_datoteke Prva linija u skripti mora definirati shell: #!/bin/sh #!/bin/csh #!/bin/tcsh #!/bin/bash C shell TC-shell BASH shell Bourne shell ili ili
102/1275
Primjer 1:
#!/bin/bash # Ova skripta daje prikaz datuma, vremena, # username-a, trenutnog radnog direktorija echo Datum i vrijeme: date echo echo Vase korisnicko ime je: $(whoami) \n echo Trenutno se nalazite u \c pwd Izlaz: Datum i vrijeme: Sun Feb 15 23:35 Vase korisnicko ime je: user Trenutno se nalazite u: /home/user Specijalne shell varijable: $1-$9 $0 $# $? $$ $! $* $@ - argumenti - ime komande - broj argumenata - exit status zadnje pokrenute komande - PID trenutne instance shell-a - PID zadnje komande pokrenute u pozadini - string koji sadrava sve argumente - isto kao igore, osim kada je pod navodnicima
103/1275
Komanda shift pomie argumente - $n+1 postaje $n Primjer: demo_shift skripta: echo "arg1=$1 arg2=$2 arg3=$3" shift echo "arg1=$1 arg2=$2 arg3=$3" $ demo_shift jedan dva tri cetiri arg1=jedan arg2=dva arg3=tri arg1=dva arg2=tri arg3=cetiri Evaluiranje shell varijabli Definicija Opis
Expandira vrijednost varijable var isto osim to zagrade zatvaraju ime varijabli koja e biti zamijenjena ako je definirana, vrijednost od var; inae nesto i $var nije setirana na
$(var?poruka) ako je definirana, vrijednost od var, inae ispii poruku i izai iz shella. Ako je poruka prazna ispii standardnu poruku. $(var+nesto) Ako je definirana var, vrijednost od nesto, inae nita
104/1275
Za itanje korisnikog unosa koristimo komandu read. echo "Unesite svoje ime" read ime echo "Dobro dosli na labos $ime" if then else fi if [uvjet] then razne_komande # if uvjet je zadovoljen (true) else razne_komande # if uvjet nije zadovoljen (false) fi if....... then.... elif.... ...... fi Primjer (provjera je li traeni korisnik logiran): user=$1 then echo "$user je logiran" else echo "$user nije logiran" fi # ulazni parametar
105/1275
Komanda test testiranje za datoteke i varijable if [! f $FILE] then if test "$WARN"= "yes" then echo "$FILE ne postoji" fi fi Test uvjeti: -e datoteka -d datoteka -f datoteka -L datoteka -r[wx] datoteka -z string -n string str1=str2 str1!=str2 n1 eq n2 istina ako datoteka postoji istina ako je datoteka direktorij istina ako je datoteka obina datoteka istina ako je datoteka simboliki link istina ako datoteka ima dozvolu za itanje [pisanje, pokretanje] istina ako je string nul-string istina ako string nije null-string istina ako su str1 i str2 isti istina ako su str1 i str2 razliiti istina ako su brojevi n1 i n2 jednaki (ostale kljune rijei: -ge, -gt,-le, -lt, -ne) case case word in pattern1) command(s) ;; pattern2) command(s) ;;
106/1275
patternN) comand(s) ;; esac for do done for var in listofwords do commands done Primjer #!/bin/bash # usporeuje datoteke iz dva direktorija # unesi cmpfile dir1 dir2 dir1=$1 dir2=$2 for i in $(ls $dir1) do echo $i: cmp $dir1/$i $dir2/$i echo done
107/1275
108/1275
109/1275
to se to zbilo?
nakon uspjenog logina exec-a se shell (login proces umire std(in,out i err) su prespojeni na shell) Happy Unix user unosi komandu ls fork-a se shell, novoj instanci shell-a dodjeljuju standardni streamovi, parent shell ivi i eka da se child process zavri u toj novoj instanci shell-a se exec-a ls koji preuzme streamove obavi svoje i umre streamovi se otvaraju prvotnom shell-u, koji oekuje novu komandu Happy Unix user is even more happy
110/1275
Marijana Ladan-Pelivanovi
C SHELL, T C-SHELL
111/1275
UVOD
Shell kao korisniko okruenje ima ogromne mogunosti. Dostupne su velike skupine programa, od tekstualnih procesora, programa za komunikaciju, administraciju sistema pa do raznih programskih alata. Prvo iroko rasprostranjeno alternativno okruenje UNIX sistema bio je C shell. Nastao je na Berkeley sveuilitu u Kaliforniji a razvio ga je Bill Joy kao dio Berkley Software Distribution (BSD) verzije UNIX sistema, koja je izala nekoliko godina poslije verzije 7 (1979). Inae C shell je dobio ime po slinosti naredbi sa C programskim jezikom. Oni programeri koji koriste C ili C++ najee programiraju u C-shellu. Kao i KornShell i C shell je produetak sh shell-a. Tenex-C shell je poboljana verzija C shell-a. Izvrni program C shell-a nalazi se u datoteci /bin/csh.
112/1275
113/1275
Primjer .login datoteke #!/bin/csh # Sample .login file stty erase ^H intr ^C susp ^Z echo "Welcome to Wiliki\!" frm -s n Primjer .logout datoteke #!/bin/csh # Sample .logout file echo -n "Logged out of Wiliki " dat
114/1275
Postavljanje prompta
Kod t (csh) prompt moemo postaviti tako da u naoj .cshrc datoteci postavimo slijedeu liniju set prompt=" % m % / % " Ovim nainom, svaki put kada pritisnemo return, prompt e nam rei gdje se nalazimo bez da prvo mijenjamo direktorij.
Leksika struktura
Shell dijeli ulazne linije u rijei, prazna mjesta i tabove. Specijalni karakteri kao '&', '|', ';', '<','>', '&&', '||', '<<', '>>' su uvijek odvojene rijei, bile one ili ne okruene praznim mjestima (whitespace). Specijalni karakteri ukljuujui i prazan space i tab mogu imati drugo znaenje i biti dio druge rijei, ukoliko se nalaze ispred backslash '\' ili jednostukog " ili dvostrukog "" navoda.
Nastavljanje naredbe u vie redova. Primjer: \ % cat *.* \ <Enter> grep "srce" | \ <Enter> more <Enter>
115/1275
Aliasi
Prilikom rada na UNIX-u esto se susreemo sa naredbama koje imaju komplicirane nazive. Ponekad naredbe koje esto koristimo sadre mnogo opcija i argumenata koji se moraju navesti. Tada se koristimo aliasima. Pomou aliasa dugake naredbe tj. naredbe s puno argumenata i opcija moemo skratiti ili im dati druga jednostavnija imena. Aliasi se mogu definirati u naredbenoj liniji ili .cshrc datoteci koristei formu: alias novoime=naredba Znai novoime je alias za naredbu po imenu naredba.
Varijable
Za vrijeme rada shell pohranjuje tzv. shell varijable. Varijable u C shellu su definirane koritenjem interne set naredbe. C shell podrava varijable okoline (environment varijable) i varijable same ljuske. Varijable okoline programa definiramo sa: setenv ime vrijednosti Varijable same ljuske se postavljaju sa: set ime=vrijednost Neke od najee koritenih varijabli: logname, home, path, mail, term automatski se ukljuuju i u okolinu nakon ove naredbe, pa za njih nije potrebno upotrebljavati setenv. Prilikom ukljuenja u okolinu, imena ovih varijabli se piu velikim slovima npr. PATH.
116/1275
Setenv izlistava okolinu koja se predaje programima, dok set daje popis svih varijabli koje poznaje sama ljuska. Varijable u C shell-u moemo koristiti pisanjem znaka $ prije imena varijable. Ili ako su varijable napisane kao varijable stringova onda koristimo zagrade. Postojanje varijabli provjeravamo upisivanjem $?variable
Primjeri: set var = (srce.c srce.o) echo "Type yes or no?" set yes_no=($<) set i=15 setj=20 echo$k
117/1275
String koji se pojavljuje na terminalu kada je shell spreman da primi prompt narednu naredbu. ! se zamjenjuje rednim brojem komandne linije. Obino se postavlja na slijedeu vrijednost: set prompt= "hostname'\!%" user term shell korisniko ime, startamo sa $USER tip terminala koji koristimo, startamo sa $TERM Puno ime trenutnog shell-a, startamo sa $SHELL
118/1275
Povijest naredbi
Povijest naredbi je mogunost smjetanja naredbi u bafer, njihovo kasnije modificiranje i ponovno izvravanje. Znai shell pamti prethodno unesenu naredbu i omoguava da se ista ponovno pozove. Po izlasku iz shell-a, lista se upisuje u ~/.history i tako biva zapamena izmeu dva login procesa. Sa history i savehist varijablama mogue je postaviti broj prethodno izvrenih naredbi koje e biti opet pozvane. Primjer spremanja 100 zadnjih naredbi u shellu i 50 zadnjih naredbi u .cshrc koje e biti pozvane sljedeim loginom. set history=100 savehist=50 Prethodne naredbe mogue je pozvati i koritenjem ugraenih history varijabli. History substitution
!!
!n !-n !string
Naredbena linija broj n. Broj n se moe otkriti sa history Naredbena linija sa brojem za n manji od trenutnog Zadnja naredbena linija koja poinje stringom. Primjer: % c proba.c pr.c obj. o -o proba -lm ... % !c
!?string?
!n*
Svi argumenti n-te naredbene linije. Ako se ne zada n podrazumijeva se prethodna linija. Primjer:
119/1275
% c proba.o pr.o obj.o -o proba !n^ !n$ !i:j ^str1^str2 !n:s/str1/str2/ Prvi argument n-te naredbene linije Zadnji argument n-te naredbene linije j-ti argument i-te naredbene linije U zadnjoj naredbi zamijeni str1 sa str2 U n-toj komandnoj liniji zamijeni str1 sa str2.
&
<Ctrl>Z bg [%job]
Privremeno zaustavljanje procesa Naredba za prebacivanje procesa u pozadinu. Ako nema argumenata prebacuje se trenutni posao (zadnje prekinuti). Primjer: % infinite < Ctrl > Z % bg
fg [%job]
Naredba za prebacivanje procesa iz pozadine u radni (foreground). Primjer: % infinite & % fg % infinite
stop [%job]
<Ctrl> C
120/1275
Praenje Signala
U C shell-u jedino to moemo napraviti sa signalima je hvatanje signala SIGNIT
Pozivanje funkcije
Funkcije u shell script-ovima kao i u viim programskim jezicima predstavljaju osnovno sredstvo modularizacije programa. Postoje dva naina definiranja funkcija: function ime { naredbe } ili ime ( ) { naredbe } Funkcije se pozivaju jednostavnim navoenjem imena i argumenata iza imena ukoliko takvi postoje. Primjer pozivanja funkcije main: Prototip prema kojem se poziva funkcija main svakog programa u UNIX-u je: int main(int argc, char *argv[], char *envp[]); argc je broj argumenata navedenih kod poziva programa, a argv je niz od argc pokazivaa na te argumente kao nizove znakova. Prvi od tih nizova je ime samog pozvanog programa. envp je niz pokazivaa na nizove znakova oblika "ime=vrijednost" koji ine okolinu. Posljednji pokaziva je NULL.
121/1275
Takoer, program koji ne koristi nikakve ulazne parametre moe definirati main kao: int main(void) { ... } main treba vratiti cjelobrojnu vrijednost jer poziv moemo pojednostavljeno zamisliti kao: exit(main(argc, argv, envp)); Ako program zavrava pozivom exit na nekom mjestu, onda ne dolazi do povratka iz main. Meutim, ako main normalno zavrava, onda je potrebna povratna vrijednost koja e postati argument poziva exit.
122/1275
Redirekcija
Mehanizam redirekcije omoguava kombiniranje osnovnih naredbi (npr. cat, grep, sort, cut,tr) u cilju obavljanja sloenih operacija. Osnovni tipovi redirekcije (preusmjeravanja): Preusmjeravanje izlaza naredbi za rezultate (stdout): > date > now Dodavanje na kraj postojee datoteke >> ps -ef >> proba Preusmjeravanje izlaza naredbi za pogreke (stderr): >& ls abc>& er2 upisuje u stvorenu datoteku >>& dodavanje na kraj postojee datoteke ls abc >>& er1 Preusmjeravanje ulaza naredbi (stdin): < cat<.login ita iz postojee datoteke << cat<<EOF ita iz tijela datoteke tipkam...... EOF
123/1275
Piping
Jedna od moi komandne linije je mogunost koritenja piping-a. Koritenje ove tehnike u terminalu je dobar trik, a predstavlja i olakanje pri radu. Piping je takoer iroko rairena metoda meu C programerima. Bez pipinga, da bi napravili jednostavne zadatke morali bi pisati velike koliine koda. U osnovi piping ini proces pokretanja neke naredbe i slanje njenog izlaznog rezultata na drugi program ili datoteku, tj. zapisivanje u tu datoteku. Zamislimo da imamo tekst datoteku u tekuem direktoriju koja sadri mnogo linija teksta sadranih od rijei TUX, a zatim jednu reenicu koja e sadrati rije TUX i rije Uni. grep TUX datoteka_1.txt Rezultat e biti izlistan na ekranu, a sainjavat e pretragu za reenicama koje sadre rije TUX. Ako napiemo grep TUX datoteka_1.txt > tux_recenice.txt rezultat moemo vidjeti u datoteci tux_recenice.txt. Znai, rezultat naredbe grep je redirektiran i zapisan u datoteku tux_recenice.txt. Dio naredbe " >tux_recenice.txt" govori shell-u da napravi novu datoteku tux_recenice.txt i u nju zapie rezultat naredbe grep, umjesto da sve izlista na ekran. Ukoliko datoteka s tim imenom ve postoji rezultat naredbe grep biti e zapisan preko sadraja te datoteke. Ako umjesto znaka > stavimo znak >>, sadraj ve postojee datoteke e ostati isti, a rezultat e biti dodan na zadnju liniju teksta. Prava mo pipinga je kada jedan program moe itati output nekog drugog programa. Ako napiemo grep TUX datoteka_1.txt | grep Uni
124/1275
Prva grep naredba izlista sve tux reenice kao output. Znak | vrijednosti iz outputa prenosi na input slijedee naredbe, koja je takoer grep naredba. Druga grep naredba pregleda sadraj inputa u potrazi za reenicama koje sadre rije Uni u sebi. Naredba grep na ovaj nain se koristi kao filter.
stout
stdin naredba1
naredba2
125/1275
{ string..}
~home ~user
Regular expressions
Neki tekst procesori kao grep, egrep, sed, awk i vi omoguavaju pretraivanje pattern-a umjesto fiksnih stingova. Takvi tekstualni modeli (pattern) su poznati kao regular expressions. . Zamjenjuje bilo koji znak * Zamjenjuje nulu $ Oznaava kraj linije
126/1275
izvriti: /bin/sch [-vh] script_name args ... -v ispisuje linije skripta koje se izvravaju -x ispisuje naredbe koje se izvravaju ili: % chmod +x script_name % script_name args...
Kontrola toka
Omoguuje kontrolu izvravanja scripta pomou konstrukcija kao to su petlje, uvjetne naredbe i sl. IF (izvrava niz naredbi ako je uvjet istinit) if (izraz) then naredba endif naredba if (izraz) then naredba
127/1275
else naredba endif (za postojanje i else) Provjera datoteka: if ( -c filename) then .... gdje je -c : r w x e o z d Istinito ako korisnik koji izvrava script moe itati datoteku.
SWITCH (ovisno o ispunjenosti uvjeta izvrava se jedan od nekoliko zadanih nizova naredbi) switch ($var) switch($1) case -p: lp $2 breaksw cc -c $2 breaksw case -l: naredba breaksw ... case strn: naredba breaksw case -c: case strl1:
128/1275
cc $2 breaksw
FOREACH (izvrava niz naredbi odreeni broj puta) foreach var name (wordlist) naredba end end foreach arg ($*) echo $arg
WHILE (izvrava niz naredbi dok god je uvjet istinit) while (izraz) naredba end set i=1 set j=10 while ($i<=$j) echo Neto @i++ end
129/1275
INTEGER ARITMETIKA
Mogunost obavljanja aritmetikih operacija nad varijablama u scriptu bez UNIX naredbi Aritmetike operacije + zbrajanje - oduzimanje * mnoenje / dijeljenje ++ inkrementiranje -- dekrementiranje Logike operacije << pomicanje u lijevo >> pomicanje u desno | ili operacija ^ ekskluzivno ili
Logiki operatori
== != =~ !~ Istinito ako je lijevi string jednak desnom Istinito ako lijevi string nije jednak desnom Istinito ako lijevi string odgovara stringu sa desne strane s tim to su Istinito ako lijevi string ne odgovara stringu s desne strane. Univerzalni znaci
univerzalni znaci dozvoljeni ($file =~ *.c). su i ovdje dozvoljeni <Istinito ako je broj s lijeve strane manji od desnog <= >= && Istinito ako je broj s lijeve strane manji ili jednak broju s desne strane Istinito ako je broj s lijeve str. vei ili jednak desnom Logiko i Istinito ako je naredba uspjeno zavrena >Istinito ako je broj s lijeve strane vei od desnog || Logiko ili {command}
130/1275
alias [name[expression]] bg [%job] cd [name], chdir [name] echo [-n[words...]] exit [status] fg [%job] history jobs [ l ] kill nohup [command [args...]] rehash repeat count command [args...]
Izvrava naredbu ignorirajui signale. Naredba se ne moe prekinuti ni kada se korisnik koji je startovao odjavi sa sistema. Preraunava tabelu direktorija u promjenjivoj path. Neophodno jedino kada se dodaju nove naredbe dok smo prijavljeni u sistem. Ponavlja naredbu count puta.
setenv name value Postavlja varijable okoline (USER,PATH se postavljaju automatski) shift [varijable] source [-h] filename stop [%job] unalias pattern Brie postavljene aliase ija imena odgovaraju patternu. Npr. unalias * brie sve. Pomjera rijei u varijable u lijevo. Prva rije se gubi. Anko nije definirano ime varijable, korist se argv. Izvrava drugi script. Sa -h opcijom naredbe iz scripta se ne izvravaju nego samo umeu history u listu.
131/1275
Resetuje sve varijable ija imena odgovaraju patternu. unset* resetuje sve Brie varijable okoline ija imena odgovaraju patternu. unsetenv* brie sve.
Komentari i izlaz
Sve od # do kraja linije smatra se komentarom. Izlaz iz shella sa statusom status: exit [status]
132/1275
T C SHELL (TENEX-C-SHELL)
T shell odnosno Tenex shell je poboljana i potpuno kompatibilna verzija C shell-a. T C shell je komandni interpreter kojeg koristimo i kao interaktivni login shell i kao shell script komandni procesor. Ukljuuje: Editiranje komandne linije Nadzor login/logout procedure History nadopunu Periodino izvoenje naredbi Ispravljanje gramatikih pogreki (pravilno pisanje rijei) Rad s dugakim listama argumenata Start-up Tcsh
Tcsh
Interaktivan
Neinteraktivan
Login
No-Login
133/1275
Podeavanje prompta
set prompt = " --%T %n % ~--\n$" Kod tc shell-a postoje 3 vrste prompta 1. prompt1: Kazuje da tcsh oekuje novu naredbu
134/1275
2. prompt2: "Nastavak prompta" javlja se kod nepotpune while ili foreach petlje kao i poslije linija koje zavravaju \. 3. prompt3: Ovaj prompt se javlja samo u sluaju greke i nudi malu pomo kroz tcsh.
135/1275
Primjer: >ls/usr/l[^D] lbin/ lib/ local/ >ls/usr/l Ako je postavljen autolist onda to izgleda ovako: >set autolist >nm/usr/lib/libt[tab] libtermcap.a@libtermlib.a@ >nm/usr/lib/libterm Definiranje listi % set x = aaa bbb ccc % echo $x $#x $x[1] aaa 1 aaa % set x = "aaa bbb ccc" % echo $x $#x $x[1] aaa bbb ccc 1 aaa bbb ccc % set x = (aaa bbb ccc) % echo $x $#x $x[1] aaa bbb ccc 3 aaa Broj rijei u listi definiramo sa $#var lost+found/
136/1275
137/1275
Predrag Jovanovi
138/1275
Funkcije shella
Primarne funkcije shell-a su ostvarivanje interakcije korisnika s kernelom,a sve u svrhu sigurnosti datoteka na raunalu.Kernel (jezgra) je u neku ruku interpreter odnosno on prevodi
139/1275
podatke dobivene od programa u procesorske instrukcije razumljive samo hardware-u.Bilo bi gotovo nemogue da ovjek ui te instrukcije kako komunicirao s jezgrom.Shell je dakle program koji prevodi korisnike zahtjeve za upravljanje nad sustavom.Od korisnika se zahtjeva potivanje odreenih sintaksnih pravila i razumijevanje logike funkcioniranja sustava koje se shell strogo pridrava.Neovisno od vrste Linux-ovog shella svi imaju zajednike osnovne funkcije: interpretacija komandne linije (command line interpretation) iniciranje programa (program initation) preusmjeravanje ulaza i izlaza (input output redirection) lanano povezivanje komandi (pipeline connection) supstitucija imena datoteka (substitution of filenames) upravljanje varijablama (maintenace of variables) kontrola radne okoline (enviroment control) programiranje skripti (shell programming)
to je shell skripta?
Izvrna datoteka koja se sastoji od niza shell naredbi,skripta se ponaa kao program,naredbe se izvravaju sekvencijalno.Svaki od postojeih shellov-a ima svoj skriptni jezik,postoje slinosti ali i razlike. Skriptni jezici se sastoje od kontrolnih struktura,shell naredbi,varijabli i izraza. Ako je skripta napisana nekim skriptnim jezikom da bi ju pokrenuli mora se koristiti odgovarajui shell. Prva linija skripte specificira odgovarajui shell. Na primjer za Bourne Again Shell (bash): #!/bin/bash Skripte se piu u nekom od tekstualnih editora Vi, Emacs npr.
140/1275
primjer 01: #!/bin/bash # je oznaka za komentar echo Moja prva skripta Skriptu prije pokretanja moramo uiniti izvrnom,naredba koja nam to omoguuje je naredba chmod. chmod a+x ime_skripte poziv skripte: bash ime_skripte
Postavljanje dozvola za izvravanje skripte chmod naredba i opcije chmod mijenja dozvole za datoteku ili direktorij opcije: + r w x u g o a dodaje dozvolu uklanja dozvolu postavlja dozvolu za itanje postavlja dozvolu za pisanje postavlja dozvolu za izvravanje postavlja dozvolu za korisnika koji je kreirao datoteku postavlja dozvolu za grupu korisnika postavlja dozvolu za sve ostale korisnike sistema postavlja dozvolu za korisnika,grupu i sve ostale
141/1275
Argumenti skripte
Shell skripta kao i naredbe moe imati argumente.Pri pozivu skripte poslije imena mogu se unositi argumenti.Vrijednosti argumenata mogu se koristiti unutar skripte koritenjem operatora $ i broja.Prvi argument $1,drugi $2 itd. Specijalno $0 sadri ime shell skripte.Mijenjanje vrijednosti ulaznih argumenata nije dozvoljeno. primjer 06: #!/bin/bash echo Prvi unijeti argument je: $1 echo Drugi unijeti argument je: $2 echo Trei unijeti argument je: $3
poziv skripte: skripta05 danas je padao snijeg rezultat: Prvi unijeti argument je:danas
Varijable
U shellu varijable nemaju tipove,mogu sadravati brojeve,znakove i nizove znakova.Ne moraju se ak ni deklarirati.Vrijednosti se pridruuju varijablama pomou =operatora.Koritenje vrijednosti varijable nam omoguava specijalni operator $ ispred imena varijable.Imena varijabli mogu sadravati znakove,brojeve i podvlaku,ne smiju sadravati rezervirane znakove shell-a kao to su usklinici,& ampersand ili razmaci koji se koriste za odvajanje naredbi i razdvajanje naredbe i argumenata.
142/1275
primjer 02: #!/bin/bash str="Moja druga skripta!" echo $str lokalne varijable primjer 03: #!/bin/bash var=shell function fun{ local var=programiranje echo $var } echo $var fun echo $var
Funkcije
Bash nam omoguava grupiranje koda u cjeline pomou funkcija.One rade na slian nain kao kod programskih jezika.Funkcije nam daju mogunost da neki dio koda ako se radi o veoj koliini,ne ponavljamo nekoliko puta.Funkcije se pozivaju njihovim imenom I mogue ime proslijediti argumente. Sintaksa: ime_funkcije() { naredbe } jednom definirana funkcija se poziva imenom i parametrima.
143/1275
Ulaz i izlaz skripte echo,read Naredba echo alje podatak na standardni izlaz,a naredba read upisuje podatak u varijablu.
primjer 04: #!/bin/bash echo Unesite Vae ime: read ime echo $ime,kako ste!
Eksportiranje varijabli
Sve definicije varijabli unutar odreene skripte su dostupne samo toj skripti.Meutim ako elimo da su varijable definirane u skripti,vidljive i u nekoj drugoj skripti koja se poziva iz tekue,moramo koristiti naredbu export koja e osigurati kopije varijabli za sve skripte koje se pozivaju iz tekue. primjer 05: #!/bin/bash var1=ime_osobe export var1 druga_skripta #!/bin/bash var2=prezime_osobe echo $var1 $var2
144/1275
dakle kada se iz tekue skripte pozove druga_skripta bit e joj proslijeena kopija varijable var1 i moi e ju koristiti unutar svog shella.
-ako se eli koristiti razmak izmeu operanada mora se sve stavit pod navodnike.
145/1275
Naredba test
Pomou naredbe test moemo usporeivati cjelobrojne vrijednosti, stringove,te obavljati logike operacije. Naredba se sastoji od kljune rijei test,iza koje se navode vrijednosti koje se usporeuju,a izmeu njih je option kljuna rije koja odreuje tip usporedbe.Option se moe smatrati operatorom,ali se zapisuje slovnom oznakom ispred koje je znak minus.npr eq.Vraa izlazni status 0 ako je usporedba tona. Sintaksa: test vrijednost1 option vrijednost2
146/1275
Kao alternativa postoji mogunost da umjesto kljune rijei test koristimo zatvorene uglate zagrade [ ],tada bi linija test $num eq 10 izgledala ovako: [ $num -eq 10] Opcije i operatori naredbe test: Usporedba cjelobrojnih vrijednosti: -gt -lt -ge -le -eq -ne Usporedba nizova znakova -z -n = != Str testiranje za prazan niz znak testiranje za vrijednost jednakost nejednakost da li je vrijednost stringa null Funkcija vee od manje od vee ili jednako manje ili jednako jednako razliito
147/1275
Logike operacije -a -o ! Testovi za datoteke -f -s -r -w -x -d -h -c -b datoteka postoji,obina je datoteka nije prazna moe se itati mogue pisanje u datoteku mogue izvravanje datoteke ime datoteke je direktorij ime je simboliki link ime je oznaka ureaja ime je blok datoteka logiki AND logiki OR logika negacija
Kontrolne strukture
Bash shell ima skup kontrolnih struktura koje nam omoguavaju kontrolu toka programa,odnosno redoslijed izvravanja naredbi. Uvjetna struktura If testira uspjenost izvoenja shell naredbe,a ne izraza kao u veini programskih jezika. Ifthen struktura mora zavriti s kljunom rijei fi ifthen Sintaksa: fi ifthenelse if naredba then naredba
148/1275
Sintaksa: else
if naredba then
naredbe naredbe fi
primjer 09: #!/bin/bash if [ $# -ne 1 ]; then echo Netoan broj argumenata exit 1 fi echo $1
primjer 10: #!/bin/bash if [ "bash=shell" ]; then echo izraz se izraunao u true else echo izraz se izraunao u false fi
primjer 11: #!/bin/bash echo Unesite s za ispis datoteka prema veliini echo inae ce se ispisati sve informacije
149/1275
echo n Molim Vas unesite opciju: read var if [ "$var= s ] then ls s else ls l fi
Petlje: while,until,for-in,for Bash shell posjeduje kontrolne strukture petlje koje nam omoguavaju ponavljanje naredbi.Poput bash if strukture,while i until ispituju rezultat naredbe. Meutim,for i for-in strukture ne izvravaju testove,ve prolaze kroz niz vrijednosti,dodjeljujui svaku vrijednost varijabli. Sintaksa for-in: for varijabla in lista-vrijednosti do naredbe done Sintaksa until: naredbe done done until naredba do Sintaksa for: for varijabla do naredbe done Sintaksa while: while naredba do naredbe
For-in petlja For-in petlja je pogodna i za manipulaciju s datotekama.Moemo koristit specijalne znakove za generiranje imena datoteka kao listu vrijednosti u for-in petlji.Na primjer specijalni znak * generira listu svih datoteka u direktoriju, *.c sve datoteke s ekstenzijom .c
150/1275
primjer 12: #!/bin/bash for var in *.c do cp $var mybackup/$var echo $var done
While petlja Petlja while ponavlja naredbe.Poinje kljunom rijei while iza koje slijedi naredba navedena u zatvorenim uglatim zagradama. primjer 14: #!/bin/bash broja=0 while [ $broja -lt 1000 ]; do echo Broja je $broja let broja=broja+1 done
151/1275
while [ $str = da ] do echo n Unesite Vase ime: read ime echo Postovanje, $ime echo n Zelite li ponoviti: read ime done echo Ok
primjer 16: #!/bin/bash brojac=1 while let brojac <= 4 do echo $brojac shell let brojac = brojac + 1 done
For petlja Struktura for bez odreene liste vrijednosti podrazumijeva listu ulaznih argumenata komandne linije.Kada pozovemo shell skriptu,navedeni argumenti postaju lista vrijednosti koju poziva for,varijabla koja se koristi u for naredbi se postavlja automatski na svaku vrijednost argumenta u nizu.Struktura for je ekvivalentna listi koja se generira pomou $@. $@ je specijalna varijabla ija vrijednost predstavlja listu argumenata komandne linije. primjer 17: #!/bin/bash for var do
152/1275
cp $var mybackup/$var echo $var done poziv skripte: bash uarg main.c lib.c io.c A moemo i eksplicitno pozivati argumente pomou for-in i jedne od specijalnih Varijabli $* ili $@. Struktura for-in e posebno pozivati svaki argument I dodjeljivati vrijednost for-in varijabli.Postoji razlika jer $* e pozivati svaku rije posebno i ako su rijei navedene pod navodnicima. primjer 18: #!/bin/bash echo Unijeli ste $# argumenata for var in $* do echo $var done poziv skripte: izlaz: jedan dva tri etiri Dakle,ako elimo da se argumenti u navodnim znacima tretiraju kao jedan argument,koristimo $@. primjer 18: #!/bin/bash echo Unijeli ste $# argumenata bash numarg jedan dva tri etiri
153/1275
for var in $@ do echo $var done poziv skripte: izlaz: jedan dva tri etiri bash numarg jedan dva tri etiri
Logike naredbe && i | | Logike naredbe izvravaju logike operacije na dvije naredbe shella. Sintaksa: naredba && naredba naredba | | naredba U sluaju logikog I (&&),ako su obje naredbe uspjeno izvrene,uspjena je i logika naredba i vraa izlazni status 0.Za logiku ILI naredbu ako je barem jedna od naredbi uspjeno izvrena,uspjena je i logika ILI (| |) naredba i vraa izlazni status 0.Logike naredbe nam slue za testiranje uvjeta u kontrolnim strukturama.
Case Kontrolna struktura koja nam omoguava izbor izmeu vie opcija.Izbor se donosi usporedbom vrijednosti sa ponuenim vrijednostima.Struktura zapoinje kljunom rijei case, zatim izraunavanje vrijednosti varijable,pa in. Zatim slijede opcije iza svake ide ),naredbe,pa ;; *) defaultna opcija. I kljuna rije esac na kraju.
154/1275
primjer 19: #!/bin/bash # Program koji korisniku omoguava razliit # nain za izlistavanje datoteka echo s. ispis datoteka prema veliini echo l. ispis svih informacija o datotekama echo c. ispis datoteka s .c ekstenzijom echo n Molim Vas unesite izbor: read izbor case $izbor in s) ls s ;; l) ls l ;;
155/1275
156/1275
cp $var mybackup/$var echo $var done | sort > cdat u ovom primjeru naredba echo ispisuje imena svih datoteka s .c ekstenzijom,a imena datoteka se prosljeuju do filtra za sortiranje koji sortira imena prije preusmjeravanja.
Trap struktura je osmiljena za upravljanje vanjskim dogaajima koji remete rad programa.Najuobiajeniji je primjer signala prekida kojeg obino alje korisnik pritiskujui CTRL-C.Ako za vrijeme izvravanja programa pritisnemo CTRL-C program e se zaustaviti.Kad god se program prekine na ovakav nain,postoje akcije koje moemo poduzeti.Obino je to izlazak iz programa s vrijednou greke.Sustav svakom dogaaju dodjeljuje odreen broj. -broj signala za CTRL-C je 2 primjer 21: #!/bin/bash trap echo Prekid program; rm cdat; exit 1 2 for var in *.c do cp $var mybackup/$var
157/1275
echo $var done | sort > cdat Naredba trap se moe koristiti za spreavanje zaustavljanja programa zbog nekih vanjskih dogaaja.Na primjer,pretpostavimo da ne elimo dati mogunost korisniku da sam zaustavi program s CTRL-C; elimo ignorirati sve vanjske dogaaje.Naredba trap moe presrest dogaaj CTRL-C i sprijeiti zaustavljanje programa.To se moe izvesti unoenjem skupa praznih jednostrukih navodnika na mjestu prvog argumenta naredbe trap. ( trap 2 )
158/1275
ZAKLJUAK:
Linux-ov shell (bash) nije grafiki orijentiran i za sve operacije koje elimo izvriti nad operativnim sustavom moramo poznavati naredbe kao i njihove formate argumenata.To je naravno puno tee od GUI pristupa ali za neke operacije shell je jednostavno nuan i prua velike mogunosti manipulacije nad sustavom kakve GUI ne prua.Na primjer uzmimo neki sustav koji iskljuivo koristi GUI za komunikaciju korisnika sa operativnim sustavom.Kada se dogodi problem koji je prouzrokovao,na bilo koji nain greku u radu hardware-a ili software-a odgovornog za rad grafike na raunalu,to se esto dogaa,ak i ti operativni sustavi predlau nakon to doive kolaps,startanje svojevrsnog shell-a (command prompt-a) za rjeavanje problema sustava na nekom niem nivou,bliem samim komponentama raunala. to se tie pisanja skripti u shell-u,zakljuak bi bio da se pisanjem skripti moe postii znatna uteda u vremenu i smanjenje vjerojatnosti pogreaka. Jednostavno ako svaki dan odraujemo slijedno odreene akcije nad sustavom i na to troimo odreeno vrijeme, trebalo bi razmisliti da li bi mogli napisati skriptu koja bi to odraivala za nas. Dakle imamo prednosti pisanja skripti: kreiranje vlastitih skripti za obavljanje odreenih zadataka, uteda vremena, smanjuje se mogunost pogreke, automatizacija svakodnevnih zadataka, automatizacija administrativnih poslova time poveana produktivnost.
159/1275
Marko Vukovi
160/1275
161/1275
U ovom primjeru nema nita neoekivano, samo set naredbi koje mogu lako biti izvravane jedna po jedna izravno iz komandne linije radne konzole. Prednost stavljanja naredbi u sript kd ide dalje od primitivnog naela utede truda i vremena kod tipkanja. Script kd lako moe biti modificiran, izmijenjen, prilagoavan i generalno moe ga se uiniti pristupanim za neku odreenu aplikaciju.
162/1275
budui ovaj nain efektivno onemoguava itanje iz ulazne biblioteke stdin unutar script kda). Puno sigurnije je napraviti da script kd direktno izvriv sa naredbom chmod. Npr.: chmod 555 scriptname ili: chmod +rx scriptname (omoguava itanje i izvravanje svim korisnicima), chmod u+rx scriptname (omoguava itanje i izvravanje samo autoru kda). Nakon to je script kd postao izvriv, moe se testirati upisivanjem naredbe ./scriptname. Ukoliko nema problema u sintaksi, izvravanjem kda poziva se pravilni prevodilac naredbi i obrauje kd. Za zadnji korak, nakon testiranja i eventualnog otklanjanja greaka, korisnik bi se mogao odluiti za pomicanje datoteke u /usr/local/bin (kao root direktorij), tako da omogui pristup datoteci (kdu) na nain da bude izvrna i dostupna u cijelom sustavi. To se odnosi na sve korisnike. Datoteka se jednostavno ozvrava pozivanjem: scriptname [ENTER] iz komandne linije. (omoguava itanje i izvravanje)
163/1275
Referenciranje varijabli
Ime varijable je oznaka za njenu vrijednost, informaciju koju dri ista. Referenciranje vrijednosti jedne varijable se zove supstiticija varijable. Ime i vrijednost varijable su dvije sasvim odvojene karakteristike varijable. Ako je varijabla1 ime varijable, tada je $varijabla1 referenca (adresa) na varijablu, dakle na informaciju koju ona sadri. Jedini put kad se varijabla pojavljuje bez reference, bez prefiksa $, jest kad je deklarirana ili pridruena, kad nije postavljena, kad se koristi u "export" nainu rada ili u posebnim sluajevima kad avrijabla predstavlja signal. Pridruivanje moe biti sa '=' znakom, u naredbi read i na poetku petlje. Zatvaranje referencirane vrijednosti pod dvostrukim navodnicima (" ") se ne sukobljava sa zamjenom varijabli. Ovaj nain se zove djelomini navod, neto kao "slabi navod". Koritenje jednostavnih navodnika (' ') koristi ime varijable doslovce, i supstitucija nije mogua. Ovo se naziva puni navod, negdje spominjan i kao "jaki navod". Primjeti se da je $varijabla1 zapravo jednostavnija forma od ${varijabla1}. U kontekstu gdje sintaksa $varijabla1 rezultira grekom, preporua se koritenje due forme.
164/1275
Deklaracija varijabli
Deklaracija varijabli se koristi sa operatorom pridruivanja '=' (bez koritenja razmaka prije i poslije znaka). Dotini operator se moe koristiti u svrhu pridruivanja ili testiranja, ovisno o kontekstu. Primjer: jednostavna deklaracija varijable U ovom odsjeku je prikazan najednostavniji nain pridruivanja vrijednosti nekom imenu varijable:
echo a=879 echo "vrijednost varijable \"a\" je $a." let a=16+5 #pridruzivanje koristenjem 'let'
Primjer: deklaracija i referenciranje varijable Slijedei programski odsjeak pokazuje kako se deklariraju varijable i potom kako se vri zamjena:
#!/bin/bash a=375 hello=$a echo hello echo $hello echo "$hello" echo "${hello}" echo hello="A B echo $hello echo "$hello" C D" # ispis: A B C D # ispis: A B C D #identicno kao i: echo ${hello}
165/1275
echo echo '$hello' # ispis $hello # ovdje uocavamo efekte # razlicitih tipova navoda echo exit 0
166/1275
moraju biti oznaeni sa vitiastim zagradama: ${10}, ${11}, ${12}. Posebne varijable $* i $@ iskljuuju sve pozicijske parametre.
167/1275
exit status
Svaka naredba vraa izlazni status znan kao exit status (negdje u literturi je oznaen i kao return status). Uspjeno izvrena naredba vraa nulu (0), dok neuspjela naredba vraa broj razliit od nule koji uglavnom oznaava broj greke (engl. error code). Uspjeno izvrene UNIX naredbe i programi vraaju nulu kao izlazni status nakon uspjenog kompletiranja, iako postoji i par iznimaka.
Uvjetne naredbe
Svaki kompletan programski jezik sadri set nekakvih uvjetnih naredbi koje se izvravaju u skladu sa zadanim uvjetom. BASH ima naredbu test, razne operatore koji koriste uglate i vitiaste zagrade, i if/then konstrukciju.
Uvjetne konstrukcije
Uvjetna konstrukcija if/then ispituje da li je izlazni status naredbe jednak nuli (budui da "0" znai uspjeno izvrenu naredbu prema pravilima UNIX-a), i ako jest, prealzi u izvravanje jedne ili vie zadanih naredbi. Takoer postoji i poseban operator "[" (lijeva uglata zagrada). On je sinonim za naredbu test i postoji iskljuivo zbog razloga efikasnosti. Ova naredba prihvaa zadane argumente kao izraze usporedbe ili ispituje fajlove, te vraa izlazni status usporedbe (0 za istinito, 1 za pogreno). if naredba takoer moe ispitivati i exit status bilo koje naredbe, ne samo produkt usporedbe.
168/1275
Naredba test ispituje tipove datoteka i usporeuje nizove.Postoji jo i naredba elif kao sinonim za else if. eljeni efekt je gnijeenje jedne konstrukcije (unutarnje) if/then unutar druge (vanjske).
169/1275
170/1275
Ugnjeene petlje
Ugnjeena petlja je petlja unutar petlje, tj. unutarnja petlja u bloku vanjske petlje. Tu se deava da prvi prolaz kroz vanjsku petlju pokree i unutarnju, koja se izvrava do kraja. Slijedei prolaz kroz vanjsku petlju opet aktivira unutarnju. Ovo se ponavlja dok se vanjska petlja ne izvri do kraja. Naravno, naredbom break moemo u svakom dijelu vanjske ili unutarnje petlje utjecati na prijevremeni prekid iterativnog procesa.
for a in 1 2 3 4 5 do
#vanjska petlja
echo "stavi $outer u vanjsku petlju." echo "----------------------" inner=1 #resetiraj inner
for b in 1 2 3 4 5 do
#unutarnja petlja
echo "stavi $inner u unutarnju petlju." let "inner +=1" done #povecaj brojac inner za 1 #kraj unutarnje petlje
171/1275
172/1275
ARITMETIKO PROIRIVANJE
Aritmetiko proirivanje prua jednostavan i izravan nain obrade aritmetikih podataka u kdu. Prevoenje znakovnog niza u brojevnu vrijednost je prilino izravno, i koristi se u kombinaciji sa jednostrukim navodnicima (`...`), dvostrukim zagradama ( ((...)) ), ili naredbom let. Navest emo par primjera aritmetikog proirivanja u nastavku.
#povecaj n za 1 # n = 1
173/1275
Primjer: Aritmetiko proirivanje sa naredbom let let z = z+3 let "z=z+3" #navodnici dopustaju upotrebu razmaka, #ovdje naredba let zapravo izvrsava #aritmeticku usporedbu, a ne prosirivanje
174/1275
I/O PREUSMJERAVANJE
Uvijek postoje tri osnovne "datoteke" koje su otvorene: stdin (predstavlja tipkovnicu), stdout (predstavlja ekran) i stderr (predstavlja izlaz za javljanje greke, takoer ekran). Te, i mnoge druge otvorene datoteke, mogu biti preusmjerene. Preusmjeravanje obino znai slanje izlaznog stanja (odreene datoteke, linije, programa ili ak dijela kda unutar script-a) prema ulazu druge datoteke, linije, programa,... Svakom otvorenom fajlu se pridruuje njegov pokaziva (engl. file descriptor jednostavan broj koji operativni sustav pridruuje otvorenoj datoteci zato da ju moe pratiti. Pojednostavljena verzija pokazivaa na datoteku u C-u.). Standardni pokazivai za stdin, stdout i stderr su 0, 1 i 2. Za dodatne otvorene datoteke, ostaju nam pokazivai od 3 do 9. Ponekad se ti dodatni pokazivai koriste za dohvat jedne od standardnih datoteka, dakle kao privremena duplicirana veza. Ovo pojednostavljuje vraanje u normalni nain rada poslije kompleksnog preusmjeravanja i mijeanja datoteka.
Naredba exec
Upotreba naredbe exec <ime_datoteke preusmjerava stdin prema nekakvoj datoteci. Od te toke nadalje, svi podaci vezani uz stdin dolaze ravno iz te datoteke, za razliku od svog normalnog izvora (obino unos iz tipkovnice). Ovo omoguava metodu itanja datoteke liniju po liniju i eventualno ralanjivanje svake linije unosa koritenjem naredbe sed i/ili awk. Slino tome, naredba exec >ime_datoteke preusmjerava stdout u eljenu datoteku. Ovim postupkom se alju svi izlazni podaci u spomenutu datoteku. I/O preusmjeravanje je takoer pametan nain da se izbjegnu problemi koji se javljaju kad su neke varijable nedostupne, tj. unutar nekog subshell-a.
175/1275
176/1275
(cat list1 list2 list3 | sort | uniq > list123) & (cat list4 list5 list6 | sort | uniq > list456) &
wait
Ovdje se za preusmjeravanje I/O podataka u podzadatak koristi tzv. pipe operator, tj. "|".
177/1275
ZAKLJUAK
Shell programiranje je principijelno jednostavan nain pisanja programa, temeljen na najjednostavnijim principima programiranja. Podrava klasine UNIX programe, koristi interne naredbe kako bi se poboljala efikasnost izvoenja istih, i slijedi najjednostavniji princip rada s varijablama. Naravno da kod svakog programskog jezika uoavamo mane, pa tako je i s ovim. Konkretno u BASH shell scripting-u jednostavnost je u drugom smjeru mana, ali ne koliko je vrlina, nasreu. BASH ne koristi nikakve debugging programe, teak je za prepoznavanje i otklanjanje greaka, to je, proporcionalno s veliinom kda, isto toliko i vei problem. Osim toga, postoje i situacije u kojima nije preporuljivo koristiti Shell scripting: Intenzivni zadatci, pogotovo tamo gdje je brzina neophodna Zadatci sa sloenim matematikim operacijama Zadatci koji zahtjevaju prenosivost izmeu radnih platformi Sloene, strukturirane aplikacije Kritine backup aplikacije Situacije gdje je prijeko potrebna sigurnost, gdje moramo garantirati vrst integritet sustava, kao i zatitu od upada, provala i kompjuterskog vandalizma Operacije sa izvrnim datotekama (BASH je ogranien na serijski pristup podatcima, a i to samo u djelomino nespretnom i neefektivnom redak-po-redak nainu rada) Zadatci sa multidimenzionalnim poljima Zadatci sa strukturnim fajlovima, kao to su povezane liste ili stabla Zadatci kreiranja ili manipuliranja grafikom ili GUI-em (Graphics User Interface Grafiki modelirano suelje od strane korisnika) Zadatci koji zahtjevaju izravan pristup sistemskom hardveru Zadatci koji zahtjevaju izravan pristup port-ovima ili I/O utorima Aplikacije zatvorenog kda Ukoliko se korisnik nae u jednoj od gore spomenutih situacija, pametnije je iskoristiti jedan od jezika nove generacije: Perl, Tcl, Python, Ruby ili ak i C, C++ i Java-u. ak i onda stvaranje prototipa aplikacije kao shell script kda moe biti koristan korak razvoja kda. Ako sve zbrojimo i oduzmemo dobili smo razmjerno jednostavan programski jezik, kompatibilan s jezicima nove generacije, isto kao i raznim shell programskim standardima,
178/1275
REGEX
179/1275
REGULAR EXPRESSIONS
((pravilni | regularni) izrazi)
180/1275
MODEL NEURONA:
u1..n w1..n f( ) i
Nekoliko godina kasnije matematiar Stephen Kleene je te modele formalno matematiki opisao. Nazvao ih je regularni skupovi. Kleene je razvio jednostavnu notaciju (sustav znakova) za izraavanje regularnih skupova koju je nazvao regularni izrazi. Sredinom prolog stoljea, 50-ih i 60-ih godina, regularnim izrazima su se bavili i matematiari. Robert Constable je napisao dobar prirunik za matematiki naklonjene strunjake: "The role of finite automata in the development of modern computing theory". RegEx je poseban jezik koji omoguava inteligentno usporeivanje stringova, temelji se na matematikoj teoriji jezika, deterministikih i nedeterministikih konanih automata. Prednost regEx a je u tome to se usporedba stringa ne vri, ali i moe, prema nekom fiksnom stringu. Usporedba stringa vri se prema nekom uzorku koji predstavlja odreeni skup razliitih strigova ili znakova. Kao rezultat usporedbe dobivamo sve one stringove koji u sebi imaju odreeni uzorak. Uzorak se odreuje pomou zamjenskih znakova (metacharacters) i posebnih nizova (special sequences). Jezik regularnih izraza koristi se u Unix OS, a koriste ga razni programi i okoline:
181/1275
Kratki opis nekih programa koji koriste regEx - e: awk: awk [-fscript-name] [-Fc] [inline-script] [params] [filename] awk pretrauje ulaznu datoteku (ili stdin) i trai linije ili polja koje zadovoljavaju uzorke te izvrava pridruene operacije. Uzorci i akcije se zadaju u komandnoj liniji (inline-script) ili datoteci (script-name). Omoguava referenciranje linije ili bilo kojeg polja u liniji.
182/1275
grep, egrep, fgrep: grep [options] PATTERN [FILE....] grep je program koji na ulaznoj datoteci usporeuje uzorak koji smo mu predali. Uzorak se usporeuje sa svakom linijom u datoteci. Linije u kojima imamo pogodak se ispisuju ili broje, ovisno o opciji koju smo ukljuili pri pokretanju programa. vie o tome: man grep. Program grep ima nekoliko razliitih verzija: egrep za proirene regularne izraze. fgrep koristimo kad elimo raditi usporedbu samo prema nekom fiksnom uzorku. egrep == grep E ... fgrep == grep F ... vie informacija: man grep sed: Supstitucija u sed-u: sed 's/uzorak1/uzorak2/ ' file sed je stream editor i slui za izvoenje osnovnih tekstualnih transformacija na svom ulazu. sed se razlikuje od drugih editora po tome to za ulaz moe primiti datoteku ili tok podataka (pipeline). vie informacija: man sed vi: vi [options] [file] vi ili vim (vi improved) je text editor koji se moe koristiti za ureivanje bilo kakvog teksta. Najvie se koristi za ureivanje programa.
183/1275
vi txt1 pokretanje vi editora i ureivanje txt1 datoteke :q! izlaz iz vi editora bez spremanja podataka vi u ex modu nam omoguava koritenje supstitucije. ex txt1 "txt1" 4L, 246C Entering Ex mode. Type "visual" to go to Normal mode. :q! vie informacija: man vi
184/1275
185/1275
{ } koristi se kada elimo odrediti neko ponavljanje [ ] koristi se kada elimo odrediti listu znakova koje traimo, ili neki raspon znakova [.-.]. Zamjenski znakovi unutar uglatih zagrada imaju drugaije znaenje (vie o tome kasnije). \ | koristi se kad elimo iskljuiti specijalnu namjenu zamjenskog znaka, koristi se kad elimo postaviti alternativni odabir ili kod specijalnih nizova ( ) koristi se za grupiranje izraza; izrazi se grupiraju i privremeno uvaju u memoriji, moemo ih referencirati s \1, ... .. .. .,\9
186/1275
Sada imamo vraanje (backtracking) prema poetku sve dok ne nae prvi broj 2 (gledajui s desna na lijevo). Zahvaeni string e biti "abcdrefghfds789254gfhh2". Backtracking je posljedica pohlepnosti nekih zamjenskih znakova (*,+,{}); on uvijek vraa najdesniji pogodak (njegovo je kretanje s desna na lijevo). Pohlepnost moemo iskljuiti tako da iza svakog pohlepnog zamjenskog znaka piemo '?' . "*?" "+?" "{min, max}?" "??". Sada je situacija malo drugaija. Uzmimo zadnji primjer: regEx .*?2 i string "abcdrefghfds789254gfhh2568975hujkhfed". Regularni izraz sada nakon svakog znaka s kojim je imao pogodak pokuava usporediti broj 2. Zahvaeni string e sada biti "abcdrefghfds7892". Korak po korak primjer: Regularni izraz a[bcd]*b, zahvaa slovo a, nula ili vie slova iz liste [bcd], i na kraju b. Usporedimo to sa stringom "abcbd" Korak Pogodak 1 2 3 4 5 6 7 a abcbd Promaaj abcb abc abcb Zahvaa 'a' Zahvaa [bcd]*, ide daleko koliko moe, a to je do kraja stringa Pokuava zahvatiti b, poto je trenutna pozicija kraj stringa, imamo promaaj Povratak na poetak, tako da [bcd]* zahvati jedan znak manje Ponovno natrag, tako da [bcd]* zahvaa samo "bc" Ponovno pokua s b.Ovaj put znak na trenutnoj poziciji je "b", znai uspijeva Objanjenje
187/1275
188/1275
Osnovni primjeri
(sintaksa zamjenskih znakova, sintaksa specijalnih nizova) sintaksa zamjenskih znakova:
. zahvaa bilo koji znak A.A Zahvaa bilo koji troslovni niz znakova koji poinje i zavrava s A. PRIMJER: A.A zahvaeni stringovi: AA AbA ABA AzA A.A nezahvaeni stringovi: A A AbbA A__A AokoA A.LA
^ oznaava poetak reda ^Koliko je sati zahvaa liniju koja poinje stringom "Koliko je sati" ^\d PRIMJER: ^Koliko je sati zahvaeni stringovi: "koliko je sati .. .." ^\d zahvaeni stringovi: 1ds 0ABD nezahvaeni stringovi: zahvaa liniju koja poinje brojem
189/1275
$ oznaava kraj reda \d$ zahvaa liniju koja zavrava brojem \.$ zahvaa liniju koja zavrava tokom PRIMJER: \d$ zahvaeni stringovi: An52 Bell1 _5 \.$ zahvaeni stringovi: eto. nezahvaeni stringovi: dkkd bell 6_ nezahvaeni stringovi: marko.hr
* trai se nula ili vie zadanih == {0,} D\d*A zahvaa string koji izmeu znakova D i A nema nijednu ili ima vie znamenki PRIMJER: D\d*A zahvaeni stringovi: DA D0123A D01A-KT nezahvaeni stringovi: DBA D1CA DB23A
190/1275
+ trai se jedan ili vie zadanih == {1,} D\d+A zahvaa string koji izmeu znakova D i A ima jednu ili vie znamenki PRIMJER: D\d+A zahvaeni stringovi: D1A D0123A D01A-KT nezahvaeni stringovi: DA D1CA DB23A
? nula ili trai se jedan znak == {0,1} 25?6 zahvaa string koji poslije 2 nema nijedan ili ima jedan broj 5 i zavrava sa 6 PRIMJER: 25?6 zahvaeni stringovi: 256 26 256adf nezahvaeni stringovi: 2556 236 2d8
{ } koristi se kad elimo odrediti neko ponavljanje 2(5{2, 4})9 zahvaa sve stringove koji poinju s 2 i imaju min 2 i max 4 broja 5, a sekvenca broja 5 zavrava s 9 PRIMJER: 2(5{2, 4})9 zahvaeni stringovi: 2559 255559 255596 nezahvaeni stringovi: 259 255555555559 250559
191/1275
^[abc] zahvaa svaku liniju koja poinje slovima a, b ili c ^[A-Z] zahvaa svaku liniju koja poinje velikim slovom PRIMJER: ^[abc] zahvaeni stringovi: ako je bGet cuker ^[A-Z] zahvaeni stringovi: A Guru Pas nezahvaeni stringovi: zakon Bget Car nezahvaeni stringovi: aS luk 23pc TF
kad elimo ukljuiti specijalnu namjenu nezamjenskog znaka \.\*.*\\ zahvaeni stringovi su svi oni koji za prvi znak imaju '.', zatim '*'
te nula ili vie bilo kojih znakova i zavravaju znakom '\' PRIMJER: \.\*.*\\ zahvaeni stringovi: .*asdasd\ .*\ nezahvaeni stringovi: .8995\ .*AAA
192/1275
rib(a | e) zahvaa string koji kao prva tri znaka ima "rib", a kao etvrti znak ima 'a' ili e (c|C)$ zahvaa linije koje zavravaju s c ili C PRIMJER: rib(a | e) zahvaeni stringovi: zaribati ribe (c|C) $ zahvaeni stringovi: Tko je u dv.C Gdje je Wc nezahvaeni stringovi: ribolov stribor nezahvaeni stringovi: tko je u dv.C ? c.
( ) koristi se za grupiranje izraza (\w\.)(.\d) zahvaa sve one koji poinju slovom, brojem ili underscoreom te kao drugi znak imaju toku, pa bilo koji znak i nakon toga znamenku PRIMJER: (\w\.)(.\d) zahvaeni stringovi: _.d5 A.D4 nezahvaeni stringovi: Dd5 d.dd
193/1275
'\D' iskljuuje znamenku '\D' = [^0-9] ^\D\d\d zahvaene su sve linije koje poinju bilo kojim znakom osim broja, a nakon toga imaju dvoznamenkasti broj PRIMJER: ^\D\d\d zahvaeni stringovi: _22dlf g33_.c nezahvaeni stringovi: 555fhdj h5.tz
194/1275
'\w' zahvaa slovo, broj ili '_' '\w' = [0-9a-zA-Z_] \w\d\d\w zahvaa sve one nizove znakova koji kao prvi znak imaju broj, slovo ili '_', kao drugi i trei znak imaju dvoznamenkasti broj, a zadnji znak imaju isti kao i prvi PRIMJER: \w\d\d\w zahvaeni stringovi: 5556as d99d456 nezahvaeni stringovi: s5aff 7aaa
'\W' iskljuuje bilo koje slovo, broj ili '_' '\W' = [^0-9a-zA-Z_] \d\W\d zahvaa sve one nizove znakova koji kao prvi znak imaju za broj, kao drugi znak ne smiju imati broj, slovo ili '_', a kao zadnji znak moraju imati broj PRIMJER: \d\W\d zahvaeni stringovi: 26 2.6 nezahvaeni stringovi: 2a5 222
195/1275
'\b' zahvaa rijei koje imaju odreene znakove na rubovima rijei [0-9]\b zahvaa sve "rijei" koje kao prvi i zadnji znak imaju broj PRIMJER: [0-9]\b zahvaeni stringovi: 0fshdf0 1g9 987 nezahvaeni stringovi: ad9 _99s 99dl.
'\B' iskljuuje rijei koje imaju odreene znakove na rubovima rijei [0-9]\B zahvaa sve rijei koje nemaju znamenku kao prvi i zadnji znak PRIMJER: [0-9]\B zahvaeni stringovi: adf pl89pp nezahvaeni stringovi: 123 1vf.
Znak \f \n \r \t \v \r+\f
Opis Form-feed (poetak reda) Linefeed (novi red na poetak) Carriage return (novi red) Tab Vertical tab
196/1275
'\s' = [ \t \n\r\f\v]
^\s zahvaa sve linije koje poinju white spaceom PRIMJER: - za primjer smo odredili da toka oznaava poetak linije - poetak linije ->' . ' ^\s . zahvaeni stringovi: Ides u ducan.. nezahvaeni stringovi: .idem
'\S' iskljuuje bilo koji white space '\s' = [^ \t \n\r\f\v] ^\S zahvaa sve linije koje ne poinju white spaceom PRIMJER: - za primjer smo odredili da toka oznaava poetak linije - poetak linije ->' . ' ^\S zahvaeni stringovi: .idem . nezahvaeni stringovi: Ides u ducan..
'\<' poetak rijei 9\< zahvaa sve rijei koje poinju brojem 9 PRIMJER: 9\< zahvaeni stringovi: 9idem 945 nezahvaeni stringovi: a9cd 899
197/1275
'\>' kraj rijei A\> zahvaa sve rijei koje zavravaju slovom A PRIMJER: A\> zahvaeni stringovi: 1233A DA nezahvaeni stringovi: 1233 Da
'\A' poetak stringa PRIMJER: \A... zahvaa prva tri slova nekog stringa \A... zahvaeni stringovi: Tada se zbilo... nezahvaeni stringovi: f\n
'\Z' kraj stringa PRIMJER: ...\Z zahvaa zadnja tri slova nekog stringa ...\Z zahvaeni stringovi: Tada se zbilo...\n nezahvaeni stringovi: f\n
\Z zahvaa string ispred \n, a ako ne postoji string, moe zahvatiti i \n, za razliku od $ koji uvijek zahvaa ispred \n
198/1275
Lookahead Assertions
(?=regEx) nalazi li se ispred...
foo(?=bar) vs. foobat Najprije se usporeuje prvi dio regEx-a "foo" sa stringom "foobat". Usporedba se izvrava kao to smo objasnili. Imamo poklapanje "foo" s prva tri slova stringa "foobat". Nakon toga kree regEx generator s drugim dijelom usporedbe "bar" vs. "bat". Imamo dva pogotka, ali 'r' ne pogaa 't' pa imamo promaaj. foo(?=bar) vs. "foobar" Pogodak! Generator zahvaa foo jer se iza nalazi bar. \t(?=MATEMATIKA) Traimo pogodak na liniji: MATEMATIKA Pogodak na matematici 2. (?!regEx) da li se ispred NE nalazi ... MATEMATIKA 2 TALIJANSKI ...
Traimo pogodak nad imenima fajlova koji nemaju ekstenziju "bat" ili "exe". .*[.](?!bat$|exe$).*$ Imamo pogodak na svakoj fajlu koji ne zavrava s "bat" ili "exe".
199/1275
Lookbehaind Assertions
(?<=regEx) da li se iza nalazi ...
(?<=a)b vs. "thingamabob" Generator se kree znak po znak i uvijek radi korak prema poetku stringa te usporeuje sadraj zagrade. Ako ima pogodak, gleda znak iza i usporeuje ga sa znakom iza zagrade. (?<!regEx) da li se iza ne nalazi ...
Primjena regularnih izraza na nekim uniX alatima EGREP PRIMJER: Datoteka tel_imenik /* Ana, Ban Alex, France Indi, Car Elvis, Potrag Marko, Zeus Zoran, Yevs */ egrep "^A" tel_imenik 3398-000 5598-999 8895-977 9989-771 1189-001 9987-573
200/1275
3398-000 5598-999
PRIMJER: egrep "[xX]" tel_imenik Alex, France egrep ' ( Indi|Elvis) ' tel_imenik Indi, Car Elvis, Potrag 8895-977 9989-771 5598-999
PRIMJER: zo@linux:~> cat srijeda alan nije napisao nista od onoga sto je trebao, sada mu je dobro. aln nije napisao nista od onoga sto je trebao, sada mu je dobro. alau nije napisao nista od onoga sto je trebao, sada mu je dobro. alan nije napisao nista od onoga sto je trebao . alanu je dobro. zo@linux:~> egrep -e '^alan[u]?[ \ta-zA-Z]*je[ \tA-Zaz,]*dobro\.?$' srijeda alan nije napisao nista od onoga sto je trebao, sada mu je dobro. alanu je dobro. zo@linux:~> Telefonski brojevi: zo@linux:~> cat srijeda 3893-464
201/1275
3893 -986 9236- 563 2359 - 323 9885-9663 11-66666 2356-99 6 55555-666 zo@linux:~> egrep -E '^[0-9]{4}[ \t]?-[ \t]?[0-9]{3}$' srijeda 3893-464 3893 -986 9236- 563 2359 - 323 zo@linux:~> Floating point + int: zo@linux:~> cat srijeda 2566.56555 25985526.322 256.325 6596 56...5544 256.3. 256.23 .32 zo@linux:~> egrep -E '^[0-9]+\.?[0-9]+$' srijeda 2566.56555 25985526.322 256.325 6596 256.23 zo@linux:~> Ako elimo samo floating point brojeve:
202/1275
PRIMJER: Lg.txt MANU GNO GNO EXI EXI LOGIN LOGOUT LOGIN LOGOUT MANU LOGOUT LOGIN 01.01.2004. 12:00 01.01.2004. 12:38 01.01.2004. 23:58 02.01.2004. 23:59 03.01.2004. 23:15 03.01.2004. 23:29 03.01.2004. 23:29 03.01.2004. 23:30 04.01.2004. 09:00 04.01.2004. 09:05 04.01.2004. 10:01 04.01.2004. 10:03 04.01.2004. 10:05
ZORAK LOGIN MANU LOGIN ENA LOGIN ZORAK LOGOUT SETER LOGIN MANEK SEKOviN
LOGIN LOGIN
MARA LOGIN MANU LOGOUT ZORAK LOGIN SEKOviN INED ENA MARA LOGOUT LOGIN LOGOUT
04.01.2004. 11:59 04.01.2004. 12:47 04.01.2004. 23:00 04.01.2004. 12:59 04.01.2004. 13:59 04.01.2004. 15:08 04.01.2004. 16:00 04.01.2004. 16:07 04.01.2004. 16:26 05.01.2004. 00:05 05.01.2004. 06:01 05.01.2004. 08:02 05.02.2004. 09:08
LOGOUT
LOGOUT
203/1275
ZORAK LOGOUT MANU LOGOUT ZORAK LOGIN ZORAK LOGOUT EXI EXI EXI EXI LOGIN LOGOUT LOGIN LOGOUT
05.02.2004. 09:09 05.02.2004. 10:59 06.02.2004. 11:55 06.02.2004. 12:59 06.02.2004. 13:05 06.02.2004. 13:00 10.02.2004. 08:00 10.02.2004. 08:01 12.02.2004. 09:05 12.02.2004. 09:58 13.02.2004. 08:08 LOGOUT 14.02.2004. 09:05
SETER
MANU login & logout za 1 mjesec. zo@linux:~> egrep -E '^MANU[^\D\S]*(0.\.01\.2004\.)' lg MANU LOGIN 01.01.2004. 12:00 MANU LOGOUT 01.01.2004. 23:58 MANU LOGIN 03.01.2004. 23:30 MANU LOGOUT 04.01.2004. 12:47 zo@linux:~> MANU login & logout za 2 mjesec. zo@linux:~> egrep -E '^MANU[^\D\S]*(0.\.02\.2004\.)' lg MANU LOGIN 05.02.2004. 09:08 MANU LOGOUT 05.02.2004. 10:59 zo@linux:~> Sve aktivnosti u 23 satu u 01 mjesecu bilo koji dan.
204/1275
zo@linux:~> egrep -E '^[^\D\S]*(0.\.01\.2004\..)(23)' lg MANU LOGOUT 01.01.2004. 23:58 GNO EXI EXI LOGOUT 02.01.2004. 23:59 LOGIN 03.01.2004. 23:15 LOGOUT 03.01.2004. 23:29
ZORAK LOGIN 03.01.2004. 23:29 MANU LOGIN 03.01.2004. 23:30 ZORAK LOGIN 04.01.2004. 23:00 zo@linux:~> Svi Logout-ovi u 23 satu u 01 mjesecu bilo koji dan.
zo@linux:~> egrep -E'LOGOUT[^\D\S]*(0.\.01\.2004\..)(23)' lg MANU LOGOUT 01.01.2004. 23:58 GNO EXI LOGOUT 02.01.2004. 23:59 LOGOUT 03.01.2004. 23:29
zo@linux:~> Svi login-ovi setera. zo@linux:~> egrep -E '^SETER.?LOGIN[^\D\S]*(1([09]?)\.02\.2004\..)' lg SETER LOGIN 10.02.2004. 08:00 SETER LOGIN 13.02.2004. 08:08 zo@linux:~> Svi logout-ovi setera. zo@linux:~> egrep -E '^SETER.?LOGOUT[^\D\S]*(1([0-9]?)\.02\.2004\..)' lg
205/1275
PRIMJER: E-mail addr filter. zo@linux:~> cat ma2 mali_fl@pl_hr mali_fl@@pl_hr jhjh??@dfd_pl hjlsll_@ww mali.pes@yoki.hr mali-.pes@xor.mg. mali-.pes@xor.mg.hl mali....pes@xor.mg .mali.pes@yahoo.com ernest.flego@malibu.23 endel.fdu@kos.de.ff.dd ma-Exvest@net.hr zo@linux:~> egrep -E '(^([a-zA-Z0-9-_])+)\.?[a-zA-Z0-9_]*[@]{1}([a-zA-Z0-9]+)\.{1}([a-zA-Z]{2,10})(?(\.)[a-z-A-Z]{2,3}|[a-zA-Z]{0,3})' ma2 mali.pes@yoki.hr mali-.pes@xor.mg.hl ma-Exvest@net.hr IP addr filter
206/1275
ip.wpad /* 158.988.456.235 163.254.252.111 111.189.299.266 11.58.566.233 */ zo@linux:~> egrep -E '(25[0-5]|2[0-5][0-9]|[01][0-9][09]\.25[0-5]|2[0-5][0-9]|[01][0-9][0-9]\.25[0-5]|2[0-5][0-9]|[01][0-9][0-9]\.25[0-5]|2[05][0-9]|[01][0-9][0-9])' ip.wpad 163.254.252.111 zo@linux:~> AWK PRIMJER: F1/* ime darko darko marin eston narav */ awk_/* $5 ~/[0]/ {print $0} $5 ~ /[0]/ {lines++} END{print "Broj duznika:",lines} */ prezime puh on draget 4 sret tezak 4 7 marke kolicina kocke 1 7 buli plast 0 kugla kocke naziv 0 1 0 1 1 placeno marko puzla 5
207/1275
zo@linux:~> awk -f awk_ f1 marko puzla darko on narav tezak Broj duznika: 3 zo@linux:~> Ili zo@linux:~> awk '$5 ~/[0]/ {print $0} $5 ~ /[0]/ {lines++}END{print "Broj duznika:",lines} ' f1 marko puzla darko on narav tezak Broj duznika: 3 zo@linux:~> vi supstitucija u vi ex modu 7 4 5 kocke 0 kocke 0 marke 0 7 4 5 kocke 0 kocke 0 marke 0
PRIMJER: zo@linux:~> cat sub1 function(x+1,x,x+2) zo@linux:~> ex sub1 "sub1" 2L, 14C Entering Ex mode. Type "visual" to go to Normal mode.
208/1275
:%s/function(\([^,]*\),\([^,]*\),\([^,]\))/function(\2,\1,\3)/g :wq
PRIMJER: zo@linux:~> cat sub2 Marko Blazevic, Jadranka Muzic Parduk, HR, ,APL ,HR, 10000 Zagreb SLO,21100 Ljubljana 21000 Split ,42000 Varazdin
Melten Bukrest, SmartNet, Gonar Tenser, Siemens,HR Drago Mio,Endor-Soft zo@linux:~> ex sub2 "sub2" 6L, 212C
Entering Ex mode. Type "visual" to go to Normal mode. :%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3,\4,\2/ :wq zo@linux:~> cat sub2 Marko Blazevic, HR, Melten Bukrest, Jadranka Muzic 10000 Zagreb, SLO,21100 Ljubljana, ,HR, 21000 Split,APL Siemens Parduk SmartNet
209/1275
zo@linux:~> ex sub2 "sub2" 6L, 212C Entering Ex mode. Type "visual" to go to Normal mode. :%s/[\t]*,[\t]*/,/g :wq //g[opcionalan] ako elimo da se izraz primijeni na cijelu liniju, //inae samo na prvi pogodak zo@linux:~> cat sub2 Marko Blazevic,HR,10000 Zagreb,Parduk Melten Bukrest,SLO,21100 Ljubljana,SmartNet Jadranka Muzic,HR,21000 Split,APL Gonar Tenser,HR,42000 Varazdin,Siemens Drago Mio,BIH,50000 Sarajevo,Endor-Soft zo@linux:~> zo@linux:~> cat txt 16:30-19:00 MAT II DV.F101 19:00-21:20 DV.F101 16:30-18:00 MAT II DV.F101 18:10-21:20 UNIX DV.F101 16:30-18:00 NWP DV.F101 18:10-21:20 DV.F112 13:15-14:50 8:00-9:35 DV.F02 9:45-13:05 PIN DV.F02
TALIJANSKI
EKONOMIKA
NWP(labosi?)
210/1275
"txt" 12L, 301C Entering Ex mode. Type "visual" to go to Normal mode. :%s/MAT/MATEMATIKA/g MATEMATIKA II :wq zo@linux:~> cat txt 16:30-19:00 MATEMATIKA II DV.F101 19:00-21:20 EKONOMIKA DV.F101 16:30-18:00 MATEMATIKA II DV.F101 18:10-21:20 UNIX DV.F101 16:30-18:00 NWP DV.F101 18:10-21:20 NWP(labosi?) DV.F112 13:15-14:50 PIN(labosi) DV.F111 zo@linux:~> cat txt1 Kako bismo ubrzali stranicenje, trebamo podrku hardvera - asocijativnu memoriju. TLB je hardverski ureaj koji kesira polja tabele stranica. Postoje specijalne instrukcije kojima OS moe upravljati TLB-om. Tipina veliina TLB-a je 8-2048 ulaza. zo@linux:~> ex txt1 "txt1" 4L, 246C 8:00-9:35 TALIJANSKI DV.F02 9:45-13:05 PIN DV.F02 MATEMATIKA II NWP TALIJANSKI
211/1275
Entering Ex mode. Type "visual" to go to Normal mode. :%s/TLB/Translation Look-Aside Buffer/g 3 substitutions on 3 lines :wq
zo@linux:~> cat txt1 Kako bismo ubrzali stranicenje, trebamo podrku hardvera - asocijativnu memoriju. Translation Look-Aside Buffer je hardverski ureaj koji kesira polja tabele stranica. Postoje specijalne instrukcije kojima OS moe upravljati Translation Look-Aside Buffer-om. Tipina veliina Translation Look-Aside Buffer-a je 8-2048 ulaza. zo@linux:~>
Jedini zakljuak koji moemo donijeti vezan uz regularne izraze je taj da regularni izrazi bez obzira na to kako vam se inili na poetku u nezamislivoj mjeri olakavaju posao, ako se ne slaete sa tom tvrdnjom pokuajte sami napisati rutinu za provjeru e-maila koja e obuhvaati sve sluajeve iz primjera.
212/1275
Mario Strini
VI EDITOR
213/1275
UVOD
VI je screen based editor, najee koriten na UNIXoidima. Osnovni razlog uspjenosti VI editora su mnoga svojstva koja pomau programerima, ali i mnotvo mogunosti koje nudi u, nazovimo, svakodnevnom editiranju file-ova. esta je pojava da ga poetnici izbjegavaju upravo zbog mnotva mogunosti koje nudi. Osim VI-a postoje jo dva standardna UNIX editora, to su: ed linijski orijentiran editor, prilino kompliciran za uporabu ex linijski editor praktino jednakih mogunosti kao i VI
Startanje:
VI prua mogunost kreiranja novih ili editiranja starih dokumenata. Naredba za pokretanje je: VI [filename] (filename je opcionalan) Ukoliko se prilikom pokretanja ne navede ime file-a potrebito je prilikom snimanja dati ime. Prilikom prvog pokretanja ekran je ispunjen tildama (~) s lijeve strane ekrana. Na dnu (ukoliko je naveden filename) pisat e neto poput: filename lines 21, 400 characters (ime file-a, broj linija i broj znakova) Ukoliko file nije postojao pisat e neto poput: newfile [newfile] Za pokretanja bez imena file-a (bilo starog ili novog imena) donja linija bit e prazna.
214/1275
MODOVI RADA:
VI editor ima dva moda rada: komandni insert
Komandni mod:
Omoguuje unos komandi i manipulaciju tekstom. Za ulazak u komandni mod potrebito je pritisnuti dirku Escape (Esc)(prilikom startanja VI se i nalazi u komandnom modu). Pojavit e se : u oekivanju komande. Naredbe su obino duge jedan (1) ili dva (2) znaka. Za prelazak u insert mode koriste se naredbe a i i. Format naredbi je: [count] komanda [where] Count je broj koji poinje sa 1-9 i odnosi se na broj znakova na koji elimo imati uinak. Npr. naredba x20 e obrisati 20 znakova. Where govori na koliko linija elimo uinak naredbe (takoer, moe biti i naredba za pomicanje kursora. Jednostavne Naredbi: a h i ulazak u insert mode mie kursor lijevo jednu poziciju ulazak u insert mode otkucani znakovi e biti umetnuti prije trenutne
pozicije kursora. Ukoliko navedemo count sav tekst koji je umetnut bit e ponovljen count puta j k l r u pomie kursor jednu liniju dolje pomie kursor jednu liniju gore pomie kursor desni jednu poziciju mijenja znak pod kursorom (count za zamjenu vie znakova) povrat zadnje naredbe (undo)
215/1275
x q q! w
brie znak pod kursorom (count za obrisati count znakova) naputanje VI editora (ukoliko je dokument mijenjan dobit emo naputanje bez snimanja (nema upozorenja) snimanje (moe se navesti iza w ime file-a)
upozorenje)
wq snimiti i napustiti
Text baferi u VI
VI ima 36 bafera sa spremanje dijelova teksta i bafer ope namjene. Kad god je neki dio teksta obrisan ide u bafer ope namjene ali se moe pohraniti i u drugi bafer ako se tako specificira. Bafer se specificira naredbom iza koje slijedi broj ili slovna oznaka bafera. Na primjer: mdd znai koristi bafer m i obrii trenutnu liniju ili mp kopira sadraja bafera m(uradi paste)
Lijepljenje (pasting)
Naredbe za lijepljenje su p i P. Jedina razlika meu njima je u relativnoj poziciji kursora gdje lijepe. p lijepi specificirani ili opi bafer poslije pozicije kursora, dok P p lijepi specificirani ili opi bafer prije pozicije kursora. Specifiranje counta prije paste naredbe lijepi tekst count puta.
Indentacija i provjera
VI editor ima sklop osobina koje mu omoguuju pomo pri programiranju. Postoji varijabla kojom moemo podesiti identaciju za svaki nivo ugnjedavanja koda. Varijabla je sw. Na primjer: :set sw=5 (podesit e pomak na 5). Naredbe za indentaciju: << Pomie trenutnu liniju na lijevo za irinu jednog pomaka >> Pomie trenutnu liniju na desno za irinu jednog pomaka Posebno zgodna osobina VI editora je to to omoguuje provjeru koda za viseim zagradama. Naredba % e traiti lijevu pripadajuu zagradu.
217/1275
Za traenje stringova koristimo naredbe: / i ?. Jedina razlika izmeu ove dvije naredbe je u tome to / trai string prema naprijed, dok naredba ? trai string prema natrag.Naredbe n i N ponavljaju prethodnu naredbu u istom ili suprotnom smjeru. Neki znakovi u VI-u imaju posebno znaenje stoga je ispred njih potrebito staviti \ (backslash) da bi bili ukljueni u pretragu. Specijalni znakovi: ^ - poetak linije . odgovara jednom znaku - oznaava 0 (nula) ili vie znakova $ - kraj linije [ - poetak seta pripadajuih znakova < - krak rijei >- poetak rijei Naredbe f i F trae znak na trenutnoj liniji.Naredba f trai naprijed, dok F trai unatrag. Naredbe t i T trae znak na trenutnoj liniji, ali t pomie kursor na poziciju prije traenog znaka (traei unaprijed), dok T pretrauje unatrag do znaka prije traenog. Gore navedene naredbe f i F, te t i T mogu biti ponovljene koristei ; ili , gdje: ; ponavlja pretragu u istom smijeru, dok , to radi u obrnutom smijeru.
218/1275
PODEAVANJE VI-A
Mogue je podesiti nain na koji se VI ponaa i to se radi naredbom :set. Edit opcije raspoloive naredbom set: noautoindent autoprint noautowrite nobeautify nodoubleescape /usr/lib/tags noedcompatible noerrorbells noexrc flash hardtabs=8 noignorecase keyboardedit keyboardedit! nolisp nolist paragraphs=IPLPPPQPP prompt noreadonly redraw remap report=5 scroll=11 sections=NHSHH shell=/bin/csh shiftwidth=8 LIpplpipnpbp term=xterm noterse timeout timeoutlen=500 ttytype=xterm warn window=23 HUuhsh+c wrapscan wrapmargin=0 nowriteany magic mesg nmodelines nonumber nooptimize noshowmatch noshowmode noslowopen tabstop=8 taglength=0 tags=tags
directory=/tmp nonovice
Nekim od ovih opcija je potrebito dodijeliti vrijednost sa =, dok su druge set ili not set. Primjer: :set autoindent - Ova opcija e osigurati da svaka slijedea linija ima istu indentaciju :set mesg za aktiviranje poruka ili :set nomesg ako ne elimo poruke :set number ispisuje broj linije s lijeve strane :set warn upozorava da li je file snimljen ili ne :set wi=xx podeava broj linija koje VI koristi (xx)
219/1275
:set ws ako je ova opcija upaljena ako ne pronae eljeni string poinje pretragu s poetka teksta :set wm xx automatski "word wrap", to znai da e prei u novu liniju poslije odreenog broja znakova (xx mora biti vei od 0)
220/1275
Primjer: Ako smo otkucali neto poput Pero Peric huuuuuuuuuuuuuum i ne elimo to stalno ponavljati moemo napisati: :ab Pe Pero Peric huuuuuuuuuuuuuum Sada kad otkucamo Pe pojavit e se: Pero Peric huuuuuuuuuuuuuum
Skraenice se mogu ukinuti. Naredba za to je unabbreviate. U prethodnom primjeru bi bilo: :una Pe Za listu skraenica otkucati: :ab. Druga veoma korisna naredba je naredba za mapiranje.Postoje dvije vrste mapiranja u komandom i u insert modu. Ove dvije komande su: :map :map! Mapiranje radi slino skraenicama, da se sekvenca tipki i potom sekvenca za zamjenu. EXINIT Environment Variabla and the .exrc file: Postoje dva naina za prilagoavanje(customize) VI-a korisniku. Ako kreirate file .exrc u svom home direktoriju, sve komande tamo e biti itane prilikom startanja VI-a. Drugi nain je da podesimo varijablu EXINIT. Opcije e biti smjetene u vaem shellsetup file-u. Ako koristite /bin/csh (C-Shell) koristite ovu naredbu: setenv EXINIT '...'
221/1275
Ako koristite /bin/sh or /bin/ksh koristite ovu naredbu: export EXINIT EXINIT='...' Umjesto ... stavite naredbu koju elite, na primjer za C shell: setenv EXINIT 'set ai nu wm=3' Ako elite staviti vie od jedne naredbe odvojite naredbe uspravnom crtom (|). Primjer: setenv EXINIT 'set ai nu wm=3|map g G' Ako elite kreirati file .exrc moete staviti iste stvari u njega kao to je napisano pod navodnicima poslije EXINIT.
222/1275
POVRAT PODATAKA
Vi editira privremenu kopiju vaeg file-a i kad je editiranje zavreno ili kad snimimo od mijenja sadraj privremene kopije sa novom. Ako neto krene naopako dok editirate file VI e pokuati snimiti bilo kakav rad koji je u tijeku i snimiti ga za kasniji povrat. (Ako VI umre dok radite na file-u on e vam poslati e-mail kako ga povratiti. Opcija r e u tom sluaju biti upotrijebljena prilikom slijedeeg dizanja. Komanda bi trebala izgledati ovako vi r vitalinfo. Naravno, poslije povrata (recoveringa) file je potrebito ponovo snimiti.)
223/1275
Umetanje teksta
A dodaje na kraj trenutne linije I ubacuje na poetak linije ulazi u insert mode u novu liniju iznad trenutne pozicije kursora i ulazi u insert mode, znakovi e biti ubacivani prije trenutne pozicije kursora - ulazi u insert mode u novu liniju ispod trenutne pozicije kursora
224/1275
Ctrl + M pomie kursor na prvi znak slijedee linije Ctrl + N - pomie kursor dole jednu liniju u istoj koloni. Count pomie navedeni broj linija dolje Ctrl + P Pomie kursor gore jednu liniju u istoj koloni. Count pomie toliko linija gore Ctrl + U Skrola nazad pola prozora. Count skrola toliko linija. $ - pomie kursor na kraj trenutne linije. Count pomie na kraj slijedeih linija % - pomie kursor na mjesto parne zagrade ^ - pomie kursor na prvi non-whitespace znak ( - pomie kursor na poetak reenice ) pomie kursor na poetak slijedee reenice { - pomie kursor na prethodni paragraf. } pomie kursor na slijedei paragraf | - pomie kursor na kolonu specificiranu sa count + - pomie kursor na prvi non-whitespace znak u slijedeoj liniji - pomie kursor na prvi non-whitespace znak u prethodnoj liniji _ - pomie kursor na prvi non-whitespace znak u trenutnoj liniji 0 (Nula) pomie kursor na prvu kolonu trenutne linije B pomie kursor nazad jednu rije preskaui punktuaciju E pomie kursor na kraj rijei preskaui punktuaciju G ide na broj linije specificiran sa count, ako count nije zadan onda ide na kraj file-a H pomie kursor na prvi non-whitespace znak na vrhu ekrana L pomie kursor na prvi non-whitespace znak na dnu ekrana M pomie kursor na prvi non-whitespace znak na sredini ekrana W pomie se naprijed na poetak rijei preskaui punktuaciju b pomie kursor nazad jednu rije. Ako je kursor na sredini rijei, pomie kursor na prvi znak te rijei e pomie kursor naprijed jednu rije. Ako je kursor na sredini rijei, pomie kursor na zadnji znak te rijei h pomie kursor na lijevo jedan znak j pomie kursor dolje jednu liniju k pomie kursor gore jednu liniju
225/1275
l pomie kursor na desno jedan karakter w pomie kursor naprijed jednu rije. Ako je kursor na sredini rijei pomie kursor na prvi znak slijedee rijei
Zamjena teksta:
C mijenja do kraja linije od trenutne pozicije kursora R mijenja znakove na ekranu sa setom znakova unesenih sa Escapeomey. S mijenja cijeli liniju c- mijenja sve dok cc ne promjeni trenutnu liniju. Count mijenja navedeni broj linija. R mijenja jedan znak pod kursorom. Count mijenja navedeni broj znakova s mijenja jedan znak pod kursorom i ide u insert mode. Count mijenja broj znakova. $ e biti stavljen na zadnji znak zamjene
226/1275
Formatiranje znakova/linija
~ mijenja case znaka po kursorom < - pomjera linije do where prema lijevo za jednu irinu pomaka << pomjera trenutnu liniju na lijevo i moe biti specificirano sa count - pomjera linije do where prema desno za jednu irinu pomaka << pomjera trenutnu liniju na desno i moe biti specificirano sa count J spaja trenutnu liniju sa slijedeom. Counr spaja navedeni broj linija
Snimanje i izlaz:
Ctrl + \ - naputa VI mode i odlazi u EX mode. EX editor je linijski editor na kom je baziran Vi editor. Komanda za povrat nazad je :vi Q naputa VI i odlazi u EX mode ZZ naputa editor, snima ako ima izmjena
227/1275
Miscellany:
Ctrl + G Prikazuje ime file-a i status Ctrl + L isti i ponovo iscrtava ekran Ctrl + R Ponovo iscrtava ekran uklanjajui pogrene linije Ctrl + [ - Escape tipka. Odgaa prethodno danu komandu Ctrl + ^ - ide nazad na prethodno editirani file ! izvrava shell naredbu. & - ponavlja prethodnu :s naredbu . ponavlja zadnju naredbu koja je promijenila file : - poetak tipkanja EX editor naredbi. Naredba je izvrena kad user otipka return @ - ispisuje naredbu spremljenu u baferu U vraa trenutnu liniju u stanje koje je bilo prije no to je kursor uao u liniju m oznaava trenutnu poziciju sa znakom specificiranim poslije m naredbe u vraa zadnju promjenu napravljenu na filu. Ponovno u e negirati prethodno u
228/1275
ZAKLJUAK
Vi editor predstavlja moan alat za editiranje texta. Iz pobrojane liste naredbi lako je vidljivo da je gotovo teko zamisliti neku operaciju sa tekstom koju VI ne moe izvriti. Osim toga odvojenost modova rada (komandnog i insert moda) u bitnome olakava navigaciju kroz VI. Naredbe su jednostavne i logino postavljene. Stoga nije nimalo udno da je VI postao bazinim editorom UNIX based Operacijskih sustava.
229/1275
Matko Peji
EMACS
230/1275
UVOD
to je Emacs?
Emacs je besplatan, portabilan, nadogradivi tekst editor. Besplatan znai da je izvorni kod (source code) za Emacs dostupan svima sa pristupom internetu te se moe besplatno kopirati i redistribuirati. Portabilan znai da se Emacs moe pokrenuti na nizu strojeva i radi na nizu operativnih sustava tako da se slobodno moete pouzdati u injenicu da moete koristiti isti program za ureivanje teksta neovisno kojim strojem se sluite. Sa rijei nadogradivi opisuje se trea, ali vjerojatno najvanije karakteristika Emacs-a. Ne samo da moete prilagoditi sve mogunosti Emacs-a tako kako vama najvie odgovara, ve moete isprogramirati Emacs da radi stvari koje njegovim kreatorima nisu uope pale na pamet. Zbog svega ovoga Emacs je izuzetno popularan i uspjean program. Jedini popularniji tekst editor koji se koristi na Linux i Unix strojevima je sveprisutni vi. Ali Emacs nije samo program za obradu teksta. Ako koristite jedan od mnogih poznatijih programskih jezika, Emacs vjerojatno sadri mod koji omoguuje lako editiranje koda u tom jeziku. Kompajliranje, debagiranje , direktna interakcija sa interpreterom, skakanje po kodu na bilo koju poziciju oznaenu simbolom (funkcija ili ime varijable), sve su to opcije koje pisac koda moe koristiti u Emacsu. Emacs takoer sadri programe za itanje pote (mail readers), za itanje vijesti (news readers),www, gopher i FTP klijente, spell checking i psihologa (Rogarian therapist-probati obavezno) Emacs je veinom napisan u Lisp programskom jeziku, a u jezgri se nalazi Lisp interpreter napisan u C-u. Samo osnovni dijelovi Emacsa su napisani u C-u. Emacs je stvoren prije dvadeset godina tako da postoji more razliitih add-on paketa, od kojih vam veina omoguuje stvari o kojima kreator Emacsa nije ni sanjao.
231/1275
232/1275
233/1275
Napomena: Emacs u nekim sluajevima koristi posebne znakove kao strelice (npr. pod X-om ili kad se vrti pod DOS-m, gdje Emacs razumije dogaaje tipkovnice). Ali preporuka je ne koristiti te tipke ak i kad rade, da bi mogli koristiti Emacs sa bilo kojeg terminala.
Notacija
U nastavku teksta koristiti e se standardna Emacs notacija za opisi utipkavanja: C-x M-x C-M-x RET SPC ESC Za bilo koji x, znak je Control-x Za bilo koji x, znak je Meta-x (vie o Meta znakovima u Za svaki x, znak je Control-Meta-x. Tipka povratka (zapravo C-m). Razmaknica Tipka izlaza, odgovara joj C-[
nastavku teksta).
234/1275
Jednostavne tipke
Postoji 95 raznih ASCII znakova koji se mogu ispisati i svi su vezani uz self-insertcommand da bi se mogli umetnuti u tekst kada su odabrani. Za naredbe ureivanja Emacs koristi sve control znake: C-a, C-b itd. Ali to je jo 32 znakova, a Emacs ima vie od 32 naredbe za ureivanje. 128 znakova u gornjoj polovici ASCII-a nisu zauzeti, ali kako ih otipkati? Emacs koristi Meta tipku koja radi na isti nain kao i Control i Shift tipke, tj. ne generira znak sama po sebi ve se koristi za modifikaciju nekog drugog znakova sa tipkovnice.Meta tipka generira isti znak uz koji je pritisnuta, ali sa bit setom vieg reda. To nam daje pristup znakovima kao Meta-a, Meta-b itd. (Postoji takoer i Meta-A, ali da bi se izbjegla mogua zabuna metaznakovi tampanih slova odgovaraju metaznakovima pisanih) to je sa control znakovima sa bit setom vieg reda? To su potpuno validni metaznakovi; oznaavaju se sa C-M-a, itd. Za njihov odabir zajedno se dre pritisnute Control i Meta tipke. Budui da su i Control i Meta Shift tipke M-C-a i C-M-a je zapravo isto. Zbog ujednaenosti uglavnom se pie M-C-a.
235/1275
236/1275
ESC prefiks
Ne postoji drugi prefiks koji je istovremeno vrlo vaan i potpuno suvian kao ESC prefiks. Sve tipkovnice nemaju Meta tipku koja postavlja bit vieg reda (high order bit). Na PCu na kojem se vrti Emacs Alt tipka se koristi kao Meta, ali na PC-u koji je povezan sa Unix strojem preko nekog telekomunikacijskog programa Alt tipka moe, ali i ne mora raditi. Sreom ak i ako nemate Meta tipku nije sve izgubljeno. Kao zamjenu koristite ESC prefiks. Dakle M-a postaje ESC a, C-M f postaje ESC C-f (ne zaboravite da C-M-f = M-C-f) Postoji samo jedna kvaka: ESC nije shift tipka, ve validan ACSCII znak. Dakle nemojte pokuavati drati ESC pritisnutim dok pritiete neku drugu tipku, koristite ga kao prefiks i otipkajte ga odvojeno. Ako ga zadrite pritisnutim sekundu predugo vjerojatno ete izazvati autorepeat to bi vas moglo vrlo zbuniti.
Previe naredbi?
Kako popamtiti sve ove naredbe? Jednostavno: nikako.Veina korisnika Emacs-a naui samo osnovne naredbe i sa tim su potpuno zadovoljni. Neki naue osnovne naredbe i jo neke koje im trebaju za neke posebne zadae. Neki konstantno ue nove naredbe da bi ubrzali editiranje. Vrlo mali broj korisnika doe do stupnja da piu svoje vlastite, potpuno nove Emacs naredbe.
237/1275
238/1275
meuspremnik, naziva se po datoteci i inicijalizira se sa kopijom datoteke. U oba sluaja trenutni prozor prikazuje meuspremnik. C-x C-s save-buffer. Ovo je glavna naredba za spremanje datoteke, tj. za pisanje kopije aktivnog meuspremnika na disk. C-x s save-some-buffers. Omoguuje vam da spremite sve meuspremnike koji posjeuju datoteke, pitajui vas za svaki i nudei nekoliko opcija (spremi, nemoj spremiti, baci pogled pa ga moda spremi, itd.)
239/1275
240/1275
OSNOVNI KONCEPTI
Vjerojatno je vanije razumjeti ove osnovne koncepte nego znati bilo koju naredbu za editiranje. Naredbe za editiranje su detalji: moete ih i sami nauiti,a ko temeljito obradite osnove.
Ulaenje i izlaenje
Za ui u Emacs jednostavno utipkajte: emacs kada se digne, neete editirati niti jednu datoteku. Sada moete upotrebom odgovarajuih naredbi uitati datoteku za ureivanje. Druga mogunost je da upiete emacs foo.tl i pokrenete Emacs sa inicijalnom datotekom Za izlaz iz Emacsa koristite naredbu C-x C-c (koja je vezana za save-buffer-kill-emacs). Ponuditi e vam se spremanje meuspremnika i izlaz iz Emacsa. Emacs moete i suspendirati (u Unix-su to znai zaustavljanje programa i stavljanje ga u pozadinu) koristei naredbu C-x C-z (koja je vezana za suspend-emacs). Kako ga ponovo pokrenuti ovisi o vaem shell-u, ali je vjerojatno temeljeno na fq naredbi.
241/1275
Ekran
Linija moda (The Mode Line)
Cijeli Emacs ekran je posveen tekstu vae datoteke, osim jedne linije blizu dna: to je linija moda. Ova linija slui za informiranje, nikada ne moete u nju ui. Gotovo uvijek je na neki nain oznaena. Ona ispisuje vane obavijesti (koje se mogu mijenjati) kao: Stanje meuspremnika. Da li je promijenjen, nije promijenjen ili je readonly. Ime datoteke koju ureujete. Glavni mod. Dio datoteke koju vidite na ekranu: All Top Bot Percentage Vidite cijelu datoteku Vidite vrh datoteke Vidite dno datoteke NN% pokazuje postotak datoteke iznad vrha prozora
udne poruke
S vremena na vrijeme Emacs e u minibuffer upisati neku svoju poruku koja, na prvi pogled nema veze sa onim to vi radite. Dvije najee poruke su: Mark set i Garbage collecting.... Prva poruka znai da je Emacs odredio cilj (set a mark) za vas ovisno o vaoj zadnjoj naredbi; automatsko odreivanje cilja je poeljna mogunost za neke naredbe. Druga
242/1275
poruka znai da Emacs-ova lisp maina preuzima spremanje (reclaming storage). Ovu poruku moete ignorirati i nastaviti tipkati. Emacs nee izgubiti vae znakove.
Pomo
Emacs ima veliki i opirni online help, koji je dostupan preko help tipke C-h. C-h je prefiks tipka. Pritisnite C-h dvaput i dobiti ete listu podnaredbi; uinite to tri puta i dobiti
243/1275
ete prozor koji opisuje sve te naredbe (SPC e skrolat taj prozor). Neke od najboljih help naredbi su: C-h a command-apropos. Trai kljunu rije i onda ispisuje sve naredbe sa tom Kljunom rijei u njenom dugom imenu. C-h k describe-key. Trai pritisak tipke i opisuje naredbu vezanu za tu tipku (ako postoji) C-h i info .Ulazi u Info hipertekst ita dokumentacije (Info hypertaxt documentation reader) C-h m describe-mode. Opisuje trenutni glavni mod i njegove key bindings. C-h p finder-by-keyword. Pokree interaktivni pretraiva Emacs paketa. C-h t help-with-tutorial. Pokree emacs tutorial.
Info
Emacs ima ugraeni hypertext documentation reader, Info. Da bi ga pokrenuli otipkajte C-h i ili M-x info RET. On sadri svoj vlastiti tutorial. Tutorial pretpostavlja da poznajte Emacs otprilike koliko je opisan u ovom dokumentu.
244/1275
Kae sa da Emacs ima beskrajan undo, jer moete izvriti undo nad dugakim nizom naredbi, za razliku od nekih drugih editora. Kaemo da Emacs ima redu jer moete promijeniti smjer dok izvravate undu i tako u stvari pozvati undo na undo. Jednom kada se nauite na ovu mogunost nasmijati ete se na svaki editor koji ju nema. Vrlo je vano da se to prije udomaite sa undo naredbom. Preporua se paljivo itanje undo dijela manuala i puno vjebe.
Completion
Emacs nudi vie mogunosti nadogradnje (completion. To znai da Emacs pokuava zavriti vaa parcijalno otipkana imena datoteka, imena naredbi, itd. DA bi pozvali completion pritisnite TAB.
245/1275
Citiranje znakova koji su vezani kao naredbe (Quoting characters That Are Bound As Commands)
Ponekada trebamo umetnuti controlni znak u datoteku. Ali kako da umetnemo ESC kada je koristimo kao prefiks naredbu? Odgovor jr: koristimo quoted-insert koji je vezan za C-q. C-q rdi kao prefiks naredba na nain da kada ju napiete ona eka jo jedan znak. Ali taj znak se ne izvri kao naredba ve se umee u meuspremnik. Dakle C-q ESC umee Escape.
246/1275
247/1275
Znakovi
C-f Forward-char. Mie naprijed (desno) preko znaka C-b Backward-char. Mie nazad (lijevo) preko znaka 6.2 Rijei M-f Foreward-word. Mie naprijed preko rijei. M-b Backward-word. Mie unazad preko rijei.
248/1275
Linije (vertikalno)
C-n next-line. Mie dolje do slijedee linije. C-p previous-line. Mie gore do prethodne linije. Kada se kree po linijama kursor pokuava ostati u istom stupcu, ali ako je nova linija prekratka, pozicionirati e se na kraj linije. Ovo je vrlo vano: Emacs ne umee razmake na kraj linija.
Linije (horizontalno)
C-a begining-of-line. Mie na poetak trenutno aktivne linije. C-e end-of-line. Mie na kraj trenutno aktivne linije. E kao end (kraj), a A kao poetak abecede.
Reenice
M-a backward-sentence. Mie na poetak trenutno aktivne reenice. M-e foreward-sentence. Mie na kraj trenutno aktivne reenice.
249/1275
Odlomci
M-{ backward-paragraf. Mie na poetak trenutno aktivnog odlomka. M-} foreward-paragraph. Mie na kraj trenutno aktivnog odlomka.
Stranice
C-x [ backward-page. Mie na poetak trenutno aktivne stranice. C-x ] foreward-page. Mie na kraj trenutno aktivne stranice. Stranice su u veini modova odvojene sa C-l.
Meuspremnici
M-< beggining-of-buffer. Mie na poetak meuspremnika M-> end-of-buffer. Mie na kraj meuspremnika.
250/1275
Funkcije
Budui da su funkcije tako vaan dio svakog programskog jezika, Emacs sadri naredbe za pomicanje kroz njih. Ove naredbe rade bez problema u veini modova. U Emacsu funkcije i procedure se nazivaju defun kao i u Lispu. C-M-a begining-of-defun. Mie na poetak trenutno aktivne defun. C-M-e end-of-defun. Mie na kraj trenutno aktivne defun.
251/1275
Znakovi
C-d delete-char. Brie znak desno od kursora. DEL delete-backward-char. Brie znak lijevo od kursora.
Rijei
M-d kill-word. Ubija sve do kraja rijei desno od kursora. M-DEL backward-kill-word. Ubija sve do poetka rijei lijevo od kursora.
252/1275
Linije (horizontalno)
C-k kill-line. Ubija do kraja trenutno aktivne linije ne ukljuujui newline znak. Dakle, ako elite ubiti cijelu liniju potrebna su dva C-k. C-u 0 C-k kill-line. Ubije do poetka trenutno aktivne linije, ne ukljuujui newline znak. Ako ste moda ste pomislili da C-u -1 C-k ubija liniju do poetka, imali ste pravo, ali ta naredba brie i newline znak ispred.
Reenice
M-k kill-sentence. Ubija do kraja trenutno aktivne reenice ukljuujui i sve newline znakove na koje naie. C-u -1 M-k kill-sentence. Ubija do poetka trenutno aktivne reenice ukljuujui i sve newline znakove na koje naie.
Odlomci
Naredbe forward-kill-paragraph i backward-kill-paragraph postoje, ali po defaultu nisu vezane za neke odreene tipke.
Stranice
Ne postoje naredbe za ubijanje stranica
253/1275
Meuspremnici
Naredba kill-buffer ne ubija sav tekst u meuspremniku, ve ubija cijelu strukturu podataka meuspremnika
Funkcije
Ne postoje naredbe za ubijanje funkcija (defun).
Vraanje (Yanking)
Jednom kada ste ubili neki tekst, kako ga vratiti? Zadnje ubijeni tekst moete vratiti (yank) sa C-y. Budui da Emacs ima samo jedan kill-ring, ubojstvo moete izvriti u jednom meuspremniku , a tekst vratiti (yank) u drugom. Da bi vratili prethodna ubojstva morate se pomicati po kill-ringu. Ponite sa C-y i onda koristite M-y da bi se pomakli na prethodno mjesto u kill-ringu zamjenom upravo vraenog teksta prethodnim ubojstvom. Svaki daljnji My mie as po kill-ringu, svaki put zamjenjujui vraeni (yanked) tekst. Kada doete do teksta koji vas interesira jednostavno stanite. Svaka druga naredba prekida kruenje po kill ringu i C-y vraa zadnje ubojstvo.
254/1275
255/1275
Zamjena
Najvanija naredba za zamjenu je query-replace (vezana za M-8). Ova naredba e od vas zatraiti tekst za zamjenu i tekst koji elite zamijeniti te e potom izvriti zamjenu unutar trenutno aktivnog meuspremnika. Naredba query-replace je interaktivna, nakon svakog pronalaska ponuditi e vam slijedee mogunosti: SPC DEL Izvri zamjenu Nemoj izvriti zamjenu
256/1275
RET ESC
. Izvri zamjenu i zaustavi query-replace ! izvri zamjenu i sve druge zamjenu u unutar meuspremnika bez daljnje interakcije Postoji jo podnaredbi, ali one zahtijevaju dodatno poznavanje Emacsa. Postoji jo naredbi za zamjenu koje bi trebali poblie upoznati: replace-string (jednostavna,neuvjetovana zamjena), replace-regexp i query-replace-regexp (kole rade sa regularnim izrazima) i tags-query-replace (zamjenjuje sve identifikatore u kolekciji source datoteka). Naredba query-replace, kao i sve ostale naredbe za zamjenu, po defaultu prepoznaje velike i male znakove. Na primjer, ako zamjenjujete foo sa bar i naletite na Foo, Emacs e Foo zamijeniti sa Bar.
257/1275
258/1275
Sada smo odredili regiju. to moemo sa njom uiniti? C-x C-x exchange-point-and-mark. Zamjenjuje point i mark. Brzo uzastopno izvravanje ove naredbe omoguuje vienje dokle regija dosee. C-w kill-region. Ubija regiju M-w kill-ring-save. Sprema regiju u kill-ring bez da je brie iz meuspremnika. C-x C-i indent-rigidly. Uvlai regiju za koliko god znakova odredimo u brojevnom argumentu (default je 1) . C-x C-l downcase-region. Pretvara sva slova u mala. Po defaultu ova naredba je onemoguena. C-x C-u upcase-region. . Pretvara sva slova u velika. Po defaultu ova naredba je onemoguena. Postoji jo mnogo drugih naredbi.
259/1275
UVLAENJE (INDENTATION)
U modovima za programske jezike, Emacs koristi TAB tipku za automatsko uvlaenje linije, sukladno sa pravilima za uvlaenje koja vrijede za dotini jezik. Na primjer u C modu Emacs prepoznaje if, while, switch, do, for, funkcije itd. , te uvlai tekst ovisno o potrebi. Dakako u veini jezika pravila za uvlaenje nisu striktno odreena, pa Emacs dozvoljava da ih svako odredi kako mu odgovara.
260/1275
MODOVI
Glavni nain na koji Emacs prilagouje naredbe svakoj vrsti teksta je kroz major i minor modes. Svaki meuspremnik ima major mod i nula, jedan ili nekoliko minor modova. Nekada Emacs izabire major mo automatski, obino na temelju ekstenzije datoteke. Naravno moete i eksplicitno odrediti mod.
261/1275
262/1275
Maja Mehinagi
LOGIN I ID
263/1275
UVOD
UNIX sistem je viekorisniki (multi-user) operativni sistem. To znai da vie od jedne osobe moe koristiti sistem u isto vrijeme. Sistem moe opsluivati vie od jednog korisnika isto kao to moe da izvrava vie procesa u isto vrijeme za jednog korisnika. Viekorisnika osobina omoguava da grupa korisnika radi zajedno, dijelei informacije i zajednike programe na sistemu. Ako se UNIX nalazi na osobnom raunalu, moe postojati samo jedan korisnik koji moe koristiti vieprocesnu (multi-tasking) osobinu i pokretati vie procesa istovremeno.
264/1275
naredbom passwd i tada je poznaje samo on. Super korisnik moe dodijeliti novu lozinku korisniku u sluaju da je korisnik zaboravio staru. Da bismo dobili dozvolu za pristup UNIX sistemu, moramo izvriti proces prijave na na sistem (signing on). Taj proces se najee zove ''logiranje'' (loggin in, loggin on). Pretpostavimo da je terminal direktno vezan (hard-wired) na UNIX sistem. Kod pojedinih sistema, kada je terminal udaljen, moramo preko telefonske centrale pozvati UNIX sistem i posredstvom modema dobiti pristup. Kada se pribliimo terminalu koji je vezan na UNIX sistem, na ekranu trebamo vidjeti poruku: Welcome to the UNIX System login: Da bismo se prijavili na UNIX utipkamo nae korisniko ime i pritisnemo <ENTER>. Primjeujete da dok piemo korisniko ime, ono to tipkamo je istog trena prikazano na ekranu. Kada utipkamo nae korisniko ime pod kojim nas UNIX raspoznaje sistem zahtjeva da unesemo i lozinku: Welcome to the UNIX System login: student password: maja za razliku od imena korisnika, prilikom unoenja lozinke na ekranu ne vidimo karaktere koje utipkavamo na tastaturi. To je uinjeno radi vee sigurnosti jer lozinka pomou koje dobivamo dozvolu za rad treba sluiti samo danom korisniku zbog moguih zloupotreba. Nakon uspjenog prijavljivanja na ekranu se pored ostalog i pojavljuje prompt-jedan ili vie karaktera koji nam kazuju da je UNIX spreman da primi i izvri naredbu. esto je prompt # za specijalne korisnike kao to je root,sysadm.... ili $ za obine korisnike. U sluaju da pogrijeimo prilikom unoenja imena korisnika ili lozinke, ponovno se pojavljuje poruka login:. Isto tako, ime i lozinka moraju se unijeti u odreenom vremenskom intervalu, najee 60 sekundi. Ako je taj terminal premaen, postupak se mora ponoviti
265/1275
ispoetka. To je sve napravljeno radi jo vee sigurnosti tj. da ne bi neovlatena osoba ula u UNIX sistem.
266/1275
login:student password:
login:studentica password
Slika 1
267/1275
Super korisnik
Na svakom UNIX sistemu pored obinih korisnika postoji odreeni broj korisnika koji ima specijalna ovlatenja. To je korisnik poznat pod imenom ''root'' ili super korisnik. Korisnik root moe pristupati svim file-ovima na sistemu kao i svim procesima, a moe ak i unititi cijeli sistem. Korisnik root ne poznaje zabrane i postoje naredbe koje moe izvravati samo on. To su na primjer podeavanje vremena na sistemu (date), podeavanje file sistema (mount) ili kreiranje specijalnih file-ova (mknod). Prvi nain postajanja super korisnika je da dovedemo sistem u stanje u kojem moe raditi samo jedan korisnik (single-user state). To se dogaa uvijek kao meufaza podizanja operativnog sistema (bootstrap). Tijekom boot-a inicijalni shell radi sa privilegijama super korisnika. U viekorisnikom reimu rada (multi-user state), moemo se prijaviti na sistem pod imenom root. Ako smo se prijavili kao obian korisnik, moemo se prijaviti kao root korisnik pomou naredbe: $ su Password:top_tajna # Takoer sa naredbom su (switch user) moemo da se prijavimo pod imenom bilo kojeg korisnika: $ su student Password:msjs $ Ako root izvrava naredbu su, tada se ne zahtjeva unoenje lozinke korisnika ije smo ime zadali kao argument.
268/1275
POLJE Ime korisnika Lozinka UID Ime pod kojim se korisnik prijavljuje na sistem
OPIS
ifrirana lozinka (crypted password). Ako stoji x tada se opis lozinke uva u file-u /etc/shadow Jedinstveni redni broj korisnika (User IDentiity) na UNIX sistemu.
269/1275
Super korisnik uvijek ima UID=0. Ostali korisnici imaju UID poevi od 101 ili 201 GID Redni broj glavne grupe (Group IDentitiy) kojoj pripada dani korisnik odgovara definiciji grupe u /etc/group Uporaba se razlikuje zavisno od verzije UNIX-a. BSD UNIX koristi GCOS polje to polje za smjetanje podataka o korisniku, koje dobijemo kasnije naredbom finger Home direktorij Direktorij gdje se nalazi korisnik poslije prijavljivanja na sistem. Naziva se i login direktorij Ime programa koji se koristi kao interpreter naredbi. Ako je izostavljeno podrazumijeva se standardni Bourne Shell (/bin/sh)
Inicijalni shell
Ime korisnika se obino zadaje malim slovima, duine do osam karaktera i ne smije zapoinjati brojem. Korisnici koji se prijavljuju na UNIX sistem mogu biti pojedinci ili drugi UNIX sistemi (uucp na primjer). ifrirana lozinka se kao rezultat jednosmjernog algoritma smjeta u drugo polje /etc/passwd file-a, ako se radi o tradicionalnom nainu. Poslije zadavanja teksta lozinke, prvih osam karaktera se kombinira sa kljuem od dva karaktera, nakon ega se dobiva ifrirana lozinka duine 13 karaktera. Svaki puta kad se korisnik prijavljuje na sistem, lozinku koju unese, ifrira se na isti nain i usporedi sa ifriranom lozinkom koja se uva u /etc/passwd file-u. Ako je dano polje prazno, tada korisnik prilikom prijavljivanja ne mora zadati lozinku.
student
maja
student
Slika 2
270/1275
Pojedini sistemi uvaju u /etc/passwd file-u pored lozinke i podatke o trajanju valjanosti lozinke i druge informacije. Ti podaci se sastoje od zareza '','' kao separatora i 4 karaktera. Dodaju se na kraj lozinke koristei sljedee oznake: ''.'' = ''0'' : ''/'' = ''1'' ; ''0-9'' = ''2-11'' ; ''A-Z'' = ''12-37'' ; ''a-z'' = ''36-63''. Prvi karakter nakon zareza predstavlja maksimalni broj tjedana valjanosti lozinke. Drugi karakter predstavlja minimalni broj tjedana izmeu dvije izmjene lozinke. Ako su oba karaktera nule (''..''), korisnik mora izmijeniti lozinku prilikom prvog sljedeeg prijavljivanja. Ako je drugi broj vei od prvoga, tada samo super korisnik moe izmijeniti danu lozinku. Ostala dva karaktera predstavljaju broj tjedana kada je lozinka posljednji put promijenjena, poevi od 1.sijenja 1970. godine. Inicijalni podaci o intervalima vremena ubacuju se runo pomou vi editora. Ako elimo privremeno zabraniti prijavljivanje nekom korisniku tj. da zakljuamo (lock) njegov raun, tada dodajemo ''LK'' ispred ifrirane lozinke u odgovarajuem polju. UID kod svih UNIX sistema u mrei koji koriste NFS treba biti isti. Kod sistema koji koriste NIS/NIS+ , taj problem je automatski rijeen. Korisnik nobody je vlasnik file-ova koje nije kreirao super korisnik, te im nitko ne moe pristupiti. Korisnik noaccess slui za prijavljivanje udaljenih korisnika ije je ime ''root''. GID se koristi za utvrivanje dozvola za pristup file-ovima koje se primjenjuju na danog korisnika. Kao to je poznato, svaki file ima tri vrste dozvola: za vlasnika, lanove grupe kojoj pripada vlasnik i ostale korisnike. GCOS polje na UNIX sistemu zadajemo u xxxx-Ime (yyyy) formatu i slui za smjetanje GCOS broja rauna (xxxx) i boksa (yyyy). Na BDS sistemu ovo polje zadajemo u formatu ''Ime Prezime, komentar''. Home direktorijima je mjesto u file sistemu gdje se login program postavlja prije startanja shell-a. U home direktorijima nalaze se svi inicijalizirani scriptovi. Informacija o home direktoriju nalazi se u shell promjenjivoj HOME, koju korisnik nakon prijavljivanja moe promijeniti. Inicijalni shell moe biti sh,csh,ksh,bash,tesh ili uucico (koristi se kod UUCP komunikacije).
271/1275
passwd x 7 n 10 korisnik
passwd f korisnik passwd x 1 korisnik passwd -w 14 korisnik passwd -1 korisnik passwd -u korisnik
272/1275
Nina ugaj
TELNET I SSH
273/1275
UVOD
Za pristupanje nekom udaljenom raunalu putem lokalne ili Internet mree, neovisno o mrei, potrebno je koristiti protokole, pomou kojih se moe uspostaviti veza s udaljenim raunalom. Telnet i SSH dva su takva protokola, koja omoguavaju spajanje i rad na nekom udaljenom raunalu. Telnet je servis (program, a ujedno i naziv protokola), koji omoguuje pristup nekom udaljenom raunalu emulacijom terminala, a SSH je
primaju kodirani, tj. sigurni od presretanja i itanja. kriptirani protokol to znai da su svi podaci koji se alju i
Iako imaju istu funkciju (remote pristup raunalima) i iako je SSH vrlo slian telnetu, zbog potencijalne ranjivosti telneta, SSH se pokazao daleko sigurniji, te se telnet polako povlai iz upotrebe. Takoer, u odnosu na FTP (File Transfer Protocol) ili tradicionalne BSD R-naredbe (Rcommands) - rlogin, rsh i rcp, SSH je sigurniji, a u njegove dvije implementacije SSH1 i SSH2, ispravljeni su neki propusti. Veina njih se svodi na manje bugove, no bilo je i nekoliko ozbiljnih sigurnosnih propusta. Najopasniji od dosad zloupotrebljavanih propusta omoguava udaljenom napadau koritenje raunala kao root. I protokol SSH1 se pri odreenim konfiguracijama pokazao potencijalno ranjivim na sesije koje se dekriptiraju tijekom transfera. Zato se savjetuje, kad god je to mogue, koritenje jaeg protokola SSH2, jer su neke slabosti SSH1 ispravljene u protokolu SSH2. Telnet i SSH rade na razliitom portu: telnet SSH 23 / tcp 22 / tcp
Neovisno o vrsti protokola, da bi se korisnik spojio na neko udaljeno raunalo mora na njemu imati otvoren korisniki raun (account).
Telnet i SSH servisi baziraju se, kao i veina mrenih servisa, na klijent-posluitelj modelu. Klijent uspostavlja vezu s posluiteljskim raunalom na kojem je pokrenut telnet odnosno SSH daemon (tipino telnet na portu 23, a SSH na portu 22), nakon ega slijedi razmjena podataka odnosno naredbi izmeu tih raunala.
274/1275
TELNET
Da bi mogli koristiti resurse raunala kojem pristupamo, na njemu treba imati otvoren korisniki raun. Nakon otvaranja veze s udaljenim posluiteljem pojavljuje se prozor koji zahtijeva od korisnika da se prijavi za rad i to unosom korisnikog imena (logina) i ifre (passworda). Nakon upisa istih korisnik moe izvoditi naredbe i operacije na udaljenom posluitelju. U sluaju pogreno upisanih podataka pojavljuje se obavijest o greki i mogunost ponovnog pokuaja. Ukoliko se ifra upie krivo vie od tri puta korisniki raun obino se automatski zakljuava iz sigurnosnih razloga.
275/1275
Premda neki sustavi pruaju mogunost prijave kao gosta, takva je mogunost rijetka zbog sigurnosnih razloga. Telnet korisnicima omoguuje i prijavljivanje na njihova vlastita raunala iz udaljenih lokacija, takoer unoenjem korisnikog imena i ifre. Na taj nain korisnici mogu provjeravati e-mail, ureivati datoteke i pokretati programe na svojim uobiajenim raunalima kao da su na njih prijavljeni lokalno. To se, meutim, moe uiniti u okruju koje se temelji na terminalima, jer se za to ne moe koristiti sustav X Windowsa. Telnet prua samo emulaciju terminala za uobiajene terminale poput DEC VT-100, koji ne podravaju grafika okruja poput X Windowsa. Znai da je veza koju telnet omoguuje ograniena na koritenje naredbenog suelja pri radu.
Tradicionalni mreni servisi kao to su telnet, ftp, rsh i dr., iako vrlo praktini i jednostavni za koritenje, ujedno sadre i jedan veliki nedostatak imaju implementiran vrlo nizak nivo sigurnosti, budui da se u vrijeme njihova nastanka nije previe panje obraalo na sigurnost raunalnih sustava. Komunikacija nije kriptirana, te su mogue zlouporabe od strane neovlatenih ili zlonamjernih korisnika. U dananje vrijeme kada sigurnosni aspekt predstavlja jedan od najvanijih elemenata svake raunalne mree taj problem svakodnevno dolazi sve vie do izraaja.
276/1275
Inherentne slabosti kod takvih mrenih servisa neovlatenim korisnicima omoguuju vrlo jednostavan dolazak do povjerljivih korisnikih informacija te prislukivanje kompletnih mrenih sesija izmeu klijentskog i posluiteljskog raunala. Takoer ne postoji nikakav mehanizam koji bi omoguio meusobnu autentikaciju (authentication) raunala, to neovlatenim korisnicima omoguuje lairanje mrenih sesija, te lano predstavljane pod imenom drugih raunala. Upravo gore navedeni elementi bili su podloga za nastanak SSH protokola i programa koji ga implementiraju, kako bi se na taj nain korisnicima omoguilo sigurno komuniciranje s udaljenim raunalima. Osnovna sintaksa za telnet je sljedea: telnet [hostname] => hostname je ime udaljenog raunala. Ako ime udaljenog raunala nije navedeno, telnet se pokree u svom interaktivnom nainu rada, a ako je ime udaljenog raunala navedeno, telnet odmah pokuava zapoeti sesiju. Telnet prihvaa nekoliko argumenata naredbenog retka: -d => ukljuuje otkrivanje greaka -a => pokuava automatsko prijavljivanje -n tracefile => ukljuuje praenje i podatke iz praenja sprema u datoteku pod tracefile -e escape_char => odreuje da znak za izlazak iz sesije bude escape_char -l user => korisniko ime user alje udaljenom sustavu za automatsko prijavljivanje. Ovaj argument automatski ukljuuje i argument -a. port => ukazuje na broj porta koji treba koristiti za spajanje na udaljeni sustav. Ovaj se argument koristi za odreivanje razliitih mrenih programa. Ako nije naveden, telnet se spaja na unaprijed zadani telnet port.
277/1275
Dakle, telnet sesiju korisnik pokree utipkavi telnet, nakon ega slijedi ime raunala na koje se eli spojiti. Telnet zatim vraa poruku Trying i neku IP adresu (gdje je neka IP adresa adresa raunala koje je navedeno). Ako se telnet uspjeno spoji na raunalo (to znai da je to raunalo ukljueno i da mrea nije iskljuena), Linux/Unix e izvijestiti Connected to ime raunala i zatim e rei da je znak za izlazak iz sesije neka odreena kombinacija tipki. Znak za izlazak odreuje i kombinaciju tipki koju treba utipkati za prelazak iz terminalske sesije u telnetov interpretator naredbi. Tamo korisnik prelazi ako naredbe eli izravno slati programu telnet, a ne u sesiju na udaljenom raunalu. Nakon to se telnet uspjeno spojio na udaljeni sustav bit e prikazana prijavna informacija i sustav e zatraiti unos korisnikog imena i ifre. Pod pretpostavkom da korisnik ima valjano korisniko ime i ifru, uspjeno e se prijaviti i tada moe interaktivno raditi na udaljenom sustavu. Na kraju rada svakako se treba odjaviti. Telnet zatim izvijesti da je udaljena sesija zatvorena i korisnik se vraa se u naredbeni redak lokalne ljuske. Primjer telnet sesije iz Linux raunala koje se spaja na Linux raunalo:
U navedenom primjeru Escape character is '^]'. Dakle, telnet dojavljuje da ulogu escape znaka ima Control+]. Pritiskom na tu kombinaciju tipki prelazi se u interaktivni rad s telnet programom, na to upuuje prompt: telnet>
278/1275
U interaktivnom radu telnet raspoznaje slijedee naredbe, iji se popis dobije navoenjem naredbe help: close => prekid trenutno spojene veze display => prikaz parametara mode => promjena naina rada: line-by-line (utipkani sadraj retka prvo se prikazuju na lokalnom raunalu, nakon ega se odjednom alje udaljenom raunalu) ili character-at-a-time (veina pritisnutih tipki alje se neposredno udaljenom raunalu) open hostname [port] => povezivanje s udaljenim raunalom. Inicijalno: port 23. quit => naputanje telneta send => prijenos posebnih znakova ( naredbom "send ?" dobije se detaljniji opis). set => postavljanje parametara ("set ?" za detaljniji opis). status => prikaz trenutnog statusa toggle => izmjena parametara ("toggle ?" za detaljniji opis). z => privremeni prelazak u novu ljusku (shell) na lokalnom raunalu ? => prikaz pomoi Povratak u Unix ljusku obavlja se pritiskom na tipku <Enter>. Za zavretak rada s telnetom i prekidanje veze s udaljenim raunalom dovoljno je napraviti odjavu rada (logout).
279/1275
SSH
SSH (Secure Shell = sigurna ljuska) je mreni servis koji korisnicima omoguuje uspostavu sigurnog komunikacijskog kanala izmeu dva raunala putem nesigurne raunalne mree. SSH servis svoj rad bazira na koritenju kombinacije simetrine i asimetrine kriptografije, te metoda enkripcije koje omoguuju sigurniji prijenos podataka raunalnom mreom. Trenutno postoje dvije verzije SSH protokola, SSH1 i SSH2. SSH2 je novija verzija, koja sadri odreena poboljanja u odnosu na stariju verziju. Originalna verzija SSH protokola razvijena je od strane Finske kompanije SSH Communications Security Corp , koja je na odreeni nain zatitila svoj proizvod, te samim time ograniila mogunosti njegovog koritenja. Kao rezultat toga nastala je open-source implementacija istog protokola pod imenom OpenSSH, koja se danas najee koristi, te e kao takva biti opisana u nastavku seminara.
280/1275
Slika: Simetrina kriptografija Odmah se primjeuje jedan veliki nedostatak ove grupe algoritama, a to je taj da se i poiljatelj i primatelj na neki nain moraju dogovoriti oko tajnog kljua koji e koristiti za komunikaciju. Proces dogovora oko tajnog kljua predstavlja poseban problem, budui da je
281/1275
razmjenu kljueva potrebno obaviti nesigurnim putem (mail, telefon ili sl.) to moe ugroziti privatnost kljua. Prednost algoritama ove skupine je ta da su iznimno brzi to je glavni razlog njihove uestale primjene. Najpoznatiji predstavnici ove grupe algoritama su DES (Data Encryption Standard), IDEA, 3DES, Blowfish i dr. Asimetrini algoritmi svoj rad baziraju na koritenju dva kljua umjesto jednoga. Svaki korisnik u tom sluaju posjeduje svoj tajni i javni klju. Kljuevi su meusobno kompatibilni na taj nain da se poruka kriptirana jednim kljuem moe dekriptirati samo drugim kljuem istog korisnika. Tajni klju je strogo povjerljiv i poznat je samo njegovom vlasniku, dok se javni klju slobodno distribuira svim korisnicima s kojima se eli komunicirati ovim putem. Postupak razmjene podataka u tom sluaju je sljedei: poiljatelj poruku kriptira javnim kljuem primatelja poruke koji je svima poznat i dostupan primatelj poruku dekriptira svojim tajnim kljuem koji je poznat jedino njemu
Slika: Asimetrina kriptografija Na taj nain svatko svakome moe poslati enkripcijom zatienu poruku pod uvjetom da je poznat javni klju primatelja poruke i time je omoguena sigurna i jednostavna razmjena podataka izmeu dva korisnika.
282/1275
Takoer, uklonjen je i problem razmjene kljueva koji se javljao kod simetrine kriptografije. Najpoznatiji predstavnik ove skupine algoritama je RSA algoritam koji se ujedno koristi i kod SSH protokola. Nedostatak ove metode su neto vei zahtjevi na procesorsku snagu raunala, odnosno neto due trajanje postupka enkripcije podataka. Moderne metode enkripcije za svoj rad koriste kombinaciju simetrine i asimetrine kriptografije. Algoritmi asimetrine kriptografije koriste se na poetku sesije za sigurno dogovaranje tajnog kljua koji e se kasnije koristiti za kriptiranje samih podataka koritenjem nekog od simetrinih algoritama. Na taj nain postiu se optimalne performanse algoritma budui da su iskoritene prednosti obje metode: sigurnost i brzina. Upravo ovakav koncept iskoriten je i kod SSH protokola gdje se razmjena i dogovor oko tajnog kljua sesije obavlja asimetrinim RSA algoritmom, da bi se u sljedeoj fazi tako dogovoreni klju koristio za simetrinu enkripciju podataka koji se razmjenjuju izmeu udaljenih raunala.
283/1275
SSH PROTOKOL
Osnovne karakteristike SSH protokola su: smanjene mogunosti provoenja DNS i IP spoofing napada, u kojima neovlateni korisnik pokuava ostvariti neautorizirani pristup raunalnim resursima udaljenog sustava lairanjem IP adresa i DNS imena raunala implementirane metode autentikacije raunala bazirane na RSA algoritmu simetrine kriptografije mogunost preusmjeravanja proizvoljnih TCP/IP portova preko sigurnog SSH komunikacijskog kanala (POP, FTP i dr.) prije bilo kakve razmjene podataka izmeu dva raunala provodi se kompletan postupak meusobne autentikacije klijenta i posluitelja, ime se bitno smanjuje mogunost provoenja bilo kakvog napada na SSH servis jednostavna upotreba programa koji implementiraju SSH protokol Uspostava veze izmeu dva raunala SSH protokolom moe se podijeliti u nekoliko faza: U prvoj fazi klijent i posluitelj razmjenjuju podatke o inaici protokola koji e se koristiti, obavlja se identifikacija koritenih SSH programskih paketa, provjerava se ispravnost veze i sl. U ovoj fazi enkripcija podataka jo se ne koristi. U sljedeoj fazi klijent i posluitelj dogovaraju se o tajnom kljuu i algoritmu koji e se koristiti u daljnjim fazama komunikacije. Nakon ove faze dogovoren je klju sesije i protokol koji e se koristiti za kriptiranje podataka. Svi podaci razmijenjeni izmeu klijenta i posluitelja nakon ove faze biti e kriptirani na dogovoreni nain. Slijedi trea faza u kojoj se klijent autenticira kod posluitelja kako bi se na taj nain utvrdio identitet klijenta odnosno provjerile ovlasti pristupa za tog klijenta. Ukoliko je sve prolo u redu prihvaa se sesija izmeu klijenta i posluitelja nakon ega je mogua sigurna razmjena podataka. SSH podrava nekoliko naina autentikacije korisnika od kojih je najsigurnija ona koja koristi RSA algoritam. Postoje metode bazirane na .rhost i host.equiv datotekama koje su
284/1275
naslijeene od rsh i njemu slinih servisa, no iz sigurnosnih razloga ne preporuuje se koritenje ovih metoda. Najjednostavnija i vrlo esto koritena metoda autentikacije je ona koja se bazira na ifri korisnika. Pristup je identian kao i kod veine drugih mrenih servisa s osnovnom razlikom to se ovdje korisniki podatci (korisniko ime i ifra) alju mreom kriptirani. U nastavku e biti opisani osnovni postupci koje je potrebno obaviti kako bi se omoguilo koritenje SSH servisa.
285/1275
286/1275
Na ovaj nain SSH neovlatenom korisniku onemoguuje pregledavanje postojeih korisnikih rauna na udaljenom raunalu, budui da se ne primijeti razlika izmeu pokuaja spajanja na SSH posluitelj s regularnim i neregularnim korisnikim imenom. Ovakav pristup je sasvim poeljan sa stanovita sigurnosti, budui da se ne eli neovlatenom korisniku omoguiti dolazak do liste postojeih korisnika na udaljenom raunalu. U ovom sluaju kompletan se proces autentikacije korisnika bazira iskljuivo na njegovoj ifri, te se na ovaj nain moe spojiti svatko tko zna odgovarajue korisniko ime i ifru bilo kojeg korisnika sustava. Ukoliko korisnika ifra na bilo koji nain bude kompromitirana SSH autentikacija ovim putem gubi smisao. Zato se drugi nain spajanja na SSH posluitelj bazira na RSA autentikaciji, odnosno na koritenju javnog i tajnog kljua korisnika. Kod ovog pristupa klijent posluitelju u prvoj fazi postupka autentikacije alje poruku koja izmeu ostalih informacija sadri i podatak o njegovom javnom kljuu koji eli koristiti za autentikaciju. Posluitelj u svojoj internoj bazi provjerava da li ima podatak o istom korisniku, te ukoliko ima vraa korisniku znakovni niz (chalenge) koji je kriptiran javnim kljuem tog korisnika. Nakon toga klijent mora dekriptirati primljenu vrijednost te vratiti odgovor posluitelju, koji e potvrditi uspjenu dekripciju primljene vrijednosti. Budui da je dekripciju mogue obaviti jedino pomou tajnog kljua istog korisnika, posluitelj prihvaa sesiju i autenticira korisnika. U ovom sluaju posluitelj nikada ne trai ifru korisnika budui da je kompletni proces autentikacije obavljen na temelju javnog i tajnog kljua korisnika. Da bi se omoguio ovakav proces autentikacije klijent prvo mora generirati svoj par tajni/javni klju, te nakon toga kopiju javnog kljua pohraniti na posluitelju. U svrhu generiranja parova javni/tajni klju korisnika koristi se ssh-keygen program koji dolazi u paketu s openssh programom. Zadavanje naredbe # ssh-keygen rezultirati e kreiranjem javnog i tajnog kljua korisnika pod ijim je ovlastima zadana gore navedena naredba.
287/1275
Prilikom postupka generiranja kljueva korisnik e biti upitan da unese tzv. passphrase niz koji prua dodatni nivo zatite kod koritenja SSH servisa i koji se moe jednostavno shvatiti kao ifra za korisnikov par kljueva. Iako nije obavezno definiranje ovog niza (mogue je ostaviti prazan niz, tj. samo pritisnuti <Enter>), korisnicima se iz sigurnosnih razloga preporuuje koritenje istoga. Trenutno postoje dvije verzije SSH protokola, SSH1 i SSH2. Zbog toga je mogue sshkeygen programu proslijediti -t parametar kojim se definira za koji algoritam se eli stvoriti par kljueva: ssh-keygen -t rsa1 => koristi se za SSH1 verziju protokola ssh-keygen -t dsa i ssh-keygen -t rsa => koriste se za SSH2 verziju protokola Budui da datoteke koje sadre kljueve korisnika sadre razliita imena, za svaki od algoritama mogue je generirati zaseban par kljueva. Na taj nain omoguuje se spajanje na razliite SSH posluitelje odnosno izbjegavanje eventualnih problema s kompatibilnou software-a izmeu klijenta i posluitelja. Kljuevi generirani bilo kojom od navedenih opcija nalaze se u $HOME/.ssh direktoriju korisnika, gdje se uvijek za svaki algoritam stvaraju dvije datoteke od kojih jedna sadri javni klju, a druga tajni klju korisnika. Imena su im identina s jedinom razlikom to javni klju sadri ekstenziju .pub. Primjeri: id_rsa => datoteka koja sadri tajni klju korisnika za SSH2 verziju protokola koja koristi RSA algoritam za enkripciju id_rsa.pub => datoteka koja sadri javni klju korisnika za SSH2 verziju protokola koja koristi RSA algoritam za enkripciju
288/1275
id_dsa => datoteka koja sadri tajni klju korisnika za SSH2 verziju protokola koja koristi DSA algoritam za enkripciju id_dsa.pub => datoteka koja sadri javni klju korisnika za SSH2 verziju protokola koja koristi DSA algoritam za enkripciju identity => datoteka koja sadri tajni klju korisnika za SSH1 verziju protokola koja koristi RSA algoritam za enkripciju identity.pub => datoteka koja sadri javni klju korisnika za SSH2 verziju protokola koja koristi RSA algoritam za enkripciju Nakon generiranja odgovarajuih kljueva posebnu panju treba posvetiti ovlastima koje su pridijeljene pojedinim datotekama. Sve datoteke koje ne sadre nastavak .pub sadre tajni klju korisnika, te kao takve ne smiju biti dostupne nikome osim samome korisniku ( rw------- ovlasti). Nepaljivo pridjeljivane ovlasti datotekama koje sadre tajni klju korisnika mogu ozbiljno ugroziti sigurnost SSH sustava. Kao to je ve spomenuto, nakon generiranja vlastitog para tajni/javni klju, kopiju javnog kljua klijent mora pohraniti na posluitelju na kojeg se eli spajati. Ukoliko se koristi SSH1 verzija protokola potrebno je identity.pub javni klju kopirati u $HOME/.ssh/authorized_keys datoteku na udaljenom raunalu, a ukoliko se koristi SSH2 verzija protokola to potrebno je je kopirati klju id_rsa.pub ili id_dsa.pub u ili $HOME/.ssh/authorized_keys2 datoteku udaljenog raunala. Nakon stvorena odgovarajua $HOME/.ssh/authorized_keys $HOME/.ssh/authorized_keys2 datoteka potrebno je ispravno postaviti ovlasti tih datoteka kako bi se veza mogla uspjeno uspostaviti. Potrebno je zadati naredbu: # chmod 644 .ssh/authorized_keys .ssh/authorized_keys2 to e rezultirati -rw-r--r-- ovlastima, koje svim korisnicima sustava dozvoljavaju itanje ovih datoteka.
289/1275
Ukoliko je sve dobro podeeno potrebno je jo samo pokrenuti proces spajanja SSH protokolom na udaljeno raunalo: # ssh <ime_raunala> nakon ega je korisnik automatski prijavljen u sustav ukoliko je sve prolo u redu za vrijeme postupka autentikacije korisnika. Ukoliko je korisnik definirao passphrase niz prilikom generiranja para tajni/javni klju, biti e potrebno unijeti taj niz ukoliko se eli uspostaviti veza s udaljenim raunalom. Na ovaj nain dodatno je zatien korisnikov par kljueva, budui da je osim poznavanja tajnog kljua u ovom sluaju potrebno i poznavati passphrase niz definiran prilikom postupka generiranja kljueva ime se dodatno podie sigurnosni nivo SSH sustava. U $HOME/.ssh direktoriju korisnika koji koristi SSH servis postoji i datoteka pod imenom known_hosts. Ona sadri listu svih raunala s kojima je klijentski dio SSH aplikacije ikada komunicirao, zajedno s njihovim identifikacijskim oznakama (ssh_host_key), to omoguuje dodatnu identifikaciju udaljenog raunala s kojim se eli uspostaviti sesija. Ssh_host_key je klju koji sadri svako raunalo s instaliranim SSH servisom i generira se prilikom instalacije programskog paketa. Koristi se u svrhu meusobne identifikacije raunala koja meusobno komuniciraju SSH protokolom. Prilikom prvog spajanja na udaljeni SSH posluitelj aplikacija e javiti da ne poznaje udaljeno raunalo te e korisnika traiti potvrdu za nastavak uspostave veze. Ukoliko korisnik odgovori potvrdno uspostavit e se veza s udaljenim raunalom, nakon ega e to raunalo biti zapisano u known_hosts datoteku zajedno s njegovim ssh_host_key.pub kljuem primljenim od strane udaljenog raunala. Svaki naknadni pokuaj spajanja na isto raunalo nee prijavljivati tu poruku budui da je raunalo zabiljeeno u spomenutu datoteku zajedno sa svojom identifikacijom. Ovakav pristup smanjuje mogunost provoenja raznih napada na SSH servis, budui da e pokuaj spajanja na raunalo iji ssh_host_key ne odgovara kljuu koji je pohranjen u known_hosts datoteku za to raunalo, rezultirati neuspjehom. SSH klijent moe se pokrenuti s odgovarajuim parametrima ime se moe preciznije utjecati na nain njegovog rada. Ove opcije potrebno je koristiti ukoliko se ele iskoristiti naprednije mogunosti SSH servisa.
290/1275
Neke od opcija koje je mogue proslijediti SSH programu u obliku argumenata su: -c => definira se simetrini algoritam koji e se koristiti za enkripciju podataka. Mogue vrijednosti ovog parametra su: des, blowfish i 3des. Inicijalna vrijednost je 3des, budui da se isti smatra optimalnim. Blowfish je neto manje sigurniji od 3des algoritma ali je zato znatno bri, dok je des algoritam ovdje mogue navesti iskljuivo iz razloga kompatibilnosti sa SSH1 verzijom protokola, a iz sigurnosnih razloga ne preporuuje se njegovo koritenje. -f => zahtjeva se od ssh klijenta da radi kao pozadinski proces. Ova se opcija vrlo esto koristi u sluajevima kada se eli uspostaviti sigurni SSH kanal izmeu dva raunala, koji e se kasnije iskoristiti za tuneliranje drugih TCP protokola. -g => dozvoljava se udaljenim raunalima spajanje na lokalno preusmjereni port. Ova opcija takoer je vezana za mogunost koritenja preusmjeravanja portova. -l => definira se korisniko ime (-l kao login) korisnika, pod kojim se eli spojiti na udaljeno raunalo. -p => definira se port udaljenog raunala na koji e se klijent aplikacija spajati. Inicijalno je to port 22. -x i -X => onemoguuje se ili omoguuje preusmjeravanje X11 sesija peko sigurnog SSH kanala. -C => omoguuje se kompresija podataka koji se prenose SSH kanalom, a nivo kompresije moe se definirati CompressionLevel parametrom u konfiguracijskoj datoteci klijent programa. -v
291/1275
=> omoguuje se tzv. verbose mod rada u kojem program ispisuje detaljne poruke vezane za svoj rad. Ova opcija koristi se u sluaju otklanjanja greaka kod SSH servisa. -F => definira se konfiguracijska datoteka SSH klijent aplikacije. Ova opcija definira se u sluaju kada se ne eli koristiti inicijalna config datoteka klijenta. -L port:host:hostport => definira se port port koji e se na lokalnom raunalu preusmjeravati putem SSH kanala na port hostport udaljenog raunala host. Ova opcija koristi se u svrhu preusmjeravanja proizvoljnih TCP portova preko SSH sigurnog kanala. -R port:host:hostport => definira se port port na udaljenom SSH posluitelju koji e biti preusmjeren na port hostport lokalnog raunala host. Opcija koja se takoer koristi za preusmjeravanje portova preko sigurnog SSH kanala. -1 => forsira se koritenje SSH1 verzije protokola. -2 => forsira se koritenje SSH2 verzije protokola.
292/1275
Konfiguracijski parametri mogu se definirati za svako raunalo na koje se eli spajati tako da se navede kljuna rije Host koja definira na koja se sva raunala parametri odnose. Navedeni parametri vrijede sve do sljedee kljune rijei Host nakon koje se navede parametri za sljedeu vezu. Na taj nain mogue je definirati razliite parametre sesije za spajanje na razliita udaljena raunala. Ovo moe biti vrlo korisna opcija, pogotovo ukoliko korisnik posjeduje korisnike raune na vie razliitih SSH posluitelja.
293/1275
konfiguracijskoj datoteci. Pokretanje SSH posluitelja potrebno je omoguiti prilikom svakog podizanja sustava, to je mogue postii dodavanjem odgovarajuih start skripti u /etc/rc direktorij. Neki od brojnih konfiguracijskih parametara s kojima je mogue pokretati program su: -b => definira se veliina kljua kojeg posluitelj generira prilikom instalacije. Inicijalno je to 768 bitova. -d => pokretanje moda za otklanjanje greaka. Ukoliko se zada ova opcija sustav e u log datoteke biljeiti sve akcije vezane za rad posluitelja, a ujedno e se i u konzoli generirati odgovarajue poruke to olakava otklanjanje greaka. -f => ukoliko se ne eli koristiti inicijalna /etc/ssh/ssh_config datoteka definira se konfiguracijska datoteka iz koje se ita konfiguracija. -g => definira se vrijeme koje se klijentu dozvoljava za izvravanje postupka autentikacije. Ukoliko se klijent ne autenticira za to vrijeme posluitelj prekida sesiju s klijentom. Inicijalna vrijednost ovog parametra je 600 sekundi. -h => definira se datoteka iz koje se ita javni klju posluitelja. Ovaj parametar potrebno je definirati u sluajevima kada se sshd program pokree pod ovlastima drugog korisnika budui da isti nema ovlasti pristupa ssh_host_key datoteci koja inicijalno sadri ovu vrijednost. U tom sluaju korisnik definira vlastitu datoteku kojoj ima pristup, te je nakon toga navede kao parametar sshd posluitelju.
294/1275
-i => ovaj parametar definira se u sluajevima kada se sshd program pokree putem inetd posluitelja. U principu se ovakav pristup ne preporuuje, budui da se na taj nain neto usporavaju performanse sustava. -p => definira se mreni port na kojem posluitelj oslukuje zahtjeve klijenta. Na ovaj nain mogue je ssh daemon programu zadati bilo koji port koji e se koristiti za uspostavu mrenih sesija. Inicijalno je to port 22.
295/1275
Chipers => definiraju se grupe algoritama koje se mogu koristiti za kriptiranje podataka. Mogue je definirati sljedee algoritme: aes128-cbc, 3des-cbc, blowfishcbc, cast128-cbc i arcfour. Mogue je definirati vie algoritama pri emu se isti u tom sluaju odvajaju zarezom. CheckMail => definira se da li sshd posluitelj mora provjeravati mail korisnika prilikom njegovog spajanja. Inicijalna vrijednost ovog parametra je "no". Deny Groups i Deny Users => parametri kojima se na slian nain kao i kod AllowGroups i AllowUsers omoguuje zabrana pristupa SSH servisu. Koritenjem ovih parametara mogue je vrlo precizno definirati kojim korisnicima je omogueno koritenje SSH servisa. IgnoreRhosts => onemoguuje se autentikacija korisnika na temelju .rhosts i hosts.equiv datoteka. Inicijalna vrijednost ovog parametra je "yes", budui da se ovaj nain autentikacije smatra manje sigurnim. IgnoreUserKnownHosts => definira se da li sshd posluitelj uzima u obzir known_hosts datoteku prilikom procesa autentikacije korisnika. Inicijalna vrijednost ovog parametra je "yes". PaswordAuthentication => definira se da li je korisniku dozvoljeno prijavljivanje na sustave na temelju korisnike ifre. Inicijalna vrijednost ovog parametra je "yes". PermitRootLogin => definira se da li je dozvoljeno prijavljivanje pod korisnikim raunom administratora sustava. Inicijalna vrijednost ovog parametra je "yes". Mogue je definirati sljedee vrijednosti ovog atributa: yes, no, forced-commands-only (omoguuje prijavljivanje administratora na temelju njegovog para tajni/javni klju) i without-password (bez korisnike ifre). Port => definira se mreni port na kojem sshd posluitelj oslukuje zahtjeve. Inicijalno je to port 22.
296/1275
Protocol => definira se verzija protokola koju koristi sshd program posluitelj. Mogue vrijednosti ovog atributa su 1 i 2. PubkeyAuthentication => definira se da li je dozvoljena autentikacija korisnika na temelju para javni/tajni klju. Inicijalna vrijednost ovog parametra je "yes". ReverseMappingCheck => vrlo korisna opcija sa stanovita sigurnosti, kojom se od sshd posluitelja zahtjeva da provjeri IP adresu i ime raunala s kojeg zahtjev dolazi. Na ovaj nain prua se dodatna zatita od IP i DNS spoofing napada u kojima neovlateni korisnik laira IP adresu ili ime raunala s kojeg konekcija dolazi, kako bi na taj nain ostvario neautorizirani pristup resursima drugog sustava. RhostsAuthentication => definira se da li je mogua autentikacija samo na temelju .rhosts ili hosts.equiv datoteka. U normalnim okolnostima ne preporuuje se koritenje ove metode budui da se smatra manje sigurnom. Iz sigurnosnih razloga inicijalna vrijednost ovog parametra je "no". RhostsRSAAuthentication => definira se da li je dozvoljena autentikacija korisnika na temelju .rhosts ili hosts.equiv datoteka u kombinaciji s RSA autentikacijom. Ova metoda neto je sigurnija u odnosu na prethodno navedenu, ali je takoer iz sigurnosnih razloga vrijednost ovog parametra postavljena na vrijednost "no". RSAAuthentication => definira se da li je dozvoljena autentikacija korisnika na temelju RSA algoritma, odnosno na temelju para javni/tajni klju korisnika. Inicijalna vrijednost ovog parametra je "yes", budui da se ovaj mehanizam autentikacije smatra prilino sigurnim. Subsystem => definira se dodatni vanjski podsustav (npr. sftp podsustav za prijenos datoteka). U tu svrhu potrebno je navesti ime podsustava koji se eli koristiti. Inicijalno ovdje nije naveden niti jedan podsustav.
297/1275
X11Forwarding => omoguuje se preusmjeravanje X11 protokola putem sigurnog SSH kanala. Inicijalno je ova mogunost iskljuena. Pomou ovih parametara mogue je vrlo precizno definirati ponaanje SSH daemon programa.
Authorized_keys datoteke
Kako je ve ranije spomenuto authorized_keys datoteka sadri popis javnih RSA kljueva svih korisnika koji se SSH protokolom ele spajati na SSH posluitelj pomou svog para tajni/javni klju. Kod SSH1 verzije protokola ta datoteka nosi ime authorized_keys, dok kod SSH2 verzije ta ista datoteka nosi ime authorized_keys2. Na istom sustavu mogue je koristiti obje datoteke ukoliko se eli da posluitelj jednako podrava SS1 i SSH2 verzije protokola. Svaki redak ove datoteke sadri jedan javni klju (RSA ili DSA, ovisno o koritenom algoritmu enkripcije) korisnika. Znak # kao i veini drugih sluajeva predstavlja poetak komentara te se kao takav ignorira. Za datoteku $HOME/.ssh/authorized_keys osim to je na raspolaganju korisniku u ijem se home direktoriju nalazi, takoer se preporuuje da bude dostupna administratoru sustava. U nju e korisnici kopirati svoj javni klju za SSH1 verziju protokola, ili preciznije reeno identity.pub datoteku. U datoteku $HOME/.ssh/authorized_keys2 korisnici kopiraju kljueve vezane za SSH2 verziju protokola, odnosno id_rsa.pub i id_dsa.pub datoteke. /etc/ssh_host_key, /etc/ssh_host_dsa_key, /etc/ssh_host_rsa_key datoteke Navedene datoteke sadre privatne kljueve tog raunala. Slino kao to i svaki korisnik posjeduje svoj par javni/tajni klju, tako i svako raunalo koje koristi SSH servis ima svoj zasebni par kljueva. Ove datoteke iz tog razloga moraju imati ovlasti koje samo
298/1275
administratoru sustava omoguuju njihovo pregledavanje i mijenjanje. Sshd program se iz sigurnosnih razloga nee htjeti pokrenuti ukoliko su ovlasti ovih datoteka krivo postavljene. /etc/ssh_host_key.pub, datoteke Navedene datoteke sadre javne kljueve raunala na kojem se nalaze. Za razliku od tajnog kljua opisanog u prethodnoj stavci ova datoteka moe biti dostupna ostalim korisnicima. Njezin sadraj se takoer generira koritenjem ssh-keygen naredbe. etc/ssh_known_hosts i $HOME/.ssh/known_hosts datoteke Ove datoteke koriste se u sluajevima kada se proces autentikacije provodi na temelju .rhosts datoteke u kombinaciji sa RSA postupkom. Javni klju raunala koje se ele spojiti se mora nalaziti u ovoj datoteci ukoliko se eli uspjeno uspostaviti veza sa SSH posluiteljem. Iste datoteke klijent SSH aplikacija koristi kako bi provjerila identitet udaljenog raunala na koje se pokuava spojiti. Ukoliko se u ovome koraku primijete bilo kakve neregularnosti sesija se prekida. /etc/hosts.allow i /etc/hosts.deny datoteke Datoteke kojima se moe tono kontrolirati dozvola pristupa pojedinim servisima instaliranim na istom raunalu. Datoteke se koriste u kombinaciji sa tcp_wraper programskim paketom u svrhu poveane kontrole pristupa pojedinim TCP mrenim servisima. $HOME/.rhosts datoteka Ova datoteka sadri razmakom odvojene vrijednosti korisniko ime - ime raunala, i svi tako navedeni korisnici sa navedenog raunala mogu se spojiti na to raunalo bez navoenja korisnike ifre. Koritenje .rhosts datoteke naslijeeno je od starijih mrenih servisa kao to su rsh, i rlogin koji se danas vie ne koriste. Iz navedenog odmah se moe zakljuiti zato se korisnicima nikako ne preporuuje koritenje ovakvog mehanizma autentikacije, budui da je /etc/ssh_host_dsa_key.pub, /etc/ssh_host_rsa_key.pub
299/1275
isti prilino nesiguran. Ukoliko se eli omoguiti ovakav nain autentikacije, to je potrebno eksplicitno navesti u konfiguracijskoj datoteci sshd posluitelja. $HOME/.shosts datoteka Shosts datoteka je posebno odreena datoteka koja obavlja ulogu .rhosts datoteke, s jedinom razlikom da se koristi iskljuivo za ssh servis. /etc/hosts.equiv datoteka U ovoj datoteci navedena su imena raunala koja se mogu spojiti na dotino raunalo bez odgovarajue korisnike ifre, pod pretpostavkom da korisnik ima isto korisniko ime na oba raunala. Slino kao i kod .rhost datoteke korisnicima se iz sigurnosnih razloga ne preporuuje koritenje ove datoteke u svrhu autentikacije udaljenih korisnika. /etc/shosts.equiv Isto kao i /etc/hosts.equiv, samo to datoteka vrijedi iskljuivo za SSH servis.
300/1275
Slika: Tuneliranje protokola Princip je sljedei: SSH klijentu potrebno je rei koji se port na lokalnom raunalu eli tunelirati kroz sigurni SSH kanal, i na koji port udaljenog raunala se taj promet eli preusmjeriti. U tu svrhu koristi se ve prije spomenuta -L opcija ssh klijenta. Nakon toga kompletni promet lokalnog raunala koji se alje na u prethodnoj fazi definirani port biti e putem sigurnog SSH kanala preusmjeren na sshd posluitelj navedenog udaljenog raunala. Sshd posluitelj prima kriptirani promet na SSH portu 22 i prosljeuje ga servisu na port koji je u prvom koraku definiran kod ssh klijenta. Servis vraa odgovor na primljeni zahtjev, te ga prosljeuje sshd posluitelju, koji ga putem SSH kanala vraa klijentskom dijelu aplikacije.
301/1275
SSH klijent prima odgovor i prosljeuje ga servisu koji je inicirao sesiju. Openita sintaksa naredbe kojom se omoguuje tuneliranje, tj. preusmjeravanje protokola je: # ssh -f -L [local port]:[full name of remote host]:[remote port] [some command] Parametar -f nije obavezan, ali ga je poeljno navesti kako bi kreirani ssh tunel radio kao pozadinski proces. Na taj nain nakon uspostave SSH tunela omoguuje se oslobaanje konzole, te je mogue zadavanje drugih naredbi. Ukoliko se ne proslijedi parametar -f nakon uspostave SSH kanala korisnik e morati prei u drugu konzolu ukoliko eli izvravati naredbe na lokalnom raunalu. Parametar -L slui za definiranje parametara postupka tuneliranja, odnosno za definiranje portova koji e biti preusmjereni. Prilikom proizvoljnog odabira porta preporuuje se uzimanje nekog visokog porta koji nije koriten od strane nekih drugih aplikacija, tj. uzimanje nezauzetog porta. Lista portova koji su zauzeti od strane drugih programa moe se nai u datoteci /etc/services. Ukoliko se ssh klijent eli pokretati kao pozadinski proces (parametar -f) neophodno je na kraju naredbe zadati naredbu koju e posluitelj izvriti nakon prihvaanja sesije, npr. naredbu sleep koja ujedno korisniku daje dovoljno vremena da se klijent aplikacijom servisa koji se tunelira (telnet, FTP) spoji na udaljeno raunalo. Naredba sleep kao argument prima broj sekundi koji e udaljeni proces biti spreman prihvatiti zahtjev klijenta. Tuneliranje telnet servisa teoretski nema previe smisla, budui da je SSH sam po sebi sigurna zamjena za telnet servis. Mogue je bilo koji TCP protokol tunelirati kroz SSH kanal (POP, POP3, IMAP, FTP i sl.). Protokoli koji su najvei kandidati za SSH preusmjeravanje su oni koji ne implementiraju nikakve mehanizme zatite podataka. Tuneliranje FTP protokola (FTP slino kao i telnet servis podatke mreom alje u istom tekstualnom obliku) na nain kako je to gore opisano neto je kompleksnije u odnosu na ostale protokole kao to su telnet, POP, NNTP i dr. Razlog je taj to FTP konekcija koristi dva porta za komunikaciju, jedan kontrolni i jedan podatkovni, a stvar se dodatno komplicira budui da postoje dva moda rada FTP protokola aktivni i pasivni. Sftp je program koji dolazi u paketu s openssh programskim paketom, a omoguuje sigurnije koritenje FTP protokola pomou SSH protokola. Koritenje sftp programa preporuuje se svim korisnicima kao sigurnija zamjena za tradicionalni FTP servis, a koritenje programa je vrlo jednostavno, budui da su sve naredbe naslijeene od obinog FTP protokola.
302/1275
SCP
S openssh programskim paketom dolazi i scp program. Scp (Secure Copy) program omoguuje sigurno kopiranje datoteka izmeu lokalnog i udaljenog raunala. Sigurno kopiranje datoteka bazira se na koritenju SSH protokola, odnosno kriptiranju podataka koji se prenose raunalnom mreom. Osim sigurnosti koju nude, dodatna prednost sftp i scp programa je ta to ne zahtijevaju instalaciju dodatnih programa posluitelja na udaljenom raunalu. Razlog tomu je taj to oba programa svoj rad baziraju na SSH protokolu, te kao takvi koriste sshd posluitelj. Koritenje scp naredbe vrlo je slino koritenju klasine cp Linux/Unix naredbe s jedinom razlikom to se kopiranje odvija izmeu udaljenih raunala. Primjeri: # scp local_dir/filename myname@host:remote_dir => Gore navedena naredba rezultirati e kopiranjem datoteke filename unutar lokalnog direktorija local_dir u direktorij remote_dir na udaljenom raunalu host. Myname parametar definira korisniko ime korisnika na udaljenom raunalu. # scp local_dir/* myname@host:remote_dir => Slino kao i u prethodnom primjeru, samo to se kopira kompletni sadraj direktorija local_dir. #scp /home/peric/* peric@test2:/home/peric => Kopiranje sadraja home direktorija korisnika peric sa lokalnog raunala test1, u home direktorij istog korisnika na raunalo test2 WinSCP je besplatni programski paket za Windows operativne sustave (Win 95/98/NT/2000/ME/XP), koji omoguuje kopiranje datoteka izmeu lokalnog i udaljenog raunala. Program svoj rad bazira na ranije spomenutom SCP (Secure Copy) protokolu koji dolazi kao dio ssh paketa. Podrane su obje verzije SSH protokola (SSH1 i SSH2), te autentikacija korisnika na temelju RSA para javni/tajni klju odnosno ifre korisnika. Da bi se moglo uspjeno WinSCP klijent aplikacijom uspostaviti veza s udaljenim raunalom, potrebno je na njemu imati pokrenut sshd program posluitelj, budui da se kompletna veza odvija putem SSH protokola.
303/1275
ZAKLJUAK
Tehnologija i znanost munjevitom brzinom grabe naprijed, a najbre od svih se razvijaju znanosti i tehnologije vezane uz raunala. Svaki napredak ima svoje prednosti i nedostatke. U mrenim okolinama, dok distribuirano raunarstvo uzima sve vie maha, te se vie ne moe vjerovati u dobronamjernost korisnika sustava, kontrola pristupa i autentikacija korisnika postaju nuan uvjet. U ovom seminaru dan je kratki pregled osnovnih karakteristika telnet i SSH protokola, te neke od mogunosti njihove primjene. Opisani su temeljni programski paketi neophodni za koritenje SSH protokola, kao i osnovni postupci njihove konfiguracije. Moe se zakljuiti da je osnovna namjena SSH protokola da omogui kreiranje sigurnih sesija izmeu dva raunala. Na taj nain uklanja se najvei nedostatak mrenih servisa kao to su telnet i sl., a to je nezatienost prijenosa podataka. Podaci se kod takvih protokola prenose raunalnom mreom u istom tekstualnom obliku to neovlatenim korisnicima omoguuje jednostavan dolazak do povjerljivih korisnikih informacija. Upravo zato se svim korisnicima preporuuje prelazak na sigurnije implementacije istih servisa, tj. koritenje SSH protokola. Iz istih razloga poseban je naglasak dan upravo sigurnosnim svojstvima ovog protokola, to je ujedno i njegova najvea snaga.
304/1275
Frane Gjeldum
305/1275
Opi dio
Program tar se koristi na linux operativnim sustavima za stvaranje i manipuliranje tar arhiva. Arhivom nazivamo pojedinaan file koji sadri vie dokumenata ,a pri tome evidentira imena tih dokumenata ,njihove vlasnike i mnoge druge podatke vezane za njih. Dokumenti unutar arhiva se nazivaju members ili lanovi. to tar radi? Osim to moemo stvoriti tar arhivu moemo vriti razne manipulacije. Tako npr. moemo ekstrahirati tj. istisnuti dokumente iz ve prije napravljenih arhiva , promijeniti ili izlistati dokumente koji su prije spremljeni u arhivu. Sami poetci uporabe tara veu se za magnetsku vrpcu pa tako kratica ureajima, dokumentima, pa i programima. Tar arhive se koriste na mnogo naina .Evo neke od njih: -Kao spremite Posebno se to koristi pri transferu kroz mreu, gdje se spremaju u arhive razni povezani dokumenti. Jedini nain da se pohrani nekoliko dokumenata na traci, a da se zadre informacije o njihovim imenima je upravo koritenjem arhiva. -Kao Back up -Za transport Postupak kopiranja kolekcije dokumenata na disk ili Arhivu kreiranu na jednom sistemu lako prenesemo na traku kao zatita od moguih oteenja ili gubitaka. drugi sistem i tamo ekstrahiramo njen sadraj Obino arhive dolaze s ekstenzijom .tar! Nije potrebno navoditi ekstenziju, ali dobro je radi preglednosti. tar na engleskom znai tape arhiver. Modernije verzije tara danas pristupaju raznim dostupnim
306/1275
Autori tara Tar je originalno napisao John Gilmore, ali mnogi drugi su ga modificirali i unapreivali. Vano je istaknuti da je tar zajedniki proizvod rada vie ljudi koji su koristei tar uoavali probleme, pronalazili rjeenja i podijelili svoja miljenja.
307/1275
File i verbose opcije Da bi razumjeli kako raditi s tar operacijama potrebno je poznavati i tar opcije. Upotrebom naredbe tar nije potrebno navoditi opcije, ali one mogu biti vrlo korisne za lake razumijevanje naredbi i izbjegavanje greaka. Opcija ima mnogo i sada emo samo dotaknuti tu temu. Dvije najkoritenije opcije su File i Verbose opcija. File opcijom odreujemo ime arhive s kojom tar radi. Ukoliko navedemo ime arhive tar e upotrijebiti default, obino predodreenu traku prikljuenu za nae raunalo ili ako nema trake, javiti e greku. Primjer Long i Short forme za opciju File: --file=archive-name -f archive-name Verbose opcija prikazuje detalje koji jo uvijek radi. Na primjer, ukoliko elimo vidjeti proces upisivanja dokumenata u arhivu i elimo pojasniti odreene stvari. Primjer Long i Short forme za opciju Verbose: --verbose -v Nakon upoznavanja s osnovnim tar opcijama prouiti emo kako kreirati arhive, listati arhive i ekstrahirati lanove iz arhive.
308/1275
Kreiranje arhiva Jedna od osnovnih operacija tara je create (-c) koju upotrebljavamo za kreiranje tar arhiva, naravno da bi to objasnili moramo prvo kreirati direktorij koji sadri tri dokumenta. Navedena tri dokumenta emo spremiti u arhivu. Dokumente emo nazvati blues; folk; jazz, direktorij emo nazvati practice, a arhivu collection.tar. U daljnjim primjerima pretpostavlja direktorija. Da bi stavili dokumente blues, folk, jazz u arhivu collection.tar upotrijebiti emo slijedeu naredbu: $ tar --create file=collection.tar blues folk jazz Redoslijed argumenata nije vaan kada upotrebljavamo long opciju forme, pa se moe napisati: $ tar blues --create folk file=collection.tar jazz Naravno, vidljivo je da je iz ovog redoslijeda tee razumjeti naredbu. Redoslijed argumenata postaje vaan upotrebom short forme gdje pogrean redoslijed moe dovesti do neeljenih rezultata. Kada listamo sadraj radnog direktorija (ls) vidjet emo da se arhiva collection.tar i dokumenti blues, folk i jazz nalaze u njemu. Kreirana arhiva nije unitila kopije dokumenata u direktoriju. Zakljuno, moramo navesti operaciju i ime dokumenata inae tar nee raditi. Vrlo je vano pogledati da ve ne postoji dokument u radnom direktoriju istog imena ,kao arhiva koju emo imenovati prethodnom navedenom naredbom jer e tar izbrisati trenutni sadraj tog dokumenta. Naravno direktorije smo prije kreirali ,a arhivu collection.tar stvaramo i imenujemo prethodnim primjerom tar naredbe. Koristei istu naredbu s verboseopcijom, tar e sam dodati imena dokumenata koje koristi dok radi .To se esto koristi da prikaemo akcije koje inae ne bi vidjeli. $ tar create --verbose --file=collection.tar blues folk jazz se da se nalazimo u direktoriju practice koji je poddirektorij home
309/1275
blues folk jazz Ovaj primjer je isti kao i prethodni, samo to tar sam dodaje imena blues, folk i jazz. Isti primjer u kratkoj formi bi izgledao: $ tar cvf collection.tar blues folk jazz blues folk jazz Kao to se moe vidjeti, sistem reagira jednako bez obzira da li uporabimo long ili short formu. Ve je prije napomenuto da pogrean redoslijed moe dovesti do neeljenih rezultata kod upotrebe short opcije. Kao primjer evo naredba: $ tar cfv collection.tar blues folk jazz Ovdje dolazi do greke jer se stvara arhiva imena v jer je najblie argumentu file name.U daljnje probleme neu ulaziti. Vano je napomenuti da je mogue kod stvaranja arhiva i arhivirati itave direktorije, tako da umjesto imena dokumenata navedemo ime direktorija. Direktoriji e biti arhivirani u svome radnom direktoriju i naknadno mogu biti ponovno stvoreni sa svim svojim sadrajem postupkom ekstrahiranja. Tako na direktorij practice ,koji se nalazi u home direktoriju ,moemo arhivirati u novu arhivu music.tar tipkajui naredbu: $ tar --create --verbose --file=music.tar practice practice/ practice/blues practice/folk practice/jazz practice/collection.tar
310/1275
Primjeuje se da arhiva nije direktoriju iz kojeg je tar i bio pozvan.. Listanje arhiva
esto elimo znati to pojedina arhiva sadri. Lako doznamo imena lanova arhive upotrebom list operacije. Tako npr. moemo pregledati sadraj arhive collection.tar tipkajui naredbu: $tar list file=collection.tar Na to bi tar odgovorio : Blues Folk jazz Mogue je i tono odraditi lan neke arhive pa nam tar vrati samo njega: $tar list file=collection.tar blues Pak da bi dobili sadraj arhiviranog direktorija, spominjanog u operaciji create., trebamo uporabiti ime direktorija kao file name argument. $ tar list file=music.tar practice Tar bi odgovorio; Practice/ Practice/blues Practice/jazz Practice/collection.tar Vidimo da su listani svi dokumenti i poddirektorij u direktoriju practice.
311/1275
Kako ekstrahirati lanove iz arhive Naravno nema smisla kreirati arhivu s lanovima ako ne moemo te lanove izvaditi i uporabiti. Za ekstrahiranje lanova upotrebljava se operacija (-- extract,-x). Ekstrahiranje lanova arhive ne mijenja samu arhivu; moemo taj postupak obaviti onoliko puta koliko nam treba. Slino i drugim operacijama moemo ekstrahirati cijelu arhivu ili samo pojedine lanove tj. dokumente. Ako elimo ekstrahirati cijelu arhivu navest emo samo ime arhive bez imena lanova. $ tar xvf collection.tar (Tar e vratiti sve lanove arhive.) Ako elimo ekstrahirati tono odraen lan, navest emo ime dokumenta kao parametar nakon imena arhive. $tar extract file=collection.tar blues (Tar e ekstrahirati dokument blues iz arhive collection.tar) Slino je ako elimo ekstrahirati pojedini direktorij iz njegove arhive. Moramo navesti njegovo ime iza arhive. Ipak treba pripaziti da ve ne postoji imenom takav direktorij jer bi onda ekstrahirani dokumenti bili stavljeni ba u taj istoimeni direktorij. Ako u tom direktoriju ve ima dokumenata i to istih imena kao dokumenti u direktoriju koji ekstrahiramo ,izgubit emo ih tj. zamijenit e ih dokumenti direktorija. U sluaju da je dokument bio arhiviran,a da u svom imenu sadri i ime svog direktorija koji ustvari ne postoji unutar radnog direktorija, tar e kreirati taj direktorij. Ako elimo ekstrahirati pojedini dokument nekog direktorija koji se nalazi u arhivi, moramo navesti iza imena arhive puno ime dokumenta toga direktorija. To se vidi u sljedeoj naredbi: $ tar xvf music.tar practice/folk practice/jazz (Direktorij practice koji se nalazi u arhivi music.tar sadri dokumente folk i jazz koje elimo ekstrahirati.) ekstrahiranog
312/1275
usporeujui datum kreiranja ili modificiranja lana arhive s datumom kreiranja ili
313/1275
U primjeru pozvat emo tar s update operacijom : $ tar update -v f collection.tar blues folk rock classical blues classical $ (Naveli smo verbose opciju pa tar vraa imena dokumenata s kojima radi, a to su u ovom sluaju dokumenti koji trebaju biti aurirani(updatirani). Spajanje arhiva s concatenate Da bi dodali jednu ili vie arhiva na kraj neke druge arhive trebamo uporabiti concatenate (--catenate,-a) operaciju. To je mnogo lake nego dodavati svaki lan pojedinano. Nova arhiva nakon spajanja e se zvati istim imenom kao prva navedena arhiva u naredbi i sadravat e lanove svih arhiva, ak i ako se lanovi isto zovu, zajedno e koegzistirati. Znai da nema brisanja lanova. Uklanjanje lanova arhive koristei -- delete Da bi uklonili pojedini lan neke arhive koristei operaciju delete, potrebno je navesti ime arhive i nakon toga ime lana kog elimo izbrisati. Ako ne navedemo ime lana nita nee biti izbrisano. Operacija delete za razliku od drugih nema short formu. Na primjeru emo obrisati dokument blues iz arhive. $ tar delete file=collection.tar blues
314/1275
Treba razlikovati potpune arhivske kopije(full dumps) diferecijalne kopije(incremental dumps) Obino se radi potpuna arhivska kopija jedanput na tjedan, a diferencijalna kopija jednom na dan. To znai da e se svaki dan raditi back up svih dokumenata nastalih ili promijenjenih od zadnje potpune kopije. To znai da e neki dokumenti biti arhivirani vie od jedanput .Takva strategija nam omoguava restauriranje file sistema s preciznou od jednog dana ekstrahirajui samo dvije arhive; zadnju tjednu potpunu arhivsku kopiju i zadnju diferencijalnu kopiju. Time bi jedino mogle biti izgubljeni dokumenti kreirani ili mijenjani nakon zadnje dnevne diferencijalne kopije. Program tar obino je distribuiran sa gotovim besplatnim skriptama za back up i restauraciju. Skripte za back up i restauraciju su dizajnirane da budu upotrebljavane zajedno. Osim uporabom skripta uvijek moemo i tipkati naredbe rukom . Vrlo zgodna stvar je da se dokumenti mogu restaurirati tipkajui naredbe rukom iz arhive kreirane back up skriptom i obrnuto. Full dump s esto naziva i level-0 tj. nulti nivo ,a incremental dump predstavlja level-1 tj. prvi nivo. Arhive se obino rade na prenosivim medijima; magnetske vrpce ,diskete , tape catriges i razni drugi mediji. Koliina podataka koji se mogu pohraniti ovisi naravno o veliini diska ili trake, ali i o nainu na kojim su formatirani. Prednost magnetskih medija je da se mogu ponovno uporabiti. Arhive jednostavno obriemo i ponovno uporabimo magnetski medij. Ipak takve medije treba zatititi od magnetskog polja ,a kada ponu proizvoditi greke ,s vremenom ih treba zamijeniti.
315/1275
CPIO PROGRAM
Cpio kopira dokumente u tar ili cpio arhivu. Arhiva moe biti dokument na disku ili npr. magnetskoj traci. Slino kao i tar obavlja i ekstrahiranje van arhiva. Gnu cpio podupire sljedee formate arhiva : binarni ,stari ASCII, novi ASCII , star tar , posix.1 tar. Po defaultu cpio kreira arhive u binarnom obliku da bi bio kompatibilan sa starijim cpio programima. Poto podrava i tar format , cpio je kompatibilan i sa tar programom. Kod ekstrahiranja cpio prepoznaje vrstu formata arhiva i moe itati i arhive kreirane na raunalima sa drukijim poretkom bajtova. Gnu cpio izvodi tri primarne funkcije i tri operativna naina rada(moda) -kopira dokumente u arhivu (copy-out mode) -ekstrahira dokumente iz arhive (copy- in mode) -dodaje dokumente drugom direktorijskom stablu (copy- pass mode)
Copy-out mode
U copy out modu cpio kopira dokumente(files) u arhivu. on ita imena dokumenata ,liniju po liniju sa standardnog ulaza i stvara arhivu na standardnom izlazu. Tipian nain da stvorimo listu imena dokumenata je da uporabimo find naredbu. U tom sluaju poeljno je dodati find naredbi opciju -depth da smanjimo probleme s dozvolama neitljivih direktorija. Opa sintaksa: cpio {-o|--create} [-0acvABLV] [-C bytes] [-H format] [-M message] [-O [[user@]host:]archive] [-F [[user@]host:]archive] [--file=[[user@]host:]archive] [--format=format] [--sparse] [--message=message][--null] [--reset-access-time] [--verbose] [--dot] [--append] [--block-size=blocks] [--dereference] [--io-size=bytes] [--help] [--version] < name-list [> archive]
316/1275
Generalna sintaksa sadri mnogo opcija pa bi predugo trajalo objanjavanje svake od njih. Nadam se da e biti bar malo razumljivija nakon to pokaemo par primjera. U prvom primjeru prikazat emo arhiviranje sadraja pojedinog direktorija. % ls | cpio -ov > directory.cpio (Naredbu ls koristimo da dobijemo listu imena dokumenata na standardni ulaz. Opcija -o kreira arhivu a -v opcija vraa imena dokumenata redoslijedom kako ih dodajemo u arhivu. Opcije mogu stajati skupa ali mora ispred njih doi crtica ili samostalno bez crtice. Oznaka > obavlja preusmjeravanje izlaza u dokument directory.cpio Ako elimo arhivirati cijelo direktorijsko stablo uporabit emo naredbu find za dobavljanje liste dokumenata. Primjer: % find . -print -depth | cpio -ov > tree.cpio
Copy-in mode
U copy in modu cpio ekstrahira dokumente van arhive i lista sadraj arhive. Arhiva se nalazi na standardnom ulazu. Mogue je uporabiti i predloke (paterns) pa samo imena dokumenata u arhivi koja se podudaraju sa zadanim predlocima e biti ekstrahirana. Ako nisu zadani predloci, ekstrahirat e se svi dokumenti iz arhive. Ekstrahiranje arhive zahtjeva malo vie razmiljanja jer cpio nee kreirati direktorije za obnovljene dokumente po defaultu, ni ti e prepisati stare dokumente bez da mu zadamo opciju. Opa sintaksa: cpio {-i|--extract} [-bcdfmnrtsuvBSV] [-C bytes] [-E file] [-H format] [-M message] [-R [user][:.][group]] [-I [[user@]host:]archive] [-F [[user@]host:]archive]
317/1275
[--file=[[user@]host:]archive] [--make-directories] [--nonmatching] [--preserve-modification-time] [--numeric-uid-gid] [--rename] [--list] [--swap-bytes] [--swap] [--dot] [--unconditional] [--verbose] [--block-size=blocks] [--swap-halfwords] [--io-size=bytes] [--pattern-file=file] [--format=format] [--owner=[user][:.][group]] [--no- preserve-owner] [--message=message] [--help] [--version] [-no-abosolute-filenames] [-only-verify-crc] [-quiet] [pattern...] [< archive Primjeri: % cpio -iv < directory.cpio (Ovom naredbom se dokumenti pohranjeni u arhivi directory.cpio ponovno obnavljaju i smjetaju u trenutno aktivni direktorij. Opcija -i ekstrahira arhivu a -v prikazuje imena dokumenata redoslijedom kako se ekstrahiraju.)
% cpio -idv < tree.cpio ( Ovom naredbom se sadraj itavog stabla direktorija ekstrahira u trenutni direktorij. Opcija -d slui za kreiranje direktorija ako je potrebno. Posebna -u opcija se moe uporabiti ako elimo prepisati stare istoimene dokumente s novim ili skorije promijenjenim.)
Copy-pass mode
U copy-pass modu cpio kopira dokumente iz jednog direktorijskog stabla u drugo, kombinirajui korake iz copy-in i copy-out modova a da ustvari i ne koristi arhivu. Sa standardnog ulaza ita listu dokumenata koje treba kopirati u drugi direktorij. Ime tog direktorija se ne zadaje kao opcija ve kao slobodan argument. Opa sintaksa: cpio {-p|--pass-through} [-0adlmuvLV] [-R [user][:.][group]] [--null] [--reset-access-time] [--make-directories] [--link]
318/1275
[--preserve-modification-time] [--unconditional] [--verbose] [--dot] [--dereference] [--owner=[user][:.][group]] [--sparse] [--no-preserve-owner] [--help] [--version] destination-directory < name-list% Primjer: find . -depth -print0 | cpio --null -pvd new-dir (Primjer pokazuje kopiranje dokumenata iz trenutnog direktorija i poddirektorija u novi direktorij new dir.Kombinacija opcija -print0 i -null se koristi za dobavljanje imena dokumenata izmeu find i cpio.Opcija -p oznaava cpio-u da doda dokumente u direktorij new dir.
319/1275
DD PROGRAM
Jo jedan program , slian tar ili cpio programima koji se moe uporabiti za arhiviranje je dd program. On kopira dokumente (files) uz manipuliranje ulazno-izlaznim (i/o)veliinama blokova. Opcionalno se mogu vriti konverzije nad dokumentima. Po defaultu kopira dokumente sa standardnog ulaza na standardni izlaz. Opa sintaksa: dd[option] Navest emo neke opcije koje program prima: if=file (ita iz FILE umjesto iz standardnog ulaza) of=file (pie u FILE umjesto na standardni izlaz) ibs=bytes (ita BYTES bajtove po redoslijedu) obs =bytes (pie BYTES bajtove po redoslijedu) bs=bytes (ita i pie BYTES bajtove po redoslijedu cbs=bytes (konvertira bajtove po redoslijedu) skip=blocks (preskae blokove ibs; blokovi na ulazu prije kopiranja) seek=blocks (preskae blokove obs; blokovi na izlazu prije kopiranja) count=blocks (kopira blokove ibs do kraja dokumenta; blokove na izlazu) conv=CONVERSION,CONVERSION] (kopira dokument ali prema tome to je navedeno kao argument) -ascii (pretvara ebcdic u ascii) -ebcdic (pretvara ascii u ebcdic) -lcase (pretvara velika slova u mala) -ucase (pretvara mala slova u velika)
Vidimo da opcija ima dosta , ali najbolje e neke stvari objasniti na konkretnom primjeru.
320/1275
U sljedeoj shell naredbi kopirat emo podatke u blokove velike 512 kb, Izmeu diska i trake ali neemo spremati ni restaurirati podatke u labelu na poetku diska. Primjer: (dd bs =4k skip=1 count=0 && dd bs=512 k) < $disk > $ tape -kopirano je sve osim labele na poetku diska Primjer: (dd bs=4k seek=1 count=0 && dd bs=512 k) <$ tape>$disk -kopirano je sve iz trake na disk ali se labela na disku nije dirala
321/1275
Davorin ajnovi
322 /1275
UVOD
UNIX je u razdoblju nastajanja predstavljao jezgru operacijskog sustava, a kasnije je ovo ime znailo i dodatne uslune programe koji su postali sastavni dio UNIX-a i omoguavali rijeavanje razliitih pitanja. Danas izgovarajui rije UNIX u irem smislu, podrazumijevamo jezgru UNIX-a, uslune programe, dodatne mrene servise, koa to su TCP/IP protokol, prijenos datoteka za udaljeni rad, raspodijeljeni sustav datoteka NFS, mrena informacijska baza NIS. Podrazumijevamo i zaista ogroman niz uslunih programa koji se uglavnom mogu besplatno skinuti s Interneta, a kod novijih instalacija ve su po definiciji ugraeni zajedno s UNIX-om. UNIX je podloga gotovo svim aplikacijama od baza podataka, projektiranja u elektrotehnici, do crtanja slika i obrade teksta. Kao to vidimo UNIX pokriva jako iroko podruje i za svako od njih mogla bi se napisati knjiga. U ovom seminarskom radu trudio sam se pokriti neke osnovne stvari tipa montiranja ureaja kao to je CD-ROM, usb, diskovne particije i slino koje mnogima poetnicima u poetku zadaju glavobolje posebno onim korisnicima koji su navikli na prijateljsko okruenje Windowsa. Iako se o ovom podruju moe zaista jako puno toga napisati, trudio sam se to je vie bilo mogue pojednostaviti neke stvari koje sluajnom itatelju mog seminarskog rada u potrazi za nekim rijeenjem moe pomoi u svladavanju problema. Skupio sam nekoliko najee postavljanih pitanja o montiranju(deviceova) na jedno mjesto i objasnio ih. Ipak kako se ovdje govori o UNIX-u mora se imati na umu da je ipak potrebno uloiti truda i imati puno puno strpljenja da bi se na kraju dobili rezultati. U drugom dijelu obrazloio sam Sambu programski paket koji je vrlo popularan zbog svoje sigurnosti i stabilnosti. Dat je uvid u konfiguraciju Sambe kao i neke osnovne stvari pomou kojih se moe stei dojam o samom paketu i njegovim mogunostima.
323 /1275
Malo emo pogledati ovu zadnju vrstu tj. specijalne datoteke! Specijalne datoteke su vrlo neobino ali zgodno svojstvo UNIX-a. Specijalne datoteke se koriste(itaju, piu) kao i obine datoteke , ali zahtijevi za itanjem-pisanjem rezultiraju u aktiviranju pripadne ulazno izlazne jedinice. Ulazi u specijalne datoteke nalaze se u direktoriju /dev iako je to samo dogovorno ne i nuno.Tako ako elimo pisati na pisau piemo u datoteku /dev/lpt. Prednost ovakve organizacije ulaza i izlaza je sljedea: 1. ulaz-izlaz u datoteku i u ulazno-izlaznu jedinicu se ne razlikuju 2. imena datoteka i ulazno-izlaznih jedinica imaju ista svojstva 3. postoji isti zatitni mehanizam i za datoteke i za ulazno-izlazne jedinice itd.
324 /1275
Pogledajmo za ta se koriste direktoriji /dev, /etc, /mnt . direktorij /dev sadri specijalne datoteke,vanjske jedinice,kao npr. diskovi, pisai itd. direktorij /etc sadri dosta izvedbenih i podatkovnih datoteka vezanih uz sam operacijski sustav i njegovu konfiguraciju. Ono je vrlo vaan direktorij jer sadri mnoge datoteke za podeavanje sustava kao i datoteku fstab koja sadri popis sustava datoteka koje se stvaraju prilikom pokretanja Linuxa. direktorij /mnt se koristi za privremeno povezivanje djelova diska, CD-ROM-a i dr. Dakle u Linuxu je prostor na kojem se nalaze datoteke podijeljene na direktorije u obliku stabla na vrhu kojeg se nalazi root slika 1. Korisnici od tog stabla vide samo direktorije i datoteke. U stvari mnogi direktoriji koji se nalaze unutar stabla su fiziki smjeteni na raznim dijelovima diska, na razliitim diskovima ili ak raunalima. Ako je jedna od tih particija smjetena na disku dodana u stablo u direktorij koji je poznat pod nazivom mount point onda se takav direktorij i sve to se u njemu nalazi naziva sustav datoteka.
325 /1275
montiramo a mountpoint mjesto montiranja odnosno mjesto u stablu direktorija na kojem se stvara sustav datoteka.Naredbu mount mogu koristiti iskljuivo superkorisnici inae bi sustav sigurnosti bio naruen. Napomenimo jo nekoliko argumenata koje koristi naredba mount. Ako nije navedena opcija koja vam je potrebna , program mount e je potraiti u datoteci /etc/fstab.
Argument
-w -r -n -t type -a -o popis_opcija
Opis
Stvaranje sustava dat. Sa dozvolom za itanje i pisanje Stvaranje sustava dat. Sa dozvolom samo za itanje Stvaranje sustava bez zapisivanja u datoteku /etc/mtab Odreivanje vrste sustava datoteke(ext2,msdos,nfs itd) Stvaranje svih sustava dat. Koji se nalaze u /etc/fstab Osim ovih opcija moete koristiti i dodatne!Vidi stranicu man mount
326 /1275
none none
0 0
Potrebno je ubaciti tekst za win particije , neto ovako: /dev/hda7 /dev/hda6 /dev/hda5 /dev/hda1 /dev/hda8 none none swap swap pri=1 /ext2 defaults /boot ext2 defaults /win/c vfat /win/d vfat defaults defaults 0 1 1 1 1 0 0 1 1 0 0 0 0
Kao to se vidi dodane su dvije nove linije za hda1 i hda8. Parametar vfat govori Linuxu da se radi o FAT particiji, a win/c i win/d su direktoriji gdje kaemo Linuxu da montira win particije.Ti direktoriji moraju postojati inae emo dobiti poruku da je montiranje nemogue(dakle ako ih nema napravimo ih mkdir ....). I na kraju postoje 1 i 0. S ovim parametrima govorimo Linuxu koje particije elimo automatski mountati pri dizanju sistema to smo i napravili. Jo samo snimimo datoteku , zatvorimo je i to je to. Evo jedan primjer runog mountanja bilo kojih particija ili ureaja(CD-ROM-ova) npr. za hda1 particiju kada nije editiran /etc/fstab fajl: mount t vfat /dev/hda1 /win/c ili mount t vfat /dev/hda8 /win/d Dakle mount kae montiraj, -t ukazuje Linuxu na fajl sistem particije, vfat govori da je to FAT a moe biti i iso9660 u sluaju da se montira cdrom ureaj itd. /dev/hda1 govori da se mounta hard disk br. 1 a moemo pisati i /dev/cdrom ako hoemo mountati cd-rom ureaj. /win/c direktori gdje hoemo montirati particiju a obino se koristi /mnt kao mount point(/mnt/win/c). A odmontiravanje ide ovako: umount /dev/hda1.
327 /1275
328 /1275
329 /1275
330 /1275
Kad ste sve odabrali spremite promjene i otipkajte sljedee: make modules make modules_install Ako je sve prolo OK pozovemo te module: modprobe usb-storage modprobe vfat modprobe msdos modprobe usb-uhci modprobe sd_mod Prikljuimo usbstick i kucajte dmesg... Trebali bi dobiti neto poput ovoga: usb 1-2: new full speed USB device using address 3 scsi0 : SCSI emulation for USB Mass Storage devices
Vendor: Model: Rev: ANSI SCSI revision: 02 Type: Direct-Access
USB Mass Storage devices found at 3 SCSI devices sda: 252509 512-byte hdwr sectors(129 MB) sda: assuming Write Enabled sda: assuming drive cache: write trougt /dev/scsi/host0/bus0/target0/lun0: p1 Attached scsi removable disk sda at scsi0 , channel 0, id 0, lun 0 To znai da je hardware prepoznaat i ostaje nam samo da ga postavimo u sistem. Na novi hardware e biti pod /dev/sda1 ili ako ve imamo neki scsi sda2 itd.. Napravimo direktorij gdje emo ga mountati... mkdir/mnt/usb zatim (ne zaboravimo kao root) mount t vfat /dev/sda /mnt/usb (msdos ili vfat) Da bi vidjeli je li USB tu otipkajmo sljedee: localhost@root $ df h
331 /1275
Filesystem Size Used Avail Use% Mounted on /dev/hda3.......................... /dev/hda4.......................... /dev/sda1 123M 37M 87M 30% /mnt/usb Bitan nam je ovaj zadnji redak koji potvruje da je na usb uspjeno montiran.
U svakom redu ima po est polja razdvojenih razmacima. Svaki red opisuje po jedan sistem datoteka. Polja su obino poravnata zbog bolje preglednosti ali to nije obavezno. Prvo polje prikazuje ime ureaja ili oznake koja mu je pridruena naredbom e2label(LABEL=oznaka). Datoteka fstab moe sadravati veze do udaljenog sistema i u tom sluaju prvo polje sadri NFS putanju. Zapis server: /resurs upuuje na direktorij /resurs na raunalu serveru. U drugom polju zadaje se toka povezivanja, a tree polje oznaava tip sistema datoteka. Tono ime tipa koristi se kako bi se raspoznali odreeni sustavi datoteka u ovisnosti od konfiguracije sistema. etvrto polje sadrava opcije za povezivanje(po defaultu je rw, za itanje i upis).
332 /1275
Peto polje se obino ne koristi, a u njemu je zadana uestalost ispisa koja se moe koristiti za pravljenje rezervnih kopija. U estom polju zadaju se koraci u kojima naredba fsck ispituje sistem datoteka. Sistem datoteka za koje je u ovom polju zadana ista vrijednost ispituju se istovremeno ako je mogue , tako da se ne zadaje ista vrijednost za dva sustava datoteka koji su na istom disku jer e pomjeranje glave naprijed i nazad znatno pogorati performanse. Samo sustavi datoteka na odvojenim diskovima ispituju se paralelno. Sada koristei upravo prikazanu datoteku fstab, naredba # mount /mnt/cdrom uradit e isto to i naredba # mount t iso9660 o ro,noauto,owner /dev/cdrom /mnt/cdrom . Naredba mount a povezati e sve sistemske dat. navedene u datoteci fstab. Ona se obino izvrava iz pokretakih skripti u toku podizanja sistema. Operator t ograniava tu operaciju na sisteme datoteka odreenog tipa. Na primjer # mount -at ext2 povezati e sve lokalne sisteme datoteka tipa ext2 na osnovno stablo. Naredba mount ita datoteku fstab sekvencijalno. Zbog toga prije prije sistema datoteka povezanih na druge sisteme u datoteci fstab moraju biti navedene njihove roditeljske particije , npr. red var/log mora biti iza reda /var , ako je /var zaseban sistem datoteka.. U datoteci mtab nalaze se svi trenutno montirani filesystemi. Ako otipkamo naredbu mount bez argumenata prikazat e se sadraj datoteke mtab. Isto tako ako elimo neto odmontirati otreba otipkati umount ime. Argument ime je dovoljan za potpunu identifikaciju fiesystema i prilikom poziva umount e prvo pogledati u /etc/mtab gdje se potrai dodatni argument koji ako ne postoji jednostavno dobijemo poruku da se specificirani filesystem ne moe odmontirati jer nije montiran. Vano je napomenuti da sustav datoteka ne moe biti odmontiran jedino ako je zauzet. Ako pokuamo odmontirati takav filesystem dobit emo poruku o zauzeu. Da bi sustav bio zauzet dovoljno je da user promijeni direktorij naredbom cd i da taj filesystem bude zauzet. Naredbom # cat /etc/mtab moemo vidjeti sadraj datoteke mtab-a.
333 /1275
SAMBA Uvod
U ovom dijelu opisano je instaliranje, podeavanje i koritenje paketa Samba. Pomou sambe moemo uiniti sljedee:
Dijeliti Linux sustave datoteka s Windows operativnim sustavima Dijeliti sustave datoteka iz operativnih sustava Windows s Linuxom Dijeliti pisa koji radi u okruju Windowsa s Linuxom Dijeliti pisa spojen na Linux raunalo s Windowsima
Samba je protokol koji koriste Microsoftovi operativni sustavi za dijeljenje datoteka i pisaa. Tvrtke Microsoft i Intel su 1987. god. razvile protokol SMB(Server Message Block) ,a Andrew Trigdell je prilagodio sustav raznim UNIX i Linux raunalima. Samba je danas dobro podrana i stalno se razvija i proiruje funkcionalnost. Nudi stabilan mehanizam velike snage za integriranje raunala pod Windowsom u mreu pod Linuxom. Adut sambe je to to je podrebno instalirati jedan paket na jedno raunalo pod Linuxom, a na strani Windowsa nije potreban dodatni softwer pod uvjetom da je raunalo pod Windowsima konfigurirano za rad u Microsoft mrei.
334 /1275
U datoteci smb.conf raunala definiraju koji klijenti mogu pristupati resursima preko Sambe. U datoteci treba da se nalaze samo IP adrese(ili rasponi adresa) koji tu trebaju biti.
pomou
prikljucima koje koristi CIFS s Interneta. To su TCP priklj. od 137 39. Ovo je primjer cjele datoteke smb.conf za jednostavnu mreu: [global] # workgroup = Ime NT domena ili ime radne grupe workgroup = MojaGrupa #Navodi raunala koja mogu da pristupaju objektima preko Sambe #Ovdje je to doputeno samo raunalima na dvije mree klase C host allow = 192.168.1 192.168.2 #Automatsko uitavanje liste printera iz datoteke printcap name = /etc/printcap load printers = yes #Koristi se zsebna zapisnika datoteka za svako raunalo , granica veliine 500K za svaku log file = /var/log/samba/log.%m max log size = 500 #definiranje naina zatite resursa. Veina korisnika eli sigurnost na nivou korisnika. #Detalji se mogu nai u datoteci security_level.txt u dokumentaciji Sambe security = user #Preporuka je upotreba ifrirane lozinke(ENCRYPTION.txt, Win95.txt u dokumentaciji #Sambe. Ne aktivirati ovu opciju bez da se proui spomenuta dokumentacija ;encrypt password = yes ;smb passwd file = /etc/smbpasswd
335 /1275
#Veini korisnika ova opcij daje bolje performanse.Prouiti datoteku speed.txt u stranicama #prirunika socket options = TCP_NODELAY #Djeljenje matinih direktorija korisnika. [homes] comment = Home Directories browseable = no writable = yes #Djeljenje svih pisaa [printers] comment = All Printers path = /var/spool/samba browseable = no guest ok = no writable = no printable = yes #Djeljenje odreenog direktorija [devel] comment = Zajedniki direktorij prodajnog odjela path = /devel/shared public = no writable = yes printable = no create mask 0775
NAPOMENA ! Printeri moraju biti konfigurirani na Linux raunalu. Micanjem komentara ; aktiviraju se zakomentirani redovi.
336 /1275
Iz komentara se moe vidjeti da korisnici kada se prijave na svoja raunala mogu koristiti matine direktorije, direktorij /devel/shared i mogu printati na svim printerima poznatim serveru. Kao to se vidi datoteka smb.conf sastoji se od nekoliko odlomaka. Svaki od njih zapoinje imenom odlomka u uglatim zagradama, primjerice odlomak [global]. Unutar svakog vrijednost, primjerice odlomka paratetri se odreuju pomou parova ime =
workgroup=MojaGrupa. Datoteka smb.conf sadri tri posebna odlomka [global], [homes], [printers], te jedan ili vie korisnikih odlomaka. Odlomak [global] upravlja parametrima koji se koriste za kompletan smb posluitelj, a sadri osnovna podeenja(default)vrijednosti koje se koriste u drugim odlomcima. Prvi redak odlomka [global] definira radnu grupu kojoj pripada nae raunalo. Isto tako sadri i mjesto na kojem je definiran sustav za ispis na naem posluitelju ,a u sljedeem retku je naznaeno mjesto gdje se nalazi datoteka za podeenje ispisa. Odlomak [homes] omoguuje mrenim klijentima povezivanje s korisnikim poetnim direktorijem na naem posluitelju, a da pritom nema izravnog zapisa u datoteci smb.conf. Uputimo li zahtijev za odreenom uslugom na posluitelj samba on e prvo pregledati datoteku smb.conf i potraiti poseban odlomak koji odgovara traenoj usluzi. Ako ne nae odgovarajui zapis u datoteci, program Samba provjerava odlomak [homes]. Ako on postoji, Samba trai datoteku s lozinkama, a u njoj poetni direktorij onog korisnika koji je uputio zahtijev. Nakon toga e taj direktorij postati dijeljeni direktorij na mrei. Odlomak [printers] odreuje nain ispisa u sluaju da u datoteci smb.conf nema posebnih zapisa koji se odnose na nain ispisa. Kao i kod odlomka [homes], ako nije naen poseban zapis koji odreuje nain ispisa na pisa, Samba koristi odlomak [printers] kako bi korisnicima omoguila pristup pisaima koji su definirani u datoteci /etc/printcap. Parametar printable moemo podesiti na vrijednost yes i u tom sluaju se zadani pisa moe koristiti za ispis. Parametar guest ok slui za podeavanje mogunosti ispisa za korisnika koji se prijavio kao gost.
337 /1275
Dijeljenje direktorija
Nakon to se uspjeno postavi posluitelj Samba, moemo stvoriti posebne dijeljene
direktorije kojima mogu pristupati odreene grupe korisnika ili javne direktorije kojima mogupristupati svi. Pretpostavimo da elimo napraviti direktorij kojem dozvoljavamo pristup samo odreenog korisnika. Trebamo napisati novi odlomak i unjeti potrebne podatke. Zadati emo korisnika, stazu korisnikog direktorija i jo neka podeenja: [davorovdir] comment = Davorov udaljeni direktorij path = /usr/local/src valid users = tomi browseable = yes public = no writable = yes create mod = 0700 Na ovaj nain stvoren je dijeljeni direktorij pod nazivom davorovdir. Staza do direktorija na lokalnom posluitelju je /usr/local/src. Kako browsable ima vrijednost yes direktori e se pojaviti u mrenom poopisu direktorija, a kako je parametar public postavljen na no moi e mu pristupati samo korisnik s imenom tomi. Pristup drugim korisnicima moemo omoguiti tako da ih se navede u parametru valid users.
338 /1275
339 /1275
340 /1275
Service uid gid pid machine ------------------------------------------------------ned ned ned 1275 klum (192.168.1.51) gold trent trent 1279 admpc (192.168.1.50) admin ned ned 1275 klum (192.168.1.51) Locked files: Pid Deny mode R/W Oplock -------------------------------------------------------1275 1275
Name
Rezultat naredbe smbstatus sadri prilino dugake redove koji su ovdje skraeni zbog jednostavnijeg prikaza i jasnoe!
341 /1275
Poslje greki u radu, programi pod Windowsima esto ostavljaju zakljuane datoteke iza sebe to izaziva probleme prilikom ponovnog pokretanja programa. Moe se nasilno otkljuati datoteka zaustavljanjem procese smbd koji je zakljuao tu datoteku.Nasilno otkljuavanje moe dovesti do greaka u datotekama.
Zakljuak
Samba programski paket je vrlo moan alat u sluajevima kada postoji potreba za meusobnim dijeljenjem raunalnih resursa izmeu raunala sa instaliranim Linux i Windows operativnim sustavima. S obzirom na sve ee situacije u kojima se unutar iste raunalne mree intenzivno koriste raunala sa instaliranim razliitim vrstama i inaicama operativnih sustava (tipino Linux i Windows, ali nisu iskljueni niti ostali operativni sustavi), snaga ovog programskog paketa dolazi do izraaja. Naime, Samba paketom omoguava se meusobno dijeljenje diskovnog prostora (engl. shares), zatim pisaa, pa ak i serijskih portova izmeu razliitih operativnih sustava, to ovaj programski paket ini gotovo neizbjenim izborom u 'mjeovitim' radnim okolinama. Velika prednost Samba paketa lei u injenici da Samba moe zamijeniti Windows posluitelje potrebne za uspostavu lokalne mree (WINS posluitelj i kontrolor domene). Cijene Windows posluitelja su relativno velike dok se Samba distribuira besplatno. Treba uzeti u obzir da se Windows NT posluitelji dodatno naplauju ovisno o tome koliko je raunala u mrei na njih spojeno. Iako Samba paket jo uvijek nema potpunu funkcionalnost NT posluitelja, on se bez problema moe koristiti u manjim lokalnim mreama (do 30 raunala) kod kojih nema potrebe za pomonim WINS posluiteljem i pomonim kontrolorom domene koje Samba jo uvijek ne podrava. Samba WINS posluitelj i kontrolor domene rade zadovoljavajue na raunalu sa P166 procesorom i 128MB RAM-a to su puno manji zahtjevi od onih koje namee Windows NT operacijski sustav. Moe se zakljuiti da je Samba dobra (i jeftinija) zamjena za Windows NT posluitelje u malim lokalnim mreama kao to su SOHO mree.
342 /1275
Branimir ivkovi
343 /1275
UVOD
Ime awk nastalo je od inicijala njegovih kreatora: Alfred V. Aho, Peter J. Weinberger, i Brian W. Kernighan. Original program napisan je 1977 u AT&T Bell Laboratories. 1985 nova inaica programa napravila je programski jezik monijim, predstavlja korisniki definirane funkcije, viestruki ulazni sljedovi, izraun regularnih izraza. Ta nova inaica postala je uglavnom dostupna sa Unix System V Release 3.1. izdanjem. Inaica u System V Release 4 izdanju dodaje neka nova svojstva i ispravlja ponaanje u nekim od tamnih strana jezika. Specifikacija za awk u POSIX Command Language and Utilities standardu dodatno je proistila jezik utemeljen na suradnji gawk kreatora, i originalnih Bell Labs awk kreatora. gawk je kompatibilan sa System V Release 4 izdanjem programa awk. Kompatibilan je i sa POSIX specifikacijom jezika awk. GNU implementaciju, gawk, napisali su Paul Rubin i Jay Fenlason 1986 godine, na prijedlog koji je dao Richard Stallman. John Woods je takoer pridonio svojim dijelovima koda. 1988 i 1989 godine, David Trueman temeljito prerauje gawk kako bi bio kompatibilan sa novijim awk programom. U preradi mu je pomogao Arnold Robbins. Tekui razvoj fokusiran je na popravcima pogreaka, poboljanje izvedbe, poklapanje sa standardima, i povremeno, nova svojstva.
344 /1275
OPIS
awk je jezik za obradu datoteka koji je vrlo pogodan za manipuliranje s podacima i popravljanje informacija iz tekstualnih datoteka. Program awk se sastoji od bilo kojeg broja korisniki definiranih funkcija i pravila u obliku: pattern {action} Svako pravilo specificira uzorak (eng. pattern) koji traimo i akciju (eng. action) koja e se izvriti kada pronaemo uzorak. Uzorak je regularan izraz, poseban uzorak, raspon uzorka, ili bilo koji aritmetiki izraz. BEGIN je poseban uzorak koji slui kao oznaka akcije koju awk izvodi prije itanja bilo kojeg ulaznog zapisa. END je poseban uzorak koji slui kao oznaka akcije koju awk izvodi nakon to su proitani svi ulazni zapisi. Moete zadati raspon uzorka kao: pattern1,pattern2 Ovaj raspon usporeuje sve retke od retka koji se slae sa prvim uzorkom pattern1 do retka koji se slae sa drugim uzorkom pattern2, ukljuivo sa tim uzorcima. Ako izostavite uzorak, ili ako brojana vrijednost uzorka nije nula, awk izvodi akciju koja daje rezultat za taj redak. Akcija je slijed navoda okonan znakom toka zarez (;), znakom za novi redak, ili zatvorenim vitiastim zagradama (}). Uvjet (eng. condition) je bilo koji izraz. Vrijednostkoja nije nula awk smatra istinitom (eng. true), a vrijednost nula neistinitom (eng. false). Izjava (eng. statement) moe biti i slijed naredbi ograen vitiastim zagradama. # if statement if (condition) statement
345 /1275
[else statement]
# for loop for (expression1; condition; expression2) statement Naredba for je ekvivalentna sljedeem: expression1 while (condition){ statement expression2 } Naredba for moe biti u obliku: for (i in array) statement awk izvodi naredbu statement za svaki element u nizu array.
346 /1275
continue zaustavlja tekue ponavljanje for ili while naredbe i poinje slijedee ponavljanje (ako takvo postoji).
Next zavri sve obrade za tekui ulazni zapis i odmah zapoinje obradu slijedeeg ulaznog zapisa.
exit[(expr)] odmah odlazimo na END akciju ako postoji. Ako ne postoji END akcija ili ako awk ve izvodi END akciju, awk program zavrava. awk postavlja exit status programa nabrojanu vrijednost koju sadri izraz expr. Ako izostavite izraz (expr), exit status je 0.
return [expr] izlazimo iz funkcije. Ako specificirate izraz expr, funkcija vraa vrijednost izraza expr kao svoj rezultat, inae, rezultat funkcije nije definiran.
347 /1275
Postoje dva naina da se specificira awk program: a. proiri. b. Koristei f prog opciju. Direktno na naredbenom retku. U tom sluaju, program je argument jednog naredbenog retka, obino ograen apostrofima (') kako bi sprijeili shell u nastojanju da ga
Program moete specificirati izravno na naredbenom retku jedino ako ne upotrebljavate f prog argumente. Kada specificirate datoteke na naredbenom retku, te datoteke pribavljaju ulazne podatke sa kojima e awk manipulirati. Ukoliko ne specificirate datoteku ili specificirate kao naziv datoteke, awk ita podatke sa standardnog ulaza. Na naredbenom retku varijable moete postaviti na neku poetnu vrijednost koristei: var=vrijednost Na naredbenom retku moete naizmjenino postavljati poetne vrijednosti varijabli i imena ulaznih spisa. awk obrauje postavljanje poetnih vrijednosti varijabli i ulazne datoteke onim redom kojim se pojavljuju na naredbenom retku. Npr. naredba awk f progfile a=1 f1 f2 a=2 f3 postavlja vrijednost varijable a na 1 prije nego to proita ulazne podatke iz f1 i postavlja vrijednost varijable a na 2 prije nego to proita ulazne podatke iz f3. Postavljanje poetne vrijednosti varijable koje se pojavljuje prije prve datoteke u naredbenom retku izvodi se odmah nakon poetne akcije (BEGIN). Postavljanje poetne vrijednosti varijable koje se pojavljuje nakon zadnje datoteke izvodi se neposredno prije posljednje akcije (END).
348 /1275
Opcija -v dozvoljava nam da dodijelimo vrijednost varijable prije poetka izvoenja awk programa (to je prije poetne akcije - BEGIN). Npr. awk -v v1=10 -f prog datafile awk dodjeljuje varijabli v1 pripadajuu vrijednost prije poetne akcije (ali nakon standardnog dodjeljivanja vrijednosti ugraenim (eng. built-in) varijablama kao to su FS (niz znakova za razdvajanje polja) i OFMT, te ugraene varijable imaju posebno znaenje za awk). awk dijeli ulaz na zapise. Po standardu, zapise razdvajaju znakovi za prijelaz u novi red. Ako elite, moete specificirati neki drugi znak za razdvajanje zapisa. awk slijedno usporeuje svaki ulazni zapis sa uzorkom svakog pravila u programu. Ako se uzorak poklapa, nad tim ulaznim zapisom awk izvodi akciju definiranu za to pravilo. Uzorci i akcije se esto odnose na odvojena polja unutar zapisa. Po standardu, white space (obino znakovi za razmak (eng. blank), znakovi novog retka (eng. newline), ili vodoravne oznake tabulatora (eng. horizontal tab characters)) razdvajaju polja. Mogue je specificirati neki drugi niz znakova (eng. string) za razdvajanje polja koristei F ere opciju. Moete izostaviti dio awk pravila koji se odnosi na uzorak ili dio koji se odnosi na akciju ali nije mogue izostaviti oboje. Ako izostavite uzorak, awk izvodi akciju za svaki ulazni zapis (to znai da svaki zapis odgovara). Ako izostavite akciju, awk ispisuje na standardni izlaz svaki zapis koji se poklapa sa uzorkom. Sve to se u retku programa nalazi iza znaka # awk smatra komentarom. Na primjer: # Ovo je komentar
349 /1275
OPCIJE
-F ere specificira produen regularni izraz koji slui za odvajanje polja. -f prog vraa awk program koji sadri datoteka prog. Ako se na komandnom retku vie puta pojavi opcija f, kao rezultat dobijemo program koji je konkatenacija svih specificiranih programa. -v var=value dodjeljuje vrijednost varijabli var prije poetka izvoenja programa. Ovu opciju moete specificirati puno puta.
350 /1275
VARIJABLE I IZRAZI
Postoje tri vrste varijabli: identifikatori (eng. identifiers), polja (eng. fields) i niz elemenata (eng. array elements). Identifikator je slijed slova, znamenki i podvuenih crta koji zapoinje slovom ili podvuenom crtom. awk dijeli ulaz na zapise, a zapise dijeli u polja. Specifikacije polja imaju oblik $n gdje n kree od 1 do NF (ugraena varijabla koja sadri informaciju o broju polja u tekuem zapisu). Takva specifikacija polja odnosi se na nto polje tekueg ulaznog zapisa. $0 (nula) odnosi se na itav tekui ulazni zapis. Nizovi su asocijativne kolekcije vrijednosti koje zovemo elementi niza. Konstruirani su u obliku: identifier[subscript] gdje je indeks subscript u obliku izraz ili izraz,izraz,. i upuuje na niz elemenata. Svaki takav izraz moe sadravati bilo koji niz znakova. Za viestruke izraze indeksa, awk ulana vrijednosti niza znakova svih izraza i odvaja ih oznakom SUBSEP. Poetna vrijednost oznake SUBSEP postavljena je na \034 (ASCII field separator). Polja i identifikatore ponekad pripisujemo skalarnim varijablama kako bi ih razlikovali od nizova. awk varijable ne deklariramo i nije ih potrebno postaviti na poetnu vrijednost. Vrijednost varijable koja nije postavljena na neku poetnu vrijednost je prazan niz znakova u string kontekstu i broj 0 u kontekstu brojki. Izrazi se sastoje od konstanta, varijabli, funkcija, regularnih izraza i stanja indeksiranih znakova u nizu u kombinaciji sa operatorima. Svaka varijabla i izraz ima vrijednost u obliku niza znakova i odgovarajuu brojanu vrijednost; awk koristi vrijednost koja odgovara kontekstu. Kad pretvaramo brojanu vrijednost u niz znakova odgovarajue vrijednosti, awk provodi radnju ekvivalentnu pozivu funkcije sprintf . Ako upotrebljavate niz znakova u kontekstu brojke, i awk ne moe interpretirati sadraj niza znakova kao broj, tretirat e vrijednost tog niza znakova kao broj nula.
351 /1275
Brojane konstante su sljedovi decimalnih znamenki. Konstante sastavljene od niza znakova su u navodnicima, npr. a literal string. Konstantan string moe sadravati slijed znakova za prekid koji su prikazani u tablici 1. Escape \a \b \f \n \r \t \v \ooo \xdd \/ \" Character audible bell backspace formfeed newline carriage return horizontal tab vertical tab octal value ooo hexadecimal value dd slash quote
Tablica 1. Konstantan string za prekidni niz u programskom jeziku awk. awk podrava proirene regularne izraze. Kad awk ita program, prevodi znakove ograene slash znakovima (/) kao regularne izraze. Na primjer: /foo.*bar/{print $1,$3} rezultat ove naredbe bit e ispis svih redaka koji sadre niz znakova foo , te nakon toga bilo koji niz znakova koji zavrava nizom znakova bar. awk odreuje uvjet indeksa u nizu na slijedei nain: index in array
352 /1275
gdje index izgleda kao izraz ili (izraz,,izraz). Ovaj uvjet se izrauna kao 1 ako je vrijednost niza znakova predstavljena sa index ujedno i indeks u nizu, inae se uvjet izrauna kao 0 (nula). Na taj nain pouzdano znamo postoji li taj element niza.
Tablica simbola
Tablici simbola moete pristupiti preko ugraenog niza SYMTAB. SYMTAB[expr] je isto to i varijabla imenovana kao rezultat izrauna izraza. Na primjer: SYMTAB["var"] je sinonim za varijablu var.
353 /1275
OPERATORI
Unarni operatori su +, -, ++ i --. Operatore ++ i -- moete koristiti kao postfiksne ili kao prefiksne operatore. Binarni aritmetiki operatori su +, -, *, /, % i ^. Uvjetni operator expr ? expr1 : expr2 Izraz expr mora kao rezultat dati broj. Ako je taj broj razliit od nule izraunava se izraz expr1 i njegov rezultat je rezultat cijelog izraza. Ako je taj broj jednak nuli izraunava se izraz expr2 i njegov rezultat je rezultat cijelog izraza. Ako dva izraza nisu razdvojena operatorom, awk konkatenira njihove string vrijednosti. Operator ~ daje rezultat 1 (true) ako regularni izraz na desnoj strani pristaje string vrijednosti na lijevoj strani. Operator !~ daje rezultat 1 kada se desna strana ne poklapa sa lijevom. Na primjer: $2 ~ /[0-9]/ odabrat e svaki redak u kojem drugo polje sadri barem jednu znamenku. awk interpretira svaki string ili varijablu na desnoj strani operatora ~ ili !~ regularni izraz. Relacijski operatori su <, <=, >, >=, == i !=. Kad su oba operanda koje usporeujemo brojke, awk usporeuje njihove brojane vrijednosti, inae ih usporeuje kao string vrijednosti. Operand je brojka ako je to cijeli broj (eng. integer) ili broj sa pominim zarezom (eng. floating point number), ako je to polje ili ARGV element koji izgleda kao broj, ili ako je to varijabla kreirana dodjeljivanjem na komandnom retku koja izgleda kao broj. Boolean operatori su || (or), && (and) i ! (not). Prilikom izrauna izraza koristi se Short Circuit Evaluation. kao dinamiki
354 /1275
Logiki i operator && prvo se izraunava lijevi operand, ako je lijevi operand kao rezultat dao nulu, desni operand se ne izraunava. Logiki ili operator || Prvo se izraunava lijevi operand, ako lijevi operand kao rezultat nije dao nulu, desni operand se ne izraunava. Varijabli moete dodijeliti vrijednost sa var=expr Ako je op binarni aritmetiki operator, naredba var op= expr je ekvivalentna naredbi var = var op expr razlikuju se u tome to se var izraunava samo jednom.
355 /1275
356 /1275
ULAZNI PODACI
awk dijeli ulazne podatke na zapise (eng. records). Znak za razdvajanje zapisa odvaja svaki zapis od onog slijedeeg. Vrijednost ugraene varijable RS daje tekui znak za razdvajanje zapisa, standardno zapoinje kao newline (\n). Ako varijabli RS dodijelite neki drugi znak, awk e ga od tada koristiti kao znak za razdvajanje zapisa. Order of Operations (A) $i V[a] V++ V ++V --V A^B +A -A !A A*B A/B A%B A+B A-B AB A<B A>B A<=B A>=B A!=B A==B A~B A!~B A in V A && B A || B A?B:C V=B V+=B V-=B V*=B V/=B V%=B V^=B A, B and C are any expression. i is any expression yielding an integer. V is any variable. Tablica 2. awk poredak operacija regular expression matching array membership logical AND logical OR conditional expression assignment exponentiation unary plus, unary minus, logical NOT multiplication, division, remainder addition, subtraction string concatenation comparisons grouping field, array element increment, decrement
357 /1275
awk dijeli zapise u polja. String za razdvajanje polja, odreuje ga vrijednost ugraene varijable FS, razdvaja svako polje od slijedeeg. Moete postaviti odreeni string za razdvajanje polja tako da dodijelite neku vrijednost varijabli FS, ili tako da specificirate -F ere opciju na naredbenom retku. Varijabli FS moete dodijeliti regularni izraz. Na primjer: FS = "[,:$]" kae da znak zareza, dvotoke ili dolara moe razdvajati polja. Slijedea lista ugraenih varijabli omoguuje razliite dijelove informacija o ulaznim podacima. NF NR FNR broj polja u tekuem zapisu broj ukupno proitanih zapisa broj zapisa proitanih iz tekue datoteke
getline uita slijedei ulazni zapis u $0 i razdijeljuje zapis u polja. Varijable NF, NR i FNR su prikladno postavljene. getline var uita slijedei ulazni zapis u varijablu var. awk ne razdijeljuje zapis u polja (to znai da se tekua $n vrijednost ne mijenja), ali se prikladno postave varijable NR i FNR. getline <expr interpretira vrijednost string izraza expr kao da je ime datoteke. awk uita slijedei zapis u $0, razdvoji ga u polja i prikladno postavi NF. Ako datoteka nije otvorena, awk ju otvori. Datoteka ostaje otvorena dok ju ne zatvorite funkcijom close(). getline var <expr interpretira vrijednost string izraza expr kao da je ime datoteke i uita slijedei zapis iz te datoteke u varijablu var, ali ga ne razdijeljuje u polja.
358 /1275
expr | getline interpretira vrijednost string izraza expr kao naredbeni redak koji treba izvriti, awk proslijedi izlazne podatke te naredbe u funkciju getline i uita ih u $0 na slian nain kao getline <expr. expr | getline var izvrava vrijednost string izraza expr kao naredbu i prosljeuje izlazne podatke te naredbe u funkciju getline. Rezultat je slian kao getline var <expr. Moete imati samo ogranien broj otvorenih polja i kanala (eng. pipe) u isto vrijeme. Polja i kanale moete zatvarati tijekom izvravanja koristei funkciju close(expr) Izraz expr koji zatvaramo mora biti onaj koji je naveden ispred znaka | ili nakon znaka < u funkciji getline, ili onaj koji je napisan nakon znaka > ili znaka >> u naredbi print ili naredbi printf. Ako funkcija uspjeno zatvori kanal, vraa broj nula. Ako zatvarate polja i kanale koji vam vie nisu potrebni, moete koristiti bilo koji broj polja i kanala tijekom izvravanja awk programa.
359 /1275
360 /1275
361 /1275
str = sprintf(fmt, expr, expr...) Formira listu izraza expr, expr... koristei specifikaciju string vrijednosti fmt, te vraa formatiran string. String fmt se sastoji od specifikacija pretvorbi koje pretvaraju i dodaju slijedei izraz expr u string, to su najee znakovi koje funkcija sprintf() dodaje u string. Te specifikacije pretvorbi su sline onima koje koristimo po ANSI C standardu. Specifikacije pretvorbi su u obliku %[-][0][x][.y]c gdje je 0 x y c poravna polje po lijevoj strani; default je poravnavanje polja po desnoj nula na poetku ispisuje broj sa nulom na poetku je minimalna irina polja je preciznost je znak za pretvorbu strani
Za string, preciznost je najvei broj znakova koji trebaju biti ispisani iz string vrijednosti. Za broj, preciznost je broj znamenki koje trebaju biti ispisane sa desne strane decimalne toke kada se ispisuje broj sa pominim zarezom (eng. floating point). Ako je x ili y znak zvjezdica (*), najmanja irina polja ili preciznost je vrijednost slijedeeg izraza expr u pozivu funkcije sprintf(). Znak za pretvorbu c je jedan od slijedeih: d i o u decimal integer decimal integer unsigned octal integer unsigned decimal integer
x,X unsigned hexadecimal integer f,F floating point e,E floating point (scientific notation) g,G the shorter of e and f (suppresses non-significant zeros)
362 /1275
c s
n = split(string, array, regexp) Razdijeli string u polja. Izraz regexp je regularni izraz koji odreuje niz znakova za razdvajanje polja i namijenjen je za ovu operaciju. Funkcija rasporeuje odvojena polja u elemente niza array; indeksi niza poinju od 1. Funkcija split() vraa broj polja u koja je podijelio string vrijednost (taj broj je ujedno i najvei indeks tog niza). Izraz regexp dijeli zapis na isti nain kao i FS string za razdvajanje polja. Ako izostavite argument regexp, funkcija split() koristit e tekuu vrijednost varijable FS. str = substr(string, offset, len) Vraa podniz znakova iz string vrijednosti koji poinje na mjestu offset i uzima najvie len znakova. Prvi znak u string vrijednosti ima offset vrijednost 1. Ako izostavite argument len, funkcija substr() vratit e preostali dio string vrijednosti. str = tolower(expr) Pretvara sva slova string vrijednosti izraza expr u mala slova i vraa rezultat. Ako izostavite izraz expr, funkcija tolower() umjesto izraza koristi referencu $0. str = toupper(expr) Pretvara sva slova string vrijednosti izraza expr u velika slova i vraa rezultat. Ako izostavite izraz expr, funkcija toupper() umjesto izraza koristi $0.
363 /1275
SISTEMSKE FUNKCIJE
status = system(expr) izvrava string vrijednost izraza expr kao naredbu. Na primjer system("tail " $1) poziva naredbu tail, koristei string vrijednost od $1 kao datoteku koju tail pretrauje.
vrijednosti (eng. parameter-list) sadri bilo koji broj normalnih (skalarnih) i array varijabli odvojenih zarezom. Kada pozivate funkciju, awk prosljeuje skalarne argumente po vrijednosti, i array argumente po referenci. Imena specificirana u listi vrijednosti su lokalna za funkciju; sva druga imena koja se koriste u funkciji su globalna. Funkcija se vraa onome tko ju je pozvao kada izvri zadnju naredbu u funkciji ili kada dosegne eksplicitnu return naredbu. Povratna vrijednost, ako postoji, specificirana je u return naredbi.
364 /1275
IZLAZNI PODACI
Naredba print ispie svoje argumente u jednostavnom formatu. Ako nema argumenata, ona ispie tekui ulazni zapis u cijelosti. awk dodaje znak za razdvajanje izlaznih zapisa (eng. output record separator) ORS na kraj izlaznih podataka koje proizvede svaka print naredba; kada znak zarez razdvaja argumente print naredbe, znak za razdvajanje izlaznih polja (eng. output field separator) OFS razdvaja odgovarajue vrijednostiizlaznih podataka. ORS i OFS su ugraene varijable i njihove vrijednosti moete promijeniti tako da im dodijelite string vrijednosti. Default vrijednost znaka za razdvajanje izlaznih zapisa je znak za novi redak (eng. newline) i default vrijednost znaka za razdvajanje izlaznih polja je razmak (eng. space). Varijabla OFMT zadaje izlazni oblik brojeva sa pominim zarezom. Default vrijednost varijable OFMT je %.6g; moete promijeniti tu vrijednost tako da varijabli dodijelite neku drugu string vrijednost. OFMT se primjenjuje samo na brojeve sa pominim zarezom (eng. floating point). Naredba printf oblikuje svoje argumente koristei fmt argument. Oblikovanje je isto kao kod ugraene funkcije sprintf(). Za razliku od naredbe print, naredba printf ne dodaje znak za razdvajanje izlaznih podataka automatski, te na taj nain omoguuje programu puno precizniju kontrolu nad izlaznim podacima. Naredbe print i printf piu na standardni izlaz. Moete preusmjeriti izlaz na datoteku ili kanal (eng. pipe). Ako dodate izraz >expr naredbi print ili printf, awk tretira string vrijednost izraza expr kao ime datoteke, i pie izlazne podatke u tu datoteku. Isto tako, ako dodate izraz >>expr, awk pridodaje izlazne podatke tekuem sadraju datoteke. Da bi iskljuili dvosmislenosti, naredbe kao ovakva print a > b c su sintaksno neispravne. Koristite zagrade kako bi izbjegli dvosmislenost.
365 /1275
SED
366 /1275
Adresiranje uzorka
Adresa moe biti broj retka ili uzorak, ograen u slash znakove (/uzorak/). Uzorak opisujemo koristei regularne izraze. \n moe biti koriten za usporedbu sa bilo kojim newline znakom u prostoru za uzorak, ali ne i sa newline znakom na kraju prostora za uzorak. Ako uzorak nije specificiran, naredba e biti primijenjena na sve retke. Ako je specificirana samo jedna adresa, naredba e biti primijenjena na sve retke koji se slau sa tom adresom. Ako su specificirane dvije adrese odvojene zarezom, naredba e biti primijenjena na raspon redaka izmeu prve i druge adrese, ukljuivo sa tim adresama. Neke naredbe prihvaaju samo jednu adresu: a, i, r, q, i =. Operator ! napisan nakon adrese prouzroi da sed primijeni naredbu na sve retke koji se ne slau sa adresom. Vitiaste zagrade ({}) koristimo da bi ugnijezdili jednu adresu unutar druge, ili da bi primijenili viestruke naredbe na istu adresu. [/pattern/[,/pattern/]]{ command1 command2 }
367 /1275
Otvorena vitiasta zagrada mora biti na kraju retka, a zatvorena vitiasta zagrada mora biti sama u retku. Nakon zatvorene vitiaste zagrade ne smije biti razmaka.
metacharacters). Special Characters . * Slae se sa svakim pojedinanim znakom osim sa newline znakom. Slae se sa bilo kojim brojem (ukljuivi nula) pojedinog znaka (ukljuivi znak specificiran regularnim izrazom) koji se nalazi neposredno prije znaka zvjezdica. [] Slae se sa bilo kojom klasom znakova zatvorenom izmeu uglatih zagrada. Svi drugi zamjenski znakovi gube svoje znaenje kada su specificirani kao lanovi klase. \{n,m\} Slae se sa rasponom pojavljivanja pojedinog znaka (ukljuivi znak specificiran regularnim izrazom) koji se nalazi neposredno prije. \{n\} e se slagati sa tono n pojavljivanja, \{n,\}e se slagati sa baren n pojavljivanja, i \{n,m\} e se slagati sa bilo kojim brojem pojavljivanja izmeu n i m. ^ $ \ \(\) Odreuje mjesto regularnog izraza koji slijedi na poetku retka. Znak ^ je poseban jedino kada se pojavi na poetku regularnog izraza. Odreuje mjesto koje prethodi regularnom izrazu na kraju retka. Znak $ je poseban jedino kada se pojavi na kraju regularnog izraza. Ne obrauje poseban znak koji ga slijedi. Sprema uzorak ograen izmeu \( i \) na posebno mjesto za dranje podataka. Na taj nain, u jedan redak moe biti spremljeno do devet uzoraka. Mogu biti ponovo pokrenuti pomou znaka za izlazni slijed \1 do \9. Usage
368 /1275
\n &
Slae se sa ntim uzorkom koji je prije toga spremljen pomou \( i \), n je broj od 1 do 9 i spremljeni uzorci se broje slijeva. Ispisuje cijeli tekst koji se slae kada znak koristimo u string vrijednosti za zamjenu. Tablica 3. Pattern-Matching Metacharacters
369 /1275
Tomislav Grgac
SED
370/1275
371/1275
2. SINTAKSA I KORITENJE
Sintaksa SED naredbe ima dvije forme: > sed [options] 'command' file(s) > sed [options] -f scriptfile file(s) Prva forma omoguava nam da direktno u komandnoj liniji upiemo naredbe za editiranje unutar jednostrukih navodnika, dok nam druga omoguava specifikaciju datoteke u kojoj se nalaze sed naredbe. Na kraju se specificira datoteka na kojoj se provodi editiranje, a ako ona nije navedena sed ita sa standardnog ulaza. U ovom poglavlju opisat emo nain rada te sintaksu za sve opcije i naredbe od adresiranja do funkcija te emo za svaku dati i stvarni primjer. Primjeri e ii postepeno, od nekih opih do kompliciranijih, kako emo obraivati pojedine funkcije. Takoer treba napomenuti da e u veini primjera ulazi i izlazi iz SED-a biti datoteke, to nipoto ne znai da su to jedini naini, dapae, u mnogo sluajeva pipe ili preusmjeravanja su jednostavniji, loginiji, praktiniji, a moda i jedini naini ulaza ili izlaza obzirom na svrhu upotrebe SED-a ili operacije koje mu slijede ili prethode.
372/1275
Izvorna linija ili ulazna datoteka nakon obrade ostaje nepromijenjena jer naredbe za editiranje mijenjaju kopiju izvorne linije s ulaza. Takva kopija se proslijeuje na standardni izlaz, ali se isto tako moe preusmjeriti u datoteku.
2.2. Opcije
Sed prepoznaje tri mogue opcije sa komandne linije: -n - onemoguava standardni izlaz; prikazuje samo linije specificirane sa zastavicom (flag) '/p'. Standardno ponaanje sed-a je da prikazuje sve linije (ili cijelu datoteku)
Primjer: Recimo da elimo datoteku imena "input" obraditi sa nekom sed naredbom i ne ispisati nita: >sed -n 'command' input ili moemo tu izlaz te datoteke pipe-om preusmjeriti u sed i takoer nita ne ispisati: >cat input | sed -n 'command' Idemo sada ispisati, recimo, od 4. do 12. reda: >sed -n '4,12/p' input
-e - oznaava da je slijedei argument naredba za editiranje; nije potreban osim u sluaju postojanja viestrukih komandi za editiranje.
Primjer: Obradit emo datoteku "input" sa dvije sed naredbe: >sed -e 'command1' -e 'command2' input
Primjer: Obradit emo datoteku "input" sa naredbama iz skripte "script te jo jednom naredbom nakon skripte: >sed -f script -e 'command' input
373/1275
2.3. Adresiranje
Linije teksta iz datoteke za obradu mogu se pojedinano selektirati pomou adresa. Adresiranje moe biti preko broja linije ili kontekstno.
2.3.1
Broj linije je decimalni integer. Kako se pojedina linija ita sa ulaza, broja linija se inkrementira, adresa broja linije selektira liniju sa ulaza ime se interni broja linija izjednai sa adresom broja linije. Broja zbraja kumulativno preko vie datoteka s ulaza, odnosno ne resetira se prilikom otvaranja nove datoteke. Kao poseban sluaj, sa adresiranjem pomou znaka '$' dobija se zadnja linija datoteke s ulaza.
Primjer: Probajmo adresirati sedmu liniju i obraditi je za sada s "ostatak naredbe": > sed '7 ostatak naredbe' input Ako pak elimo adresirati raspon linija, recimo od 100-te do kraja input datoteke (pri tome smo kraj nali na 412 liniji sa wc naredbom i to moemo napraviti na slijedei nain: > sed '100,412 ostatak naredbe' input ili krae koristei $: >sed '100,$ ostatak naredbe' input Poto interni broja linija radi kumulativno na vie datoteka, evo jednog primjera i za to (uz preusmjeravanje rezultata u datoteku "output": >sed '100,$ ostatak naredbe' input1 input2 input3 > output ili na drugaiji nain (s pipe-om), ali s istim uinkom: >cat input1 input2 input3 | sed '100,$ ostatak naredbe' > output koristei znak ! kao negaciju probajmo adresirati sve osim linija izmeu 2 i 5: >sed '!2,5 ostatak naredbe' input
2.3.2
Kontekstno adresiranje
Kontekstna adresa je uzorak odnosno regularni izraz unutar znakova '/'. Regularni izrazi koje sed prepoznaje konstruiraju se na slijedei nain: Obini znak (niti jedan od dolje obraenih), je izraz, i u tekstu trai taj znak;
374/1275
Primjer: Napisat emo naredbu koja trai znak A u datoteci input: >sed '/A/' input ili rije UNIX: >sed '/UNIX/' input
Znakom '^' oznaavamo da se trai izraz koji se nalazi na poetku linije (zapoinje tim izrazom);
Primjer: Traimo u datoteci input sve linije koje zapoinju sa slovom A: >sed '/^A/' input ili rijei UNIX: >sed '/^UNIX/' input
Znakom '$' oznaavamo da se trai izraz koji se nalazi na kraju linije (zavrava tim izrazom);
Primjer: Ponovit emo prethodni primjer ali ovaj put traimo pojavu slova A na kraju linije: >sed '/A$/' input ili rijei UNIX: >sed '/UNIX$/' input Evo jednog zanimljivog primjera - kako nai praznu liniju: >sed '/^$/' input
Znak '\n' trai oznaku za novu liniju (ali ne novu liniju u prostoru uzoraka "pattern space");
Primjer: Traimo oznaku za novu liniju: >sed '/\n/' input ovakva traenja su korisna kada elimo umetati ili brisati linije
375/1275
niz znakova u uglatim zagradama '[ ]' trae bilo koji od tih znakova u stringu, a ako je prvi znak u stringu '^' trae se bilo koji znakovi osim tih navedenih u uglatim zagradama '[ ]'; sa znakom '-' oznaujemo niz uzastopnih znakova;
Primjer: Traimo liniju koja poinje s brojem: >sed '/^[0-9]/' input ili liniju koja ne poinje sa znakom A iza kojeg slijedi znak C - tu moemo primjetiti razliito znaenje znaka ^, kao poetak i kao negacija: >sed '/^[^AC]/' input' probajmo sad traiti liniju koja zavrava nekim od znakova izmeu A i K: >sed '/[A-K]$/' input
Izraz iza kojeg stoji znak '*' trai bilo koji broj pojava (ukljuujui nijednu) izraza koji mu prethodi;
Primjer: Traimo znak A iza kojeg slijedi 0 ili vie pojava (zaredom) znaka B: >sed '/AB*/' input ili liniju koja poinje sa razmacima: >sed '/^ */' input'
konkatenacija (spajanje) izraza je opet izraz koji trai konkatenaciju stringova koji se podudaraju sa komponentama izraza;
Primjer: Kako bi recimo nali rije UNIX bez obzira da li je pisana velikim ili malim slovima: >sed '/[Uu][Nn][Ii][Xx]/'
sekvence, ali ima popratni uinak koji emo opisati pod funkcijom 's' i pod
376/1275
izraz '\(n,m\)' (n i m su brojevi) trai niz pojava znakova koji se trae unutar sekvence '\ \' napisane prije nje; '\n\)' e traiti n-tu pojavu; '\n,\)' e traiti najmanje n-tu pojavu; '\(n,m\)' e traiti bilo koju pojavu izmeu n i m;
Primjer: Printat emo samo linije koje sadre 65 znakova i vie >sed -n '/^.\(65\)/p' input
izraz '//' ili "nul izraz" je jednak kao zadnji kompajlirani izraz;
Ako elimo koristiti neke od specijalnih znakova (^ $ . * [ ] \ /) kao elemente izraza, koristimo ih u kombinaciji s '\'.
2.3.3
Broj adresa
Naredbe mogu imati 0, 1 ili 2 adrese. Ukoliko za naredbu postoji vie adresa od maksimalno dozvoljenih, to e se smatrati grekom. Ako je nije navedena niti jedna adresa, ona se primjenjuje na sve linije s ulaza. Ako je navedena jedna adresa, ona se primjenjuje na sve linije koje se s njom podudaraju. Ako su pak navedene dvije adrese, one se primjenjuju na sve linije koje se nalaze izmeu traenih (adresiranih), ukljuujui i njih. Kod pisanja naredbi takve dvije adrese se odvajaju zarezom.
2.4. Funkcije
Funkcije su u stvari bit sed-a. One su te koje mijenjaju ulazni string. Naredba za editiranje se sastoji od adrese (koje smo opisali gore) i od funkcije. Funkcije se imenuju jednim znakom i dijelimo ih na slijedee podgrupe: Funkcije orijentirane na cijelu liniju (Whole-Line Oriented Functions) koje dodaju, briu ili mijenjaju cijele linije teksta; Zamjenske Funkcije (Substitute Functions) koje trae i mijenjaju regularne izraze unutar linije; Ulazno izlazne funkcije (Input-Output Functions) koje se bave itanjem i zapisivanjem linija ili datoteka;
377/1275
Funkcije vie ulaznih linija (Multiple input-line functions) koje trae izraze koji se proteu kroz vie linija; Funkcije uvanja i dohvaanja (Hold and Get Functions) koje omoguavaju spremanje i uitavanje ulaznog teksta za kasniju upotrebu; Funkcije kontrole toka (Flow of Control Functions) koje kontroliraju redoslijed primjene funkcija; Ostale funkcije (Miscellaneous Functions)
n - slijedea linija (next line) Funkcija n ita slijedeu liniju s ulaza zamjenjujui trenutnu liniju koja se ako je tako specificirano zapisuje na izlaz, a kontrolu preuzima naredba koja slijedi iza n.
Primjer: Dodat emo praznu liniju iza svake druge linije (koristit emo G (get) funkciju opisanu u poglavlju 2.4.5. gdje dodajemo sadraj privremenog buffera koji je prazan): >sed -e 'n' -e 'G' input
378/1275
a\ <text> - dodavanje teksta (append) Funkcija a dodaje tekst iz argumenta nakon linije koja je adresirana. Funkcija se pie na kraju linije, iza nje se pie '\', a tekst koji se dodaje ide u slijedeu liniju. Ukoliko tekst iz argumenta ide u vie linija oznake za nove linije moraju biti "skrivene" tako to e znak '\' prethoditi svakoj novoj liniji. Rezultat e se poslati na izlaz nakon to se izvre naredbe za editiranje, bez obzira na to to se desilo sa adresiranom linijom (ona je ak mogla biti obrisana ili zamijenjena funkcijom d ili c).
Primjer: Ubacit emo liniju s tekstom "Programski alati na UNIX raunalima" iza svake linije koja sadri rije "Kolegij": >sed '/Kolegij/a\ >Programski alati na UNIX raunalima' input
i\ <text> - umetanje teksta (insert) Funkcija i radi isto to i funkcija a, osim to se tekst iz argumenta dodaje ispred linije koja je adresirana.
Primjer: Ubacit emo liniju s tekstom "/*Komentar: ovo je pretprocesorska direktiva*/" ispred svake linije koja poinje s "#": >sed '/^#/i\ >/*Komentar: ovo je pretprocesorska direktiva*/' input
c\ <text> - zamjena teksta (change) Funkcija c brie adresiranu liniju i zamjenjuje je sa tekstom iz argumenta. Poput finkcija i i a ako postoji vie linija teksta s kojim se zamjenjuje, nove linije moraju biti skrivene sa '\'. c funkcija moe imati dvije adrese te samim time adresirati regiju teksta. Takva selektirana regija se brie te se umjesto nje umee tekst iz argumenta (umetanje se vri jednom za cijelu regiju, a ne za svaku pojedinanu liniju iz regije).
379/1275
Primjer: Zamijenit emo svaku liniju koja je prazna s linijom koja sadri tekst "prazna linija": >sed '/^$/c\ >prazna linija' input probajmo sada zamijeniti linije od 4. do 6. sa linijama "etvrta linija", "peta linija" i "esta linija": >sed '4,6/c\ >etvrta linija\ >peta linija\ >esta linija' input
Po defaultu e samo prvi niz znakova koji se podudara s uzorkom biti zamijenjen, ali i tome se moe doskoiti (vidi flag g ispod). <Replacement> nije uzorak, odnosno svi posebni znakovi koji se upotrebljavaju kod uzorka, nemaju specijalno znaenje. Pa ipak neki drugi znakovi su specijalni: & - taj znak e se zamijeniti sa skupom znakova koji se podudara s uzorkom <pattern>;
Primjer: Zamijenit emo pojavu teksta "UNIX" sa "Programski alati na UNIX raunalima" koristei specijalni znak & (primjetimo da ne moramo koristiti escape sekvence za navodnike): >sed 's/UNIX/"Programski alati na & raunalima"/' input
380/1275
\d - (d je jednoznamenkasti broj) bit e zamijenjen sa d-tom pojavom znakova koji se trae unutar sekvence "\( \)".
Primjer: >sed 's/\(alati \)\(programski \)/\2\1/' input Ovdje smo imali primjer zamjenske funkcije koja se sastoji od regularnog izraza podjeljenog u dvije grupe " alati " i "programski". Ako se ta funkcija primjeni na liniju koja sadri izraz "alati programski", regularni izraz "hvata" svaku od podgrupa, dok zamjenski izraz \2\1 zamjenjuje redoslijed grupa i producira izraz "programski alati"
Argument <flags> moe sadravati slijedee zastavice (flag-ove): g - zamjenjuje <replacement> argument za sve pojave argumenta <pattern> u liniji. Nakon uspjene zamjene, potraga za slijedeom instancom argumenta <pattern> poinje iza prethodno umetnutog niza znakova.
Primjer: Zamijenit emo svaku pojavu teksta "password" sa "xxxxxxxx" izmeu prve i 15 linije: >sed '1,15 s/password/xxxxxxxx/g' input
n - (n je broj izmeu 1 i 512) zamjenjuje <replacement> argument za n-tu pojavu argumenta <pattern> u adresiranoj liniji.
Primjer: Zamijenit emo treu pojavu teksta "kuna" sa "dolar" za drugu liniju ulaza: >sed '2 s/kuna/dolar/3' input
p - daje liniju na standardni izlaz ako (i samo ako) je zamjena uspjeno obavljena. Tu moemo primjetiti da ako postoji vie s funkcija koje imaju p zastavicu (flag), koje uspjeno izvedu zamjenu na istoj liniji s ulaza, tada emo na izlaz dobiti vie kopija obraene linije - po jednu za svaku uspjenu zamjenu.
Primjer: Ako naa input datoteka sadri tekst: >Prva linija >Dobro more Dobro jutro >trea linija tada primjenom slijedee sed naredbe: >sed 's/Dobro/Plavo/p input kod veina verzija SED-a dobivamo na ispis slijedee:
381/1275
>Prva linija >Plavo more Dobro jutro >Plavo more Dobro jutro >trea linija objanjenje toga je da SED po default-u printa sve linije, dok p flag trai ispis uspjeno izmjenjene linije. Ukoliko primjenimo slijedeu sintaksu: >sed -n 's/Dobro/Plavo/p' input dobivamo: >Plavo more Dobro jutro onemoguili smo default-ni ispis -n opcijom, a p flagom traili ispis samo promijenjene linije. Ako pak elimo dobiti ispis cijele datoteke, ukljuujui i promijenjene linije te da nema dupliciranja, neemo koristiti niti -n opciju, niti p flag. Recimo da elimo u naoj datoteci input promijeniti sve pojave "Dobro" u "Plavo" u liniji i istodobno ispisati promijenjenu liniju, tada koristimo kombinaciju flagova g i p (g mora biti prvi), a sintaksa izgleda: >sed 's/Dobro/Plavo/gp input
w <filename> - ta zastavica (flag) omoguuje da se linija koja je uspjeno bila obraena s funkcijom zapisuje u datoteku danu argumentom <filename>. Tu, kao i kod p zastavice (flag-a) moemo imati zapisivanje vie razliitih kopija iste linije. Ako datoteka specificirana <filename> argumentom ve postoji, bit e prepisana, a ako ne postoji, bit e kreirana kao nova. Kombiniranjem w zastavice i w funkcije (opisane ispod) mogue je specificirati do 10 razliitih naziva datoteka.
Primjer: Koristit emo datoteku input sa sadrajem iz prethodnog primjera i primjenom slijedee sintakse: >sed 's/Dobro/Plavo/w output' input na standardni izlaz, ali i u datoteku output smo zapisali linije koja je promijenjena (samo prva promjena): >Plavo more Dobro jutro ako pak elimo napraviti izmjene na cijeloj liniji, koristimo kombinaciju g i w flagova: >sed 's/Dobro/Plavo/gw output' input i dobivamo na ekranu i u datoteci output: >Plavo more Plavo jutro ako pak elimo izlaz na paralelni printer (LPT1) tada je sintaksa: >sed 's/Dobro/Plavo/gw lpt1' input ili redirekcijom na printer bez koritenja w flaga: > sed 's/Dobro/Plavo/g' input > LPT1:
382/1275
p i w flagovi funkcije s rade isto kao samostalne funkcije p i w (opisane dolje) osim to su ovisne o uspjehu svoje zamjenske funkcije s.
w <filename> - zapisuje adresiranu liniju u datoteku specificiranu sa <filename>. Ako datoteka specificirana <filename> argumentom ve postoji, bit e prepisana, a ako ne postoji, bit e kreirana kao nova. Kao i kod funkcije p linija se zapisuje u trenutku nailaska na p funkciju, bez obzira to slijedee naredbe za editiranje rade na liniji. Mogue je specificirati do 10 razliitih naziva datoteka (kombiniranjem sa zastavicom (flag) w funkcije s.
Primjer: Kod funkcije za zamjenu w flag smo koristili za zapisivanje samo promijenjenih linija u datoteku. Funkcija w moe stajati sama i recimo da cijelu promijenjenu datoteku elimo spremiti moemo koristiti slijedeu opu sintaksu: >sed -e 'funkcija koja mijenja' -e 'w output' input a stvarni primjer: >sed -e 's/kuna/dolar/g' -e 'w output' input Napomena: Nigdje ne stoji da datoteka input i output moraju biti razliite, dapae, w funkcija (i w flag s funkcije) e vrlo rado izvriti spremanje rezultata u datoteku iz koje smo itali podatke, tako da ako je to stvarno ono to elimo, moramo paziti na pravilnu sintaksu i smisao funkcija i opcija koje prethode w funkciji jer nakon to se w funkcija izvri povratka nema.
383/1275
r <filename> - ita sadraj datoteke zadane argumentom <filename> i dodaje (append) ga nakon linije koja se poklapa s adresom. Datoteka e se proitati i dodati (appendirati) bez obzira to slijedee naredbe za editiranje rade na obraivanoj liniji. Ako su funkcije r i a (opisane gore) izvrene na istoj liniji, tekst iz funkcije a i funkcije r su dodani onim redom kako su funkcije izvravane. Ako pak datoteka iz argumenta <filename> ne moe biti otvorena, smatra se da je "NULL file", te se nee tretirati kao greka.
Primjer: >sed 'r source' input ovakvu sintaksu nemojte koristiti osim ako niste sigurni da to elite. Naime, poto nema adresiranja, ovakav kod e uzrokovati da se sadraj datoteke source ubaci iza svake linije datoteke input, to moe biti nezgodno ako je datoteka source jako velika. Probajmo radije ubaciti njen sadraj iza 4 linije datoteke input: >sed '4r source' input Sintaksa r funkcije ne doputa specifikaciju vie od jedne adrese tako da e slijedei kod uzrokovati greku: >sed '4,7r source' input ako ipak elimo ubaciti sadraj datoteke source iza svake od 4. do 7. linije potrebno je koristiti funkciju za grupiranje { } koju emo opisati u poglavlju 2.4.6, a kod bi izgledao: >sed '4,7{ >r source >}' input
Napomena: Poto postoji limit na broj datoteka koje se mogu otvoriti istovremeno, treba obratiti panju da ne bude vie od 10 datoteka spomenutih u w funkciji i w zastavici (flagu) s funkcije, te da se taj broj smanjuje za 1 ako se izvrava i r funkcija (samo jedna datoteka za itanje moe biti otvorena).
384/1275
Primjer: Sama za sebe N funkcija nije previe zanimljiva jer ne mijenja ulazni tekst, ali probajmo napraviti slijedee:na liniju koja zavrava s tokom, dodat emo slijedeu liniju s ulaza (opet emo koristiti funkciju grupiranja { }): >sed '/\.$/ { >N >s/\n// >}' input ili drugi primjer gdje emo izbrisati sav tekst izmeu rijei "poetak" u prvoj liniji i rijei "kraj" u drugoj liniji (opet koristimo funkciju grupiranja i to sada i sa njenim ugnjeivanjem): >sed '/poetak/ { >N >/\n.*kraj/ { >s/poetak.*\n.*kraj/poetak kraj/ >} >}' input
D - funkcija koja brie prvi dio vielinijskog prostora uzoraka kreiranog N funkcijom i to do i ukljuujui prve oznake za novu liniju. Nakon izvrenja nastavlja se editiranje s prvom naredbom iz skripte. Ukoliko ova funkcija potpuno izbrie prostor uzoraka (a to znai da je oznaka za novu liniju bila ujedno i kraj), tada se ita nova linija s ulaza.
Primjer: Koristit emo primjer slian prethodnom samo emo ovog puta obrisati liniju u kojoj se nalazi rije "poetak" ako se u slijedeoj liniji nalazi rije "kraj": >sed '/poetak/ { >N >/\n.*kraj/ D }' input
P - funkcija koja tampa prvi dio vielinijskog prostora uzoraka kreiranog N funkcijom i to do i ukljuujui prve oznake za novu liniju.
Primjer: I opet primjer s "poetak" i "kraj", ali sada, umjesto brisanja, isprintat emo liniju u kojoj se nalazi rije "poetak" ako se u slijedeoj liniji nalazi rije "kraj": >sed -n '/poetak/ { >N >/\n.*kraj/ P }' input i sada evo primjera gdje kombiniramo sve tri Multiple input line funkcije (najei redoslijed njihove primjene je prvo N pa P i na kraju D); traimo liniju koja sadri rije "poetak", uitavamo slijedeu liniju, ako u njoj postoji rije "kraj" briemo sav tekst izmeu njih, printamo i briemo prvu liniju:
385/1275
>sed '/poetak/ { >N >/poetak.*kraj/ { >s/poetak.*kraj/poetak kraj/ >P >D >} >}' input
Funkcije P i D su ekvivalenti funkcija p i d ukoliko na njih nije bila primjenjena funkcija N, odnosno u prostoru uzoraka nema oznake za novu liniju.
Primjer: sed 'x' input > output ovakva sintaksa e dodati praznu liniju na poetak datoteke i izbrisati zadnju liniju. Evo kako radi: na prvoj liniji se izmjenjuje sadraj privremenog buffera (koji je prazan) sa sadrajem prve linije koja je sad pohranjena u buffer, druga linija se izmjenjeuje s prvom i tako dalje do zadnje linije koja se sprema u buffer i izmjenjuje s predzadnjom koja je u bufferu. Slijedi izlazak iz naredbe ime je obrisan buffer u kojem je bila zadnja linija koja nije nigdje zapisana.
{ } - funkcija za grupiranje naredbi omoguuje da se skup naredbi unutar nje tretira, na linijama selektiranim u adresnom dijelu, kao jedan blok. Prva naredba u bloku moe (i ne mora) biti u istoj liniji sa { dok se zatvaranje bloka naredbi oznaava sa } i mora biti u posebnoj liniji. Takoer je bitno spomenuti da se grupe mogu ugnjeivati.
Primjer: Poto smo ve u prijanjim primjerima imali upotrebu funkcije za grupiranje, evo jednog primjera njenog ugnjeivanja (nesting): >sed /^Poetak/ { >/10000/ { >s/Zgb/Zagreb/2 >s/^/Promijenjeni / >} >}' input evo pojanjenja to smo napravili: adresirali smo sve linije koje poinju s "Poetak"; primjenjujemo funkciju za grupiranje i u njog adresiramo sve linije koje sadre 10000; na njima primjenjujemo novu funkciju grupiranja u kojoj mijenjamo drugu pojavu stringa "Zgb" u "Zagreb" i na poetak linije umeemo string "Promijenjeni"
387/1275
:<label> - ova funkcija biljei mjesto u listi naredbi za editiranje kojem se mogu obratiti b i t funkcije (obraene ispod). Argument <label> moe biti niz od osam ili manje znakova. Ukoliko postoje dvije ili vie istih labela funkcije :, generirat e se compile time diagnostic te nee biti pokuaja izvrenja. Funkcija : i njen argument se piu zajedno (bez razmaka).
Primjer: Primjer za samu funkciju je prilino besmislen. Funkcija e zabiljeiti dio koda, ali bez funkcija grananja b i t, nikad nee biti ponovo pozvan.No ipak, evo sintakse: >sed ':labela' input
b <label> - grananje do labele (branch to label) - ova funkcija uzrokuje da se transferira kontrola na neku drugu liniju u skripti. Labela je opcionalna, a to znai da, ako je ima izvrenje se nastavlja na liniji obiljeenoj funkcijom : i pripadajuom labelom, a ako je nema, kontrola se transferira na kraj skripte. Ukoliko pak nije pronaena funkcija : s istom labelom, generirat e se compile time diagnostic te nee biti pokuaja izvrenja. Funkcija grananja moe se iskoristiti za izvravanje niza naredbi kao procedura koja moe biti zvana vie puta iz glavnog tijela skripte.
Primjer: Ako je linija prazna idi na kraj skripte: >sed '/^$/b' input
t <label> - testiranje promjene (test substitutions) - ova funkcija testira da li je na trenutnoj liniji s ulaza uspjeno izvrena neka promjena. Ukoliko je, izvrava se grananje do labele markirane : funkcijom, a ukoliko nije, ne dogaa se nita. Zastavica (flag) koja oznaava da je uspjeno izvrena promjena na liniji se ponitava izvravanjem t funkcije ili itanjem nove linije s ulaza.
Primjer: Ako postoji vie praznih linija zaredom, briemo sve osim jedne: >sed '/^$/ { >:loop >N >s/^\n$// >t loop >}' input postupak je slijedei: traimo praznu liniju; kad i ako je naemo grupiramo daljnje funkcije i labelom oznaavamo poetak; uitavamo slijedeu liniju; radimo zamjenu: ako linija izmeu svog poetka i kraja ima samo embedded newline briemo ga; ako je za supstitucija uspjela granamo se do labele loop i ponavljamo dok god se supstitucija ne izvri (linija nije prazna).
388/1275
Primjer: Evo kako moemo saznati koliko linija ima naa datoteka input: >sed -n '$=' input Napomena: funkcija = sama ne broji linije, ve samo ispisuje redni broj adresirane linije. Kad smo ve kod adresirane linije idemo ispisati broj linije koja poinje s "Poetak" >sed -n '/^Poetak/=' input ako pak elimo ispred svake linije dodati njen broj koristimo slijedeu sintaksu: >sed -n -e '=' -e 'p' input
q - quit - funkcija koja uzrokuje da se trenutna linija zapie na izlaz (ako treba), svi dodani ili proitani tekstovi da se zapiu i da se prekine izvravanje.
Primjer: Ako elimo isprintati prvih 10 linija koristei q funkciju to bi izgledalo ovako: >sed '10q' input apsolutno isti uinak dobili bi koristei p funkciju: >sed -n '1,10p' input slijedei kod bi printao sve linije od prve do i ukljuujui i onu u kojos se nalazi "traeni tekst" i nakon toga prekinuo rad: >sed '/traeni tekst/q' input Napomena: Pri koritenju q funkcije treba biti oprezan ako se promjene zapisuju u originalnu datoteku iz koje itamo jer nakon izvrenja funkcije q nema vie zapisivanja na izlaz.
Obje funkcije primaju samo jednu adresu tako da ako elimo raditi s vie adresa ili regijom, moramo koristiti funkciju za grupiranje. Ovime smo pokrili sve osnovne funkcije SED-a. Postoje jo neke funkcije koje nisu sastavni dio McMahonovog SED-a, ali ih podravaju neke druge verzije. Za te funkcije neemo davati primjere ve emo ih samo popisati i objasniti: y - transform - funkcija slina zamjenskoj funkciji s (ima istu sintaksu), a radi trasformiranje znakova u adresnom dijelu sa znakovima u replacement dijelu l - ispusuje trenutni sadraj prostora uzoraka (korisno kod debuggiranja skripte) ; - function (command) stacking - funkcija koja nam omoguuje slaganje vie SED funkcija jednu iza druge bez upotrebe -e opcije ili { } funkcije.
389/1275
3. ZAKLJUAK
Prilikom izrade ovog seminara naao sam se u dilemi: da li od poetka krenuti sa stvarnim, konkretnim primjerima rjeavanja nekog odreenog, konkretnog problema ije su sintakse obino prilino nerazumljive i komplicirane ili poeti od jednostavnih i openitih primjera pa ih vremenom kombnirati i "komplicirati". Traei literaturu i primjere na internetu, ustanovio sam da je onih prvih puno vie te da je veina materijala raena povrno i pogotovo nesistematino. Najbolji primjer toga su materijali koji daju popis opcija, adresiranja i funkcija abecedno, ne pazei na njihovo grupiranje ili nain rada samog SED-a, ime je vrlo teko korisniku poetniku nai i primjeniti ono to mu treba. Stoga sam odluio da ovaj seminar bude pisan za nekog tko se jo sa SED-om nije susretao, a eli ga nauiti i nakon toga ga znati uspjeno primjeniti, a za one koji imaju kakav stvaran problem, moda im poslui neka od gotovih skripti koje se nalaze u dodatku. U svakom sluaju, SED je izuzetan alat. Na alost, veina ljudi ne uspije shvatiti njegovu pravu snagu. Jezik je vrlo jednostavan, ali dokumentacija je loa. Korisnici (programeri) e pisati programe za editiranje nekog teksta esto neznajui da isti cilj mogu postii sa nekoliko ili ak jednom sed naredbom.
390/1275
4. DODATAK
Skripta za brisanje vie od jedne prazne linije izmeu "nepraznih" linija
# Write non-empty lines. /./ { p d } # Write a single empty line, then look for more empty lines. /^$/ p # Get next line, discard the held <newline> (empty line), # and look for more empty lines. :Empty /^$/ { N s/.// b Empty } # Write the non-empty line before going back to search # for the first in a set of empty lines. p
Skripta za pretvaranje prvog slova rijei iz malih u velika slova (Carlos Duarte)
# idea: # . grab all first chars of all words into the second part of line # . convert that chars # . for each word, replace first char with those # # if line is: "carlos duarte", then # # carlos duarte # \ncarlos duarte\nCD # Carlos \nduarte\nD # Carlos Duarte\n\n h s/\([a-zA-Z]\)[a-zA-Z][a-zA-Z]*/\1/g s/[^a-zA-Z]*//g y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ x G s/^[^a-zA-Z]*/&\ / ta :a s/\n[a-zA-Z]\([a-zA-Z][a-zA-Z]*[^a-zA-Z]*\)\(.*\n\)\(.\)/\3\1\ \2/ ta P d
391/1275
Skripta za formatiranje teksta tako da ni jedne linija nije dua od 40 znakova (Carlos Duarte)
# fmt.sed -- format text such as each line gets below 40 chars # Carlos Duarte, 980528 :a /^.\{40\}/!{ $q N s/ *\n */ / ba } s/^.\{40\}/&\ / s/^\(.*\) \(.*\)\n/\1\ \2/ P s/^.*\n// ba
392/1275
Skripta za centriranje svih linija datoteke na 80 znakova (lako podesivo na druge veliine)
# center all lines of a file, on a 80 columns width # # to change that width, the number in \{\} must be replaced to w+1, and # the number of added spaces also must be changed # 1{ # Prepare 80 spaces in the buffer x s/^$/ / s/^ *$/&&&&&&&&/ x } # del leading and trailing spaces y/ // s/^ *// s/ *$// # add a new-line and 80 spaces to end of line G # keep 1st 81 chars (80 + new-line) s/^\(.\{81\}\).*$/\1/ # spaces are split into two halves through the use of back-refs. s/^\(.*\)\n\( *\)\2.*$/\2\1/
393/1275
/^"/{ : double /^$/{ x p n /^"/b break b double } H x s,\n\(.[^\"]*\).*,\1, x s,.[^\"]*,, /^"/b break /^\\/{ H x s,\n\(.\).*,\1, x s/.// } b double } /^'/{ : single /^$/{ x p n /^'/b break b single } H x s,\n\(.[^\']*\).*,\1, x s,.[^\']*,, /^'/b break /^\\/{ H x s,\n\(.\).*,\1, x s/.// } b single } /^\/\*/{ s/.// : ccom s,^.[^*]*,, /^$/ n /^\*\//{
394/1275
395/1275
Kreimir Heimovi
GCC COMPILER
396/1275
Programski alati na Unix raunalima GCC compiler "Ne smije vam past na pamet kritizirati GCC dok ga dobro ne upoznate!" Pavle poljari Zagreb, 08.01.2004.
SOFTWARE
Raunala ne mogu nita napraviti bez uputa korisnika. Da bi napravili bilo koji posao morate raunalu dati niz instrukcija. Taj set instrukcija naziva se raunalni program. Software se odnosi na skup raunalnih programa i procedura koje opisuju kako koristiti te programe. Moemo rei da je software kolekcija programa koje poveavaju mogunosti hardware-a. Software vodi raunalo pri svakom koraku, gdje da pone i gdje da zavri odreeni posao. Proces izrade softvera je ono to svi nazivamo programiranje. Raunalni software se obino dijeli na dvije iroke kategorije: sistemski software aplikacijski software Sistemski software Znamo da je program set instrukcija koje se moraju uitati u raunalo da bi moglo raditi. Kad upalite raunalo neki programi se izvre i aktiviraju razliite dijelove raunala i spremaju ga za rad. Taj set programa je sistemski software. Stoga moemo rei da je sistemski software set od jednog ili vie programa napravljenih za kontroliranje rada raunala kao sistema (komunikacija s printerom, diskom, kontrola upotrebe memorije i procesora i sl.). Bez sistemskog softwareas (operacijskog sustava- DOS, WINDOS, UNIX) nije mogue raditi na raunalu. Razvoj sistemskog softwarea je kompleksan posao i zahtjeva mnogo znanja o raunalnoj tehnologiji. Zato se za razliku od aplikacijskog softwarea ne razvija kod kue. Aplikacijski software je set programa koji izvravaju operacije za odreenu primjenu (pisanje teksta, izrada statistikih izvjetaja, analiza podataka itd). Jedan primjer aplikacijskog softwarea su programski jezici.
397/1275
PROGRAMSKI JEZICI
Upoznati smo sa terminom "jezik". Jezik je sistem komunikacije izmeu dvije ili vie osoba. Moemo komunicirati na nekoliko jezika: hrvatski, engleski, njemaki... No kako komunicirati sa raunalom. Raunalo nee razumjeti govorne jezike (za sada) za prijenos podataka i instrukcija. Zato postoje programski jezici posebno razvijeni da moete prenijeti podatke i instrukcije raunalu za obavljanje odreenog posla. FORTRAN, BASIC, C, COBOL samo su neki od mnotva programskih jezika. Instrukcije i programi piu se u odreenom jeziku ovisno o vrsti posla koju elimo da program obavlja. Na primjer za znanstvene aplikacije koristi se FORTRAN, a za poslovne COBOL. Svaki programski jezik moe se kategorizirati u slijedee kategorije: jezici visoke razine - High Level Languages jezici niske razine - Low Level Languages (strojni i asemblerski jezici)
398/1275
b) Asemblerski jezik To je prvi korak ka poboljanju strukture programiranja. Poto raunalo prepoznaje brojeve i slova odreena kombinacija alfanumerika se moe iskoristiti za zamjenu strojnog koda. Asemblerski jezik, dakle, tvori set simbola i slova a prevoditelj (asembler) je taj koji prevaa asemblerski jezik u strojni. Programiranje u asemnbleru je mnogo lake jer omoguava programeru da lake shvati kod. Npr. liniju koda (izmiljena) "CPx1000 R1", koja kopira (CP-copy) sadraj s adrese(x) 1000 u registar R1, lake je shvatiti nego "1010 1000 1110" (1010-copy, 1000-adresa, 1110-registar). Asebblerski jezik ima istu razinu izvravanja kao i strojni jezik, jer je asembler prevoditelj jedan-za-jedan. (jedna naredba u asemblerskom jeziku = jedna naredba u strojnom jeziku). Glavni nedostatak asemblerskog jezika je to to je strojno ovisan. Program napisan za jedno raunalo moda se nee pokrenuti na drugim raunalima sa drugaijom konfiguracijom hardwarea.
399/1275
primjer.c
C kompajler
primjer.exe
Kompajler (Compiler)
Kompajler je prevoditelj koji prevodi naredbe pisane u jeziku visoke razine u strojni jezik. Zove se kompajler jer kompajlira (najblii prijevod bio bi - prevodi). Kompajler je programski prevoditelj poput asemblera samo mnogo sofisticiraniji. On najprije pregledava program i onda ga prevodi u strojni jezik. Program koji pie programer u nekom jeziku visoke razine naziva se izvorni program (source program), a kod tog programa izvorni kod (source code). Kad kompajler taj program prebaci u strojni jezik dobiva se objektni program. Kompajler moe prevoditi samo one izvorne programe koji su pisani u jeziku za koji je kompajler namijenjen. Fortran kompajler nee kompajlirati izvorni kod napisan u COBOL-u. Objektni program koji napravi kompajler je strojno ovisan. To znai da se programi kompajlirani za jednu platformu nee izvravati na drugoj. Zato svaka platforma mora imati svoj kompajler za odreeni programski jezik. Platformska neovisnost postie se koritenjem jezika vie razine na razliitim platformama.
400/1275
Interpreter
Interpreter je jedna druga vrsta prevodioca koja se koristi za prevoenje programskih jezika viih razina u strojni jezik. On uzima jednu naredbu jezika vie razine, prevodi ju u strojni jezik i odmah ju izvrava. Prevoenje i izvravanje izvodi se za svaku naredbu. Uvelike se razlikuje od kompajlera koji prevodi cijeli program u strojni jezik i ne izvrava ga. Prednost interpretira nad kompajlerom je brza reakcija na promjene u izvornom programu. On eliminira potrebu za zasebnim kompajliranjem nakon promjena za svaki program. Interpretere je relativno lako napisati u usporedbi s kompajlerima i ne zahtijevaju mnogo memorije. Problem je to se izvrenje svake naredbe svaki put najprije prevodi pa onda izvrava. Zato se kompajlirani program izvrava mnogo bre nego interpreterski program.
401/1275
Fortran
Jedan od najstarijih programskih jezika, FORTRAN, razvio je tim programera IBM-a na elu s Johnom Backusom i prvi put je predstavljen 1957. Ime FORTRAN je akronim od FORmula TRANslation, jer je napravljen da olaka prevoenje matematikih formula u kod. Zbog toga se esto se govori o FORTRANu kao znanstvenom jeziku. FORTRAN je prvi jezik visoke razine koji je koristio prvi kompajler ikad napravljen. Prije njegova razvitka programeri morali su pisati u strojnom/asemblerskom kodu. Cilj dizajniranja FORTRANa, bio je da se napravi programski jezik kojeg bi bilo lako nauiti, koji bi bio prikladan za razliite aplikacije, neovisan o platformi i omoguavao da se kompleksni matematiki izrazi piu slino obinoj algebarskoj notaciji. Uz sve to ideja je bila da bude gotovo jednako efikasan pri izvravanju kao asemblerski jezik. Poto je FORTRAN mnogo lake kodirati programerima je omogueno 500% bre pisanje programa, dok se efikasnost izvravanja smanjila za samo 20%. To je omoguilo programerima da se vie posvete rjeavanju aspekata problema a manje samom kodiranju. FORTRAN je nije bio inovativan samo zbog toga to je bio prvi jezik visoke razine, ve i zbog svog kompajlera, koji je priznat kao roditelj nove grane raunalne znanosti teorija kompajlera. Nekoliko godina nakon izdavanja, FORTRAN je razvio mnogo dijalekata (zbog tweakanja programera koji su ga eljeli prilagoditi za svoje potrebe) i bilo je teko prenaati program s jednog stroja na drugi.
402/1275
ANSI (American National Standards Institute) je 1966. izdala prvi Standard za Programski Jezik. Ta standardizirana verzija poznata je kao FORTRAN '66 (FORTRAN IV). Unato standardizaciji, nekoliko godina poslije ponovno se pojavila skupina dijalekata, pa je bilo potrebno da ANSI pogleda stvar jo jednom. Nova standardizirana verzija izlazi 1978. pod nazivom FORTRAN '77 (jer je ANSI poeo s revizijom 1977.). U tu verziju ukljuene su neke nove opcije:nov nain rukovanja grekama i mehanizmi za velike programske projekte. Zadnja verzija, Fortran '90 (vie nije sve velikim slovima) dodaje jo novih mogunosti: rekurziju, pokazivae i korisnike tipove podataka. Budunost Fortrana '90: Trenutna istraivanja u teoriji kompajlera ukljuuju sposobnosti kompajlera da generira objektni kod koji e moi iskoristiti mogunosti velikih paralelnih raunala. Fortran '90 kompajleri su glavne mete takvih istraivanja.
C
Programski jezik C je prvobitno razvio Dennis Richie (Bell Laboratories) 1970. iz BCPL-a (B Compiler), s namjerom da se pokree na PDP-11 sa UNIX operacijskim sustavom. Prvobitni naziv mu je bio NB (New B). Iako je namijenjen da se pokree pod UNIX-om, postojao je veliki interes za pokretanje C-a pod MS-DOS-om na IBM PC i kompatibilnim raunalima. To je odlian jezika takvu okolinu zbog jednostavnosti izraza, cjelovitosti koda i irokog spektra primjene. Zbog jednostavnosti pisanja C compiler je obino prvi jezik visoke razine dostupan na svakom novom raunalu, ukljuujui mikroraunala, miniraunala i mainframe raunala. C nije najbolji jezik za poetnike, jer na prvi pogled izgleda zagonetan. On doputa programeru irok raspon operacija od visoke razine do vrlo niske, pribliavajui se razini asemblerskog jezika. Gotovo da nema granice dozvoljene fleksibilnosti. Jedan iskusan C programer davno je izjavio: "U C-u moete programirati sve", mnogo C-programera i jo vise C-programa mogu potvrditi njegovu izjavu. Sa velikom dozom slobode koju prua C morate prihvatiti i velik dio odgovornosti, jer je vrlo lako napisati program koji se rui zbog bezvezne male greke koju e neki drugi kompiler oznaiti i pozvati fatal error. U C-u ste preputeni sami sebi. Programiranje u C-u je odlino na podrujima gdje bi ste eljeli koristiti asemblerski jezik sa jednostavnou pisanja i lakoom odravanja. Kae se da program napisan u C-u
403/1275
"plaa" poveanje od 20 do 50% u brzini izvedbe, jer niti jedan jezik visoke razine nije tako cjelovit kao asemblerski jezik. Ipak vrijeme koje se utedi na kodiranje moe biti ogromno, to ini C najpoeljnijim jezikom za mnoge programere. S druge strane, poto veina programa troi 90 posto svoga vremena u samo 10 posto ili manje koda, mogue je napisati C program i potom prepraviti mali dio koda u asemblerskom jeziku i na taj nain dobiti na brzini programa, kao da je cijeli napisan u asemblerskom jeziku. Kad je postalo oigledno da programski jezik C postaje vrlo popularan jezik dostupan na razliitim platformama, grupa zabrinutih pojedinaca sastala se da predloi standardni set pravila za koritenje C-a. Grupa je predstavljala sve sektore software industrije i nakon mnogo sastanaka i puno predloaka, napisali su prihvatljiv standard za programski jezik C. Prihvaen je od strane ANSI-a (American National Standards Institute) i ISO-a (International Standard Organization). Nitko ga nikome nije nametnuo, no poto je tako iroko prihvaen bilo bi nerazborito, za bilo kojeg pisca compiler-a, odbiti prilagoditi se standardu. Danas vie nije bitno treba li kod programskog jezika C pronalaziti loe strane ili ga hvaliti, kao to nema smisla raspravljati o tome je li dobra sadanja signalizacija na prometnicama ili bi bilo bolje zamijeniti znaenje crvenog i zelenog svijetla. Bavimo li se djelatnou u kojoj se koristi jezik C, moramo ga to prije usvojiti i primjenjivati. Pri tome postoje razliite razine koritenja meu kojima je najvanija razumijevanje ve napisanog programa C uz mogunost njegove promjene (prilagodbe) pri rjeavanju konkretnog problema. Ta razina zahtijeva relativno malo napora za ovladavanje jezikom, a u praksi je prijeko potrebna.
C++
C++ je objektno orijentiran jezik koji je napravio Bjarne Stoustrup u Bell Labs-u 19831985 (danas AT&T Labs i Lucent Bell Labs). C++ je nastavak na C. Prije 1983 Stoustrup je na C dodao dodatne mogunosti i formirao jezik koji je sam zvao "C sa klasama". Kombinirao je koritenje klasa Simule i objektno orijentirane mogunosti sa snagom i iskoristivou C-a. Pojam C++ prvi je puta upotrebljen 1983. C++ je dizajniran za UNIX okruenje, no ubrzo je prihvaen na drugim operacijskim sustavima. Sa C++-om programeri su dobili mogunost da poboljaju kvalitetu koda i dijelove koda su mogli ponovno koristiti.
404/1275
C++ implementira izdvajanje podataka (data abstaction) koristei koncept "klasa" (class), uz druge mogunosti, da bi omoguio objektno orijentirano programiranje. Novi koncept "preklapanja operatora" (operator overloading) uveden u C++-u nije vien u drugim objektno orijentiranim programima. Neke dodatne mogunosti C++-a dozvoljavaju niskorazinski pristup memoriji no i dalje sadre elemente jezika visoke razine.. C++ je standardiziran od strane ANSI-a i ISO-a. Zadnja verzija standarda napravljena je 2002. godine
Objective-C
Objective-C je jednostavni programski jezik dizajniran da omogui sofisticirano objektno orijentirano programiranje u C standardu. On je nastavak ANSI C standarda, i zato je mogue postojee C programe prilagoditi koritenju software frameworka bez gubitaka uloenog rada u originalni razvoj. Poto Objective-C ukljuuje C, kad radite sa njim dobivate sve mogunosti C-a. Moete birati kada elite neto napraviti na objektno orijentiran nain (na primjer definiranje klase), a kada zadrati proceduralne programske tehnike (definiranje strukture i nekih funkcija umjesto klasa). tovie, Objective-C je jednostavan jezik. Sintaksa mu je mala, nedvosmislen je i lako ga je nauiti. Objektno orijentirano programiranje, zbog terminologije i naglaska apstraktnom dizajnu, esto predstavlja potekoe poetnicima. Dobro organiziran jezik poput Objective-Ca moe olakati put prema znanju objektno orijentiranog programiranja. U usporedbi sa drugim jezicima baziranim na C-u, Objective-C je dinamian. Kompajler uva veliku koliinu informacija o objektima koje koristi prilikom izvoenja. Odluke koje bi u nekim sluajevima bile napravljene tijekom kompajliranja mogu se odgoditi sve do vremena izvoenja. To daje Objective-C programima neobinu fleksibilnost i mo. Na primjer, dinaminost Objective-Ca donosi prednosti koje se teko mogu dobiti u drugim objektno orijentiranim jezicima: Objective-C podrava otvoreni stil dinamikog spajanja, stil koji moe smjestiti jednostavnu arhitekturu za interaktivna korisnika suelja. Poruke nisu nuno vezane uz klase, primatelje ili selektor metoda, stoga software framework moe dopustiti korisnicima donoenje odluka pri izvoenju i dozvoliti razvijaima slobodu izraza u njihovu dizajnu. Dinaminost Objective-C-a omoguava izgradnju naprednih razvojnih alata. Suelje prema nainu izvravanja omoguuje pristup informacijama o pokrenutim aplikacijama, pa je
405/1275
mogue razviti alate koji nadgledaju, otkrivaju i mijenjaju pozadinsku strukturu i aktivnosti Objective-C aplikacija.
Java
Java kao programski jezik razvio se iz jezika Oak. Oak je razvio Sun Microsystems u ranim devedesetim kao jezik neovisan o platformi orijentiranim prema potrebama zabavne industrije poput komunikacije igaraih konzola i video rekordera. Oak je isprva napravljen za koritenje u set-top kutijama dizajniranim za video-on-demand usluge (npr. teletext). Taman kad je posao s proizvoaima set-top kutija bio pri kraju pojavio se WWW (World Wide Web). Oak dizajneri poeli su shvaati trend te se njihov fokus prebacio na Internet i WebRunner (browser s omoguenim Oak-om) je roen. Oak je preimenovan u Java a WebRunner postaje HotJava browser. Oduevljenje Internetom privuklo je mnoge dobavljae softwarea tako da su Java razvojni alati mnogih proizvoaa ubrzo postali dostupni. Isto oduevljenje odrazilo se na proizvoae softwarea koji su netom pohitali da poblie upoznaju Javu i njene mnoge divne mogunosti. Java je isti objektno orijentiranim jezik.. To znai da je u Java programu sve objekt i sve proizlazi iz bazne klase (root object class). Java okruje ukljuuje stotine klasa i metoda u est glavnih podruja. Jedna od Javinih najprivlanijih mogunosti je njen standardni library (Rich Standard Library). Mnogi e kao prednost Jave istaknuti mogunost dinamike alokacije varijabli, a glavni razlog koji je omoguio brzo prihvaanje Jave je slinost Javine sintakse sa popularnim programskim jezikom C++.
406/1275
GNU
GNU Projekt je razvio potpuno slobodan softwareski sistem nazvan "GNU" (GNU's Not Unix) koji je kompatibilan s UNIX-om. Ime GNU izabrano je jer ispunjava slijedee zahtjeve; prvo, to je rekurzivna kratica za "GNU's Not Unix", drugo, to je rije i tree zabavno ga je izgovoriti. Rije "slobodan" ne odnosi se na cijenu, ve na slobodu. Moete ili ne morate platiti odreenu cijenu da biste dobili GNU software. Bilo kako bili, jednom kad imate GNU software imate tri specifine slobode pri njegovoj upotrebi: Prvo: slobodu kopiranja programa i dijeljenja meu prijateljima i kolegama Drugo: slobodu izmjene programa na bilo koji nain, jer imate izvorni kod Tree: slobodu distribucije unaprijeene verzije, na taj nain pomoi izgradnju drutva (Ako redistribuirate GNU software, moete naplatiti fiziki in prijenosa kopije ili moete kopije davati) GNU projekt je zaet 1983 kao nain vraanja kooperativnog duha koji je nekad bio prisutan da se ponovno omogui suradnja sklanjajui prepreke koje nameu vlasnici softwarea. 1971, kad je Richard Stallman poeo karijeru u MIT-u, radio je u grupi koja je koristila termin "besplatan software". ak su i neka raunalna poduzea distribuirala besplatni software. Programerima je omoguen zajedniki rad. Do kraja 1980 gotovo sav softwaer je bio u neijem vlasnitvu (propritary), a njegovi su vlasnici prijeili suradnju korisnika. To je uinilo stvaranje neega poput GNU Projekta potrebnim. Svako raunalo zahtjeva operativni sistem; ako nema besplatnog operativnog sistema, ne moete pokrenuti raunalo bez da dohvatite vlasniki softvare. Tako je prva stvar pri stvaranju besplatnog softwarea bila napraviti besplatni operacijski sustav. Operacijski sustav nije samo jezgra (kernel); on ukljuuje i kompajlere, editore, programe za obradu teksta i mnoge druge stvari. Pisanje operacijskog sustava je vrlo velik posao, te je trajao nekoliko godina. Odluili su napraviti operacijski sustav kompatibilan s UNIX-om jer je bio isproban i portabilan, a kompatibilnost bi uinila prelazak s UNIX-a na GNU laganim. Inicijalni cilj da se napravi UNIX-oidni operacijski sistem bio je postignut. Do 1990. napravljeni su ili naeni svi glavni dijelovi osim jednog jezgre. Tada je Linus Torvalds razvio besplatnu jezgru Linux. Spajajui Linux sa gotovo zavrenim GNU sistemom dobiven je kompletan operativni
407/1275
sustav: Linux baziran GNU sistem. Procjenjuje se da stotine tisua ljudi danas koristi Linuxbased GNU sisteme, ukljuujui Slackware, Debian, Red Hat i druge. Meutim GNU Projekt nije ogranien na operacijske sustave. Njihov cilj je omoguiti cijeli spektar software-a, to god neki korisnik moe poeljeti. To ukljuuje i aplikacijski software. elja im je omoguiti software za ljude koji nisu strunjaci na polju raunala. Zato se trenutni razvija drag'n'drop desktop s ikonama (slino Windowsima) da bi poetnici lake koristili GNU sisteme. GNU Projekt takoer eli omoguiti besplatne igre i ostale oblike zabave (neke igre su ve dostupne). Kako daleko moe ii besplatan software? Nema granica, osim kad zakona poput patentnih sistema potpuno zabrane besplatan software (eli se patentirati ideja????). Krajnji cilj je omoguiti besplatan software za sve to korisnici poele i na taj nain vlasniki softvare potjerati u zaborav.
408/1275
GCC
409/1275
410/1275
Strojevi (raunala) podrani od strane GCC-a: Gotovo svi strojevi u irokoj upotrebi Acorn (Advanced) RISC Machine. Alpha (DEC) Intel x86 Families, i860, i960. Motorola 680x0, 68C11,DSP56000 Hitachi SH,H8300 Intel IA-64 (Itanium) MIPS, IBM PowerPC, HP PA-RISC, SUN SPARC
411/1275
Make file
Make file je datoteka koja se koristi pri kompajliranju izvornog koda. U njemu su definirana odnosna pravila i akcije koje trebaju biti napravljene po tim pravilima. Poopena sintaksa pravila/akcije je: mojprogram: mojfile.c _________gcc mojfile.c -o mojprogram gdje "_________" predstavlja TAB (tabulator), "moj_program" je meta pravila, "mojfile.c" je zavisnik pravila, a "gcc ....." je naredba. UPOZORENJE: TAB je potreban i ne mogu ga zamijeniti prazna mjesta. Gornje pravilo kae: Da bi napravio "moj_program" provjeri je li "mojfile.c" modificiran nakon to je trenutna verzija "mojprogram", ako postoji, kreirana. Ako je "mojfile.c" izmijenjen ili ako "mojprogram" ne postoji, onda izvri naredbu "gcc mojfile.c -o mojprogram" (koja generira "mojprogram"). Pravila u make file-ovima izvravaju se pozivom UNIX-ovog make programa sa parametrom <ime_programa> u komandnoj liniji. (U gornjem sluaju: "make mojprogram"). Prednost koritenja make datoteke je: nije potrebno ponovno pisati dugake naredbe za kompajler make kompajlira samo one datoteke koje treba, odnosno one kojima su zavisnici pravila izmijenjeni Obino se napie i pravilo sa metom "clean" koja uklanja sve izvrne i sve objektne datoteke npr. clean: ________/bin/rm f mojprogram Primijetite da meta "clean" nema zavisnika, to jest, ako napiete "make clean" u UNIX promptu, naredba e se uvijek izvriti. Takoer, po defaultu , ako napiete samo "make" bez parametra (mete), izvriti e se prvo pravilo u make datoteci. Stoga je tipini poetak make datoteke navoenje default-nog pravila: default: mojprogram kojim se osiguramo da e naredba "make" imati eljene posljedice.
412/1275
Predprocesor
Predprocesor je program koji u izvornom kodu programa trai predprocesorske
direktive koje prevodi i u skladu s rezultatom previenja mijenja izvorni program. C predprocesor je makro procesor koji C kompajler automatski koristi za promjenu koda prije kompilacije. Zove se makro procesor jer dozvoljava definiranje makroa koji slue kao pokrate za dulje konstrukcije. C predprocesor se koristi samo u C, C++ i Objective-C izvornim kodovima. U prolosti je bio koriten kao generalni program za obradu teksta. Danas bi se "zaguio" kad bi u kodu pronaao neto to se kri sa leksikim zakonima C-a. Na primjer, apostrofe e prevoditi kao poetak konstante i javljati e greku. Takoer je nemogue osloniti se na ouvanje karakteristika koje nisu znaajne za C obitelj programskih jezika. Ako bi predprocesirali Make datoteku, sve TAB-ove bi maknuo i Make ne bi radio. Ako je ovjek malo paljiv moe se provui i iskoristiti C predprocesor za stvari koje nisu C. Neki programski jezici mogu proi (Pascal, Ada, itd). Mnogi problemi mogu se izbjei pisanjem C ili C++ komentara (/**/,//) umjesto komentara tog jezika, i pisanjem jednostavnih makroa. Kad god je mogue trebali bi koristiti predprocesor vezan uz jezik u kojem se pie kod. Moderne verzije GNU asemblera imaju makro postrojenja. Veina programskih jezika visoke razine ima svoju kondicionalnu kompilaciju i ukljune mehanizme. Ako sve drugo padne u vodu, moe se pokuati sa pravim generalnim tekst procesorom, poput GNU M4. GNU C predprocesor ima malo izmijenjene opcije od ISO Standarda. Da bi dobili isti ISO Standard C potrebno je koristiti @option {-std=c98} ili c99 opcije, a da bi dobili svu dijagnostiku koristi se opcija @option {-pedantic}
Kompajler
GCC kros-kompajler Alat koji konvertira program iz C naredbi u strojni kod je kros-kompajler. Termin kroskompajler (cross-compiler) koristi se zato to je kompajler pokrenut na jednoj CPU arhitekturi (u primjeru Intel Pentium), a generira strojni kod za drugu arhitekturu (motorolin MC68360). Koraci konverzije prikazani su na slici.
413/1275
Kros-kompajler (m68k-rtems-gcc) ita datoteke koje sadre C program (filex.c) i sve datoteke koje ukljuuju (#include predprocesorska direktiva) te ih pretvara u instrukcije MC68360 strojnog koda. Prebacivanje ukljuuje tri odvojena posla: - Predprocesor skuplja sve ukljuene datoteke i proiruje makro definicije (mijenja ih kroz cijeli kod) - Kompajler prebacuje tako dobivene naredbe u MC68360 asemblerski jezik - Asembler prevodi MC68360 asemblerski jezik u MC68360 strojni jezik Krajnji strojni kod je sadran u "objektnim datotekama" (object files). Za svaku C izvornu datoteku (filex.c) postoji jedna objektna datoteka (filex.o). Kros-linker (m68k-rtemsld) spaja izvrni RTEMS, objektne datoteke proizale iz C izvornih datoteka i library rutine koje poziva C kod u jedan izvrni image (datoteka koja je prividno izvrna). Taj image je samostalni program koji se moe prenijeti bilo gdje, a izvriti samo na MC68360 platformama.
414/1275
Optimizator
Oprimizator poboljava (optimizira) GCC/G++ asemblerski kod za Pentium ili Pentium Pro instrukcije ili bez MMX instrukcija. Rezultat optimizacije je bre izvoenje programa. To se napravi tako da se prevede GCC/G++ asemblerska datoteka (koja je u GAS formatu) u novi GAS ili za NASM datoteku. Potrebno je tako napraviti jer GAS/NASM mogu raditi sa Pentium, Pentium Pro i MMX instrukcijama. GAS ih moe obraditi no GCC/G++ ih ne koristi jo dok se generira izlazna datoteka. Izlaskom verzije 2.8.x GCC/G++-a neke programi s instrukcijama za GAS su zastarjeli. No programe je jo uvijek mogue prevesti u NASM kod koji omoguuje lake prenoenje programa u asemblerskom obliku.
Asembler
GAS GAS je GNU Asembler na koji se oslanja GCC. Poti je GAS napravljen da podrava 32-bitno UNIX raunalo, koristi standardnu AT&T sintaksu koja jako slii sintaksi standarda za m68k asemblere i standard je za UNIX svijet. Sintaksa nije ni gora ni bolja od intelove sintakse. Jednostavno je drugaija. Kad se naviknete na nju izgleda vie pravilnija od Intelove sintakse, no mnogo je dosadnija. Glavne odlike GAS-ove sintakse: Imena registara su prefiksirana sa %, pa su registri %eax, %dl i tako dalje umjesto samo eax, dl itd. Zato je mogue C-ove vanjske simbole direktno ukljuiti u izvorni kod asemblera bez rizika zabune i bez potrebe za podvuenim (underscore) prefiksima. Redoslijed operanada je prvo izvor(i) a zatim odredite, to je obrnuto od Intelove konvencije. Pa e Intelova sintaksa mov eax,edx (prebaci sadraj registra edx i registar eax) u GAS-u izgledati mov %edx,%eax. Veliina operanada je specificirana kao sufix imenu instrukcije. "b" za byte (8-bit), "w"za word (16-bit) i l za long (32-bit). Ispravna sintaksa za gornju instrukciju bi
415/1275
dakle bila movl %edx,%eax.. No GAS ne zahtjeva strogu AT&T sintaksu, pa je sufiks opcionalan kad se veliina moe pogoditi iz operanda registra a u ostalim sluajevima defaultna vrijednost je 32 bita (s upozorenjem) neposredni operandi su oznaeni sa $ prefiksom, kao u add $5,%eax (dodaj neposredno long vrijednost 5 u registar %eax) ako nedostaje prefiks operanda smatra se da je rije o sadraju memorije; tako movl $foo,%eax stavlje adresu varijable foo u registar %eax, a movl foo,%eax stavlja njenu vrijednost u %eax indeksiranje ili indirekcija se postie zatvaranjem indeksnih registara ili indirektne adrese memorijske elije u zagrade; kao u testb $0x80,17(%ebp) (testira vii bit byte vrijednosti na 17 mjestu od elije na koju pokazuje %ebp) Postoje neki programi koji mogu prebacivati izvorni kod izmeu AT&T i Intel asemblerske sintakse, neki su ak sposobni raditi konverziju u oba smjera. NASM projekt (Netwide Assembler) prua i386 assembler, napisan u C-u, koji bi trebao biti dovoljno modularan da na kraju podri sve poznate sintakse i formate objekata. Odnedavno GAS podrava i Intelovu sintaksu.
Linker
Linker povezuje sve potrebne datoteke u jednu cjelinu. Linker konstruira tablicu objektnih modula i njihovu veliinu (u byte-ovima). Na osnovi te tablice, svakom objektnom modulu pridrui poetnu adresu. Zatim, rjeava sve nedosljednosti alokacije. npr. nalazi sve instrukcije koje referenciraju memoriju i dodaje realokacijske konstante jednake poetnim adresama modula. Na kraju se rjeavaju vanjske reference nalazi se adresa vanjske memorije i procedura i auriraju se instrukcije. Objektni modul je linearna struktura podataka koja sadri identifikator ili tablicu sadraja. U tablici sadraja nalazi se: tablica simbola (imena simbola segmentu) tablica vanjskih referenci (koje se varijable koriste no u stvari su u drugim modulima) i offset u tekstualnom/podatkovnom
416/1275
ime simbola, lista instrukcija koje koriste simbol, simbole proglaene vanjskima (tip external) u trenutku definicije, nerazrijeeni simboli u trenutku translacije se smatraju vanjskima, programski tekst npr asemblirane instrukcije (binarno), programski podaci npr konstante, rjenik relokacija, lista instrukcija koje treba obnoviti kad se program uita na adresi koja nije $0000 oznaka kraja modula. Nakon linkanja napravi se izvrna datoteka koja izgleda gotovo isto kao gore opisan objektni modul. Kad se program pokrene, u stvari se pokree program koji se zove "loader". On ita datoteku koja sadri program, uita ju u memoriju i sredi relokacije (ako je program uitan na mjestu razliitom od $0000).
417/1275
Janko Rade
418/1275
UVOD Debugger
Debugger nam slui da bismo vidjeli to se deava unutar programa dok se izvodi ili da bismo vidjeli to je program radio kada se sruio. Debugger je openiti koncept koji se koristi u razliitim programskim jezicima za pronalaenje greaka i uvid u izvravanje programa.
419/1275
Pozivanje gdb-a
Pozivanje gnu debuggera radi se tako da pokrene program gdb. Jednom kada se pokrenuo, gdb prihvaa i obrauje komande s tipkovnice sve dok mu se ne kae da izae iz programa (quit). Gdb se takoer moe pozvati s raznim varijantama opcija i argumenata da bi se dobila razumljivija okolina za ispravljanje greaka. Uobiajeni nain pokretanja gdb-a je pokretanje s jednim argumentom, tj. upiemo gdb pa ime programa kojega elimo ispravljati. gdb program Gdb se takoer moe pokrenuti i tako da poslije imena programa upiemo i ime core file-a (CORE file je datoteka koja sadri neke dijelove adresnog prostora od programa koji se ispravlja, a gdb pristupajui exe fileu sam trai ostale dijelove adresnog prostora). gdb program core Kao drugi argument takoer se moe napisati i PID (process ID) ako se eli ispravljati proces koji se izvrava trenutno na kompjuteru. gdb program 1234 - takvim upisom bi gdb ispravljao proces s ID-om 1234 (samo ako ne postoji file s imenom 1234(core)). Gdb se moe jo na puno naina pokrenuti tako da se koriste opcije s komandne linije. GDB te moe prisjetiti tih opcija ako se upie gdb help ili gdb -h
420/1275
421/1275
info breakpoints
Pomone informacije
Pomo i informacije o komandama uvijek moemo dobit koristei komandu help Help ili h
(gdb) help List of classes of commands: aliases breakpoints data files internals obscure running stack status support tracepoints user-defined -- Aliases of other commands -- Making program stop at certain points -- Examining data -- Specifying and examining files -- Maintenance commands -- Obscure features -- Running the program -- Examining the stack -- Status inquiries -- Support facilities -- Tracing of program execution without stopping the program -- User-defined commands
422/1275
Argumenti: Ako se pokrene program samo sa run bez argumenata onda on nasljeuje argumente od posljednje run komande koja je izvrena ili po postavkama komande set args. Show args pokazuje koji su argumenti podeeni da se automatski pokreu kada sami ne navedemo argumente. Ulazi i izlazi programa: Program koristi ulaze i izlaze na isti terminal kao gdb. info terminal program. Moemo jednostavno preusmjeriti ulaze i izlaze programa komandom run npr.: run > outfile pokree program ali se izlaz zapisuje u outfile. Jo jedan nain da se preusmjeri ulaze/izlaze programa na druge terminale pomou komande tty npr.: tty /dev/ttyb - preusmjerava ulaze/izlaze na terminal ttyb. Pokazuje informacije o ulaznim i izlaznim opcijama koje koristi
423/1275
Breakpoints, watchpoints & catchpoints Toke prekida, toke pregleda i toka zahvata
Toka prekida se koristi da bi zaustavili program na odreenom mjestu. Za svaku toku prekida se mogu postaviti uvjeti za detaljniji prikaz. Postavljanje se moe izvriti preko komande break i njenih razliitih varijanti koje se po liniji, funkciji i tonoj memorijskoj adresi postavljaju na mjesta prekida. Toka pregleda je posebna toka prekida koja zaustavlja program kada se vrijednost varijable ili funkcije promijeni. Toke pregleda se drukije postavljaju od toaka prekida, ali ih se ukljuuje- iskljuuje s istim komandama. Toka zahvata je takoer posebna toka prekida koja zaustavlja program kada se mijenjaju dogaaji kao itanje iz library a. Kao i sa tokama pregleda tako i sa tokama zahvata koriste se drukije komande, ali ih se ukljuuje - iskljuuje s istim komandama kao za toke prekida. GDB dodjeljuje brojeve na svaku toku koju napravimo, ti brojevi poinju od 1 i poveavaju se za 1. Ti se brojevi koriste kada se te toke ele promijeniti ili izbrisati.
424/1275
break linenum break filename:linenum break filename:function break *address break ... if cond tbreak args hbreak args thbreak args rbreak regex Na adresu address Sa uvjetom cond Samo za jedno zaustavljanje Hardware toke prekida Hardware toke prekida za jedno zaustavljanje Na svim funkcijama koje odgovaraju na izraz regex info watchpoints [n] info breakpoints [n] info break [n] Stupci tablice info Breakpoint Numbers Type Disposition Enabled or Disabled Address What y/n memorijska adresa mjesto u kodu # Breakpoint, watchpoint, ili catchpoint. Ispisuje tablicu svih toaka prekida, toaka pregleda i toaka zahvata koje nisu izbrisane
425/1275
awatch expr
Koja e se zaustaviti kada se expr proita ili upie u program. ispisuje popis preglednih toaka , isto kao i info break
info watchpoints
GDB postavlja hardverske toke pregleda ako je to mogue zato to su jako brze, a ako ne moe onda postavlja softverske toke prekida koje su znatno sporije i pokazuju promjenu u slijedeem redu koda. Ako je bio u mogunosti postaviti hardversku toku pregleda kada postavimo komandu watch, gdb prijavljuje Hardware watchpoint num: expr Ponekada se ne moe postaviti hardverska toka pregleda zato to tip podataka koju nadgleda ima iri opseg od opsega koju moe sama pridruiti. Postavljanje toaka zahvata Pomou komande catch postavljamo toke zahvata. catch event event: throw catch exec fork vfork load load libname unload unload libname Dinamino zatvaranje shared library-a ili zatvaranje library-a:libname. Dinamino uitavanje shared library-a ili uitavanje library-a:libname. Bacanje C++ exception-a. Hvatanje C++ exception-a. Poziv komande exec. Poziv komande fork. Poziv komande vfork. Zaustavlja kada se desi dogaaj event
tcatch event
426/1275
Nastavljanje i step-anje(koraanje)
Nastavljanje znai da program nastavlja s izvravanjem dok ne naie na kraj ili neku kontrolnu toku. Step (korak) znai izvravanje trenutne linije koda i prebacivanje u slijedeu liniju. continue [ignore-count] c [ignore-count] fg [ignore-count] step step count next [count] set step-mode set step-mode on set step-mode off until stepi arg nexti arg ni Izvravanje jedne strojne instrukcije preskae sve linije koje nemaju ispravljake informacije Dok se izlazi iz frame-a until komande u drugi frame nastavljanje do slijedeeg reda koda Nastavljanje, ali onoliko puta koliko je zadano count-om ignore-count odreuje koliko break-ova da ignorira.
Pretraivanje stoga
Kada se program zaustavi analizirajui kod, traimo kada i zbog ega je stao kako bismo popravili greku ili nadopisali potrebne instrukcije. Svaki put kada se pozove funkcija varijable i ostale informacije o funkciji se spremaju u stog (stack frame). Stog se nalazi u memoriji i moe se pregledavati pomou naredbi za pretraivanje.
428/1275
Okviri stoga
Stog je podijeljen na okvire u kojima se nalaze informacije o varijablama adrese funkcije i argumenti. Kada se pokrene program dobiva prvi okvir za funkciju main. Unutar programa okviri se razlikuju po brojevima koji im se dodjeljuju poevi od 0 prema gore. Ti brojevi samo slue da bi se razlikovali i prepoznavali okviri. frame args vrijednosti. select-frame samo prebacivanje bez ispisivanja koristimo za prebacivanje iz jednog okvira u drugi i ispisivanje
Prethodni tragovi
Prethodni tragovi(backtrace) su informacije o tome kako je program doao na mjesto na kojem se nalazi. backtrace bt ispisuje prethodne tragove koje je preao program Zaustavljanje backtrace-a se vri pomou (CTRL+C) backtrace n bt n bt - n ispisuje samo podatke o unutarnjem okviru (frame-u) specificiranom s n ispisuje samo podatke o vanjskom okviru (frame-u) specificiranom s n. backtrace -n
Backtrace ispisuje i ime datoteke, argumente i broj linije u kodu. bt 3 at builtin.c:993 #1 0x6e38 in expand_macro (sym=0x2b600) at macro.c:242 #2 0x6840 in expand_token (obs=0x0, t=177664, td=0xf7fffb08) at macro.c:71 (More stack frames follow...) pokazuje unutarnja tri okvira(frame).
429/1275
Odabir okvira
Veina komandi za odabir okvira i podataka radi sa trenutno odabranim okvirom. Evo nekih komandi za odabir okvira koje automatski ispisuju kratke informacije o odabranom okviru. frame n fn frame addr f addr up n down n npr: (gdb) up #1 0x22f0 in main (argc=1, argv=0xf7fffbf4, env=0xf7fffbfc) at env.c:10 10 read_input_file (argv[i]); up-silently n down-silently n varijante komandi up i down ali ne ispisuju na ekranu promjenu okvira. odabir okvira na adresi address pomicanje okvira n po stogu prema gore pomicanje okvira n po stogu prema dolje odabir okvira n
Informacije o okvirima
frame f info frame info f Ispisuje detaljnije informacije o trenutno odabranom okviru u obliku: ispisuje informacije o okviru koji je trenutno odabran
430/1275
adresa okvira adresa slijedeeg okvira (up) adresa slijedeeg okvira (down) jezik izvornog koda koji je pisan u okviru adresa argumenata u okviru adresa lokalnih varijabli okvira programsko brojilo imena registara iz okvira info frame addr info f addr info args info locals ispisuje informacije o okviru na adresi addr ispisuje argumente iz okvira ispisuje lokalne varijable okvira
Pretraivanje podataka
Uobiajeni nain pregleda podataka je komandom print (p). print expr print /f expr print print /f Ispisuje vrijednost zadnjeg izraza ako se ne napie koji izraz. Ispisuje vrijednost izraza expr
Izrazi
Print i sve druge gdb-ove komande prihvaaju izraze i izraunavaju njihovu vrijednost. Izrazi mogu biti konstante, varijable, operatori, uvjetni izrazi, pozivi funkcija i string-ovi. GDB ima podrku za slijedee operatore: @ :: :: {type} addr @ koristi se za upravljanje memorijom kao jednim nizom (array) odreivanje varijable po uvjetima u kojima je nastala. odnosi se na objekt tipa type pohranjenog na adresi addr
431/1275
Pretraivanje memorije
Za pretraivanje memorije se koristi komande x (examine) u nekoliko varijanti x/nfu addr x addr x Pretraivanje memorije
n,f i u su parametri koji odreuju u kojem obliku se radi ispis memorije, a addr mjesto sa kojega se poinje ispisivati memorija. n f u b h w g broj ponavljanja nain prikaza veliina jedinice u byte - ima. ili polu rijeima(2 byte-a) ili rjeima(4 byte-a) ili velikim rijeima(8 byte-a).
432/1275
Automatski prikaz
Ako elimo svaki put kada program stane ispisati vrijednost neke varijable, onda nam gdb to moe napraviti automatski. To se radi tako da na (automatic display list) dodamo varijablu. Svaki izraz dodan u takvu listu dobiva identifikacijski broj; taj broj se koristi kad ga briemo s liste izraze. Lista izgleda ovako 2: foo = 38 3: bar[5] = (struct hack *) 0x3804 Ispis prikazuje identifikacijske brojeve, izraz i njegovu trenutnu vrijednost. Takoer se moe odrediti u kojem obliku e se ispisivati koje varijable (vidi Ispis izlaznih vrijednosti). display expr display/fmt expr automatskog prikaza. undisplay dnums... delete display dnums... disable display dnums... enable display dnums... display info display brie izraz odreen identifikacijskim brojem dnum iskljuuje ispisivanje, ali ga je kasnije mogue opet ukljuiti ukljuuje ispisivanje automatskog prikaza ispisuje trenutne vrijednosti isto kao i kada stane program ispisuje popis varijabli koje se ispisuju dodaje izraz expr u listu automatskog prikaza. dodaje izraz expr u odreenom formatu fmt u listu
433/1275
434/1275
Marko Ferk
GNU MAKE
435 /1275
UVOD
Kako biste se priremili za koritenje makea, morate napisati file nazvan makefile koji opisuje povezanost sa bilo kojim, executable jezikom za programiranje i koji omoguuje auriranje svakogfilea. Tipino,u programu file je auriran iz fileovih objekata, koji su redom napravljeni compiling izvorom fileova. Kad ste jednom napravili odgovarajui makefile, svaki put kada promijenite izvor fileova, ova jednostavna shell zapovijedi: Make. suffices koji e provoditi sve potrebne rekompilacije. Make program koristi makefile bazu podataka i posljednji modificiran broj filea kako bi odluio koji podatak treba biti auriran. Za svaki od tih fileova on izdaje naredbe pohranjene u bazi podataka. Moete stvoriti argumente na komandnoj liniji makea kako bi se kontroliralo koje fileove treba rekompilirati i kako.
436/1275
PREDSTAVLJANJE MAKEFILEOVA
Makefile vam je potreban da biste dali naredbu makeu. Najee nam makefileovi pokazuju kako kompajlirati i povezati program. U ovom emo poglavlju govoriti o jednostavnom makefileu koji povezuje kako kompilirati i sloiti tekst koji se sastoji od osam C izvora i 3 glavna filea. Makefile takoer upuuje kako pokrenuti naredbe koje su izriito traene (primjerice, ukloniti odreeni file kao radnja ienja). Kad make rekompajlira editor, svaki izmijenjeni izvor C filea mora se rekompajlirati. Ako je glavni file promijenjen, svaki e izvor C filea koji ukljuuje glavni file, on se mora rekompajlirati kako bi se sauvao. Svaka kompajlacija provodi objekt na kojega se file podudara izvoru filea. Na posljetku, ako je bilo koji izvor filea rekompajliran, svi se objekt fileovi, bilo novi ili sauvani iz prethodnih kompajlacija, moraju povezati kako bi se stvorio novi izvrni editor.
Meta (target) je obino naziv filea koji je generiran programom; primjeri targeta su izvrni fileovi. Meta takoer moe biti ime radnje ili izvedbe, kao te je `clean`. Preduvjet je file koji se koristi kao input da bi se kreirala meta. Ona esto ovisi o vie fileova. Naredba (command) je radnja koji make izvodi. Pravilo moe imati vie od jedne naredbe, svake u svom nizu. Imajte na umu: trebate umetnuti tab oznaku na poetku svakog naredbenog reda. Ovo se odnosi na vas neoprezne.
437/1275
Obino je naredba u pravilu s preduvjetom i slui kako bi se kreirao target file ako se bilo koji od preduvjet izmijeni. Kako god, pravilo koje specificira naredbe za metu ne treba. Primjerice, pravilo koje sadri naredbu delete spojenu s metom `clean` nema preduvjete. Pravilo (rule) nadalje objanjava kako prepraviti odreene fileove koji su mete odreenog pravila. Make iznosi naredbe preduvjeta da stvore ili auriraju metu (target). Pravilo takoer moe objasniti kako i kada izvesti neku radnju. Makefile mora sadravati i drugi tekst osim pravila, ali jednostavni makefile treba sadravati samo pravila. Pravila se mogu doimati do neke mjere kompliciranijima nego to je ovdje prikazano, no svi vie ili manje odgovaraju vezi.
JEDNOSTAVNI MAKEFILE
Ovdje je nanizan makefile koji opisuje nain o kojem izvrni file nazvan edit ovisi o osam objekata filea koji, zauzvrat, ovisi o osmini C izvora i tri osnovna filea. U ovom primjeru svi C fileovi ukljuujui `defs.h`, a samo oni koji definiraju naredbe za montiranje ukljuuju `command.h`. Samo fileovi na niskim nivoima koji se mijenjaju pri montiranju ukljuuju `buffer.h`.
Edit: main.o kbd.o command.o display.o \ Insert.o search.o files.o utils.o Cc o edit main.o files.o utils.o Insert.o search.o files.o utils.o
main.o : main.c defs.h cc c main.c kbd.o : kbd.c defs.h command.h cc c kbd.c command.o : command.c defs.h command.h cc c command.c display.o : display.c defs.c buffer.c cc c display.c insert.o : insert.c defs.h buffer.h
438/1275
cc-c insert.c search.o : search.c defs.h buffer.h cc c search.c files.o : files.c defs.h buffer.h command.h cc c files.cc clean : rm editor main.o kbd.o command.o display.o \ insert .o search.o files.o utils.o
Podijelimo svaku drugu liniju u dva niza koristei blackslash-newline. Ovo je kao koritenje jedne druge linije, ali se lake ita. Kako biste koristili ovaj makefile da biste stvorili odgovarajui file, utipkajte: make Kako biste koristili make da biste izbrisali odgovarajui file i sve objekte iz direktorija, utipkajte:
make clean
U ovom primjeru mete ukljuuju odgovarajui file `edit`, te objekte main.o i kbd.o. Prerekviziti su fileovi poput main.c i defs.h. Zapravo svaki `.o` file je istodobno meta i preduvjet. Naredbe ukljuuju `cc c main.c` i `cc c kbd.c`. Kad je file meta treba se rekompajlirati ili prespojiti ukoliko se bilo koji preduvjet izmijeni. U dodatku. Bilo koji preduvjet koji je sam po sebi automatski generiran, prvo treba aurirati. U ovom primjeru `edit` ovisi o svakoj osmini objekt filea; objekt `main.o` ovisi o izvoru filea `main.c` i o glavnom fileu `defs.h`. Naredba shell prati svaki niz koji sadri metu i preduvjet. Ove shell naredbe govore kako aurirati file metu. Tab oznaka mora doi na poetak svakog naredbenog niza kako bi se razlikovale naredbene linije od ostalih linija u makefileu. (Imajte na umu da make ne zna nita o tome kako naredbe funkcioniraju. Ovisi na vama da traite naredbe koje e aurirati file metu na pravi nain. Sve to make ini jest da izvrava naredbe po pravilima koje ste vi zatraili kat file meta treba biti aurirana.)
439/1275
Meta `clean` nije file, ve samo naziv radnje. Budui da ne elite iznijeti radnje u ovom pravilu, `clean` nije preduvjet nijednog drugog pravila. S tim u vezi, make nikad ne poduzima nita s tim ukoliko to izriito zatraite. Imajte na umu da ovo pravilo ne samo da nije preduvjet, ve ih niti ne sadri, tako da je jedina svrha pravila vriti traene naredbe. Mete koje se ne odnose na fileove, nego su samo radnje zovu se lane mete (phony targets).
440/1275
objekt file noviji od njega. Ukoliko je objekt file tek rekompajliran, sad je noviji nego `edit`, pa je `edit` prespojen. Ako provjerimo file `insert.c` i pokrenemo make, make e kompajlirati taj file da aurira `insert.o` i zatim povezati `edit`. Ako promijenimo file `command.h` i pokrenemo make, make e rekompajlirati objekt fileove `kbd.o`, `command.o` i `files.o`, te zatim povezati file `edit`. U naem primjeru, trebali smo izlistati sve objekt fileove dvaput u naem pravilu za `edit` (ponovljeno ovdje):
edit: main.o kbd.o command.. display.o/ insert.o search.o files.o utils.o cc o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o
Takva duplikacija jest error-prone; ukoliko je novi objekt dodan sistemu, moemo ga dodati jednoj listi i drugu zaboraviti. Moemo ukloniti rizik i pojednostaviti makefile koristei varijablu. Varijable doputaju tekstualnom nizu da se definiraju odjednom i zamijene na viestruka mjesta kasnije. Standardna je praksa da je svaki makefile imenovan varijabilno; objekti, OBJEKTI, objs, OBJS, obj, ili OBJ, to predstavlja niz svih naziva objekt fileova. Ovako emo to definirati:
Nadalje, na svakom mjestu gdje elimo umetnuti listu naziva objekt fileova, moemo zamoijeniti vrijednost varijable tako da upiemo `$(objects).` Evo kako izgleda kompletan jednostavni makefile kada koristite varijablu za objekt fileove:
441/1275
edit : $(objects) cc o edit $(objects) main.o : main : main.c defs.h cc c main.c kbd.o : kbd.c defs.h command.h cc c kbd.c command.o : command.c defs.h command.h cc c command.c display.o : command.c defs.h buffer.h cc-c display.c insert.o : insert.c defs.c buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc c files.c utils.o : utils.c defs.h cc c utils.c clean : rm edit $(objects)
442/1275
PISANJE MAKEFILEOVA
TO MAKEFILE SADRI
Makefileovi sadre pet vrsta stvari: eksplicitna pravila, implicitna pravila, varijabilne definicije, direktive i komentare. Pravila, varijable i direktive opisane su dalje u ovim poglavljima. Eksplicitno pravilo kae kad i kako prepraviti jedan ili vie fileova, nazvanih metom pravila. Izlistava druge fileove o kojima meta ovisi, nazvanim preduvjetima mete. Takoer moe dati naredbe za koritenje pri kreiranju ili auriranju meta. Implicitno pravilo govori kad i kako prepraviti razred fileova zasnovano na njihovim nazivima. Opisuje kako meta moe ovisiti o fileu sa nazivom slinim meti i daje naredbe za kreiranje ili auriranje takve mete. Varijabilna definicija je linija koja odreuje vrijednost tekstualnog niza za varijablu koja moe kasnije biti zamjena u tekstu. Ovaj jednostavni primjer makefilea prikazuje varijabilnu definiciju objekta kao liste svih objekt fileova. Direktiva je naredba da make uini neto specijalno dok oitava makefile. To ukljuuje: itanje drugog makefilea odluivanje definiranje varijable iz (verbatim) niza koji sadri viestruke redove.
`#` u nizu makefilea oznauje komentar. S ostatkom se niza ignorira, samo to (trailing backslash) koji nije nestao iz drugog backslasha nastavlja komentar kroz viestruki niz. Niz koji sadri samo komentar (moda i sa razmakom ispred) prazan je i ignorira se. Ako elite koristiti doslovce znak # uinite to backslashom (npr. \#). Komentari se mogu pojaviti u bilo kojem nizu makefilea iako se oni posebno tretiraju u odreenim situacijama. Sa komandnom skriptom (ako niz poinje s likom TAB) itav se niz prenosi u shell, kao sa bilo kojim drugim nizom koji poinje sa TAB. Shell odluuje kako e se interpretirati tekst: je li ovo komentar ili nije odluuje shell.
443/1275
Sa direktivom define komentari se ne ignoriraju tijekom definiranja varijabli. Kad je varijabla proirena, tretirati e se ili makeovim komentarom ili kao tekst u komandnoj skripti, ovisno o sadraju.
444/1275
Include filenames
Filenames (nazivi fileova) ne mogu sadravati shell file naziv veze. Dodatni prostori doputeni su i ignorirani na poetku niza, ali tab nije doputen. Prostor je poeljan izmeu include i naziva filea, te izmeu naziva vie fileova. Dodatni prostor ignorira se tu i na kraju direktive. Komentar koji zapoinje sa `#` je doputen na kraju niza. Ukoliko naziv filea sadri bilo koju varijabilnu ili funkcijsku referencu, on se proiruje. Na primjer, ako imate tri `.mk` filea, `a.mk`, `b.mk` i `c.mk`, te $(bar) ekspanzije do bla bla onda je slijedee proirenje include foo*.mk $(bar) jednako include foo a.mk b.mk c.mk bla bla
VARIJABILNI MAKEFILEOVI
Ako je definirano okruenje varijabilnog MAKEFILEA, make promatra njegovu vrijednost kao listu naziva dodatnih MAKEFILEOVA koje e oitati prije drugih. Ovo djeluje dosta slino include direktivi: razliiti direktoriji pretraeni su za te MAKEFILEOVE. Osnovna uporaba MAKEFILEOVA jest u komunikaciji izmeu rekurzivnih zazivanja makea. Obino nije poeljno namjetati varijablu okruenja prije nego to make zazove gornji nivo jer je najee bolje ne razmjetati makefileove izvana. Kako god, ukoliko koristite make bez odreenog makefilea, makefile u MAKEFILEOVIMA moe uraditi korisne stvari kako bi vam pomogao da implicitna pravila djeluju bolje, poput npr. definiranja puta kojim se trai.
445/1275
VARIJABILNA MAKEFILE_LISTA
Kako make oitava razliite makefileove, ukljuujui bilo kakvo postizanje iz varijabli MAKEFILEA, naredbenog niza,, default fileova, ili iz include direktiva, njihovi e se nazivi automatski dodati varijabli MAKEFILE_LISTE. To znai da je prva stvar to make uini jest pregled posljednje rijei u ovoj varijabli i to e biti naziv trenutnog makefilea. Kad je jednom trenutni makefile uporabio include, posljednja rije e biti tek-pridrueni makefile. Ako makefile nazvan Makefile ima ovakav sadraj:
name1 := $(word $ (word $(,MAKEFILE_LIST)),$(MAKEFILE_LIST)) include inc.mk name2 := $(word $(words $(MSKEFILE_LIST)),$(MAKEFILE_LIST)) all: @echo name1 = $(name1) @echo name2 = $(name2)
446/1275
447/1275
PRIJENOS VARIJABLI
Za pridodavanje operatora, `+=`, desna se strana razmatra trenutno ukoliko su varijable prethodno ureene kao jednostavne varijable (`:=`) i drugaije. KONDICIONALNI IZVADAK Sve instance kondicionalne sintakse su u potpunosti izbaeni, to ukljuuje ifdef, ifeg, ifdef i ifneg oblike. DEFINICIJA PRAVILA Pravilo se uvijek proiruje na isti nain, bez obzira na formu: immediate : immediate ; deferred deferred To jest, dijelovi mete i preduvjeta proireni su odmah, a zapovijedi koritene pri konstruiranju mete su uvijek deferirane. Ovo openito pravilo je istinito za eksplicitna pravila, pravila o vezama, o sufiksima i statistikim vezama, te za definicije jednostavnih preduvjeta.
449/1275
PISANJE PRAVILA
Pravilo se pojavljuje u makefileu i govori kad i kako prepraviti odreeni file, a naziva se metom pravila. Izlistava druge fileove koji su preduvjeta mete i naredbe koje e koristiti pri kreiranju ili auriranju mete. Red pravila nije bitan, osim odluivanja default cilja; mete o kojoj e make razmatrati, ukoliko ne specificirate jednu. Default cilj jest meta prvog pravila u prvom makefileu. Ako prvo pravilo ima viestruke mete, samo je prva meta uzeta kao default. Postoje dvije iznimke: meta koja poinje sa tokom nije default osim ako ne sadri jednu ili vie kosih crta `/` i meta koja definira da pravilo veze nema uinka na default cilj.
PRIMJER PRAVILA
Ovdje je jedan primjer pravila: foo.o : foo.c defs.h cc c g foo.c #module for t widdling the forbs
Njegova je meta `foo.o`, a preduvjeta `foo.c` i `defs.h`. Ima jednu naredbu, koja je `cc c g foo.c`. Naredbeni niz poinje tabom kako bi se identificirala kao naredba. Ovo pravilo ukazuje na dvije stvari: kako odluiti da li je `foo.o` zastario ; zastario je ako ne postoji kako aururati file `foo.o` koristei cc. Naredba ne spominje izriito `defs.h`, no pretpostavljamo da je `foo.c` ukljuuje i stoga je `defs.h` dodan preduvjet.
SINTAKSA PRAVILA
Openito, pravilo izgleda ovako:
450/1275
ili ovako:
Mete (targets) su nazivi fileova, odvojeni razmakom. Mogu se koristiti wildcard oznake i naziv oblika `a(m)`, gdje m predstavlja lana u fileu arhivi a. Obino postoji samo jedna meta po pravilu, no povremeno ima razloga da ih bude vie. Naredbeni nizovi zapoinju tab oznakom. Prva se naredba moe pojaviti u nizu nakon preduvjeta sa tab oznakom ili se moe pojaviti u istom nizu sa polunizom. U oba sluaja efekt je isti. Budui da se simbol dolara koristi za zapoinjanje varijabilnih referenci, ako zaista elite simbol dolara morate ih upisati dva, `$$`. Moete uzdu podijeliti niz umeui blackslash iza kojeg slijedi novi red, no ovo nije obavezno, budui da make ne postavlja granice u redovima makefilea. Pravilo govori dvije stvari: kad je meta zastarjela i kako je aurirati kad je potrebno. Kriterij za zastarjelost je odreeno uvjetom preduvjeta, koji sadri imena fileova koji su odvojeni razmakom. Zamisao je da se sadraj mete filea temelji na informaciji u preduvjeta, tako da ako se neki preduvjeta izmijeni, sadraj postojee mete vie nuno ne postoji.
VRSTE PREDUVJETA
Postoje dvije vrste preduvjetA koje razumije GNU make: normalni preduvjeti poput onih opisanih u prethodnim poglavljima i order-only prerkviziti. Normalni preduvjeti zapravo imaju dvije tvrdnje; prvo, unosi red svrgavanja izgraenih naredbi: bilo koje naredbe koje su potrebne da bi se izgradio preduvjet bilo koje mete bit e potpuno svrgnut prije nego to bilo koja naredba pone izgraivati metu. Drugo, unosi ovisnu vezu: ako je bilo koji preduvjet noviji od mete, ona se smatra zastarjelom i mora e ponovno izgraditi.
451/1275
Naravno, to je upravo ono to vi elite: ako je preduvjet mete auriran, isto se treba uiniti sa metom.
UPORABA FILEOVA
WILDCARD
OZNAKA
NAZIVIMA
Samo jedan naziv moe oznaavati mnoge fileove koji koriste wildcard oznake. U makeu su one `*,?` i (). Na primjer, `*.c` oznaava popis svih fileova iji nazivi zavravaju sa `.c`. Oznaka ` na poetku file moe takoer znaiti da file od posebnog znaaja. Ako je samo ili iza njega slijedi crta, predstavlja va home direktorij. Na primjer `~/bin` proireno je `home/you/bin`. Ako nakon `~` slijedi rije, nit predstavlja home direktorij korisnika koji je nazvan po toj rijei. Na primjer, `~john/bin` proiruje se na
`/home/john/bin`. U sistemima koji nemaju home direktorij za svakog korisnika (poput MS DOS ili MS Windows) ova se funkcija simulira postavljanjem varijabilnog okruenja HOME.
LANE METE
Lana je meta ona koja nije pravi naziv filea. To je tek naziv za neke naredbe koje se izbacuju kad to izriito zatraite. Postoje dva razloga za koritenje lanih meta: za izbjegavanje sukoba sa istoimenim fileom ili kako bi se poboljala izvedba. Ako napiete pravilo ije naredbe nee kreirati ciljanu metu, naredba e biti izbaena svaki put kad se meta bude prepravljala. Evo primjera: clean: rm*.o temp
452/1275
Budui da rm naredba ne stvara file nazvan `clean`, takav file vjerojatno nikad nee postojati. Zato e rm naredba biti izbrisana svaki put kad kaete `make clean`. Lana e meta prestati raditi ako bilo to ikad kreira file nazvan `clean` u ovom direktoriju. Budui da preduvjeta nema, file `clean` razmotrit e se za auriranje, a njegova se naredba nee izbaciti. Kako bi se izbjegao ovaj problem, moete izriito zatraiti lane mete koristei posebnu metu .PHONY.
.PHONY : clean
Kad ste ovo napravili, `make clean` e provoditi naredbe bez obzira postoji li file nazvan `clean`. Poto zna da lane mete ne imenuju prave fileove koji se mogu prepraviti iz drugih fileova, make preskae implicitno pravilo o potrazi za lanim metama. Zato je deklariranje mete lanom dobra izvedba, ak i ako vas ne zabrinjava da takav file postoji. Zato prvo morate napraviti niz koji tvrdi da je clean lana meta, zatim napiete pravilo ovako:
Jo jedan primjer korisnosti lanih meta je u kombinaciji sa rekurzivnim invokacijama makea. U ovom sluaju nakefile e esto sadravati varijablu koja izlistava broj poddirektorija koje treba izgraditi. Jedan nain na koji se to rijeava je s jednim pravilom ija je naredba shell petlja preko poddirektorija, ovako:
453/1275
Dodue, postoji nekoliko problema sa ovom metodom. Prvo, otkrivena greka u pod-makeu nije obuhvaena ovim pravilom tako da e nastaviti graditi ostatak direktorija ak i kada se jedan srui. To se moe preduhitriti tako da se doda shell naredba koja e primijetiti greku i izai, no tada e to raditi ak i ako make pobudi k opcija, koja je nesretna. Drugo, i moda jo vanije, ne moete oduzeti prednost paralelno izgraenim mogunostima makea koji koriste ovu metodu, budui da postoji samo jedno pravilo. Deklariranjem poddirektorija kao lane mete uklonit ete ove probleme:
SUBDIRS
Ovdje smo takoer deklarirali da `foo` poddirektorij ne moe biti izgraen dok god `baz` direktorij nije potpun; ovakva povezanost deklaracije je osobito vana kad se pokuava paralelno izgraivanje. Lane mete ne bi trebale biti preduvjet prave mete filea; ako je, njene naredbe se pokreu svaki put kada make aurira taj file. Dok god lana meta nije preduvjet prave mete, naredbe lane mete e se izbacivati samo kad je lazna meta odreena za cilj. Lane mete mogu imati preduvjete. Kad jedan direktorij sadri viestruke programe, najvie bi odgovaralo opisivanje svih programa u jednom makefileu `./Makefile`. Budui da e meta prepravljana pogrekom biti prva u makefileu, ustaljeno je nazvati ovu lanu metu `all` i dati joj, kao preduvjeta, sve individualne programe. Na primjer:
454/1275
cc o prog1 prog1.o utils.o prog2 : prog2.o cc o prog2 prog2.o prog3 : prog3.o sort.o utils.o cc o prog3 prog3.o sort.o utils.o
.DELETE_ON_ERROR,
.IGNORE,
.LOW_RESOLUTION_TIME,
455/1275
456/1275
meta ve postoji). Ovo moe rezultirati tako da se izvri nijedno, neka ili sva pravila dvostrukih kolona. Pravila dvostrukih kolona za metu izvravaju se redom kako se pojavljuju u makefileu. Kako god, sluajevi gdje dvostruke kolone imaju smisla su ona gdje redoslijed izvravanja naredbi nije bitan.
457/1275
458/1275
moe primijeniti u kompiliranju C programa `prog.c`. Budui da su razmaci ispred varijabilne vrijednosti ignorirani u varijabilnim oznakama, vrijednost fooa je precizno `c`. (Nemojte doslovno ovako pisati svoje makefileove!)
459/1275
Kondicional sluajevi koriste tri direktive: jednu ifeg, jednu else i jednu endif. Direktiva ifeg poinje sa kondicionalom i oznaava stanje. Sadri dva argumenta odvojena sa zarezom i okruena zagradama. Varijabilna zamjena je obavljena za oba argumenta i oni su usporeeni. Linije u makefileu koje slijede ifeg su proitane ako se dva argumenta podudaraju, inae su ignorirane. Direktiva else uzrokuje sljedbeni niz koji se oitava ako je prethodni kondicional propao. U primjeru iznad to znai da je druga alternativa povezivanja naredbi koritena kad god se prva alternativa ne koristi. Imati else u kondicionalu je po izboru. Endif direktivom kondicional zavrava. Svaki kondicional mora zavriti sa endif. Slijedi tekst koji ne sadri kondicional.
460/1275
SINTAKSE KONDICIONALA
Sintaksa je jednostavan kondicional bez else kako slijedi: conditional-directice text-if-true endif
Text-if-true moe biti bez tekstualne linije da bi se smatrao dijelom makefilea ako je stanje istinito. Ako je stanje lano, nikakav se tekst ne koristi. Sintaksa conditional-directive je ista bilo da je kondicional jednostavan ili sloen. Postoje etiri razliite direktive koje testiraju razliita stanja. Evo njihove tabele:
ifeg (arg1, arg2) ifeg `arg1` `arg2` ifeg arg1 arg2 ifeg arg1 arg2 ifeg `arg1` `arg2`
Proiri sve varijabilnle reference u arg1 i arg2 i usporedi ih. Ako su identine text-if-true je efektivan, u protivnom je text-if-false, ako ga ima, efektivan.
461/1275
Ovdje je function ime funkcije; jedan od naziva s kratke liste koji su dio makea. Takoer moete sastavno kreirati vlastite funkcije koristei ugraenu call funkciju. Arguments su argumenti funkcije. Od funkcije su odvojeni imenom s jednim ili vie razmaka i ako postoji vie od jednog argumenta, onda su odvojeni zarezom. Takav prostor i zarezi nisu dio vrijednosti argumenta. Delimitri koje koristite kako biste okruili funkcijski poziv, mogu se pojaviti u argumentu samo u prikladnim parovima; druga se vrsta delimitara moe pojaviti pojedinano. Ako argument sam po sebi sadri funkcijski poziv ili varijabilnu referencu, najpametnije je koristiti istu vrstu delimitara za sve reference; napiite `$(subst a,b,$())`, a ne `$(subst a,b,${})`. Zato to je jasnije i zato to samo jedan tip delimitara odgovara da bi se pronaao kraj reference. Tekst napisan za svaki argument procesira se zamjenom varijabli i funkcijskim pozivom da bi se proizvela argumentirana vrijednost, koja je tekst na koji se funkcija odnosi. Zamjena je izvrena redosljedom kojim se argumenti pojavljuju. Zarezi i neprikladne zagrade ne mogu se pojaviti unutar argumentiranog teksta kako je zapisano, prazan prostor u uvodu se ne moe pojaviti u tekstu prvog argumenta kako je
462/1275
napisano. Te oznake mogu samo biti umetnute u vrijednost argumenta po principu varijabilne zamjene. Prvo odredite varijable comma i space ije su vrijednosti izolirane oznakama zareza i razmaka, zatim zamijenite ove varijable gdje su takve oznake potrebne, kao ovdje:
comma:=, empty:= space:= $(empty) $(empty) foo:= a b c bar:= $(subst $(space),$(comma),$(foo)) # bar is now `a,b,c'.
$(subst from,to,text)
Izvodi se tekstualna izmjena u tekstu text: svako pojavljivanje form zamijenjeno je sa by. Rezultat je zamjena funkcijskog poziva. Na primjer,
$(patsubst pattern,replacement,text) Pronalazi razmak odvojen rijeima u textu koji odgovara uzorku i zamjenjuje ih zamjenom. Ovdje uzorak moe sadravati `%` koji ima ulogu wildcard oznake, a odgovara bilo kojem broju bilo koje oznake unutar rijei. Ako zamjena takoer sadri `%`, onda se taj znak zamjenjuje tekstom koji mu odgovara u uzorku. Samo prvi `%` u uzorku i zamjeni tretira se ovako: bilo koji zamijenjeni `%` je nepromijenjen.
463/1275
$(error text)
Generira kobnu pogreku gdje je poruka text. Primijetite kako se pogreka generira svaki put kad je ova funkcija procijenjena. Tako, ako umetnete naredbu ili doznaku na desnoj strani rekurzivne varijable, nee se procjenjivati neko vrijeme. Text e se proiriti prije nego to se pogreka generira. Na primjer,
e generirati fatalnu pogreku za vrijeme itanja makefilea ako je make varijabla ERROR1 definirana.
464/1275
Meutim moda elite aurirati samo neke od svojih fileova, pa elite koristiti razliite mogunosti kompiliranja; moda elite samo pronai koji su fileovi zastarjeli i ne elite ih mijenjati. Dajui argumente dok make radi, moete uiniti bilo koju od ovih stvari i jo mnoge druge. Izlazni status makea uvijek je jedan od triju vrijednosti:
0
Izlazni je status dva ako makenaie na kakve pogreke. Ispisat e poruke opisujui odreene pogreke.
1
Izlazni je status jedan ako koristite `-q' zastavicu I make zakljuuje da su neke mete zastarjele.
naredbenom nizu. Ako na naredbenom nizu nije zadan ni jedan cilj, varijabla je prazna. Imajte na umu da se ta varijabla koristi samo u posebnim uvjetima. Primjer pravilne uporabe da bi se izbjegao `.d' file tijekom clean pravila, tako da ih make ne kreira samo zato da bi ih odmah zatim uklonio: sources = foo.c bar.c
465/1275
ifneq ($(MAKECMDGOALS),clean) include $(sources:.c=.d) endif Uporaba odreivanja cilja je opravdana ako elite kompilirati samo dio programa, ili samo jedan od nekoliko programa. Odredite kao cilj svaki file za koji elite da se prepravi. Na primjer, razmislite o direktoriju koji e sadravati nekoliko programa, sa makefileom koji zapoinje ovako: .PHONY: all all: size nm ld ar as Ukoliko radite na veliini programa (size), vjerojatno ete htjeti narediti `make size` tako da se rekompiliraju samo fileovi iz tog programa. Jo jedna uporaba odreivanja cilja je da se uredi da fileovi nisu mormalno napravljeni. Primjerice, to moe biti file outputa ili verzija programa koja je kompilirana posebno za testiranje, koje sadri pravilo u makefileu, no nije prerekvizit neispravnog cilja. Jo jedna uporaba odreivanja cilja je da se pokrenu naredbe povezane sa lanim metama ili praznim metama. Mnogi makefileovi sadre lanu metu nazvanu `clean` koja unitava sve osim izvornog filea. Jasno, to e uiniti samo ako zatraite `make clean`. Slijedi popis tipinih lanih naziva praznih meta. `all' `clean' `mostlyclean' `distclean' `realclean' `clobber' . `install' `print' `tar' `shar' `dist' `TAGS' `check' `test'
466/1275
1. Koristite naredbu `make' kako biste rekompilirali izvorne fileove koji zaista trebaju rekompilaciju, uvjerivi se da su objekt fileovi aurirani prije nego to ponete. 2. Napravite promjene u glavnim fileovima. 3. Upotrijebite naredbu `make -t' kako biste oznaili sve objekte do zadnje izmjene. Slijedei put kad budete pokretali make, promjene u glavnom fileu nee uzrokovati nikakve rekompilacije. Ukoliko ste ve promijenili glavni file do trenutka kad neki fileovi zatrebaju rekompilaciju, prekasno je da ovo napravite. Umjesto toga moete upotreijebiti `-o file` zastavicu, koja specifini file oznaava starim. To znai da se file sam po sebi nee preraditi niti e se preraditi ita drugo na njegov raun. Slijedite ovu proceduru:
1. Rekompilirajte izvorne fileove koji kompilaciju trebaju zbog razloga neovisnih o odreenom oglavnom fileu sa naredbom `make -o headerfile'. Ako je ukljueno nekoliko fileova, upotrijebite posebnu `-o` opciju za svaki glavni file. 2. Dodirnite sve objekt fileove sa `make -t'.
467/1275
ZAKLJUAK
Kroz ovaj seminarski rad pokuao sam objasniti uporabu makea. Ovdje je neizbjean file nazvan makefile, koji alje naredbe makeu. Najee nam makefileovi pokazuju kako kompajlirati i povezati program. Makefile takoer upuuje kako pokrenuti naredbe koje su izriito traene, kao na primjer uklanjanje odreenog filea kao radnja ienja. Makeova formula je jednostavna; nakon to korisnik izmijeni izvorne fileove i eli izgraditi svoj program, make provjerava kronologiju kako bi vidio to se izmijenilo, te gradi samo ono to je korisniku potrebno bez suvinog gubljenja vremena. Osmiljen jo u ranim 1970-ima, make je do dananjih dana okosnica u veini programskih projekata. Sadri bogati spektar izbora koji vam doputa manipulaciju viestrukim direktorijima, zatim izgradnju razliitih verzija programa, te se prilagoava vaim potrebama. Piui ovaj seminar ustanovio sam zato ovaj program zauzima visoko mjesto u procesu izgradnje softvera unato mnogobrojnoj mlaoj konkurenciji.
468/1275
469/1275
UVOD
Ovaj dokument sadri seminarski rad na temu CVS sustav za verzioniranje. Pokuaemo kroz njega pruiti uvid u osnovne funkcionalnosti koje nam ovaj i ovakav sustav prua. U ovom uvodu biti e definirani neki pojmovi koji su bitni za daljnji sadraj dokumenta. CVS je alat za upravljanje i kontrolu programskog koda. To je vrlo pojednostavljena, no tona definicija. Ukoliko elimo definirati preciznije, potrebno je dodati da osim same kontrole i verzioniranja programskog koda, takvi sustavi zapravo omoguuju ozbiljan razvoj grupama programera, i oni slue kao repozitorij svih datoteka koje su ukljuene u projekt na kojemu se radi. Najprimitivniji nain upravljanja datotekama je redovno pohranjivanje u projekt ukljuenih datoteka. Na taj nain postoji posljednja verzija tih datoteka no to iz pogleda osobe ukljuene u razvoj ostavlja otvorenim slijedea pitanja i probleme: Neto sam promijenio, odluio vratiti nazad promjene, no nemogu pronai datoteku. U programu je neki udnovati kod, zato je tamo? Prijavljen je gubitak funkcionalnosti programa od prolog tjedna. to se od onda u programu mijenjalo? Developer je prije par dana otklonio bug. Kakve su to izmjene bile? Developer A i developer B mijenjaju iste skripte u isto vrijeme! Developer je otklonio bug u zadnjem releasu, i sada tih njegovih promjena vie nema. Potrebno je napraviti velike izmjene u dijelu koda i paralelno ispravljati bugove u predanim skriptama. Dobio sam neiji tui kod na kojem pri svakom novom releasu moram raditi neke izmjene. Imam dugotrajni veliki projekt, sa velikim koliinama koda i datoteka i izrada dnevnih backupa svega toga se otima kontroli. Niko ne vodi rauna o aurnosti backupiranih podataka.
470 /1275
Svaki dobar alat za upravljanje i verzioniranje programskog koda mora imati zadovoljavajue rjeenje za svaki od ovih problema. Developeri moraju rado koristiti taj alat, dakle nesmije im biti naporan za koritenje, i mora se moi integrirati sa razvojnim alatima koje na projektu koristimo. Treba voditi rauna i o mrenim mogunostima alata, dakle pokrivene moraju biti i opcije mrenog pristupa takvom servisu, ponekad e razvojni timovi biti dislocirani, i treba im omoguiti pristup bez ugroavanja sigurnosti, a i u sluaju da nisu stalno spojeni na mreu, mora im se omoguiti produktivnost. CVS je dobar odabir takvog alata. Kroz ovaj seminarski rad pokuati emo pruiti uvid u njegove glavne funkcionalnosti. Generalno se za CVS moe rei da je lagan za uporabu. Novo suelje ili par novih komandi za nauiti. Naravno da postoje i kompliciraniji dijelovi ali oni mogu biti zakopani u perl skriptama da bi se omoguilo lake koritenje. Moe raditi na vie datoteka odjednom, fleksibilan je (mislei pritom otvorenost prema razvojnim okruenjima). Vrlo je bitna karakteristika i njegova cijena. CVS nije skup, plaa se zapravo samo znanje instalacije i odravanja, a raditi e dobro i pouzdano ak i pod veim optereenjem ukoliko je dobro postavljen i instaliran.
471 /1275
CVS model
Cvs model nije zakljuaj izmijeni otkljuaj model. To znai da ne ohrabruje pristup po kojem programer uzima datoteku zakljuava ju onemoguavajui drugima pristup, mijenja ju i zatim izmijenjenu vraa u stanje raspoloivosti za druge. Takav model, zakljuavanja datoteka na kojima se radi, moe biti vrlo nepopularan u razvojnom okruju u kojem developeri nemogu meusobno brzo komunicirati, jer stvara velike probleme ukoliko neki lan razvojnog tima zaboravi otkljuati datoteku, nego npr ode na godinji odmor ostavljajui zakljuane neke datoteke na kojima je radio izmjene. To moe dovesti do ruenja atmosfere u razvojnom timu, pa ako situacija eskalira i do prijetnji te fizikih obrauna. CVS model je kopiraj izmijeni spoji model. Model radi na slijedei nain: developer iz CVS sistema kopira na svoj stroj datoteke na kojima e raditi izmjene (check-out datoteke), radi izmjene na datotekama (za to vrijeme drugi developeri takoer mogu raditi na svojim kopijama te iste datoteke), nakon zavretka rada na datoteci on tu datoteku izmjenjenu vraa nazad u CVS zajedno sa dnevnikom promjena koje je na njoj uinio, i ta datoteka se spaja sa CVS master kopijom. U bilo kojem vremenskom periodu ostali developeri na projektu spajanjem na CVS sustav mogu provjeravati izmjene na datotekama na kojima trenutno i oni rade i ta nova izmjenjena datoteka maginim procesom zanavlja i njihove radne verzije, i tako to ide u tom neprekidnom krugu inei developerski ivot punim uzbuenja i iznenaenja svojim te tuim postignuima. Naravno to sve zvui sjajno, te samim tim daje za naslutiti da ne odgovara stvarnom stanju. Utjecaji koji kvare tu iznimnu zamisao posljedica su ljudske udnje za radom. Promotrimo slijedeu situaciju: developer A iz CVS sistema kopira (glavne radne datotene strukture, repozitorija) svoju radnu verziju opsjednut raznim idejama o poboljanjima koda i funkcionalnosti, nekako u isto to vrijeme developer B bitno manje zainteresiran za bilo kakav rad, reda radi kopira svoju radnu verziju te iste datoteke. Drugi in ovog igrokaza zapoinje odmah, jer developer A ve pomamljeno radi izmjene, koje oduevljeno prijavljuje u repozitorij kao novu verziju, pa zatim odmah nastavlja dalje i radi daljnje izmjene. Prou tako dani, developer A iscrpljeno u repozitorij prijavljuje 6. izmjenu i odlazi na zaslueni poinak. U to vrijeme developer B primjeuje da je prije nekoliko dana planirao neto raditi te
472 /1275
se svladavajui gaenje, napokon odluuje malo provrljati po kodu, pri tom ni ne pomiljajui da obnovi svoju kopiju raunajui s tim da naravno nitko nije radio izmjene po datoteci ako nije ni on, te naini i sam neke izmjene u kodu. Nakon testiranja developer B odluuje prijaviti svoju datoteku u repozitorij. U tom trenutku dogoditi e se slijedee, kako je datoteka na kojoj B prijavljuje izmjene u meuvremenu mijenjana od ambicioznog developera A CVS e B-a obavijestiti o tome da se datoteka na kojoj je inio izmjene u meuvremenu mijenjana te da ju mora obnoviti prije prijavljivanja. Iznerviran tuom brzopletou B obnavlja svoju datoteku i ukoliko se njegov rad na datoteci ne odnosi na kod mijenjan od Developera A, prijavljivanje izmjena e proi u najboljem redu, i B e napokon zaslueno odahnuti, shrvan svim tim stresom. Meutim, ukoliko se rad Developera B odnosi na isti dio koda kao i onaj Developera A, B-ovi problemi tek nastaju jer je dolo do konflikta. CVS taj konflikt developeru prijavljuje i oznaava dijelove koda na koji se konflikt odnosi oznakama. Sada developer B mora rijeiti taj konflikt kako bi prijavio svoje izmjene. Tu bilo kakva asistencija CVS vie nije mogua, budui da on upozorava na nastale konflikte a na developerima je da ih rijee. Budui se ovaj rad ne bavi socioloko-motivacijskim aspektom developerskog rada prepustiemo developerima iz prethodnog primjera da sami rijee konflikt, za koji su ionako sami krivi.
473 /1275
474 /1275
PREGLED POJMOVA
Neke od ovih pojmova ili njihove sinonime smo koristili do sada, no vano je prije daljnjih opisa pojmove jo jednom navesti i objasniti, budui e se ti pojmovi koristiti u slijedeim poglavljima. Check out postavljanje zahtjeva za vlastitom radnom kopijom iz repozitorija. Radna kopija koja se dobije je trenutno stanje te datoteke ili projekta u trenutku u kojem se dohvaa. Kao to je ve ranije spomenuto, kada developer zavri sa svojim izmjenama na datoteci potrebno je upotrijebiti commit i update naredbe kako bi se takva preraena datoteka objavila u CVS sistemu, primjenjujui vlastite izmjene na datoteci i ujedno dobivajui na uvid izmjene koje su inili druge osobe ukljuene na projekt Commit slanje promjena iz vlastite radne kopije u centralni repozitorij. Naziva se jo i check in. Conflict situacija u kojoj dva developera pokuavaju napraviti commit promjena koje se odnose na isti dio iste datoteke. CVS takvu situaciju prepoznaje i prijavljuje nastali konflikt, no odgovorni za tu situaciju moraju ju sami i rijeiti. Log message komentar koji se dodaje promjenama koje se commit-a, a koji mora sadravati opis promjena. Pregledavanjem postojeih komentara mora se moi dobiti saeti uvid u stanje projekta i to se na projektu do sada dogaalo. Repository glavna, master kopija projekta, gdje CVS pohranjuje kompletni revision povijest projekta. Svaki projekt ima jedan repozitorij. Revision promjena commit-ana u nekom vremenskom trenutku za jednu datoteku ili grupu datoteka. Revision je zapravo snimka jednog stanja kroz stalne promjene na projektu. Update akcija koja omoguuje primjenjivanje tuih dorada neke datoteke na vlastitu radnu kopiju te iste datoteke. Takoer ta akcija e pokazati dali vaa radna kopija ima nekih izmjena koje jo nisu commit-ane. Ukratko update dri vau radnu kopiju aurnom sa aktualnom kopijom u repozitoriju. Working copy radna kopija datoteke kroz koju developer radi izmjene na projektu. Svaki developer na projektu ima svoju radnu kopiju datoteke na kojoj neto radi ili planira raditi.
475 /1275
476 /1275
C:\WINDOWS> set HOME=C: C:\WINDOWS> cvs -d :pserver:jrandom@cvs.com:/usr/local/cvs login (Prijava na jrandom@cvs.com) CVS password: C:\WINDOWS>
477 /1275
478 /1275
cvs import: Importing /usr/local/cvs/myproj/a-subdir N myproj/a-subdir/whatever.c cvs import: Importing /usr/local/cvs/myproj/a-subdir/subsubdir N myproj/a-subdir/subsubdir/fish.c cvs import: Importing /usr/local/cvs/myproj/b-subdir N myproj/b-subdir/random.c No conflicts created by this import mojStroj$ itanjem izlaza primjeujemo da CVS ispred svake datoteke stavlja jedno slovo. U ovom sluaju slovo je "N" za "new file". Nakon izrade nebrojenih backupa te redudancije postupaka i kopija svih formata spremni smo na check out radne kopije iz repozitorija.
479 /1275
480 /1275
Dakle imamo datoteku Root koji pokazuje gdje se repozitorij nalazi i imamo datoteku Repository koja pokazuje na projekt u repozitoriju (u naem sluaju myproj). Datoteka Entries sadri podatke po pojedinim datotekama unutar projekta. Svaka linija Entries datoteke sadri informacije o jednoj datoteci, naravno unutar krovnog direktorija u kojemu se Entries datoteka nalazi; /README.txt/1.1.1.1/Sun Apr 18 18:18:22 2001// /hello.c/1.1.1.1/Sun Apr 18 18:18:22 2001// D/a-subdir//// D/b-subdir//// Format svake zapisane linije je /ime datoteke/oznaka verzije(revision number)/vremenska oznaka(datestamp universal time)// linije koje se odnose na direktorije imaju prefiks D. Valja napomenuti da vremenska oznaka daje podatak o vremenu zadnje interakcije s datotekom (check out, update, commit)
481 /1275
main () { printf ("Hello, world!\n"); + printf ("Goodbye, world!\n"); } Ovdje je dakle situacija prilino jasna. Nova linija je dodana u datoteku (+ oznaava dodanu liniju). Vano je primijetiti kako CVS ima implicitne (podrazumijevane) argumente. Do sada smo pokretali CVS naredbu iz naredbenog retka bez da napiemo na koju datoteku se odnosi. mojStroj$ cvs diff Takoer i: mojStroj$ cvs update CVS automatski primjenjuje te naredbe za sve datoteke i poddirektorije nie direktorija u kojemu se nalazimo. Naravno mogue je i eksplicitno navoditi imena datoteka kada elimo izbjei primjenu CVS naredbi na sadraj direktorija u kojemu se nalazimo.
483 /1275
484 /1275
485 /1275
cvs update: conflicts found in hello.c C hello.c mojStroj$ Aha. Veliko slovo C ispred imena datoteke znai da iako je merge proao, konflikt postoji. Sadraj hello.c sada pokazuje obadvije promjene: #include <stdio.h> void main () { printf ("Hello, world!\n"); <<<<<<< hello.c printf ("this change will conflict\n"); ======= printf ("between hello and goodbye\n"); >>>>>>> 1.3 printf ("Goodbye, world!\n"); } Konflikti se uvjek prikazuju u slijedeem formatu: <<<<<<< (ime datoteke) promjene u radnoj kopiji koje jo nisu commit-ane bure ture gura ture bure valja ======= nove izmjene koje se nalaze u repozitoriju bure ture gura ture bure valja i tako u nedogled >>>>>>> (zadnja oznaka verzije u repozitoriju) Konflikt se rjeava na isti nain kako je i izazvan. Na datoteci se izvre potrebne izmjene, maknu se >>>> oznake i datoteka se commit-a.
486 /1275
PREGLEDAVANJE IZMJENA ( - Tko ih je zato i kada radio - ) ILI ija nana crnu vunu prede
Do sada, projekt je pretrpio neke promjene. Ako elimo saznati to se do sada na projektu zbivalo nije potrebno prouavati svaki diff. Pregledavanje poruka o izmjenama(log messagea) trebalo bi nam te informacije pruiti: mojStroj$ cvs log hello.c RCS file: /usr/local/cvs/myproj/hello.c,v Working file: hello.c head: 1.4 branch: locks: strict access list: symbolic names: start: 1.1.1.1 jrandom: 1.1.1 keyword substitution: kv total revisions: 5; selected revisions: 5 description: -------------revision 1.4 date: 2001/04/20 04:14:37; author: jrandom; state: Exp; lines: +1 -1 podesih redak -------------revision 1.3 date: 2001/04/20 02:30:05; author: qsmith; state: Exp; lines: +1 -0 Dodo ja redak -------------revision 1.2 date: 2001/04/19 06:35:15; author: jrandom; state: Exp; lines: +1 -0 ispisasmo i Goodbye -------------revision 1.1
487 /1275
date: 2001/04/18 18:18:22; author: jrandom; state: Exp; branches: 1.1.1; Initial revision -------------revision 1.1.1.1 date: 2001/04/18 18:18:22; author: jrandom; state: Exp; lines: +0 -0 Inicijalni import u CVS ================================================================== mojStroj$ Kao to se iz izlaza vidi, pregledavanjem log message-a moe se brzo i kvalitetno stei uvid u dosadanji rad na projektu.
488 /1275
489 /1275
Removing novi.c; /usr/local/cvs/myproj/novi.c,v <- novi.c new revision: delete; previous revision: 1.1 done mojStroj$ Kod izbijanja direktorija treba voditi rauna da su direktoriji prazni (postupak je naravno isti kao kod izbijanja datoteka).
490 /1275
491 /1275
Tom naredbom oznaili smo trenutnu snimku stanja naeg projekta sa imenom "Testiran_Isporucen_011204". Oznaavanjem datoteka na projektu tag naredbom, dajemo oznaku jednoj fazi ivota projekta. Vano nam je stanje u kojem se u tom trenutku projekt nalazio. Slijedee slike dobro pokazuju kako tag oznaava datoteke u odreenom trenutku bez obzira kakvu povijest verzija svaka datoteka zasebno ima. Vraanje verzije koju smo oznaili kao vrijednu vraanja, tj. toku u kojoj vjerujemo da imamo dobro stanje projekta radi se na slijedei nain: xxx mojStroj$ cvs update -r Testiran_Isporucen_011204 cvs update: Updating . cvs update: Updating a-subdir cvs update: Updating a-subdir/subsubdir cvs update: Updating b-subdir cvs update: Updating c-subdir mojStroj$ Radna kopija naeg projekta vraena je na verziju Testiran_Isporucen_011204.
492 /1275
ADMINISTRACIJA REPOZITORIJA
Kreiranje repozitorija
Da bi imali to administrirati, repozitorij je potrebno prvo kreirati. Naredbom cvs -d /usr/local/repozitorij init emo kreirati repozitorij u direktoriju /usr/local/repozitorij koji prije toga trebamo kreirati. U direktoriju e biti kreiran novi direktorij CVSROOT koji ima slijedei sadraj checkoutlist commitinfo commitinfo,v config config,v history loginfo modules modules,v notify notify,v rcsinfo rcsinfo,v taginfo taginfo,v verifymsg verifymsg,v
cvswrappers,v loginfo,v
Te datoteke slue za administraciju repozitorija. Trenutno nam je cilj da upogonimo repozitorij, a znaenje pojedinih datoteka e biti objanjene kasnije. Da bi korisnici mogli koristiti repozitorij, moraju imati privilegiju za pisanje. Da bi to omoguili preporuljivo je da se kreira korisnika grupa cvs, a da se onim korisnicima koji trebaju raditi sa repozitorijem pridodjeli grupa CVS. U veim projektima korisnici imaju potrebu pristupati repozitoriju sa udaljenih lokacija. U takvim sluajevima potrebno je kreirati "Password Authenticating Server". Kada korisnici pristupaju serveru, alju zahtjeve odreenom portu. Internet deamon kada dobije zahtjev na taj port spaja CVS server i klijenta. Da bi to omoguili u /etc/services datoteci potrebno je pridruiti odabrani port servisu: cvspserver 2401/tcp
493 /1275
Nakon toga je u /etc/inetd.conf datoteci potrebno definirati to je zapravo servis koji smo pridruili portu: cvspserver stream tcp nowait root /usr/local/bin/cvs cvs \ --allow-root=/usr/local/rpozitorij pserver (ne zaboravite da je \ samo oznaka da je slijedei red nastavak prethodnog, a ne nova naredba) Novi servis e biti aktivan nakon to se ponovo pokrene internet deamon a korisnici e moi pristupati sa naredbom: cvs -d :pserver:nekilogin@cvsprimjer.com:/usr/local/repozitorij login nakon toga e se traiti da unese svoju lozinku na tom serveru. Lozinka koja se unosi je lozinka za "shell account" tj. sistemska lozinka. Da bi to bilo mogue u datoteci CVSROOT/config parametar SystemAuth mora biti podeen na "yes". Podeavanje parametara i izmjena datoteka u CVSROOT direktoriju e biti objanjeni neto kasnije. Ukoliko se ne eli koristiti ta lozinka, CVS omoguava da se za logiranje na CVS server koristi posebna lozinka. Da bi to bilo mogue u datoteci CVSROOT/passwd u repozitoriju (dakle u naem sluaju /usr/local/repozitorij/CVSROOT/passwd) je potrebno unijeti lozinke u slijedeem formatu; <ime>:<"kriptirana" lozinka> primjer: nekilogin:aSa3jreTzMheS nekidrugilogin:eFa5jzrLu7hea
494 /1275
Kada se korisnik prijavi na ovaj nain ima ista prva nad datotekama kao i kad se prijavi telnetom. Ukoliko korisniku elimo pridodjeliti novo ime koje e koristiti kada se prijavljuje na CVS server tada je u datoteci potrebno dodati jo jednu kolonu koja e definirati sistemski login koji e biti koriten za rad sa CVS serverom i koja prava e biti dodjeljena. Isto tako je mogue jednom sistemskom loginu dodjeliti vie CVS logina primjer: cvslogin: aSa3jreTzMheS:nekilogin drugicvslogin:eFa5jzrLu7hea:nekilogin u ovom primjeru korisnik cvslogin i korisnik drugicvslogin e imati ista prava kao i sistemski korisnik nekilogin. To moemo iskoristiti i ukoliko elimo na jednostavan nain korisnicima koji rade na jednom projektu zabraniti da mjenjaju dokumente drugog projekta, a istovremeno im zabranimo koritenje sistemskog logina. Da bi omoguili dodatnu kontrolu prava pisanje i itanja, u CVSROOT direktorij moemo dodati dvije datoteke readers i writers. U datoteke zapisujemo imena korisnika s pravima za itanje odnosno za itanje i pisanje. S time da u datoteku zapisujemo ime CVS logina a ne sistemskog logina ukoliko nisu jednaki. primjer: cvslogin1 cvslogin2 cvstrecilogin Ukoliko se neiji login nalazi u datoteci readers tada e taj korisnik imati privilegije samo za itanje, pa makar se nalazio i u datoteci writers. Ukoliko se neiji login nalazi u datoteci writers tada svi korisnici iji se login nalazi u toj datoteci imaju prava za itanje i pisanje. Meutim ukoliko postoji datoteka writers tada svi oni korisnici iji se login ne nalazi u datoteci writers imaju privilegiju za itanje. Tako da odabirom kreiranja jedne od dvije datoteke moemo raditi pozitivnu, odnosnu negativnu selekciju, ili pak i pozitivne i negativne, ukoliko se odluimo na kreiranje obije datoteke.
495 /1275
1.2 date 2004.12.19.21.22.06; author cvsuser4; branches; next 1.1 date 2004.12.12.18.37.53; author cvsuser4; state Exp; 1.1; state Exp;
496 /1275
branches 1.1.1.1; next 1.1.1.1 date 2004.12.12.18.37.53; author cvsuser4; branches; next ; state Exp; ;
desc @@
497 /1275
1.1.1.1 log @ @ text @@ Ukoliko neki dokument obriemo iz projekta tada taj projekt nee biti izbrisan iz repozitorija, jer ukoliko netko eli staru verziju projekta taj dokument mora biti dostupan. Taj dokument e biti premjeten u Attic direktorij, kojeg e kreirati ukoliko ne postoji unutar projekta u repozitoriju. Brisanje dokumenta naravno, radimo pomou CVS alata, nikakve izmjene ne radimo direktno u repozitorij direktoriju. CVSROOT direktorij nije dio niti jednog projekta ve slui za administraciju repozitorija. Meutim ukoliko elimo mjenjati dokumente unutar njega to inimo kao i sa bilo kojim drugim projektom, pomou alata za rad sa repozitorijem. Dakle potrebno je napraviti check out, zatim izmjenu na lokalnoj kopiji, a zatim check in.
498 /1275
config
U datoteci config moemo podesiti 3 parametra: SystemAuth ako podesimo na no korisnici se nee moi logirati ukoliko ne postoji lozinka definirana u CVSROOT/passwd. Ako se podesi na yes tada e CVS ukoliko ne nae lozinku u navedenoj datoteci, lozinku potraiti u sistemskim lozinkama. TopLevelAdmin ako se podesi na yes tada e se u lokalnoj kopiji projekta pojavljivati CVS direktorij. Tu mogunost iskoritavamo ukoliko korisnici imaju potrebu raditi na vie projekata istovremeno. U protivnom je dobro tu opciju ostaviti na no, PreservePermissions. Ukoliko elimo da se zapamte pristupna prava na datoteke u verzijama tada je potrebno opciju podesiti na no Izmeu imena opcije, znaka jednakosti i kljune rijei yes ili no ne smije stajati razmak. Ukoliko neka opcija nije navedena ili nema kljunu rije yes ili no tada e se repozitorij ponaati kao da je navedena opcija no. Ukoliko imamo potrebu stavljati komentar unutar configuracijske datoteke tada redove sa komentarima treba oznaiti sa poetnim znakom #. Primjer datoteke config: SystemAuth=yes TopLevelAdmin=no PreservePermissions=no
499 /1275
modules
U datoteci modules moemo grupirati pojedine datoteke unutar projekta u direktorije i datotekama pridjeljivati pomona radna imena. To nam omoguuje da projekt podjelimo u zasebne cjeline, ime omoguavamo efikasniji rad. Datoteka je zapisana u formatu: ime_datoteke ime_direktorija ukoliko elimo datoteku pridruiti direktoriju ili u formatu proizvoljno_ime_aliasa -a naredbe_ili_imena_koje_alias_zamjenjuje ukoliko elimo definirati alias. Alias je rije koja zamjenjuje niz rijei, i ukoliko u komandnoj liniji upiemo rije koju smo definirali kao alias u datoteci modules, tada e se upisana naredba ponaati kao da smo umjesto aliasa upisali zadani niz rijei.
commitinfo
U datoteci commitinfo definiramo dodatne dogaaje u pre-commit fazi. Ukoliko se u datoteci koju commit-amo nae sadraj koji zadovoljava uvjet zadan regular expressionom, tada se pokree program. Taj program moe biti slanje emaila administratoru, kopiranje, premjetanje nekog sadraja ili bilo kakav drugi program. Programu moemo prosljediti i atribute datoteke i to sa kljunim rijeima: %s - ime datoteke %V - verzija prije commita %v - verzija poslije commita Datoteka je zapisana u formatu:
500 /1275
regular_expression program_koji_se_pokrece_u_slucaju_zadovoljenja
loginfo
Ova datoteka se ponaa isto kao i datoteka commitinfo s tom razlikom to se program ne okida u sluaju da je regular expression zadovoljen u datoteci koju commit-amo, ve u komentaru (log message) koji piemo prilikom commit-a.
taginfo
Ova datoteka se ponaa isto kao i datoteka commitinfo s tom razlikom to se program ne okida u sluaju da je regular expression zadovoljen u datoteci koju commit-amo, ve u imenu "taga" prilikom commita.
verifymsg i rcsinfo
Datoteka verifymsg sadri naredbe koje se izvravaju prilikom svakog commit-a. Najee se koristi ukoliko elimo provjeriti da li je komentar zapisan u zadanom formatu. Ukoliko format nije zadovoljen tada se commit prekida. O formatu komentara se brine datoteka rcsinfo. U njoj se zapisuje koji format e se korisititi ovisno o zadovoljenom regular expressionu u datoteci. Datoteka je zapisana u formatu: regular_expression datoteka_sa_formatom_zapisa. Ukoliko elimo koristiti isti format zapisa za sve datoteke tada je umjesto regular expressiona dovoljno staviti kljunu rije ALL.
501 /1275
cvswrappers
U ovoj datoteci se moe definirati posebno ponaanje datoteka s obziro na njihovo ime. S obzirom na ogranienu mogunost ove datoteke, najee se koristi da se definira koje datoteke e se korisititi kao binarne. Npr: *.gif -k 'b'
checkoutlist
U ovoj datoteci moemo definirati dodatne administrativne datoteke koje elimo kontrolirati putem verzioniranja, a nisu standardno isporuene. Npr. datoteke koje smo sami napravili u kojima se nalazi format zapisa komentara. Datoteka je zapisana u formatu: ime_datoteke poruka_u_slucaju_greske_prilikom_check_outa
502 /1275
503 /1275
504 /1275
505 /1275
TKcvs Ovo Tcl/Tk bazirano CVS grafiko suelje je vrlo popularno, najvie zahvaljujui izvrsnom diff alatu unutar suelja i mogunosti instalacije na Windows, Linux i MacOSX platforme. Poput Cervisie, osim osnovnih ima i brojne napredne mogunosti i spada u red najkvalitetnijih CVS grafikih suelja. Za izvravanje je potrebno imati Tcl/Tk runtime. Primjeri baratanja granama i diff alata uTKcvs-u u razliitim "Window managerima"
506 /1275
LinCVS Prednost ovog alata je mogunost spajanja na CVS server na vie naina od ostalih suelja (local/nfs, pserver, ssh, ssh-agent, proxy). Iako sadri mnoge napredne mogunosti, ovaj alat nije na razini prethodna dva alata.
507 /1275
Ostala suelja Uz navedena mogu se pronai i druga suelja koja se ne istiu posebnim mogunostima pa emo ih samo nabrojati: gCVS, MacCVS, WinCVS, Pharmacy, JCVS, JavaCVS, MacCVSClient, MacCVS pro, smartCVS, TortoiseCVS, Igloo, CVSGrab, VisualCVS
508 /1275
Ivan Podhraki
IDE
509 /1275
UVOD
U ovom seminaru prezentirat u nekoliko selekcija unutar Integrirane Razvojne Okoline (IDE)
Linux je neto poput raja za programere. Zapravo to je teak programerski jezik, koji spada pod ovaj besplatan operativni sistem. Pa ipak , problem sa mnogim jezicima je njihovo zagonetno funkcioniranje, odnosno komplicirano koritenje.
Na primjer , Visual Basic programeri koji su naviknuti na grafiki podrano suelje, dogaa im se da vie puta odskae ta naredba od crte prevodioca (command line compiler). Zahvalan broj koji se stalno poveava je broj grafikih okolina, koji ini koritenje software lakim poput djeje igre.
510/1275
Invazija
Za
2.0.2, KDE Studio gold 3.0, isto kao i Kylix 2. U usporedbi Anjute i KDevelop , KDevelop okolina je komercijalni softver. KDE Studio iz the Kompany je dostupna u no-frills , free , Open Source verziji, gdje se Borland Kylix moe besplatno koristiti za privatne potrebe. Funkcionalno i korisniko suelje od svih prisutnih ovdje oslanja se na Windows aplikacije. Koncept posluitelja je da prikuplja baze svih kandidata odnosno sve datoteke koji su
potrebne da bi se za jedan dan izradio nov program. Ovo se ne primjenjuje samo na izvornom kodu, nego isto tako za koritenje knjinice i dokumentacija. Neki IDE trae dozvole upravljanja za pojedini plan i knjinice za program. U usporedbi sa Kylix , okolina nema za obaviti potrebnu radnju vlastiti prevodilac ( ni popratan pomo program ). Umjesto toga , oni svi ( sa iznimkama ) imaju pristup prilagoen GNU komandnim linijama alata. Moraju biti definirani kao centralni , grafiki popraeni proizvodi. Za one koji prelaze sa Microsofta i Borlanda, odnosno sa njihove razvojne okoline pod Windows operativnim sistemom nedostajat e im integrirani dijalog editori.
Takoer postoji tekui IDE za ovaj software i ako nije instaliran na raunalo moe se kasnije instalirati to nas kota nae dragocjeno vrijeme. Tako dobijemo npr.
prikazivanje svih razvojnih okolina , sa izuzetkom od Kylix , koji moe usmjeriti stvaranje pojedinih stranica , na primjer rpm oblik zapisa , to je naravno dostojno svake pohvale. Usprkos mogunosti na test kandidat ima u rutini , razlikovanje sve etiri aplikacije. Sada u prezentirati najzatupljeniji IDE.
511/1275
IDE
Anjuta 0.1.8
Anjuta dolazi pod GPL razvojnom okolinom. U svojoj tekuoj inaici je u beta faza i stoga nije jo potpuno proien. Unato to je Anjuta najmanje prisutna, ali ipak ve sada obeava.. Anjuta , u svojoj tekuoj inaici , cilja na razvoj Gtk-a , koji je temeljen na GNOME -
aplikaciji. Stoga nije iznenaenje da je bio oformljen na ovaj bazi. Anjuta ne daje izravnu podrku aplikacijama koje koriste Qt ili KDE. Sva pomo je potpuno prilagoena Gtk-u i Gnome-u. Pa ipak ukoliko ih savjesno zanemarite neete imati problema stvarajui programe temeljene na QT-u. Ovaj je dui i nespretniji put , i jednostavniji za Qt ili KDE razvijen od strane korisnika KDevelop ili KDE Studia. Gtk I Qt su dvije knjinice koje programer moe iskoristiti unutar njihovih aplikacija. Oni opskrbljuju grafike objekte npr. menije. U tom sluaju rad sa Windowsima je olakan za programere. Gtk dolazi pod GPL , i Qt je na isti nain raspoloiv pod ovom licencom. Anjuta razumije programiranje u jeziku C i C ++. Kompatibilnost sa drugim jezicima kao to je Java na primjer , je u planirajuem stadiju ili je ve djelomino gotov. U stvaranju novih programa , pomonik pomae korisniku ,vodei ga kroz nekoliko jednostavnih koraka do eljenog rezultata. (U mojem testu naprimjer, u samo est klikova miem, stvorio sam kostur za novu aplikaciju.
512/1275
Anjuta nesvjesno pohranjuje sve projekte u projekt mapu , a taj odredini direktorij se moe prema elji promijeniti u postavkama. Broj oformljenih kartoteka ne moe biti jednostavan Hello World program. U C-u je potrebna minimum jedna, ali se najee koriste dvije kartoteke make kartoteka za kompajlirajui napredak i drugi u kojem se nalazi izvorni kod.). Pod standardnim postavkama Anjuta stvara tri mape koji vodi sa 64 kartoteke ukupno. Preporuljivo je da Anjutin glavni prozor ne prekriva cijeli zaslon. Razlog tome je da softver ispisuje poruke i dodatne vane dijaloge u Windows pozadini, pa bi u protivnom bile prekrivene.. Editor je vrlo koristan te se njime vrlo lako sluimo za obradu izvornog koda.
513/1275
Pritiskom na Alt + Enter vrlo lako moe biti aktiviran. Anjuta moe otvoriti veinu razliitih oblik zapisa , kao to je Java kod ili Latex kartoteka. Upravo zato jer postoji gomila oblika zapisa , razvojna okolina izgraena je u prigodnim grafikim prijedlocima. Takoer iznenauje sposobnost za unaanje funkcija i klasa, te za unaanje simbola lijevo od koda sa + i - tipkama.
Anjuta ima lak pristup programu za pronalaenje pogreaka Gdb , a to je standardan program za otkrivanje greaka. Za stvaranje aplikacije pomou grafikog suelja, na osnovi Gtk , moe se koristiti vanjski program Glade. Ogranien je na kratak opis za veinu vanijih meni opcije. Anjuta ima vanjski pristup za dokumentaciju.
514/1275
KDevelop 2.0.2
U pokuaju kopiranja KDevelops rpm zapisa na moje test raunalo sa SuSE - Linux , dobio sam vie nego to sam oekivao. Upozorio nas je na vie od 20 deinstaliranih paketa. Veina kartoteka upuivala je na Docbook sistem dokumentiranja. Upravo to osigurava KDevelop pomo pri svim funkcijama. Ako paket odbija biti instaliran , znai da razvojna okolina nesvjesno iskoritava Yast2. Oprez! Oni koji se lobiraju nee dobiti direktnu obavijest o postojanju drugih korisnika.. Sa umetnutim instalacijskim CD-om, instalacija je veoma brzo gotova, a hard disk nekoliko megabajta puniji. Do prvog dojma dolazi odmah nakon otvaranja. KDevelop ujedinjuje velik broj programa unutar jednog radnog okruenja. Odmah, kako slijedi, otvara se grafiko okruenje -Qt. Ovaj softver je stvorio Trolltech , proizvoa Qt-a. U usporedbi s Anjutom, vie je baziran na Windows modelu. Takoer je omoguen pristup vrlo detaljnoj pomoi , to upotpunjuje programski jezik sa C++. Vanjski pristup je omoguen za dokumentaciju Qt I KDE klasa.. Editor prozor je smjeten sa desne strane, to je vrlo praktino kod editiranja izvornog koda, te sadri prozore za prikaz drugih dokumenata. Upravo zbog toga ovaj prozor moe biti nezavisno smjeten. Na dnu je smjeten statusni prozor, na kojem se ispisuju razliite poruke upuene korisniku. Ustvari KDevelop vrlo jako naglaava sastavljanje u cjelinu. Upravo zbog toga ne bi trebalo biti iznenaenja, jer svi podaci se oitavaju iz KDE projekata te se postie isti cilj. Primjeuje se da se korijeni Kdevelopa nalaze u KDE projektima. Unato mnogobrojnim KDE i Qt varijacijama programa, , razvojna okolina naalost prua jedinu vrstu aplikacije, na osnovi GNOME knjinice.
515/1275
Sreom , pomonik nudi mnogobrojne mogunosti , kao to je naprimjer promjena postavki u inaici uprava alata CVS. Ovo omoguuje da nekoliko ljudi radi na istom projektu. KDevelop i Kylix su jedini programi prisutni ovdje , to omoguuju rad tima na jednom projektu. Razdijeljen od datoteke sa projektima, pomonik moe stvoriti dokumentaciju za pojedini program Kada su svi razvojni paketi instalirani, softver moe izraditi cijeli nacrt za upravljanje. Pravedan poput Anjute , KDevelop ne ograniava broj novostvorenih fileova. Integrirani preglednik u veini sluajeva svoj posao obavlja uspjeno. To omoguuje da sve klase koje su koritene u projektu budu lako vidljive i modificirane. Pomonik ponekad moe preuzeti stvaranje novih klasa tako da generira dijelove koda i pristupnih fileova. Metode i atributi tada mogu biti dodane ili izbrisane koritenjem prigodnog dijalog prozora Kada to radimo, ponekad nam se ini da je desni klik na miu nalik arobnom tapiu. Atributi koji se runo unaaju u kod , su automatski transformirani u adrese, nakon to prou proceduru. Grafiko suelje je u veini sluajeva vrlo korisno. Sve u svemu Kdevelop sadri mnogo korisnih funkcija , koje su naalost u startu sakrivene od korisnika Vrijeme koje treba premosnici da prebaci podatke izmeu konzole za poruke i nekog drugog statusnog prozora moe biti vrlo sporo, te se na to trebamo priviknuti. Ova procedura je pa ipak u prednosti jer jasno i tono sortira poruke prema tipu.
516/1275
KDE Studio je razvijen od strane the Kompany, te je dostupan u dvije inaice. KDE Studio ( izdan pod GPL ) koji je slobodan i u izvornoj inaici koja ini komercijalni KDE Studio Gold. Osnovna razlika izmeu ove dvije inaice je u broju omoguenih mogunosti. Posvetit u se testnoj verziji KDE Studia Gold, koja se moe besplatno presnimiti sa stranice proizvoaa. Internet. Iako prua sve opcije, vrijeme koritenja strogo je ogranieno na 15 minuta . Cijela inaica dostupna je za priblino 25 $. Izravno nakon pokretanja, korisniku pomonik pomae prilagoditi novu radnu okolinu. KDE Studio razlikuje se od
drugih programa, jer razlikuje projekt od radnog prostora ( radne okoline ). KDE Studio koristi ime projekta, te pomou njega odreuje podgrupu. To znai da projekt moe biti novi program ili sastavni dio knjinice. Kada stvaramo novi projekt, ubrzo postaje jasno da KDE Studio daje naglasak na C i C++ razvoj, koristei Qt ili KDE osnovu. Ovaj IDE ne nudi izbor stvaranja GNOME aplikacije, to ostavlja mogunost stvaranja projekta runo, odnosno bez pomoi asistenta. U usporedbi sa konkurencijom, KDE Studio kreira samo jednu kopiju najvanijih podataka. Neki govore da je ak i previe ekonomian jer kao izvor programiranja koristi funkcije koje moraju biti stvorene od korisnika. Aplikacija jedino nudi predloak za KDE ili Qt program. KDE Studio nudi stablo predoeno u gornjem lijevom dijelu prozora, tako da drugi podaci ne mogu biti ispisani na tom mjestu. Statusni prozor se nalazi na gornjem desnom dijelu prozora.. Editor nudi poput Anjute mogunost uvoenja funkcija i klasa. KDE Studio ne
postie djelovanje KDevelopa, odnosno u jednu ruku postie, jer ima preglednik klasa. Takoer nudi grafiko suelje, koje mora biti dodatno pozvano sa menija. Unato svemu izgleda pomalo nejasno.
517/1275
Apsolutno nema pomonih mehanizama u stvaranju klasa, poput onih integriranih u KDevelopu. Naalost malen je broj ostalih zanimljivih stvari koje se mogu pronai u KDE Studio Gold 3.0, osim u "debug" i "compiler" opcijama.
518/1275
oformljene, ali sve ovisi o znanju korisnika i instaliranim knjinicama.. Borlandu je glavni cilj napraviti aplikaciju u Delphiu, a da takoer radi pod Linuxom, te obrnuto. U tu svrhu , Borland ne koristi za prijenos samo CLX knjinice u Linux , nego je napravio prevodioc pa je i IDE raspoloiv pod Linuxom. Nakon pokretanja , puna inaica zahtjeva unoenje registracijskog koda. izgubimo kod, moemo ga preuzeti besplatno sa Ako sluajno Ako je
http:/register.borland.com .
ulaz odobren, uvodna slika nas obavjetava da smo Delphi korisnik.. Razvojna okolina vrlo nas podsjea na Windows operativni sustav. Delphi korisnici nisi jedni kojima e se svidjeti rad kod kue. Zanimljivo je to, to proizvoa mnogo godina radi na ovom proizvodu.
519/1275
Izravno nakon poetka , oekuje nas prazan projekt , koji je smjeten u praznom prozoru, a oboje su smjeteni u glavnom prozoru. Ovaj prostor moe biti iskoriten za liste, neto poput opcija u programima za obradu fotografija. Meni predstavlja sve raspolagajue elemente, odnosno opcije. Ovaj prozor je obino
smjeten sa lijeve strane. Za vrijeme kada korisnik stvara grafiko suelje , Kylix za to vrijeme generira pripadajui programski kod. Korisnik tada mora samo pregledati i upotpuniti kod, odnosno provjeriti dali nedostaje koji dijagram. Jednom kada je kod stvoren, te je kompatibilan sa Pascalom, Kylix brzo i efikasno stvara aplikaciju. Sve postavke mogu piti pohranjene te se naknadno mogu promijeniti, uz par klikova miem. Kylix je jedini program, prezentiran u ovom radu, koji podrava grupni rad.
520/1275
ANJUTA
Anjuta e osigurati jednaku funkcionalnost i korisniko suelje kao C i C++. Vrlo nalikuje Windows korisnikom suelju, te je radna povrina vrlo fleksibilna.
slika : ANJUTA
521/1275
ARRIBA
C ++, podrava C i C ++
aplikacije, ali takoer kao Anjuta ne moe otkriti C ++ . Prua podrku za mnogo programskih jezika.
C- FORGE
C - Forge je Power PC razvoj okolina sa podrkom za mnoge jezike, C++ i vrlo popularnu Javu.
522/1275
KYLIX
Kylix je Power PC razvojna okolina sa podrkom za C i C++, te Sadri vlastite prevodioce i grafiki IDE, te program za pronalaenje pogreaka . Prua podrku za baze podataka i XML Java , i FORTRAN.
slika :
KYLIX
523/1275
KDE Studio Gold ( Kompany ) takoer osigurava jednaku funkcionalnost i korisniko suelje kao C ++, te prua podrku za C i C ++. Ima vrlo fleksibilno korisniko suelje.
524/1275
Visual SlickEdit
Osigurava jednaku funkcionalnost i korisniko suelje kao jezike te meu ostalim i FTP. Koristi se za otkrivanje pogreaka u Javi.
525/1275
ZAKLJUAK
C ili C ++ programeri koji ele programirati u programima koji su bazirani na Gtk-u trebali bi obratiti pozornost na Anjutu. KDevelop bi ipak trebao biti prva postaja za KDE i Qt programer, dok KDE Studio naalost sam sebe onesposobljuje. Za programere koji prelaze sa Delphia , najvie se preporuuje Kylix. Programeri koji su gradili svoje znanje u Visual Basicu pod Windowsima , ipak preporuujem neto sasvim drugo. Za one koji jo uvijek ne ele ulaziti u opirnost i dubinu C-a i C ++ , bilo bi najbolje da rade u Kylixu.. Navest u jo nekoliko savjeta za programere poetnike. Ako piete neki mali programski kod, ne trebate se optereivati sa radom na nekim monim alatima, jer to je slino kao da gaate vrapca topom. Zato je preporuljivo da svi korisnici koji prelaze sa Windows operativnih sustava koriste Kylix, jer je on upravo tome namijenjen.
526/1275
ECLIPSE
527/1275
TO JE ECLIPSE? Eclipse je open source razvojni projekt koji prua stabilnu, kvalitetnu, radnu platformu za razvoj visoko integriranih alata. Sastoji se od 3 projekta: Eclipse Project, Eclipse Tools Project i Eclipse Technology Project. Sve ih nadgleda Project Management Committee (PMC), a vodi Project Charter. Svaki taj projekt sastoji se od nekoliko potprojekata i licenciran je CPL (Common Public License) verzijom 1.0.
to je Eclipse Project?
Eclipse Project sastoji se od jo 3 potprojekta: Platform, JDT Java development tools i PDE Plug-in development environment. Vizija Eclipse-a kao industrijske platforme ostvaruje se tek kada sami korisnici mogu kombinirati alate razliitih proizvoaa prema svojim potrebama i to na nain kojega se ni sami proizvoai nisu dosjetili. Zadatak Eclipse Project-a jest prilagoditi i razviti Eclipse Platform potprojekt i srodne alate da ispunjavaju potrebe korisnika i proizvoaa programskih alata.
528/1275
to je Eclipse Platform?
Eclipse Platform je otvoreni produni IDE (Integrated Development Enviroment) za bilo to, ali i ni za to odreeno. Eclipse Platform predstavlja temelje za gradnju i rad integriranih alata za razvoj softvera. Eclipse Platform daje slobodu proizvoaima alata da nezavisno razvijaju alate koje mogu kombinirati sa alatima drugih i to toliko jednostavno da nitko ne moe primijetiti gdje jedan alat zavrava, a drugi poinje.
to je Eclipse SDK?
Eclipse SDK (software developer kit) jedinstveni je spoj komponenti koje su proizvela druga 3 potprojekta: Eclipse Project (Platform, JDT - Java development tools, i PDE - Plugin development environment). Svi dijelovi zajedno stvaraju bogato razvojno okruenje koje programeru omoguava uinkovito razvijanje alata koji se glatko uklapaju u Eclipse Platform.
Poslovne perspektive
Eclipse platforma predstavlja framework za prikljune IDE komponente. Izravne prednosti prikljunih IDE komponenti jesu:
529/1275
Korisnici mogu uitati neke komponente kada su im potrebne i ukloniti ih kada im prestanu biti potrebne. Kod veine komercijalnih IDE-a to nije mogue. Nezavisni prodavai mogu ponuditi specijalizirane komponente, bez razvijanja ostalih jer one su ve dostupne putem Eclipse. Na primjer, komponente project manager ili text editor. Komponente za razvoj zajednikih komponenti: na primjer, prodava koji ima specifini UML editor za odreeni posao, moe ga razviti i integrirati u ve obogaenu Eclipse razvojnu platformu.
Podrka
Kao i kod svih dobrih javno dostupnih projekata, newsgrupe, mailing liste i lanci programera cijelog svijeta podravaju Eclipse. Za gotovo svaku komponentu Eclipse postoji newsgrupa i mailing lista. Komercijalni prikljuci drugih prodavaa nude podrku za licencirane korisnike. Dodatno, sve prikljuke prati korisnika dokumentacija, koja je dostupna i preko IDE-a. Eclipse projekt podravaju i najpoznatija imena industrije, na primjer: Borland, Ericsson, Fujitsu, Hitachi, Hewlett-Packard, IBM, RedHat, SAP i Telelogic.
Poslovne mogunosti
Eclipse podrava poslovni razvoj svojom javno dostupnom razvojnom platformom, jasnom dokumentacijom i iznimnim profesionalnim lanstvom. Stvara nove prikljuke za postojee popularne proizvode i nove linije proizvoda koji e iskoristiti najnovije tehnoloke trendove u razvoju poslovnih aplikacija. Na primjer, myeclipse je specijalizirana verzija Eclipse s prikljucima koji olakavaju kontrolu kompletnog procesa J2EE aplikacija.
Distribucijski razvoj
Distribucijski razvoj, Eclipse je pojednostavnila, integracijom popularnih verzija sustava kontrole kao to su CVS, VSS i ClearCase. Eclipse takoer nudi Repository Provider API koji omoguava prikljuak drugim programerima repositora. Neke od generikih funkcija koje omoguava CVS prikljuak jesu:
530/1275
U Eclipse radnom prostoru testirati modul kao projekt Provjeravati promijenjene datoteke Dodati nove datoteke u repozitorij Prepoznati i rijeiti konflikte
Uobiajeni prikljuci
Eclipse prua okvir (prikljuno razvojno okruenje) za stvaranje novih prikljuaka obogaenih dodatnim svojstvima. Zapravo, svi alati Eclipse platforme mogu se interpretirati kao prikljuci i produeci; ne postoji neto kao ugraeni Eclipse.
531/1275
PDE (Plug-in Development Environment) PDE (Plug-in Development Environment) je set alata koji omoguuju Eclipse developerima razvoj, testiranje, debuggiranje, izradu i primjenu Eclipse plug-inova, pri radu u Eclipse radnom okruenju. Eclipse moemo shvatiti kao softver koji moemo slagati prema svojim potrebama koristei plug-inove, te bi glavno pravilo kod pisanja novih plug-inova trebala biti mogunost njihove nadopune novima. Eclipse takoer osigurava relativno jednostavan nain pisanja plug-inova s pomou PDE-a, koji se smatra temeljem Eclipse platforme. Tako svaki plug-in pridonosi funkcionalnosti Eclipsea, te se kao takav ukljuuje u rad kada je to potrebno. Svaki plug-in nalazi se u direktoriju eclipse/plugins (sl.1) koji sadri razne datoteke kao to su plugin.xml (opisuje sadraj runtimea Eclipsea), JavaTM code library, ikone, properties datoteke i sl. Sam proces pisanja plug-ina poinje kreiranjem plugin.xml datoteke, pisanjem Java izvornog koda i kompajliranjem koda u biblioteku. Nastavlja se testiranjem samog koda, te pakiranjem plug-ina u formu koja je pogodna za primjenu plug-ina. PDE nije alat koji dolazi razdvojen od samog Eclipsea. On je ugraen u radno okruje Eclipsea, te nudi razne editore, wizarde itd. kojima korisnici mogu pristupiti.
532/1275
Konfiguracija PDE-a
Tijekom samog izvoenja mnogi plug-inovi zahtijevaju koritenje nekih drugih pluginova kako bi ispravno radili. Za vrijeme razvoja plug-ina sve biblioteke morale bi biti u build pathu kako bi se kod kompajlirao bez pogreaka. Da bi PDE pruio razvojno okruje koje je identino okruju runtimea u koji e plugin biti ugraen, PDE mora specificirati Target Platform. Specifikacijom target platforme PDE skenira i izlistava sve plug-inove koji su pronaeni na toj lokaciji. Samo oni koje je eksplicitno naveo korisnik grade target platform (sl. 2) i mogu se koristiti u radnom okruju plug-ina, dok su svi ostali zanemareni.
533/1275
Projekt mora sadravati manifest datoteku (opisuje sadraj plug-ina) i build.properties datoteku (sadri informacije koje slue kao vodi kroz proces builda). Za kreiranje novog plug-in projekta PDE nam nudi wizard New Plug-in Project (sl.3) koji moemo nai pod kategorijom Plug-in Development / New Project. Ovaj wizard ne samo da kreira novi projekt, nego i developeru daje mogunost brzog starta tako to kreira plug-in datoteke i prema potrebi Java kod.
sl. 3 New Plug-in Project Wizard Veina plug-inova namijenjena je tomu da sadri pokretake Java kodove; plug-in mora specificirati izvorini direktorij koji e sadravati plug-in kod za vrijeme razvoja i biblioteku gdje e kompajlirani kod biti zapakiran. PDE tada mapira ime biblioteke u izvorini direktorij i sprema te informacije u plugin build.properties datoteku, tako da se ona moe kasnije opet koristiti tijekom build procesa.
534/1275
Takoer se moe specificirati i output direktorij gdje Java kompajler moe spremati svoje class kompajlirane datoteke projekta - dok Java kod ne sadre svi plug-inovi (npr. dokumentacijski plug-inovi). Tijekom procesa izrade plug-ina developerima, pogotovo poetnicima u radu s Eclipse-om, dostupni su Eclipse templatei. Code Generation wizard (sl.4) generira sav mark-up i kod koji je potreban da bi se proizvela customizirana i potpuno funkcionalna ekstenzija.
sl. 4 Code Generation Wizard Kada odaberemo blank plug-in project, (sl.5) wizard generira plug-in projekt, manifest datoteku, build.properties datoteku i inicijalizira sadraj od tih datoteka bazirano na podacima unesenim u wizard.
535/1275
Dependencies
Lista potrebnih plug-inova odreuje libraries koji e biti na plug-in runtime class pathu. Nakon spremanja manifest datoteke, PDE automatski obnavlja class path projekta tako da sve promjene utjeu na dependency listu, ako takva postoji. Lista potrebnih plug-inova ne bi trebala sadravati neiskoritene stavke. Takvu stavku je lako uoiti zato to se tijekom development vremena plug-in kod se nee htjeti kompajlirati u workspace. EXTRANEOUS stavke tee je uoiti jer su benigne u development vremenu. Mogu usporiti class load u runtimeu kao extra libraries u plug-inu jer se nepotrebno pretrauje classpath.
536/1275
Prema tome, PDE nudi Find Unused Dependencies (sl.6) mogunost koja trai stavke koje su EXTRANEOUS te nudi mogunost njihova micanja.
Extensions
Plug-in moe pridonijeti samoj platformi tako to dodaje extension pointove deklarirane od drugih plug-inova. Extension deklaracija mora slijediti shemu definiranu od extension pointova. Shema moe biti jednostavna ili komplicirana onoliko koliko autor eli. Dodajui nove ekstenzije u extensions page, manifest editora ukljuuje kreiranje ugnijeenih elemenata koristei se context menuom i setiranje vrijednosti atributa za te elemente u Properties pogledu. PDE koristi gramatiku extension toke da ispuni context menu s ispravnim nazivima elemenata te nadograuje property pogled sa legalnim atributima odabranog elementa. Menu i elementi menua mogu biti dodani u radno okruje kontribucijom na org.eclipse.ui.actionsets extensions points.
537/1275
Vrni element ove extenzije jest 'actionset' element koji specificira svoj jedinstveni interni identifikator. Kada je atribut 'visible' postavljen na 'True' tada e actionset biti vidljiv u svim perspektivama (sl. 7).
538/1275
sl. 7 extenzije Menu element specificira label menija onakav kakav e se pojaviti u radnom okruju. Element 'separator' kreira menu separator koji takoer slui kao grupa u koju e menu item biti dodan. I na kraju, 'action' element specificira stvarni menu item, koristei se menuom identifikatora i separatorovim imenom 'menubarpath' (atribut indicira slot gdje je item smjeten). Kada je menu akcija odabrana, klasa koja e biti pokrenuta za ispis (konkretno u ovom primjeru 'Hello World' poruke), jest ona specificirana u 'class' atributu.
539/1275
Runtime
Tip biblioteke, vidljivost i sadraj mogu se namjestiti u Runtime pageu (sl. 8) manifest editora.
sl. 8 Runtime page Library type igra vanu ulogu u runtimeu. Ako je biblioteka deklarirana da sadri i kod i resurse, pristup resursu ili class datoteci iz takve biblioteke rezultira aktivacijom plugina, dok pristup resursu iz biblioteke koji je deklariran tako da sadri samo JAR library nije jo kreiran. Library content sekcija izlistava izvorine direktorije koji e biti kompajlirani u selektiranu biblioteku za vrijeme build procesa. Kada god korisnik modificira listu, PDE automatski obnavlja potrebne entrije u plug-inovoj build.properties datoteci.
540/1275
Extension points
Definiranje novih extension-pointova zahtijeva pisanje sheme koju svi klijenti extension pointa moraju slijediti da bi se tono procesirali u runtimeu. PDE nudi editor za kompoziciju takve sheme. Ugraeni plug-inovi kao to je ovaj Hello World ne zahtijevaju extension pointove.
Testiranje plug-ina
PDE nudi takoer i launcher u svojoj platformi koji omoguuje test i debuggiranje plug-inova. Runtime workbench pregledava ponaanje plug-inova u okruju u kojem e kasnije biti implementirani. Izlazni direktorij plug-in projekta smjeten je u runtime classpath plug-ina. To omoguuje class loaderu da uvijek bude u mogunosti locirati i uitati najnovije class datoteke plug-ina. Sve ostale execution opcije i postavke nalaze se u samoj launch konfiguraciji (JRE, VM argumenti). Launcher (sl. 9) takoer moe kreirati vie razliitih konfiguracija kako bi testirao (sl. 10) plug-inove pod drukijim uvjetima.
sl. 9 Launcher
541/1275
sl. 10 test
542/1275
Zip-file koji je izgeneriran jednostavno mora biti otpakiran u instalacijski direktorij (sl. 12) bilo kojeg Eclipse-baziranog okruja te tako postaje dio produkta.
Zakljuak
ini se da plug-inovi ine centralnu stanicu arhitekture Eclipsea, dok druge komponente kao to su fragment featurei i updatei imaju vanu ulogu u razvoju Eclipse produkata.
543/1275
ECLIPSE PLATFORM - tehniki pregled Eclipse Platform dizajniran je i graen za ispunjavanje sljedeih zahtjeva: njih podrka razvojnim okolinama GUI i non-GUI baziranih aplikacija izvoenje u raznim operacijskim sustavima, ukljuujui Windows i Linux naglasak na popularizaciji Java programskog jezika za pisanje alata.
TM
podrka konstruiranju razliitih alata za razvoj aplikacija podrka irokom spektru proizvoaa programskih alata, ukljuujui nezavisne podrka alatima za manipulaciju raznih tipova sadraja (npr. HTML, Java, C, omoguavanje savrene integracije alata u razliite sadrajne tipove i preko
Glavna uloga Eclipse Platforma jest opskrbljivanje proizvoaa programskih alata mehanizmima, ali i pravilima kojih se potrebno drati da bi alate integrirali u zadane okvire. Ovi su mehanizmi predstavljeni dobro definiranim API-jem, klasama i metodama. Slika 13. prikazuje glavne komponente i API-je Eclipse Platform
Eclipse Platform Workbench JFace SWT NewTool Team Workspace NewTool Help NewTool
Platform Runtime
544/1275
Plug-in manifest datoteka sadri XML. Nadovezna toka moe deklarirati dodatne specijalne XML tipove elemenata na koje bi se nadovezala. Ovo plug-inovima omoguuje povezivanja kojima mogu kolati najrazliitije informacije. tovie, objavljene informacije dostupne su iz plug-in registryja, bez aktivacije sudjelujueg plug-ina ili loadanja bilo kakvog koda. Ova je osobina kljuna za podravanje velike baze instaliranih plug-inova od kojih su samo neki potrebni u bilo kojem danom korisnikom session-u. Dok plug-inov kod nije loadan, njegovo zauzee memorije i djelovanje na vrijeme start-upa jest zanemarivo. Koritenjem XML baziranih manifesta olakano je pisanje alata koji podravaju kreiranje plug-inova. Plug-in razvojna okolina (PDE), koja je ukljuena u Eclipse SDK - jest takav alat. Plug-in je aktiviran kada njegov kod zapravo treba biti izveden. Jednom aktiviran, plug-in koristi plug-in registry za otkrivanje i pristupanje ekstenzijama prikljuenim na njegove 'spojne' toke. Npr. plug-in koji sadri referencijalnu korisniku ekstenziju moe saznati sve sadrane korisnike preference i pristupiti njihovim imenima te sloiti preference dijalog. To moe biti napravljeno samo upotrebom informacija iz registryja, bez potrebe aktiviranja bilo kojeg sudjelujueg plug-in. Sudjelujui plug-in bit e aktiviran tek kada korisnik izabere preferencu s liste. Aktiviranje plug-inova na ovaj nain ne dogaa se automatski; postoji odreen broj API metoda koje slue iskljuivo za aktivaciju plug-ina. Jednom aktiviran, plug-in ostaje aktivan sve dok se Platform ne iskljui. Svaki plug-in opremljen je poddirektorijem u koji pohranjuje podatke specifine za njega; ovaj mehanizam omoguuje plug-inovima da prenose vana stanja izmeu izvoenja. Plaform Runtime zahtijeva specijalni produetak za aplikacije. Kada je instanca Platforma pokrenuta, ime aplikacije specificirano je preko komandne linije; jedini plug-in koji se aktivira inicijalno je onaj koji ta aplikacija zahtijeva. Odreivanjem seta dostupnih plug-inova unaprijed i podravajui znaajnu razmjenu informacija izmeu plug-inova bez potrebe da ih se aktivira, Platform moe opskrbiti svaki plug-in bogatim izvorom bitnih informacija o kontekstu u kojem djeluje. Njegov kontekst ne moe se mijenjati tijekom izvoenja Platforma, zato nema potrebe za kompleksnim dogaajima koji bi izvjetavali kada se kontekst mijenja. Duga start-up sekvenca izbjegnuta je, to je glavni nain izbjegavanja bug-ova zbog nepredvienog redoslijeda aktivacije pluginova.
546/1275
Eclipse Platform izvodi se s pomou obinog poziva standardne Java virtualne maine. Svakom plug-inu dodijeljen je njegov Java class loader koji je izravno odgovoran za loadanje svoje klase. Svaki plug-in izriito naglaava svoju ovisnost o drugim plug-inovima, od kojih oekuje da imaju direktan pristup klasama. Plug-in kontrolira vidljivost public klasa i upletanje u njihove biblioteke. Ova informacija sadrana je u plug-in manifest datoteci; pravila vidljivosti forsirana su u Runtime-u, plug-in class loaderom. Mehanizam plug-inova upotrebljava se i za podjelu samog Eclipse Platforma. Zaista, zasebni plug-inovi ine workspace, work bench, itd. ak i Platform Runtime ima svoj vlastiti plug-in. Non-GUI konfiguracije Platforma mogu jednostavno preskoiti plug-in workbencha, i druge plug-inove koji ovise o njemu. Eclipse Platform update manager downloada i instalira nove mogunosti ili naprednije verzije postojeih mogunosti. Update manager konstruira novu konfiguraciju dostupnih plug-inova koji e se upotrijebiti sljedei put kada Platform bude pokrenut. Ako se rezultat unapreivanja ili instaliranja pokae kao nezadovoljavajui, korisnik se moe vratiti na ranije koritenu konfiguraciju. Eclipse Platform Runtime takoer osigurava mehanizam za dinamina proirenja objekata. Klasa koja implementira "prilagodljivo" suelje deklarira svoju instancu otvorenom ponaanjima tree strane. Prilagodljiva instanca moe biti zahtjev za adapter objekt koji implementira interface ili klasu. Npr. resursi workspacea prilagodljivi su objekti; workbench dodaje adaptere koji osiguravaju prikladnu ikonu i tekst labelu za resurse. Svaka strana moe dodati ponaanje postojeim tipovima (i klasama i interfaceima) prilagodljivih. Vie strana moe neovisno nadovezati isti prilagodljivi objekt, svaki iz razliitih razloga. Mehanizam koristi samo Java tip prilagodljivog objekta (ne poveava potronju memorije). Bilo koji plugin moe iskoristiti ovaj mehanizam za dodavanje ponaanja postojeim prilagodljivim objektima i definiranje novih tipova prilagodljivih objekta za druge plug-inove i mogue ekstenzije.
Workspace
547/1275
Razliiti alati ukljueni u Eclipse Platform rade po regularnim datotekama u korisnikom workspaceu. Workspace sadri jedan ili vie top-level projekata, gdje se svaki projekt mapira na odgovarajui direktorij koji je specificirao korisnik, u datotenom sustavu. Razliiti projekti u workspacea mogu se mapirati u razliite direktorije ili driveove, iako se, po defaultu, svi projekti mapiraju u srodne poddirektorije u jedinom direktoriju workspacea. Svaki projekt sadrava datoteke koje je kreirao i njima manipulirao korisnik. Sve datoteke u workspaceu direktno su dostupne standardnim programima i alatima operacijskog sustava. Alati integrirani u Platformu opskrbljeni su API-jem za bavljenje resursima workspacea (kolektivni naziv za projekte, datoteke i direktorije). Resursi workspacea su zastupljeni prilagodljivim objektima, tako da ostali dijelovi mogu proiriti svoje djelovanje. Kako bi se minimizirao rizik od sluajnog gubljenja datoteka, nie rangirani history mehanizam workspacea prati prethodni sadraj bilo koje datoteke koja je promijenjena ili izbrisana integriranim alatima. Korisnik kontrolira rukovoenje historyjem s pomou prostorno i vremenski baziranih preferenca. Workspace sadri marker mehanizam za resurse, koji biljei dogaaje. Markeri se upotrebljavaju za snimanje razliitih biljeaka kao to su compiler error messages, "to-do" lista, bookmarks, search hits i debugger breakpoints. Plug-inovi mogu predoiti nove podtipove markera i kontrolirati pohranjivanje izmeu izvoenja. Platform osigurava generalni mehanizam koji doputa alatu da prati promjene u resursima workspace-a. Registriranjem resource change listenera, alatu je zajameno primanje naknadne obavijesti o svim manipulacijama resursa, brisanju ili promjeni u sadraju datoteka. Platform odgaa obavijest o dogaaju do zavretka seta manipulacija resursima. Izvjetaj o dogaaju ima formu stabla promjena koje opisuje efekt itavog seta operacija. Promjene resursa takoer sadre informacije o promjenama markera. Alati poput kompajlera i linkera moraju obraditi koordiniranu analizu tisua zasebnih datoteka. Platform nudi inkrementalni project-builder. Uvod u inkrementalni build jest upravo koritenje gore navedenog stabla promjena resursa tj. razlika od zadnjeg buildanja. Platform omoguuje vie razliitih inkrementalnih projekt-buildera koji mogu biti registrirani na istim projektima. Mogui workspace auto-build automatski okida potrebne build-ove nakon svake modifikacije resursa.
Workbench i UI Toolkit
548/1275
Eclipse Platform UI sagraen je oko workbencha koji omoguava cjelokupnu strukturu i predstavlja nadogradiv UI za korisnika. Workbench API i implementacija sagraeni su od dva programska alata: SWT widget set i grafika biblioteka integrirana window sistemom, ali OSJFace UI toolkit implementiran upotrebom SWT koji pojednostavnjuje neovisnim API-jem. uobiajene UI programske zadatke.
549/1275
Uska integracija s osnovnim window-baziranim sistemom nije striktno stvar izgleda i osjeaja. SWT je takoer u interakciji s desktop obiljejima, kao to je "drag and drop" i moe upotrebljavati komponente razvijene s OS komponentnim modelima, kao Windows ActiveX kontrole. Ova strategija uvelike pojednostavnjuje implementaciju, ispravljanje pogreaka i odravanje SWT zato to doputa svim interesantnim razvojnim programima da se izvravaju u Javi. Naravno, ovo nije direktna briga za tipine klijente SWT-a s obzirom na to da su oni kompletno skriveni iza window sistem-nezavisnih SWT API.
JFace
JFace je UI toolkit s klasama za obavljanje mnogo uobiajenih UI programskih zadataka. JFace je window-sistem nezavisan u svojem API-ju i u svojim implementacijama i dizajniran da radi sa SWT bez njegova sakrivanja. JFace se sastoji od uobiajenih komponenti UI toolkita, imid i font registryja, okvira dijaloga, preferenca, wizarda i izvjetaja o napredovanju za dugotrajne operacije. Dva njegova najinteresantnija obiljeja su actions i viewers. Akcijski mehanizam doputa korisnikim komandama da budu definirane nezavisno od njihovih tonih pozicija u UI-u. Akcija predstavlja komandu koja moe biti okinuta od strane korisnika putem tipke, podatka u meniju ili podatka u tool baru. Svaka akcija zna svoj klju UI-propertyja (labela, ikona, tool tip, itd.) koji se koriste za konstrukciju pogodnih widgetsa kako bi se akcija mogla prezentirati. Ovo razdvajanje doputa istoj akciji da bude koritena na vie mjesta u UI-ju, to znai da je lako mijenjati gdje je akcija prisutna u UI-u bez potrebe mijenjanja koda za samu akciju. Vieweri su model-bazirani adapteri za odreene SWT widgetse. Vieweri upravljaju uobiajenim ponaanjem i osiguravaju vierazinsku semantiku od one dostupne sa SWT widgets-a. Standardni Vieweri za liste, stabla i tabline podrke populariziraju viewer elementima iz klijentske domene i dre widgets u sinkronizaciji s promjenama u toj domeni. Ovi vieweri su konfigurirani content i label providerima. Content provider zna kako mapirati viewerov ulazni element u oekivani content viewer i kako da updateaa promjene domene u odgovarajue promjene viewera. Label provider zna kako da proizvede specifini string label i ikonu potrebnu za prikaz svakoga danog elementa domene u widgetu. Vieweri mogu, opcionalno, biti konfigurirani s element-based filtrima i sorterima. Klijenti su obavijeteni o
550/1275
izboru i dogaajima u podruju elemenata domene kojima se opskrbljuje Viewer. Viewerova implementacija rukuje mapiranjem izmeu elemenata domene i SWT widgetsa, prilagoavajui se za filtrirani view na elemente i resortiranje potrebnog. Standardni viewer za podravanje tekst-uobiajenih operacija kao to su dvostruko "klikanje", undo, bojenje i navigacija slovnim indeksom ili linijskim brojem. Tekst viewer nudi dokumentni model klijentu i rukovodi konverzijom od dokumenta do informacije traene od SWT ureenog tekst widgeta. Vie viewera moe biti otvoreno u istom modelu ili dokumentu; svi su aurirani automatski kada se model ili dokument promijeni u bilo kojem od njih.
Workbench
Za razliku od SWT i JFace, koji su glavni sadraj UI toolkit-a, Workbench osigurava UI osobnost Eclipse Platforma i opskrbljuje strukture u kojima alati surauju s korisnikom. Zbog ove centralne i kljune uloge, workbench je sinonim s Eclipse Platform UI kao cjelinom. Workbench API ovisan je o SWT API-ju i u manjoj mjeri o JFace API-ju. Implementacija workbencha jest buildana koritenjem i SWT-a i Jface-a. Java AWT i Swings nisu koriteni. Paradigma Eclipse Platform UI temelji se na editorima, viewerima i perspektivama. S korisnikove toke gledita, prozor workbench-a vizualno se sastoji od viewera i editora. Perspektive se manifestiraju u selekciji i obradi editora i viewera vidljivih na ekranu. Editori doputaju korisniku da otvori, obradi i spremi objekte. Oni slijede otvorispremi-zatvori ivotni krug, vrlo slino alatima baziranim na datotenom sustavu, ali mnogo tjesnije integriranim u workbenchu. Kada je aktivan, editor moe izvoditi akciju menuom workbencha i tool bara. Platform osigurava standardni editor za tekstualne resurse; vie specijalizirani editori su osigurani drugim plug-inovima. Vieweri nude informacije o nekim objektima na kojima korisnik radi u workbenchu. Viewer moe asistirati editoru dobavljanjem informacija o dokumentima koji se ureuju. Npr. standardni pripadajui view pokazuje osobine objekta izabranog u drugom view-u. Vieweri imaju jednostavniji ivotni krug nego editori: modifikacije uinjene u Vieweru (kao to je npr. promjena u vrijednosti osobine), generalno, spremaju se odmah i promjena se odmah reflektira u druge povezane dijelove UI-ja. Platform osigurava nekoliko standardnih Viewera; dodatni Vieweri osiguravaju se preko drugih plug-inova.
551/1275
Prozor workbencha ima vie odvojenih perspektiva, od kojih je samo jedna vidljiva u danom trenutku. Svaka perspektiva ima svoje vlastite viewere i editore koji su ureeni (tiled, stacked ili detached) za prezentaciju na ekranu (neki, prema potrebi, mogu biti skriveni). Nekoliko razliitih tipova viewera i editora mogu u perspektivi biti istodobno otvoreni. Perspektiva kontrolira inicijalnu poglednu vidljivost, layout i akcijsku vidljivost. Korisnik moe brzo mijenjati perspektivu kako bi izvodio razliite zadatke i moe lako presloiti i prilagoditi perspektivu kako bi bolje odgovarala odreenom zadatku. Platform osigurava standardnu perspektivu za openite resursne navigacije, online pomo i team support. Dodatne perspektive osiguravaju drugi plug-inovi. Alati se integriraju u ove editore-poglede-perspektive UI paradigme dobro definiranim nainima. Glavne produne toke doputaju alatima da poveaju workbench: Dodaju novi tip editora. Dodaju novi tip pogleda. Dodaju nove perspektive, koje araniraju stare i nove viewe kako bi odgovarali
novom korisnikovu zadatku. Platformovi standardni vieweri i editori prisutni su koristei se ovim mehanizmom. Alati takoer mogu poveati postojee editore, viewere i perspektive: Dodaju nove sekcije na postojee pogledne lokalne menije i tool bare. Dodaju nove akcije meniju workbencha i alatnom baru kad postojei editor postane aktivan. Dodaju nove akcije "pop-up" sadravajuem meniju postojeeg viewa ili editora. Dodaju nove viewere, akcijske setove i preace u postojeoj perspektivi.
Platform se brine za sve aspekte workbench prozora i upravljanje perspektivom. Editori i vieweri se automatski instaliraju u sluaju potrebe i odbacuju kad vie nisu potrebni. Prikazani labeli i ikone sadrane u alatima izlistane su u plug-in manifestu tako da workbench moe kreirati menije i alatne barove bez potrebe aktiviranja sudjelujuih plug-inova. Workbench ne aktivira plug-in dok korisnik ne pokua iskoristiti funkcionalnost koju taj plug-in prua. Jednom kada editor ili pogled postanu aktivna strana perspektive, mogu se koristiti uslugama workbencha za lociranje aktivacije i selekcije.
552/1275
UI Integracije
Alati koji su napisani u Javi s pomou Platform API-ja postiu najvii stupanj integracije u Platformu. S druge strane, vanjski alati koje pokrene Platform moraju otvoriti svoje, posebne prozore kako bi mogli komunicirati s korisnikom i moraju imati pristup korisnikovim podacima preko podlonog datotenog sistema. Njihove integracije su zato vrlo slabe, pogotovo na UI razini. U nekim okolinama Eclipse Platform takoer podrava ovakve vrste integracije: Workbench ima ugraenu podrku za umetanje bilo kakvog OLE dokumenta kao editora (samo u Windowsima). Ova opcija omoguuje tijesnu UI integraciju. Plug-inov alat moe implementirati kontejner koji premouje Eclipse Platform API s ActiveX kontrolom kako bi bila upotrijebljena u editoru, Vieweru, dijalogu ili wizardu (samo u Windowsima). SWT omoguuje potrebnu niskorazinsku podrku. Ova opcija omoguuje tijesnu UI integraciju. Plug-inov alat moe upotrebljavati AWT ili Swing za otvaranje zasebnog prozora. Ova opcija omoguuje slabu UI integraciju, ali doputa usku integraciju ispod UI
Timska podrka
Eclipse Platform doputa projektu u workspace-u da bude smjeten ispod verzije i u 2.1 izdanju (oujak 2003.) Eclipse SDK; ovo vrijedi za Windows , ali ne i za Linux . Naravno, AWT i Swing trebaju biti prisutni u konfiguraciji baznog Java Runtime okoline koji izvodi Eclipse Platform.
TM
Pomo
553/1275
Mehanizam za pomo Eclipse Platforma doputa alatu da definira i donosi dokumentaciju u jednoj ili vie online knjiga. Npr. alat obino donosi dokumentaciju stiliziranu za pomo u obliku vodia za korisnike i API dokumentaciju (ako je ima) u zasebnom programskom vodiu. Sadraj je dodan u HTML datoteke. Objekti koji ureuju sirovi sadraj u online knjige koristei pogodne navigacijske strukture izraeni su zasebno u XML datotekama. Ovo odvajanje doputa prije postojeoj HTML dokumentaciji da bude inkorporirana direktno u online knjige bez potrebe za editiranjem ili njezinim prepravljanjem. Dodana navigacijska struktura predstavlja sadraj knjiga kao stablo tema. Svaka tema, ukljuujui i nelistovne teme, moe imati link na stranicu golog sadraja. Obina knjiga moe imati viestruke alternativne liste top-level tema, doputajui nekima ili svim informacijama da budu prisutne u totalno razliitim organizacijama; npr. organiziranim prema zadacima ili alatima. XML navigacijska datoteka i HTML sadrajna datoteka su pohranjeni u plug-inovu root direktoriju ili poddirektoriju. Mali alati obino stavljaju svoju dokumentaciju za pomo u isti plug-in gdje je i kod. Veliki alati imaju odvojene plug-inove za pomo. Platform upotrebljava svoj vlastiti interni dokumentacijski server za pribavljanje aktualnih web stranica iz web dokumenta. Ovaj korisniki server doputa Platformu razrjeavanje specijalnih interplug-in linkova i ekstrakiranje HTML stranice iz ZIP arhiva. Kada se organizira sistem za pomo, potpuno tematsko stablo mogue je jedino kada je set alata za dokumentaciju zatvoren. S Eclipse Platformom, set alata je uvijek nadoveziv i posljedica toga jest da struktura dokumentacije za pomo mora biti modularna. Platformov mehanizam za pomo doputa alatu dodavanje i sirovog sadraja i tematskog seta, kako bi indicirao gdje treba umetnuti svoju temu u ve postojee tematsko stablo kao predefiniranu toku za umetanje.
Epilog
Ukratko, Eclipse Platform opskrbljuje jezgru generikih building blokova i API-ja kao to su workspace i workbench, i ostale razliite toke ekstenzija preko kojih nove
554/1275
funkcionalnosti mogu biti integrirane. Kroz te ekstenzije, alati pisani kao zasebni plug-inovi mogu proiriti Eclipse Platform. Korisniku je predstavljen IDE sa specijaliziranim setom dostupnih alatnih plug-inova. Ipak, ovo zapravo nije kraj prie nego njezin poetak. Alati u pravilu definiraju nove toke ekstenzija i svoje vlastite API-je i tako slue kao temelji i integracijske toke za nove, nadolazee alate.
555/1275
Goran Jurii
PIPE I FIFO
556/1275
UKRATKO O PROCESIMA
Najkraa definicija procesa bi bila: proces je instanca programa koji se trenutno izvodi. Svaka instanca ima svoj memorijski prostor i stanje izvoenja. Proces mora imati svoj ID (identifikacijski broj) u obliku nenegativnog integer-a tako da operacijski sustav moe razlikovati procese, alocirati i upravljati sa sistemskim resursima koji su potrebni za izvoenje pojedinog procesa. Naravno, svaki process ID je jedinstven. Isto tako, svaki proces ima i svoje tzv. file descriptor-e. *proces ID 0 je najee sistemski proces koji se zove swapper i dio je kernela *proces ID 1 je init proces i pokree ga kernel na kraju bootstrap procedure; podie ga UNIX sistem nakon uitavanja kernela; init ita inicijalizacijske datoteke dovodi sustav u potrebno stanje UNIX je vieprogramski sustav koji moe pokretati vie procesa istodobno. Proces u UNIX-u pokree jedan program i ima inicijalno jedan upravljaki thread. UNIX podrava procese koji su aktivni ak kad korisnik nije prisutan tzv. background procese koji se nazivaju daemons. Daemons-i su startani automatski pri boot-u sustava. Proces u UNIX-u se kreira pomou sistemskog poziva fork kojim se kreira kopija originalnog procesa - child proces , dok proces koji poziva fork sistemski poziv je parent proces. Svaki proces ima i parent process ID koji je inicijalno ID procesa koji ga je stvorio. Parent i child procesi su povezani s obzirom da su promjene koje se dogaaju na jednom od ta dva procesa vidljive na onom drugom. getpid i getppid sistemski pozivi vraaju process ID i parent process ID (ostale funkcije za dobivanje identifikatora procesa nalaze su u dodatku A). Pid_t je unsigned integer koji predstavlja ID procesa. Na 1. primjeru, program ispisuje svoj proces ID i ID svog parent procesa.
557/1275
Primjer 1. #include<stdio.h> #include<unistd.h> int main() { printf (ID procesa je %d\n, (int) getpid() ); printf (ID parent procesa je %d, (int) getppid() ); return 0; } Povratne vrijednosti su cast-ane na long jer nema garancije da e pid_t stati unutar int-a. Primijetite da ako pokrenete ovaj program vie puta, javlja se razliit proces ID jer svako pokretanje programa je novi proces. S druge strane, ako pokrenete program svaki put iz istog shell-a, parent process ID (odnosno, process ID shell procesa) je svaki put jednak. /*definira fork() i pid_t*/
Stvaranje procesa
Kao to smo ve spomenuli, proces moe stvoriti novi proces putem sistemskog poziva fork. Proces koji poziva postaje na taj nain parent proces, a stvoreni proces je child proces. Funkcija fork kopira memorijsku sliku parent procesa, tako da novi proces prima kopiju adresnog prostora parent procesa. Oba procesa nastavljaju na instrukciju nakon fork.
558/1275
Povratna vrijednost funkcije fork je vana karakteristika koja omoguava parent i child procesima da se meusobno razlikuju. Funkcija fork vraa 0 child-u te vraa child process ID parent procesu. U sluaju neuspjeha fork vraa -1 i ne stvara child process. Zvui zbunjujue? Evo primjera koji e pomoi. Primjer 3. #include<stdio.h> #include<unistd.h> int main() { int x; x=0; fork(); x=1; printf (Ja sam process %ld I moj x je %d\n, (long)getpid(), x); return 0; } Prije fork-a, jedan proces se izvrava sa jednom x varijablom. Nakon fork-a, dva nezavisna procesa se izvravaju, svaki sa svojom kopijom x varijable. Budui da se parent i child procesi izvravaju nezavisno, oni ne mijenjaju istu memorijsku lokaciju. Svaki proces ispisuje poruku sa svojim process ID i vrijednosti varijable x. Parent i child procesi, u ovom primjeru, izvravaju iste instrukcije jer u kodu nismo testirali povratnu vrijednost funkcije fork. Primjer 4. demonstrira kako testirati povratnu vrijednost funkcije fork.
559/1275
Primjer 4. #include <stdio.h> #include<unistd.h> #include<sys/types.h> int main(void) { pid_t childpid; childpid = fork(); if(childpid == -1) { perror(Neuspjeli pokusaj fork-anja!); return 1; } /*kod za child*/ if (childpid == 0) printf(Ja sam child %ld\n, (long)getpid() ); else /*kod za parent*/ printf(Ja sam parent%lj\n, (long)getpid() ); return 0; } Originalni proces u primjeru 4. ima vrijednost varijable childpid koja nije 0, tako da izvrava drugu printf naredbu. Child proces ima vrijednost varijable childpid 0 i izvrava prvu printf naredbu. Zar bi moglo ii bez Hello world!? Naravno da ne; pa u to ime evo jednog primjera koji koristi sistemske pozive za stvaranje child procesa koji ispisuje Hello world!.
560/1275
Primjer 5. #include<unistd.h> /*definira fork() I pid_t*/ #include<sys/wait.h> /*definira wait() sistemski poziv*/ pid_t child_pid; /*smjestaj pid child procesa*/ int chile_status; child_pid = fork(); switch (child_pid) { /*fork() NIJE uspio*/ case -1: perror(fork); /*ispisuje vec definiranu poruku o gresci*/ exit (1); /*fork() JE supio, sad smo unutar child procesa*/ case 0: printf(Hello world!\n); exit (0); /*ovdje izlazimo iz CHILD procesa*/ default: } /* ovdje mozemo dodati parent kod */ *wait() sistemski poziv eka dok child process ne zavri, i sprema njegov izlazni status u varijablu *perror ispisuje poruku o greci temeljenu na errno varijabli Funkcija fork() kopira i dio memorije poznat kao U Area (User Area). Taj dio memorije sadri izmeu ostalog, file descriptors tablicu procesa. To znai da nakon povratka iz fork() poziva, child proces nasljeuje sve file-ove koji su otvoreni u parent procesu. Isto tako, file-ovi koji su otvoreni nakon fork() poziva, se ne dijele izmeu parent i child procesa. Ako jedan proces zatvori zajedniki file, on je i dalje otvoren u drugom procesu. /*fork() je uspio, sad smo unutar PARENT procesa*/ wait (&child_status); /*cekaj dok ne zavrsi child process*/ /*sta je tocno napravio child process?*/
561/1275
562/1275
MEHANIZMI IPC-a
Za razmjenu podataka
Za sinkronizaciju
Mreni mehanizmi
pipes sockets
message queues
shared memory
files
Slika 1.
563/1275
Slika 2.
*pipe-ovi koriste meuspremnike (buffer cashe) veliine jednog bloka (obino 512 bajtova)
564/1275
Cjevovod stvaramo pozivom pipe(). Odnosno: Int pipe(int fildes[2]) Pipe vraa dva file descript-ora, fildes[0] i fildes[1]. Podaci pisani u fildes[1] mogu se itati iz fildes[0] po sistemu First-In-First-Out. Za pisanje u pipe iz procesa koristi se poziv write() u file descriptor fildes[1], a za itanje iz cjevovoda koristi se poziv read() uz file descriptor fildes[1]. Pipe zatvaramo pozivom close(). Ako je sve uspjeno izvreno, pipe vraa 0; ako nije pipe vraa -1 i postavlja errno. Program moe pristupiti pipe-u samo putem file descriptor-a. Zbog toga pipe moe koristiti samo onaj proces koji ga je stvorio i potomak koji je naslijedio descriptor-e putem fork-a.
565/1275
Kada process pozove read() iz pipe-a, read() odmah vraa ako pipe nije prazan. Ako je pipe prazan, read() eka dok se neto ne upie u pipe toliko dugo koliko proces dri pipe otvoren za pisanje. Budui da slika govori vie nego 1000 rijei.. Ovako to izgleda kad su oba kraja pipe-a otvorena za oba procesa ( pipe(p) ):
Parent write( )
p[1]
p[1]
Child write( )
Parent
p[1]
Child write( )
566/1275
pipe
KORAK 2. process A stvara dva child
B
KORAK 3. Svaki proces zatvara onaj
B
write()
C
read()
567/1275
Na redu je konkretan primjer gdje parent proces ita unos sa tastature i alje ga child procesu koji e ga ispisati na monitor.
Primjer 6. #include<stdio.h> #include<unistd.h> /*posao koji obavlja child proces*/ void do_child(int data_pipe[]) { int c; int rc; /*podaci primljeni od parent-a*/ /*povratna vrijednost od read()*/ /*prvo zatvaramo write dio pipea*/
close(data_pipe[1]);
/*petlja koja cita podatke iz pipe-a i ispisuje ih*/ while ((rc = read(data_pipe[0], &c, 1)) > 0 { putchar(c); } exit(0); } /*posao koji obavlja parent proces*/ void do_parent(int data_pipe[]) { int c; /*podaci primljeni od korisnika*/ int rc; /*povratni status od getchsr()*/ /*prvo zatvaramo nepotrebni read dio pipe-a*/ close(data_pipe[0]);
568/1275
/*sad postavljamo petlju za citanje korisnickog unosa I upis u pipe*/ while ((c = getchar()) > 0) { /*upisi podatke u pipe*/ rc = write(data_pipe[1], &c, 1); if (rc == -1) { perror(Parent); close(data_pip[1]); exit(1); } } /*u slucaju neuspjeha obavijesti o gresci I izai*/
/*ako smo dosli do EOF*/ close(data_pipe[1]); /*zatvori pipe tako da child zna da smo gotovi*/ exit(0); }
/*glavna funkcija*/ int main(int argc, char* argv[]) { int data_pipe[2]; /*niz za spremanje file descriptors-a*/ int pid; int rc; /*prvo stvorimo pipe*/ rc = pipe(data_pipe); if (rc == -1) { perror(pipe); exit(1); /*pid child procesa*/ /*za spremanje povratnih vrijednosti*/
569/1275
} pid = fork(); switch (pid) { case -1: exit(1); case 0: default: } return 0; } Dakle, child process je zatvorio write kraj pipe-a (jer treba samo itati iz pipe-a), dok je parent proces zatvorio read kraj pipe-a (jer treba pisati u pipe). *errno kernel javlja razlog greke tako da sprema broj greke u globalnu varijablu errno (sys/errno.h); perror(string) trai broj greke koja se dogodila te pie na standard error poslani string i ispisuje opisnu poruku o greci /*unutar child procesa*/ do_child(data_pipe); /*unutar parent procesa*/ do parent(data_pipe); /*fork nije uspio*/ perror(fork);
Postoji jo jedan nain na koji moemo stvoriti pipe; putem tzv. formatted pipeing-a. Sintaksa je sljedea: FILE *popen(char *command, char *type)
570/1275
Na taj nain otvaramo pipe za I/O gdje je command proces koji e se povezati sa pozivajuim procesom i na taj nain stvoriti pipe. type je ili r - za itanje, ili w - za pisanje. Pipe koji smo stvorili na ovaj nain bi uvijek trebali zatvoriti sa *stream). Za komunikaciju sa pipe-om koristimo fprintf() i fscanf(). *u C-u postoje dvije klase funkcija koje se bave datotenom problematikom. Prvu klasu ine sve one funkcije koju datoteku pamte preko tzv. File-pointera, odnosno varijable tipa (FILE*). To su funkcije poput fclose,fread,fwrite. U drugu klasu spadaju funkcije koje datoteku pamte preko njezinog rukovatelja (handle). Svakoj se datoteci prilikom otvaranja pridruuje njezin nenegativni i u tom procesu jedinstveni broj koji jednoznano definira tu datoteku. Prvih nekoliko rukovatelja zauzima se ve prilikom pokretanja procesa. To su redom: 0 rukovatelj standardnog ulaza (FILE* ekvivalent stdin), 1 rukovatelj standardnog izlaza (FILE* ekvivalent stdout) 2 rukovatelj standardne greke (FILE* ekvivalent stderr) pclose(FILE
571/1275
slobodni broj. Najmanji brojevi 0, 1 i 2 su descriptor-i standardnog ulaza, standardnog izlaza i standardnog izlaza za greke. Koristei to pravilo, kraj pipe-a iz kojeg se moe itati se povezuje na standardni ulaz na sljedei nain: zatvori se descriptor datoteke 0 i duplicira se descriptor kraja za itanje pipea dup e vratiti descriptor datoteke 0. ako se zatim pokrene proces koji ita standardni ulaz, on e itati iz pipe-a (prethodno treba zatvoriti polazni descriptor kraja za itanje pipe-a ako vie nije potreban)
572/1275
to se prvog naina tie, ako elimo stvoriti imenovani cjevovod koji bi nazvali recimo prvi_fifo, to bi uinili ovako: mknod prvi_fifo p Kao to se vidi, imenovani cjevovodi imaju ime (prvi_fifo) te su oznaeni kao posebna vrsta datoteke (oznaka p pipe). Drugi nain na koji moemo napraviti FIFO je uz pomo mknod() sistemskim pozivom. Int mknod(char *path, int mode, int dev); Tu se stvara nova datoteka iji put (ukljuujui ime) je path. Tako stvoreni imenovani cjevovod moemo otvoriti naredbom:
573/1275
Int open(char *path, int flags [, int mode] ); Do sada nismo koristili flags koji je kombinacija zastavica definiranih u <fcntl.h>. Najee koritene su: O_RDONLY otvori za itanje O_WRONLY otvori za pisanje O_RDWR otvori za itanje I pisanje O_NDELAY utjee na postupak otvaranja I kasniji rad sa read I write ako se operacija ne moe obaviti bez ekanja , nema ekanja nego se vraa greka O_APPEND dodavanje na kraj datoteke O_SYNC write e ekati sve dok podaci ne budu stvarno zapisani na disk O_CREAT ako datoteke nema, kreira se nova sa pravilima pristupa definiranim u mode O_TRUNC ako datoteka postoji njen sadraj se brie O_EXCL ne dozvoljava koritenje postojee datoteke ako je postavljeno O_CREAT
FIFO moemo stvoriti i pozivom mkfifo() funkcije. #include<sys/stat.h> int mkfifo(const char *path, mode_t mode);
574/1275
Funkcija mkfifo() takoer stvara novu datoteku iji put je path (path i ime datoteke), dok mode argument specificira dozvole . U sluaju uspjeha, mkfifo vraa 0, a u sluaju neuspjeha vraa -1 i postavlja errno. Otvaranje imenovanog cjevovoda se radi pomou, ve spomenutog, open() sistemskog poziva ili koristei fopen() standardnu C funkciju. U sluaju uspjeha dobivamo file descriptor (u sluaju open(), ili FILE pointer u sluaju fopen()), kojeg moemo koristiti za ili pisanje ili itanje. Zatvaranje fifo-a radimo pomou close() a brisanje pomou unlik() funkcije.
*neke starije verzije UNIX-a imaju samo mknod naredbu, neke samo mknod() funkciju *kad se imenovani cjevovod otvara za itanje, open eka dok ga neki drugi process ne otvori i za pisanje. Vrijedi i obrnuto. To omoguava procesima da se sinkroniziraju prije nego pone prenoenje bilo kakvih podataka. *kapacitet imenovanog cjevovoda ovisi o implementaciji
Toliko o teoriji; na redu je primjer gdje parent ita ono ta je child napisao u FIFO. Primjer 7. #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <sys/wait.h> #define BUFSIZE 256 #define FIFO_PERM (S_IRUSR | S_IWUSR) int dofifochild(const char *fifoname, const char *idstring); int dofifoparent(const char *fifoname); int main (int argc, char *argv[])
575/1275
{ pid_t childpid;
if (argc != 2) { /* komandna linija ima ime pipe-a */ fprintf(stderr, "Usage: %s pipename\n", argv[0]); return 1; } if (mkfifo(argv[1], FIFO_PERM) == -1) { /* stvori named pipe tj. FIFO */ if (errno != EEXIST) { fprintf(stderr, "[%ld]:failed to create named pipe %s: %s\n",(long)getpid(), argv[1], strerror(errno)); return 1; } } if ((childpid = fork()) == -1){ perror("Failed to fork"); return 1; } if (childpid == 0) /* child pise */ return dofifochild(argv[1], "this was written by the child"); else return dofifoparent(argv[1]); } to se dogaa u primjeru 7.? Prvo se stvara imenovani cjevovod iz path-a odreenog preko komandne linije. Zatim se fork-a child. Child proces pie u imenovani cjevovod, a parent ita ta je napisano. U primjeru je ukljuena provjera greke. Dalji rad sa imenovanim cjevovodima je isti kao i sa obinim cjevovodima.
DODATAK A
576/1275
Funkcije za dobivanje identifikatora procesa: funkcija Pid_t getpid(void) Pid_t getppid(void) Pid_t getuid(void) Pid_t geteuid(void) Pid_t getgid(void) Pid_t getegid(void) Opis Process ID Parent process ID Effective user ID Real group ID Effective group ID
DODATAK B
Dijeljenje datoteka izmeu procesa
Parent i child dijele isti file offset (isti file table entry)
file table
Parent proc.table entry
fd flags ptr f d 0: f d 1: f d 2:
v-node table v-node information i-node information current file size v-node information i-node information current file size
...
fd flags ptr f d 0: f d 1: f d 2:
...
v-node ptr
577/1275
Krasnodar Krajnik
fork
578/1275
UVOD Sistemski pozivi i C bibliotene funkcije (System Calls and Library Functions)
Svaki operacijski sustav osigurava tono odreeni broj pristupnih tokaka (service points) koje omoguavaju programu da zatrai neku uslugu od kernela (dohvaanje datoteke s diska, kreiranje procesa, alociranje memorije, sistemsko vrijeme i dr.). Skup tih pristupnih toaka, odn. usluga koje je mogue zatraiti od kernela zovu se sistemski pozivi (system calls). U UNIX-u, suelje (interface) tih pristupnih toaka odn. sistemskih poziva je dokumentirano i definirano u C jeziku1. Dakle, u UNIX-u za svaki sistemski poziv postoji ekvivalent - C bibliotena funkcija istog imena. Pozivom takve funkcije u C programu poziva se izvravanje odgovarajueg sistemskog poziva kernela. To se izvodi na nain da C funkcija, uz. ev. podeavanje i pripremu parametara, postavlja odreene vrijednosti u registre, a zatim izvrava instrukciju softverskog prekida (software interrupt) nakon ega kernel izvrava zadani sistemski poziv. Na koji nain kernel ostvaruje neku uslugu (sistemski poziv) ovisno je o implementaciji OS-a i korisnik (bio to korisnik za terminalom ili C programer) na ponaanje sistemskog poziva ne moe utjecati. S druge strane, veina C funkcija nije sinonim jednog sistemskog poziva ve za svoje izvravanje koristi ili nijedan (npr. strcpy(),strlen()) ili vie poziva (npr. system()). S toke gledita programera nema razlike izmeu prvih funkcija koje su slike odn. ekvivalenti sistemskih poziva i drugih koje koriste ili nijedan ili vie poziva. Obje skupine slue za razvoj aplikacijskih programa. Broj, ponaanje i funkcionalnost funkcija u svakoj takvoj biblioteci mogue je mijenjati po potrebi, ali broj i ponaanje sistemskih poziva u UNIX-u unaprijed je utvren implementacijom i ne moe se mijenjati.
Kod Windowsa npr. to nije tako;. skup svojih sistemskih poziva Windowsi ne dokumentiraju i ne definiraju
kao skup C bibliotenih funkcija. Umjesto toga, Windowsi koriste Windows API biblioteku koja predstavlja dodatnu razinu, suelje izmeu aplikacije i operacijskog sustava. Korisniki program poziva API funkcije, a API funkcije izvravaju sistemske pozive. S jedne strane, dakle, nema naina da korisniki program direktno izvri sistemski poziv. S druge strane, mogue je mijenjati implementaciju OS-a odn. sistemskih poziva sve dok izmjenjena implementacija ostaje kompatibilna s API.jem.
579/1275
C bibliotene funkcije koje se odnose na rad sa procesima zapravo su preslike, sinonimi (direktni pozivi) sistemskih poziva (fork, execve, wait, kill). Kako se ovaj tekst odnosi na objanjavanje tih poziva, dalje u ovom tekstu e se terminoloki naglaavati razlika izmeu onoga to zapravo predstavlja takva funkcija, sistemski poziv, i svih ostalih funkcija koje to nisu. Svi primjeri u ovom radu kompajlirani su pomou gcc 3.3.2 kompajlera i testirani na distribuciji Mandrake10 LINUX-a.
580/1275
PROCESI U UNIX-U
Proces je instanca programa u izvravanju. Program se izvodi unutar procesa. Takoer, program tijekom izvoenja moe kreirati drugi proces. Svaki proces u UNIX-u identificiran je jedinstvenim brojem, PID-om (process ID). PID je jedinstveni broj dodjeljen od strane operacijskog sustava pri nastanku (kreiranju) procesa. Tip podataka u kojem je sadran PID je pid_t deklariran u <sys/types.h> ( u dananjim sustavima obino 32-bitni unsigned int). Proces iji PID=0 je obino scheduler proces (swapper), dio kernela koji se izvodi kao sistemski proces. Prvi proces, proces s PID=1, zove se init. Init proces je pokrenut od strane kernela na kraju bootstrap procedure. Iz njega su nastali sljedei procesi koji su opet stvarali druge procese itd. Sustav procesa u UNIX-u je, dakle, stablaste strukture
Kernel mode kernel Proces 0: Kernel bootstrap
kojemu je u korijenu init proces. Servisi (procesi) koje pokree init definirani su u konfiguracijskoj /etc/init UNIX-a) (starije i datoteci verzije ili
user2 User mode /etc/init
Proces 1: pokree predefinirane servise, kreira procese za login fork exec login terminal /etc/getty /etc/getty exec /bin/login shell /bin/login exec shell shell user1 provjera passworda
/sbin/init
/etc/inittab. (novije verzije). Init je korisniki proces sa superuser privilegijama koji nikada ne umire.
Slika1. hijerarhija procesa u UNIX-u
581
Mogue je pokrenuti naredbu 'ps' s razliitim opcijama ime utjeemo na izbor procesa i odabir informacija o procesu; selekcija po PID-u, terminalu, korisniku koji je vlasnik procesa, vrijeme startanja procesa itd. (man starnice sadre detalje o opcijama). Primjer punog ispisa svih procesa: [user@localhost user]$ ps -A -f
UID root root ... root ... daemon 1559 user user PID 1 2 5 1 5687 5840 PPID 0 1 1 0 5686 5687 C 0 0 0 12:20 0 0 STIME TTY 12:19 12:19 12:19 ? 13:35 13:58 TIME ? ? ? CMD 00:00:03 00:00:00 00:00:00 init [5] [ksoftirqd/0] [kapmd]
- PID procesa - PID parent procesa - stanje procesa ( R(runnable) pokrenut=1, T (stopped) prekinut=0, - privremeno na 'spavanju', <20s, I(idle) - na 'spavanju' >20s) - vrijeme pokretanja procesa - ime kontrolnog terminala iz kojega je proces pokrenut - ukupno utroeno vrijeme izvravanja - naredba (proces) koja je pokrenula proces
fork
U UNIX-u, kreiranje novog procesa izvodi se izvravanjem sistemskog poziva fork. Svaki UNIX proces kreiran je fork-om i to je jedini nain za kreiranje procesa. Jedine iznimke od toga odnose se na spomenute procese kreirane od strane sistema u toku izvoenja bootstrap procedure. Proces koji poziva fork naziva se parent (roditeljski) proces. Uspjenim izvoenjem poziva fork, nastaje druga (gotovo) identina memorijska kopija programa koji je izvio fork poziv. Ta druga memorijska kopija parenta naziva se child (dijete). Nakon poziva fork obje kopije, i parent i child, nastavljaju izvoenje kao samostalni procesi. Ono osnovno to razlikuje parenta i childa, dakle ono po emu moemo kontrolirati koji dio koda identine memorijske kopije e izvravati parent a koji dio e izvravati child, jest povratna vrijednost koju vraca fork. fork je deklariran kao 582
// sadri deklaraciju pid_t tipa podataka // sadri deklaraciju forka i ostalih funkcija za rad s procesima
Parent procesu fork kao povratnu vrijednost vraa PID childa. Child procesu fork kao povratnu vrijednost vraa 0, U slucaju greke, fork kao povratnu vrijednost vraa -1. Neuspjeli poziv fork-a moe se dogoditi zbog sljedeeg: - nedostatak memorije za kreiranje novog procesa - u sistemu je pokrenuto previe procesa (ovo obino znai da neto nije u redu sa sistemom) - ukupan broj procesa koje je real user pokrenuo prekorauje dozvoljeni limit (limit se moe podesiti) (dodatno - vidi poglavlje vfork i copy-on-write) Dva su osnovna naina kako se upotrebljava fork: kada se proces eli duplicirati tako da parent i child izvravaju razliite dijelove koda istog programa. Ovo je tipino za mrene servere - parent proces eka na zahtjev klijenta. Kada zahtjev stigne parent forka childa koji e opsluiti zahtjev. Parent nakon fork-a nastavlja s oslukivanjem novih zahtjeva. U ovoj koncepciji se i dio osnovnog koda koji se odnosi na upravljanje serverom i dio koda koji se odnosi na opsluivanje pojedinog klijenta nalaze unutar istog programa, na jednom mjestu. kada proces eli pokrenuti izvravanje nekog drugog programa. U ovom sluaju fork upotrebljavamo za kreiranje novog procesa, a zatim unutar tog procesa pokreemo neki drugi program. Ovo je tipino za shell programe. U tom sluaju nakon forka izvrava se sistemski poziv execve koji slui za pokretanje programa.. Ova podjela ne mijenja nita u nainu rada forka, jednostavno se odnosi na injenicu da je u drugom sluaju potrebno izvriti fork prije nego to se izvri execve budui da sam execve sam za sebe nema previe smisla. Pojednostavljeno, ili koristimo samo fork ili koristimo kombinaciju fork-execve.
583
1 - fork()
proces structure
kernel
2 -alocate
4 - set pid=0
Stack 3 - copy
Stack
Heap
... pid_t pid; ...
Heap
... pid_t pid; ...
Data Text
... pid = fork() if (pid == 0) { ... } else if (pid >0) { ... } parent
7 - run
... pid = fork() if (pid == 0) { ... } else if (pid >0) { ... } child
Slika2. okvirni princip rada forka 'u area' je dio adresnog prostora procesa koji se nalazi iznad stack segmenta i tipino je mapiran na fiksne adrese. 'u area' sadri kontrolne podatke koji operacijskom sustavu slue da osigura pravilno izvoenje s obzirom na proces-specifine karakteristike: PCB (PCB process kontrol Block) u kome se uva stanje registara procesora izmeu promjene konteksta (context switching) , pravi i efektivni UID, varijable okruenja, tablicu file deskriptora i dr. Struktura procesa unutar kernela slui samom kernelu za postizanje funkcionalnosti i pouzdanosti sistema u cjelini i za svaki proces sadri: stanje procesa, pokaziva na 'u area-u', proces GID, prioritet izvravanja, informacije o upravljanju memorijom
Primjer1 ilustrira upotrebu forka kada parent i child izvravaju dio koda unutar istog programa. Jednostavni primjer keiranja procesa forkom:
// primjer1 - jednostavni fork primjer #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]) { pid_t fork_return; int exit_state;
584
printf("befor fork value of fork_return = %d\n\n"); fork_return = fork(); if (fork_return < 0){ // this part of code is run if fork fail fprintf (stderr, "can't fork \n"); _exit(-1); } else if (fork_return == 0){ // this part of code is run by child printf("I'm the child process\n"); printf("My PID = %d \n",(int)getpid()); printf("My parent PID = %d\n", (int)getppid()); printf("in my part of code fork_return = %d\n\n",(int)fork_return); } else{ // this part of code is run by parent printf("I'm the parent process\n"); printf("My PID = %d \n",(int)getpid()); printf("My parent PID = %d\n", (int)getppid()); printf("in my part of code fork_return = %d\n\n",(int)fork_return); wait (&exit_state); } }
Varijabla fork_return prilikom deklaracije nije inicijalizirana i do poziva fork poprima neku sluajnu vrijednost. Ono to se zapravo dogaa pozivom fork moemo zamisliti kao sljedee: stvara se kopija itavog adresnog prostora procesa koji je pozvao fork (parent). Pritom, ovisno o tome kako pojedina implemetacija upravlja dijeljenom memorijom, text segment (code) i ostale read-only dijelove mogue je samo mapirati, a ne i kopirati. U svakom sluaju, stvara se nova kopija adresnog prostora koji e postati adresni prostor child procesa. Time dobivamo dva identina procesa u sustavu. Nakon toga, na memorijsko mjesto fork_return varijable unutar adresnog prostora child procesa fork postavlja vrijednost 0. Ukoliko fork poziv uspije (alociranje prostora i kreiranje child procesa), fork kao povratnu vrijednost vraen PID child procesa. Ta e se povratna vrijednost pridruiti fork_return varijabli parenta. Dakle, samo parent proces zaista izvodi fork. Nakon toga e i parent i child, sa razliitim vrijednostima fork_return varijabli, nastaviti izvravanje kao odvojeni procesi na prvoj instrukciji koja slijedi fork. U naem primjeru to znai: za parent - pridruivanje povratne vrijednosti, a za child - na if naredbi kojom se ispituje sadraj varijable fork_return2. Dakle, ako je fork uspio, parent proces izvrit e blok koji zadovoljava uvjet (fork_return > 0), a child proces blok koji zadovoljava uvjet (fork_return == 0). Za bolje razumijevanje, u primjeru se koristie sistemski pozivi pid_t getpid() koji vraa PID procesa iz kojega je pozvan te pozivom pid_t getppid() koji, slino, vraa PID parent procesa.
585
Sistemski poziv wait objasnit emo kasnije. Prethodni program daje sljedei ispis:
before fork value of fork_return = 1075238912 I'm the child process My PID = 12113 My parent PID = 12112 in my part of code fork_return = 0 I'm the parent process My PID = 12112 My parent PID = 12111 in my part of code fork_return = 12113
Dakle, fork je child procesu 'vratio' 0, a parentu broj 12113 koji predstavlja PID od child procesa. Uz to, iz ispisa se vidi da negdje u sistemu postoji i parent proces od naeg parenta. Njegov PID je 12111. Takoer, iz ispisa programa se moe primjetiti da je prvo bio izvren dio koda koji je izvodio child proces, a zatim dio koji je izvrio parent. Da li je to uvijek tako i postoji li pravilo koje odreuje redoslijed? Unix (tonije scheduler) upravlja parentom i childom kao sa samostalnim procesima. Nema garancije koji od njih e prvi nastaviti izvravanje niti koliko e se dugo izvravati prije nego to ga scheduler prekine i dodijeli procesorsko vrijeme nekom drugom procesu. Tonije, ne moemo znati koliki e dio koda izvriti jedan proces prije nego to drugi zavri s izvravanjem. (moemo ev. specificirati prioritet procesa, ali ni to ne daje nikakve garancije) U naem primjeru koristili smo pozive getpid i getppid za dobivanje vlastitog odn PID- a parenta. Odmah spomenimo ovdje da ne postoji funkcija koja bi nekom parent procesu omoguila da dohvati PID nekog svog child procesa. U tom smislu fork je jedini nain za to. U sluaju da parent kreira jednog ili vie child procesa s kojima kasnije ima namjeru manipulirati ili komunicirati trebao bi uvati povratne vrijednosti forka.
586
587
Nakon poziva fork parent i child nastavljaju izvravanje kao samostalni procesi. To je tono u smislu da i jedan i drugi mogu izvravati bilo kakav kod potpuno neovisno jedan o drugom i naknadno redefinirati odreena svojstva koja su nasljeena pozivom fork. Meutim, sama koncepcija nasljeivanja odreenih osobina dovodi do tendencije organiziranosti i kontroliranosti u hijerarhiji procesa. U tom smislu odnos parent i child procesa nije jednak odnosu dva nepovezana procesa u sustavu. Dapae, ako pogledamo svojstva koja child nasljeuje od parenta moemo vidjeti da su ona oekivana i intuitivno poeljna; ako se program izvrava u svom radnom direktoriju poeljno je da to bude radni direktorij novokreiranog childa; takoer je normalno da korisnik koji je 'vlasnik' programa bude 'vlasnik' i pokrenutog child processa itd. S druge strane, ono to child ne nasljeuje zapravo je prevencija od neeljenih situacija. Npr. nasljeivanje objekta sinkronizacije kao to je mutex proizvodilo bi prije zbrku nego to bi predstavljalo poeljno ponaanje. Zamislimo samo da svaki child nasljedi zakljuani mutex. Ili, ako parent proces definira proceduru za upravljanje nekim signalom (signal handler), to tipino nije ono kako bi i child reagirao na odreeni signal. Na kraju krajeva, child i parent izvravaju razliite dijelove koda, rade razliiti posao.
588
fork i execve
U primjeru1 forkom je kreiran child proces koji je izvravao dio koda unutar istog programa kao i parent. Drugi nain upotrebe forka jest kreiranje childa i zatim pokretanje nekog drugog programa unutar tog child procesa. Takvu mogunost ostvarujemo kombinacijom forka i sistemskog poziva execve. Kada proces izvri sistemski poziv execve adresni prostor procesa se 'reinicijalizira' odn. prekriva adresnim prostorom programa koji e se unutar njega pokrenuti. Novi program poinje izvravanje od svoje main funkcije. Proces ID programa koji nastavlja s izvoenjem ostaje isti budui da se ne kreira novi proces. Execve zamijenjuje resurse trenutnog procesa (text, data, heap, stack segmente) sa novim programom uitanim sa diska. Novopokrenuti program preuzima odreena svojstva child procesa. Nabrojimo neka: PID i parent PID, ID stvarnog korisnika i grupe, kontrolni terminal, pokrenute alarme, radni i root direktorij, tms strukturu itd. Zato nam je takva mogunost pokretanja programa unutar postojeeg procesa uope potrebna? Ilustrirajmo to na primjeru UNIX shella. Neprihvatljivo bi bilo ako bi sva funkcionalnost shella bila ograniena na ono sto sam program shella, odn. njegov kod, moe uiniti. Ono to je snaga shella jest upravo njegova mogunost da pokrene izvoenje nekog drugog programa. Nain na koji to zapravo radi jest forkanje novog procesa (novog shella) i izvoenje drugog programa u njemu. execve je deklariran u datoteci zaglavlja <unistd.h> kao int execve(const char *filename, char *const argv [], char *const envp[]); pri emu filename argv [] envp[] - je ime programa kojeg pokreemo - predstavlja listu argumenata prilikom pokretanja; lista argumenata je niz stringova koji mora biti zakljuen nul pokazivaem - predstavlja listu varijabli okruenja; lista varijabli je niz stringova oblika "NAME=value" koji takoer mora biti zakljuen nul pokazivaem U sluaju greke execve vraa -1. Meutim, u sluaju da uspije - ne vraa nita! Execve kopira pokrenuti program u adresni prostor trenutnog procesa. Jedino to se dalje izvodi unutar tog procesa je program koji je pokrenut. Nakon poziva execve nee biti izvrena niti
589
jedna linija koda koja ev. slijedi. Tako, u sluaju da poziv uspije, povratna vrijednost se nema kome vratiti. Zato, povratna vrijednost bit e ona koju vrati pokrenuti program. Primjer2 demonstrira upotrebu execve poziva:
// primjer2 - fork i execve #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> int exec_program (char* program, char** arg_list, char **env){ pid_t child_pid; int status; switch (child_pid = fork()){ case (-1): // if fork fail fprintf (stderr, "can't fork new process\n"); _exit(-1); case (0): // in child we execute 'program' execve (program, arg_list, env); fprintf (stderr, "can't execute %s\n",arg_list[0]); abort (); default: // parent will wait until child ends wait(&status); return 0; } } int main (int argc, char **argv, char **envp){ char* arg_list_ls[] = {"ls","-all", 0}; exec_program("/bin/ls",arg_list_ls,envp); execve("/bin/date",0,0); printf ("done with main program\n"); return 0; } // execute 'ls' in function // execute 'date' here
Funkciji exec_program prosljeujemo ime programa koji elimo izvriti, listu argumenata kojima pokreemo program (arg[0] je ovdje takoer ime programa) i listu varijabli okruenja. U main programu prvo pokreemo 'ls' program za koji smo prije definirali listu argumeata. Taj program pokreneemo u novom procesu. Ako pokretanje uspije program e se izvriti, a nakon toga proces e regularno zavriti s izvravanjem ('ls' je jedino to e se izvriti unutar tog procesa). Zatim u main funkciji pokreemo 'date' program. Ispis programa je ovakav:
total 132 drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x -rw-rw-r--rwxrwxr-x 4 3 2 2 1 1 user user user user user user user 4096 user 4096 user 4096 user 4096 user 9719 user 50660 Pro Pro Pro Pro Pro Pro 3 3 3 3 3 3 12:33 01:55 12:33 01:55 01:55 12:33 . .. .deps .libs Makefile primjer2
590
Sveuilite u Splitu Struni studij Raunarstva Zagreb -rw-rw-r-- 1 user user 47208 Pro Fri Dec 3 12:33:47 CET 2004 Press Enter to continue!
Iz ispisa se moe primjetiti da se linija nakon pokretanja 'date' programa nije izvrila. 'date' je nakon uspjenog poziva execve prepisao adresni prostor procesa programa primjer2.o. Povratna vrijednost koju je terminal dobio je ona koju je vratio 'date'. Postoji vie funkcija (skupina exec) koje slue za pokretanje programa. U mnogim implementacijama UNIX-a, samo je jedna iz te skupine exec funkcija, obino execve, ona koja predstavlja ekvivalent odn. direktan poziv stvarnom sistemskom pozivu. Prostalih pet su bibliotene funkcije koje prije poziva execve obave jo poneko podeavanje vezano uz argumente, putanju do izvrne datoteke i sl. S obzirom na nain pozivanja i karakteristike razlikujemo: funkcije koje sadre slovo 'p' u imenu (execvp i execlp) primaju ime programa i trae program s tim imenom u trenutnom path-u; funkcijama koje ne sadre slovo 'p' potrebno je proslijediti puni path programa koji se eli pokrenuti funkcije koje sadre slovo 'v' u imenu (execv, execvp i execve) za program koji se pokree prihvaaju listu argumenata kao NULL-terminirani niz pokazivaa na string. Funkcije koje sadre slovo 'l' (execl, execlp i execle) prihvaaju listu argumenata kao var-args mehanizam koriten u C jeziku funkcije koje sadre slovo e u imenu (execve i execle) prihvaaju dodatni argument, niz varijabli okruenja u obliku NULL-terminiranog niza pokazivaa na stringove. Svaki string oblika je "VARIJABLA=vrijednost" execve pozivom real user ID i real group ID se ne mijenjaju, ali se efektivni ID mogu promijenti ovisno o statusu set-user-ID i set-group-ID bitova postavljenih za pokrenuti program. Prilikom forkanja svaki deskriptor otvoren u parent procesu ima svoj close-on-exec flag. Ako je taj flag postavljen, deskriptor je zatvoren nakon izvravanja exec poziva. U suprotnom (podrazumijevano stanje), deskriptor ostaje otvoren.
591
funcija system
#include <stdlib.h> int system(const char *command); Upotreba standardne C bibliotene funkcije system je jednostavan nain za pokretanje izvravanja nekog programa. Meutim, system funkcija zapravo izvodi kreiranje procesa (fork) u kojem se zatim pokree Bourne shell (execve) i kojem se na izvravanje predaje argument 'command'. Kao povratnu vrijednost funkcija vraa exit status shell komande. Ukoliko shell ne moe biti pokrenut vraa vrijednost 127, a u sluaju neke druge greke -1 (npr greka forka). Sistem funkcija nije zadovoljavajue rjeenje za opu upotrebu budui da se oslanja na postojanje Bourne shell-a u sustavu. U mnogim implementacijama /bin/sh pokazuje na razliite verzije bash-a. Pokretanje programa s root privilegijama pomou system funkcije moe uzrokovati drukiji rezultat na razliitim UNIX/Linux implementacijama. Zato je prporuljivo koritenje fork i execve sistemskih poziva u svrhu pokretanja procesa.
592
Vfork
vfork sistemski poziv se prvotno pojavljuje u inaici 3.0 BSD-a. Predstavljen je prvenstveno kao zamjena za fork u sluajevima kada je potrebno izvriti kombinaciju fork i exec poziva. Vforkom se izbjegava kopiranje adresnog prostora koji se ionako odmah zatim prepisiuje pokrenutim programom. Osnovna razlika koju ini upotreba vforka proizlazi iz sljedeeg: nakon to se vforka child proces, parent proces se privremeno blokira i child moze "posuditi" parentov adresni prostor. Ovakvo stanje ostaje prisutno sve dok child ili zavrsi s izvodenjem ili izvri sistemski poziv execve. Nakon toga parent proces nastavlja s izvoenjem. Ovo znai da vforkani child proces ne smije neoekivano promijeniti vrijednosti varijabli parent procesa. tovie, child proces ne smije izai (return) iz funkcije koja sadri vfork (u kojem je child kreiran) i ne smije zavriti pozivom exit. Ako child eli izai, trebao bi pozvati _exit. (Ovo se takoer odnosi i na obini fork. Kasnije emo objasniti zato je to tako.) Druga bitna razlika u odnosu na fork je u tome to vfork garantira da e child proces prvi nastaviti izvoenje, sve dok ne pozove execve ili exit. Nakon to child pozove bilo koju od ove dvije funkcije, daljnje izvoenje nastavlja parent. U smislu ovoga to smo naveli vfork je trebao predstavljati optimiziranu verziju forka naroito u sustavima koji nemaju implementiranu copy-on-write tehniku. Meutim, vfork je sa sobom donio previe popratnih problema; od zahtjeva da ne smije mijenjati nita u adresnom
593
prostoru parenta (a koristio je i parentov stack), ogranienja s obzirom na nain prekida izvravanja, do najvanijeg - ponaanje u sluaju neuspjelog execve poziva bilo je nedefinirano. Zbog toga, razliite implementacije podravale su ga ili nisu na razliite naine. I sam BSD ve ga je u verziji BSD 4.4 podravao tek kao sinonim forka. Danas se upotreba vforka vie ne preporuuje osim u posebnim sluajevima i za potrebe kompatibilnosti.
copy-on-write tehnika
U Linux-u i novijim verzijama Unix-a poboljanje performansi rada s memorijom koji se naraito oituje prilikom kreiranja procesa ostvareno je koritenjem copy-on-write tehnike. Ova tehnika oslanja se na pomo naprednih sklopova za upravljanje memorijom (MMU) prisutnima u novijim generacijama procesora ili kao dio posebnog hardvera raunala. Osnovna pretpostavka na kojoj se zasniva princip ovakvog upravljanja memorijom je taj da dva ili vie procesa mogu u svom adresnom prostoru istovremeno imati mapirane iste (dijele ih) fizike stranice sve dok nad tim stranicama vre samo operacije itanja. Nakon to proces pokua pisati u stranicu koja predstavlja dijeljeni dio memorije, memory manager (dio kernela zaduen za upravljanje memorijom) razumije da se radi o pokuaju pisanja u copy-on-write stranicu. Umjesto da generira pogreku stranice (page fault odn. access violation) memory manager alocira prostor za novu stranicu u koju zatim kopira originalnu stranicu, a zatim se ta stranica mapira u adresni prostor tog procesa. Dakle, stvarno kopiranje se obavlja samo za one stranice u koje proces upisuje i to tek onda kada pokua izvriti instrukciju pisanja. Za izvravanje forka to znai da se 'skupa' operacija prvotnog kopiranja svodi samo na kopiranje tablice stranica adresnog prostora, a ne i sadraja itavog adresnog prostora. Takoer, ovo bitno smanjuje mogunost neuspjelog poziva forka jer su u ovom sluaju memorijski zahtjevi znatno manji.
594
Informacije o tome kako je proces zavrio dostupne su u sluaju exit i _exit funkcija kao exit status, odn argumenat prosljeen prilikom poziva funkcije. U sluaju abnormalne terminacije kernel generira termination status kojim pokuava prikazati razlog abnormalnog prekida izvravanja. Parent proces moe dohvatiti informacije o nainu na koji je child prekinuo izvoenje pomou wait i waitpid sistemskih poziva Zato koristiti _exit radije nego exit kao naredbu za zavretak izvoenja childa? Osnovna razlika izmeu exit i _exit je u tome to prva obavlja ienja vezana uz bibliotene funkcije u user-modu (I/O) i zatim poziva korisniki definirane funkcije ienja. Druga obavlja ienja samo od strane kernela za dati proces. U dijelu koda koji se odnosi na kreiranje, izvoenje i zavretak child procesa stoga je u normalnim okolnostima neispravno koritenje poziva exit. To na primjer, moe dovesti do dvostrukog ispranjavanja spremnika standarnog ulaza (stdio buffer) i brisanje privremenih datoteka. U C++ kodu ovakva situacija postaje jo gora zato jer se destruktori statikih objekata mogu izvriti na pogrean nain. (Postoje odreeni sluajevi, npr. deamon procesi, u kojima bi zapravo parent trebao biti taj koji e izviti sistemski poziv _exit umjesto childa, 595
Bazino pravilo u gomili uobiajnih sluajeva jest da je sistemski poziv exit potrebno izvriti samo jednom unutar funkcije main(). U sluaju upotrebe poziva vfork, upotreba exit-a jo je opasnija zbog toga to moe utjecati na stanje parent procesa.
zombie procesi
Budui da je struktura procesa stablastog tipa i postoji parent-child odnos koji proizlazi iz koncepta nasljeivanja svojstava - redoslijed kojim parent i njegovi child procesi zavravaju s izvoenjem nije nebitan. Kada proces zavri s izvravanjem kernel dostavlja njegov exit odn. termination status parent procesu. Ukoliko parent izvri forkanje childa i child zavri s izvoenjem prije parenta, kernel jo uvijek uva informacije o exit statusu childa - za sluaj da parent zatreba te informacije. Ovakva mogunost je poeljna, a esto i nuna. Da bi parent mogao dobiti takvu informaciju, potrebno je da izvri wait sistemski poziv nakon to je izvrio fork. Ovaj poziv uzrokuje da parent zaustavi izvoenje sve dok njegov child na zavri. Nakon to child zavri i izvri se obrada wait poziva odn. dohvaanje exit statusa, kernel moe odbaciti informacije vezane uz childa. Odstupanje od ovakvog redoslijeda uzrokuje nastanak nepoeljnih zombie i orphan procesa. Ako child zavri s izvoenjem prije nego to se uope poinje ekati na njega, on postaje zombie. Ako se nikada nije niti ekalo na zavretak njegovog izvoenja, takoer postaje zombie. Premda se takav child proces vie ne izvrava, i dalje zauzima mjesto (entry) u tablici procesa (ili u novijim implementacijama samo inf. o exit statusu).. Ovo nije dobro zato jer tablica procesa sadri fiksan broj redaka (entryja) i mogue je da postane prepunjena. Takoer, postoji limit broja procesa koje jedan korisnik moe pokrenuti. Ovo je jedan od razloga zato je dobro uvijek provjeriti da li je sam fork uspjeno izvren. Ako parent zavri s izvoenjem prije nego to zavri child, child proces biva posvojen od strane nekog drugog procesa, obino init procesa. Takav child naziva se orphan. Za njega e init pozvati wait odn. obaviti poslove ienja koje je trebao obaviti parent. (Kada init to ne bi uinio ponovno bi se pojavila mogunost da child zavri kao zombie i do daljnjega 'visi' u sustavu.) 596
Kako izbjei nastanak zombie-a? Potrebno je osigurati da parent proces izvri poziv wait (ili waitpid, wait3 ili sl.) za svaki child proces koji kreira. Takoer, na nekim sistemima mogue je specificirati da parent nije zainteresiran za exit status childa. Druga mogunost je da parent izvri dvostruko forkanje childa s time jedan child proces zavrava s izvoenjem odmah po pokretanju. Ovo e uzrokovati da proces 'unuk' bude proglaen kao 'siroe', dijete bez roditelja, to e uzrokovati da init proces obavi sva potrebna ienja. Primjer - zombie proces:
// primjer3 - zombie proces #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> int main(int argc, char *argv[]) { pid_t fork_return; int exit_state; fork_return = fork(); if (fork_return < 0){ // printf("Can't fork\n"); _exit(-1); } else if (fork_return == 0){ printf("child is running \n"); // } else{ // printf("parent is running\n"); sleep(1); // system("ps N -r -H"); // wait(&exit_state); system("ps N -r -H"); // } }
if fork fail
child code (return quickly) parent code give child time to finish see if we have a zombie see if we have zombie now!
U ovom primjer parent se nakon kreiranja childa-a prije poziva wait "uspavljuje" na 1 sekundu. Ovo je dovoljno vrijeme da child zavri i postane zombie (defunct). Iz hijerarhijskog ispisa programa vidimo da child proces jo uvijek postoji u sistemu i da mu u opisu stanja stoji zombie ('Z'). Nakon izvrenog poziva wait, child vie ne postoji u sistemu. (naredba 'ps N -r' prikazuje samo procese ije stanje trenutno nije Runnable)
TIME COMMAND
597
Sveuilite u Splitu Struni studij Raunarstva Zagreb 11027 11028 11029 11030 2245 PID 11027 11028 11031 2245 Press pts1 pts1 pts1 pts1 pts0 TTY pts1 pts1 pts1 pts0 Enter to S 0:00 S 0:00 Z 0:00 R 0:00 S 0:00 STAT TIME S 0:00 S 0:00 R 0:00 S 0:00 continue!
Programski alati na Unix raunalima Procesi i upravljanje procesima /bin/sh -c ./primjer_zombie ; ./primjer_zombie [primjer_zombie] <defunct> ps N -r -H /bin/bash COMMAND /bin/sh -c ./primjer_zombie ; ./primjer_zombie ps N -r -H /bin/bash
wait i waitpid
wait i waitpid su deklarirani kao: #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options); wait sistemski poziv blokira trenutni proces (onaj iz kojega je pozvan) sve dok: - se ne zavri neki child proces - dok trenutni proces ne dobije signal za vlastito terminiranje - trenutni proces ne dobije signal za izvravanje procedure nekog svog signal-handlera Ako je child proces ve zavrio (ve se nalazi u stanju zombie) poziv odmah zavrava i svi sistemski resursi koje je child zauzimao se oslobaaju. waitpid moe ekati na zavretak tono specificiranog childa i dodatno posjeduje opcije kojima je mogue definirati razliite naine na koji e se izvriti. pid argument moe imati jednu od sljedeih vrijednosti: pid == -1 pid > 0 pid == 0 - eka na bilo koji child proces ( waitpid (-1, &status, 0) = ekvivalent obinom wait pozivu) - eka na child iji PID = pid - eka na bilo koji child iji process group ID je jednak onom u kojem se izvodi sam proces
598
pid <= -1
- eka na bilo koji child iji process group ID je jednak apsolutnoj vrijednosti od pid
Vana razlika u odnosu na wait odnosi se na argument options; za vrijednost WNOHANG waitpid ne blokira proces nego dozvoljava trenutnom procesu nastavak izvoenja ak i ako nije zavrio child koji se u waitpid specificirao. Ako je argument options=0, waitpid blokira proces. Uz wait i waitpid u pojedinim implementacijama postoje i proirenja. Npr. BSD 4.3 donosi dva nova poziva, wait3 i wait4. Prednost ovih dvaju poziva je to omoguavaju prenornje dodatnih informacija o koritenim resursima terminiranog procesa i svih njegovih child-ova.3 Primjer4 demonstrira rad poziva waitpid.
// primjer4 - waitpid #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> int main(int argc, char *argv[]) { pid_t fork_return[3]; int exit_state[3],i; for(i=0;i<3;i++){ fork_return[i] = fork(); switch(fork_return[i]){ case (-1): printf("Can't fork\n"); _exit(-1); case (0): printf("I'm child No.%d and I+m going to sleep \n",i); sleep(1); abort(); default: printf("waitpid for child %d after fork \n\n",i); waitpid(fork_return[i],&exit_state[i],WNOHANG); // wrong use of waitpid! } } system("ps N -r -H"); // see that both parent and childs are running sleep(2); system("ps N -r -H"); // see that now childs are zombies for(i=0;i<3;i++){ printf("waiting for child %d \n",i); waitpid(fork_return[i],&exit_state[i],0); // now we clean after the childs } system("ps N -r -H"); }
U Linux-u (Mandrake10) ove i dodatne opcije je dostupne su pozivom waitpid (man stranice sadre detaljnije upute)
599
U parent dijelu koda pozivamo waitpid s opcijom WNOHANG iako je oito da se child procesi izvravaju. To znai da e parent nastaviti izvoenje, a child procesi koji zavre prije sljedeeg wait/waitpid poziva postat e zombi procesi. Drugi poziv waitpid na kraju programa pobrinuo se za ienje. Ovdje je kao trei argument waitpid pozivu prosljeena 0 to znai da waitpid blokira proces. Ukoliko bi se specificirani (fork_return[i]) child na kojeg se eka jo izvodio, ovdje bi se parent proces blokirao. U naem sluaju se to ne dogaa jer su svi child procesi ve zavrili. Ispis primjera4:
I'm child No.0 and I'm going to sleep waitpid for child 0 after fork I'm child No.1 and I'm going to sleep waitpid for child 1 after fork I'm child No.2 and I'm going to sleep waitpid for child 2 after fork PID TTY 5105 pts1 Enter to 5106 pts1 5107 pts1 5108 pts1 5109 pts1 5110 pts1 2198 pts0 PID TTY 5105 pts1 Enter to 5106 pts1 5107 pts1 5108 pts1 5109 pts1 5111 pts1 2198 pts0 waiting for waiting for waiting for PID TTY 5105 pts1 Enter to 5106 pts1 5112 pts1 2198 pts0 Press Enter STAT S R S S S R S STAT S S Z Z Z R S child 0 child 1 child 2 STAT S TIME COMMAND 0:00 /bin/sh -c ./primjer4_waitpid ; echo "Press 0:00 ./primjer4_waitpid 0:00 ./primjer4_waitpid 0:00 ./primjer4_waitpid 0:00 ./primjer4_waitpid 0:00 ps N -r -H 0:00 /bin/bash TIME COMMAND 0:00 /bin/sh -c ./primjer4_waitpid ; echo "Press 0:00 ./primjer4_waitpid 0:00 [primjer4_waitpi] <defunct> 0:00 [primjer4_waitpi] <defunct> 0:00 [primjer4_waitpi] <defunct> 0:00 ps N -r -H 0:00 /bin/bash
600
601
const struct sigaction act; act.sa_handler = funkcija_handler (ili act.sa_sigaction = funkcija_handler) sigaction (SIGCHLD, &act, NULL) Ovime se definira odgovor na signal SIGCHLD. Sa odgovarajue podeenom sigaction strukturom moemo kontrolirati ponaanje procesa nakon primitka SIGCHLD signala: act.sa_handler = SIG_DFL act.sa_handler = SIG_IGN - podrazumijevani odgovor na signal - signal se ignorira privremeno zaustavlja (SIGSTOP, SIGTSTP, SIGTTIN or SIGTTOU) signal SIGCHLD nee biti generiran act.sa_flags is SA_NOCLDWAIT - child procesi se nakon zavretka nee pretvoriti u zombie procese Primjer5 pokazuje kako se redefinicijom signal-handlera moe sprijeiti nastanak zombie procesa.
// primjer5 - izbjegavanje zombi procesa redefinicijom signala #include <sys/types.h> #include <unistd.h> #include <signal.h> #include <sys/wait.h> #include <stdio.h> int main(int argc, char *argv[]) { pid_t fork_return[3]; int exit_state[3],i; struct sigaction act; act.sa_handler=SIG_IGN; // one way: ignore SIGCHLD (no zombies) act.sa_handler=SIG_DFL; // another way: catch the signal but act.sa_flags=SA_NOCLDWAIT; // set SA_NOCLDWAIT (no zombies) i=sigaction (SIGCHLD, &act, 0); for(i=0;i<3;i++){ fork_return[i] = fork(); switch(fork_return[i]){ case (-1): printf("Can't fork\n"); _exit(-1); case (0): // child code printf("I'm child No.%d and I'm going to sleep \n",i); sleep(1); printf("I'm child No.%d and I'm going to die \n",i); abort(); default: // parent code
// //
602
printf("I'm the parent. Just create child No. %d \n\n",i); } } printf("\n\nI'm system("ps N -r sleep(3); printf("\n\nI'm system("ps N -r } the parent. Just create all childs \n "); -H"); // see that both parent and childs are running // give childs time to finish the parent. My childs all finished \n "); -H"); // see that now childs are not zombies
SIGCHLD je signal za kojeg smo redefinirali akciju. Sigaction strukturom definira se handler koji e se izvriti kao odgovor na signal. Ovdje smo prosljeivanjem SIG_IGN poruili kernelu da nas ne zanima kada i kako su child procesi zavrili (samim time niti njihov exit status). Tako, nakon to child zavri s izvoenjem kernel e odbaciti sve informacije vezane uz child procese koji zato nee postajati zombie procesi. Ovime smo omoguili neovisno izvoenje parent i child procesa bez bojazni od nastanka zombie procesa. Ispis primjera5:
I'm child No.0 and I'm going to sleep I'm the parent. Just create child No. 0 I'm child No.1 and I'm going to sleep I'm the parent. Just create child No. 1 I'm child No.2 and I'm going to sleep I'm the parent. Just create child No. 2
I'm the parent. Just create all childs PID TTY STAT TIME COMMAND 2694 pts1 S 0:00 /bin/sh -c ./primjer5 ; echo "Press Enter to continue 2695 pts1 R 0:00 ./primjer5 2696 pts1 S 0:00 ./primjer5 2697 pts1 S 0:00 ./primjer5 2698 pts1 S 0:00 ./primjer5 2699 pts1 R 0:00 ps N -r -H 2172 pts0 S 0:00 /bin/bash I'm child No.0 and I'm going to die I'm child No.1 and I'm going to die I'm child No.2 and I'm going to die
I'm the parent. My childs all finished PID TTY STAT TIME COMMAND 2694 pts1 S 0:00 /bin/sh -c ./primjer5 ; echo "Press Enter to continue 2695 pts1 R 0:00 ./primjer5 2700 pts1 R 0:00 ps N -r -H 2172 pts0 S 0:00 /bin/bash Press Enter to continue!
603
#define CHILDS 5 int childs=0; void sigchld_handler(int signum) { pid_t pid_exit; int status;
while ((pid_exit = waitpid(-1, &status, WNOHANG )) > 0 ) { if(WIFEXITED(status)) // process use exit() or step out of main() printf("finished child with pid = %d, has returned %d \n",pid_exit, WEXITSTATUS(status)); else if (WIFSIGNALED(status)) // process was terminated by signal printf("finished child with pid = %d, terminetad by signal no. %d \n",pid_exit, WTERMSIG(status)); childs--; } } int main(int argc, char *argv[]) { pid_t pid;
604
for(i=0;i<CHILDS;i++){ sleep_sec=rand()%10; // child will sleep random sec childs++; switch (pid = fork()){ case (-1): printf("Can't fork\n"); _exit(-1); case (0): // child code printf("I'm child No.%d, my PID is %d, im going to sleep for %d sec \n",i,getpid(),sleep_sec); sleep(sleep_sec); if (getpid() & 1) _exit(sleep_sec); // if odd use exit to finish else kill(getpid(),SIGKILL); // if even terminate with signal default: // parent code break; } } printf("\n\nI'm the parent. Just create all childs \n"); system("ps N -r -H"); // see what is running while (childs) pause(); printf("\n\nI'm the parent. My childs all finished \n"); system("ps N -r -H"); }
pause funkcija 'uspavljuje' proces sve dok ili ne primi signal koji ga terminira ili ne primi signal koji uzrokuje pokretanje nekog signal-handlera. Ova funkcija pozivat e se sve dok broj pokrenutih child procesa ne bude 0 tj. dok signal-handler ne obradi zavretak izvoenja svih child procesa. Evo i ispisa koji ovaj primjer daje. Naravno, budui da se u primjeru koriste random vrijednosti ispis e za svako pokretanje programa biti razliit.
my my my my my
is is is is is
im im im im im
to to to to to
3 6 8 7 0
I'm the parent. Just create all childs PID TTY STAT TIME COMMAND 5867 pts1 S 0:00 /bin/sh -c ./primjer6_signali ; echo "Press Enter to 5868 pts1 R 0:00 ./primjer6_signali 5869 pts1 S 0:00 ./primjer6_signali 5870 pts1 S 0:00 ./primjer6_signali 5871 pts1 S 0:00 ./primjer6_signali 5872 pts1 S 0:00 ./primjer6_signali 5873 pts1 RW 0:00 [primjer6_signal] 5874 pts1 R 0:00 ps N -r -H 2121 pts0 S 0:00 /bin/bash
605
Sveuilite u Splitu Struni studij Raunarstva Zagreb finished finished finished finished finished child child child child child with with with with with pid pid pid pid pid = = = = = 5873, 5869, 5870, 5872, 5871,
Programski alati na Unix raunalima Procesi i upravljanje procesima has returned 0 has returned 3 terminetad by signal no. 9 terminetad by signal no. 9 has returned 8
I'm the parent. My childs all finished PID TTY STAT TIME COMMAND 5867 pts1 S 0:00 /bin/sh -c ./primjer6_signali ; echo "Press Enter to 5868 pts1 R 0:00 ./primjer6_signali 5875 pts1 R 0:00 ps N -r -H 2121 pts0 S 0:00 /bin/bash Press Enter to continue!
Zbog kopiranja adresnog prostora koje se dogaa prilikom izvravanja forka vano je da se linija sleep_sec=rand()%10; nalazi u dijelu koda kojeg izvrava parent. Ako ovu liniju stavimo u dio koda koji izvodi child proces svi child procesi 'spavat' e jednako dugo.
606
int pipe(int filedes[2]); kreira jedan par file deskriptora i stavlja ih u polje fildes pri emu filedes[0] koristimo za itanje, a filedes[1] za pisanje. U luaju da se deskriptori uspiju kreirati povratna vrijednost je 0, a usluaju greke -1 i postavljena globalna varijabla errno. Ovi deskriptori vidljivi su samo unutar parent procesa i svih child procesa naknadno nastalih forkanjem. Dva su uobiajna naina upravljanja deskriptorima nakon forkanja: parent eka na zavretak izvoenja childa. U tom sluaju offset (pozicija) u svakom od deskriptora u koji je child pisao/itao bit e valjano auriran da se izbjegne interferencija, nakon forkanja parent i child zasebno zatvaraju sve deskriptore koji im nisu potrebni close(pipefd) newpipefd = dup(pipefd) dup2(pipefd,newpipefd) - brie deskriptor pipefd i zatvara file na koji se deskriptor odnosi ako je to posljedni deskriptor koji upuuje na file - duplicira pipefd na najnie slobodno mjesto: newpipefd. - zatvara newpipefd ako je razliit od pipefd, a zatim duplicira pipefd na mjesto newpipefd U sljedeem primjeru kreira se child proces koji koristei pipe prosljeuje parent-u rezultat izvravanja programa date.
// primjer7 - pipe #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> int main(int argc, char *argv[]){ char str[1024]; int pipefd[2], status; pid_t pid; if(pipe (pipefd) == -1) exit(-1); switch(pid=fork()){ case -1: printf("can't fork\n"); _exit(-1); case 0 : // child code close(1); // close stdout dup(pipefd[1]); // set pipefd[1] to be stdout execve ("/bin/date",0,0); // date will print in pipefd[1] default: // parent code close(0); // close stdin dup(pipefd[0]); // set pipefd[0] to be stdin fgets(str,1024,stdin); // get 'date' output printf("The date is %s \n", str); wait(&status); } }
607
Ispis je: The date is Tue Dec 7 14:58:19 CET 2004 Press Enter to continue! U primjeru8 izmeu parenta i childa postoji dvosmjerna komunikacija. Parent i child koriste streamove koji se kreiraju na osnovu deskriptora. Parent prima string s konzole, prosljeuje ga childu na obradu. a child nakon obrade vraa rezultat. U <stdio.h> deklarirana je funkcija FILE* fdopen (int flides, const char *mode) koja povezuje stream s postojeim file deskriptorom. mode otvaranja mora biti kompatibilan s modom file deskriptora.
// primjer8 - pipe, stream #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> void read_from_pipe (int file, char *s){ FILE *stream = fdopen (file, "r"); fgets(s,1024,stream); fclose (stream); } void write_to_pipe (int file,const char *s) { FILE *stream = fdopen (file, "w"); fputs(s,stream); fclose (stream); } int main(int argc, char *argv[]){ char str[1024], *cp; int pipe_x[2], pipe_y[2], status; pid_t pid; if (pipe (pipe_x) || pipe (pipe_y)) exit(-1); switch(pid=fork()){ case -1: printf("can't fork \n"); _exit(-1); case 0 : // child code close(pipe_x[1]); close(pipe_y[0]); read_from_pipe(pipe_x[0],str); printf("child read from pipe - %s\n",str); cp=str; while(*cp) *cp=toupper(*cp++); write_to_pipe(pipe_y[1],str); printf("child write to pipe - %s",str); _exit(0); default: // parent code
608
Sveuilite u Splitu Struni studij Raunarstva Zagreb close(pipe_x[0]); close(pipe_y[1]); fgets(str,1024,stdin); write_to_pipe(pipe_x[1],str); printf("parent write to pipe - %s",str); read_from_pipe(pipe_y[0],str); printf("parent read from pipe - %s\n",str); wait(&status); -->pipe } }
609
610
Procesi u UNIXU
Glavnim konceptom u svakom operacijskom sustavu smatramo proces, kao apstrakciju izvravanja programa. Sve ostalo ovisno je o ovom konceptu i zbog toga je vano shvatiti to je proces.
Sva moderna raunala, i moderni OS-ovi mogu raditi vie stvari odjednom. Dok izvrava neki korisnikov program, raunalo u isto vrijeme moe itati i pisati po disku, zaslonu ili printeru. Takoer moe izravati tren jedan, tren drugi program, putajui svakog od njih da radi nekoliko desetinki, ili stotinki sekundi. Preciznije reeno u bilo kojem trenutku procesor vrti samo jedan program, ali vrlo brzo prebacuje izvravanje programa sa procesora i vraa ga u stanje ekanja. Ponekad opisujui gornju stvar govorimo o pseudo-paralelizmu kako bi naglasili pravi hardverski paralelizam na vieprocesorksim sustavima.
SLIKA 1.1 Razlika izmeu procesa i programa je jedva zamjetna, ali jako bitna. Da bi lake razumjeli razliku, napravimo jednu analogiju. Zamislimo kuhara koji pee roendarsku tortu svojoj keri. On ima recept i kuhinju opremljenu sa svim sastojcima: branom, jajima i sl. U raunalnom svijetu takav kuhar bio bi procesor, a recept bio program, dok bi sastojci bili ulazni podaci. Zamislimo sad da kuharova ker utri u kuhinju plaui jer ju je ubola pela. Kuhar tada zapamti gdje je stao u svom receptu, i prui pomo svojoj keri.
611/1275
Gledano u raunalnom svijetu vidimo da je procesor bio prebaen sa jednog procesa na proces vieg prioriteta, od kojih svaki ima razliiti program. Nakon pruene pomoi kuhar e nastaviti tono od mjeswta gdje je stao. Kljuna ideja je da je proces aktivnost neke vrste. On ima program, ulaz, izlaz i stanje. Pojedini procesor moe dijeliti nekoliko procesa, zajedno sa nekim algoritmom rasporeivanja rada tih procesa na tom procesoru.
Svojstva procesa
Proces izvrava pripadajuci programski kod koji moe doci iz razliitih izvora tj. Razliitih datoteka. Pri izvravanju proces dobiva ograniena prava s kojima raspolae i u okviru kojih se i izvrava. Sam operativni sustav moe pokrenuti proces s apsolutnim pravima gdje on dobiva potpunu slobodu pri izvravanju.
612/1275
Dio operativnog sustava, zvan rasporeivac (eng. Scheduler), dijeli vrijeme sredinje procesorske jedinice svakom procesu koliko mu pripada. Proces zahtjeva memoriju za svoju podatkovnu strukturu. Svakom procesu se prilikom izvravanja dodijeli slobodna memorija. U praksi, taj memorijski prostor ne mora biti ulanano nanizan. Proces ima mogunost pristupa datotenom sustavu, a takve aktivnosti se moraju pomno pratiti kako bi bio zadovoljen nivo sigurnosti te da se otvorene datoteke pravilno zatvore kada proces zavri. Kod svakog procesa nuna je identifikacija prema konvenciji operativnog sustava Prednosti procesa su njegova zatiena podatkovna stuktura (od pristupa drugog procesa). Proces je mogue stvoriti (pokretanjem programa iz ljuske operativnog sustava ili iz aplikacije), on moe zavriti, te su mogua prebacivanja s procesa na proces u toku izvravanja. Kao to je reeno, o njihovom prebacivanju se brine dio operativnog ustava rasporeiva. Postoji nekoliko tehnika rasporeivanja procesa koje on moe koristiti, a ovisi o operativnom sustavu. Kada proces dobiva teoretski neprekidno procesorsko vrijeme u trenutku kada doe na red zaizvravanje, operativni sustav koristi tehniku rasporeivanja Prvi dolazeci prvi posluen ili FCFS (eng. First Come-First Served). Tehniku je jednostavno implementirati, ali zato je siromana mogunostima. Bolja tehnika je gdje se svaki proces razlomi u vremenske isjeke (eng. Quantum) za izvravanje koji meusobno razmjenjuju procesorsko vrijeme prilikom kojeg se izvravaju. Ona se naziva metoda vremenskih isjeaka (eng. Time slicing) iliti RR (eng. Round Robin) i omoguava optimiziranije rasporeivanje procesa, pogotovo onih koji krae traju, naspram FCFS tehnike. Drugaije optimizirane i kompleksnije tehnike su slijedi najkrai proces ili SPN (eng. Shortest Process Next), zamjenski SPN iliti PSPN (eng. Preemtive Shortest Process Next), HPRN (eng. Highest Penalty Ration Next), vierazinski FB (eng. FeedBack), sebini RR iliti SRR (eng. Selfish Round Robin) i druge. U praksi, mogue je u operativni sustav implementirati mjeavinu navedenih tehnika. Tim tehnikama se ne dobiva samo simulacija istovremenog izvravanja vie procesa na jedno-procesorskom raunalu, ve se optimizira izvrdavanje korisnikih aplikacija i samog operativnog sustava. Meutim, na vieprocesorskom raunalnom sustavu (sa vie sredinjih procesorskih jedinica), procesi se u stvarnom vremenu izvravaju istovremeno i to onoliko
613/1275
njih koliko ima procesorskih jedinica (dvije, etiri ili vie). U praksi, svaka sredinja procesorska jedinica jednog vieprocesorskog sustava pojedinano takoer koristi ranije navedene metode. Navedene metode moemo podijeliti na one koji podravaju zamjenu (eng. Preemption) procesa i one koje rade s nezamjenskim (eng. Non-preemptive) procesima. Zamjenske metode omoguuju da se nad jednom sredinjom procesorskom jediniciom naizmjence izmjenjuju procesi, pod odreenim uvjetima, a prije nego to je pojedini zavrio sa svojim radom (simulacija vieprocesorske okoline). Prema tome, imamo slijedeu podjelu rasporeivakih metoda : zamjenske metode: RR, FB, SRR, PSPN, nezamjenske metode: FCFS, SPN, HPRN. Prilikom zamjene ili prebacivanja, stanje registara procesa s kojeg se prebacuje se mora pohraniti u podatkovnu strukturu tog procesa te se registri procesa moraju napuniti novim vrijednostima iz podatkovne strukture procesa na koji se prebacuje tok izvravanja. to se trajanja tie, samo stvaranje procesa smatra se skupom, dok se prebacivanje procesa relativno skupom operacijom. To su i nedostaci rada s procesima. Takoer, u praksi je moguce u viedretvenoj okolini izvravanje i nezamjenjivih (eng. Non-preemtive) dretvi, ali takvi algoritmi su orijentirani prema izvravanju jedne dretve (po procesoru) omogucujuci time izvravanje dretvi jedne za drugom bez mogunosti zamjenjivanja. Tada je briga o sinkronizaciji svedena na minimum. Algoritmi koji se koriste u tu svrhu su prvi dolazei prvi posluen (FCFS), slijedi najkrai proces (SPN), te sustav prioriteta. Na UNIX/Linux operativnom sustavu, proces koji je nastao kao instanca programa zapisanog na mediju za pohranu podataka, moe stvarati druge procese njegovu djecu ili podprocese.Da bi to napravio, proces roditelj se koristi sustavskim pozivom fork kojim stvara novi proces s nasljeenom veinom sustavnih svojstva roditelja: int fork(void) ;
614/1275
U ovaj sustavski poziv ulazi jedan proces, a iz njega izlaze dva odvojena procesa (dijete i roditelj) koji tada dobivaju svaki svoju povratnu vrijednost. Proces dijete dobiva rezultat 0, a roditelj dobiva identifikacijski broj procesa djeteta. Ako doe do greke, vraena vrijednost je -1 i ne dolazi do stvaranja procesa dijete. Poziv fork nema nikakvih argumenata i programer ne moe biti odgovoran za greku. Ona moe biti rezultat nemogunosti jezgre operativnog sustava da stvori novi proces (dijete) zbog nedostatka nekog od potrebnih sredstava. Kao to je reeno, proces dijete nasljeuje veinu svojstava iz segmenta sustavskih podataka kao to su trenutni direktorij, prioritet ili identifikacijski broj korisnika. Manje je atributa koji se ne nasljeuju: Osobni brojevi procesa djeteta i roditelja su razliiti. To su u biti razliiti procesi. Proces dijete dobiva kopije otvorenih opisnika datoteka (eng. File descriptor) od roditelja. No, to nisu ti isti opisnici datoteka s obzirom da ih procesi ne dijele. Ipak, procesi dijele kazaljke poloaja u datotekama (eng. File pointer). Ako jedan proces namjesti kazaljku poloaja na odreeno mjesto u datoteci, drugi proces ce takoer itati odnosno pisati od tog mjesta. Za razliku od toga, ako dijete zatvori svoj opisnik datoteke, to nema veze s roditeljevim opisnikom datoteke. Vrijeme trajanja procesa djeteta je postavljeno na nula. Proces dijete se moe inicijalizirati stvaranjem nove instance programa s medija za pohranu podataka (poziv exec) ili izvoenjem posebnog dijela ve instanciranog programa, dok istovremeno proces roditelj moe ekati da dijete zavri svoj zadatak i/ili raditi neto drugo.Poziv sustavu exit pokrece zavretak izvravanja procesa pozivatelja. Prije samog zavretka, uredno se zatvaraju sve otvorene datoteke. Poziv ne vraa nikakvu vrijednost jer iza njega nema nastavka procesa. Za status se obino stavlja 0 ako proces normalno zavrava, a 1 inae. Void exit(int status);
615/1275
Roditelj procesa koji zavrava pozivom exit prima njegov status preko sustavskog poziva wait: int wait(int *statusp) ; Poziv wait eka da neki od procesa djece zavri (ili bude zaustavljen za vrijeme ekanja), s tim da mu se ne govori koji proces da eka. Funkcija vraa identifikacijski broj procesa djeteta koji je zavrio i sprema njegov 16-bitni status u cijeli broj na koji pokazuje statusp, osim kada je taj argument NULL. U tom sluaju se status zavrenog procesa gubi. U sluaju pogreke (kada nema djece ili je ekanje prekinuto primitkom nekog prekidnog signala) rezultat je 1. Proces moe zavriti na tri naina i to: pozivom exit, primitkom signala ili padom cijelokupnog sustava (gaenje raunala, nestanak struje i drugo). Logino, samo kod prva dva naina moemo saznati nain zavretka podprocesa itanjem vrijednosti na koju pokazuje statusp. Osnovni oblik upotrebe sustavskih poziva fork, exit i wait izgleda ovako: if (fork() == 0) { // zadatak procesa djeteta exit(0); } // nastavak izvravanja procesa roditelja ekanje na zavetak djeteta wait(NULL); Moemo pokrenuti i nekoliko procesa da rade istovremeno. Kada elimo pokrenuti npr. 5 podprocesa, to moemo uraditi na sljedei nain: N = 5; for (i = 0; i < N; i++) {
616/1275
switch (fork()) { case 0: // zadatak u procesu djeteta i exit(0); case -1: // proces nije stvoren } } // petlja za prikupljanje svih stvorenih procesa djece while (i--) wait (NULL); Proces roditelj i proces dijete ne moraju zavriti zadatak istovremeno. Poseban je sluaj kada proces roditelj zavri prije svog procesa djeteta. Tada se djetetu dodjeljuje novi roditelj proces init s identifikacijskim brojem 1. Proces init je vaan prilikom pokretanja sustava. U radu sustava veinom izvodi poziv wait kako bi postao roditelj djeci bez roditelja kada oni zavre. Drugi poseban sluaj je kada proces dijete zavrti zadatak, no proces roditelj ga ne eka s wait pozivom. Tada proces dijete postaje tzv. Proces zombi (eng. Zombie). Kao i inae kad zavri neki proces, otputaju mu se njegovi segmenti u radnom spremniku, no u ovom sluaju ostaju njegovi podaci u tablici procesa operativnog sustava. Oni postoje sve dok roditelj ne izvede wait i tada proces zombi nestaje u potpunosti. Ako roditelj zavri, a nije pozvao wait, proces zombi dobiva ranije spomenuti init proces kao roditelja koji e ga pokupiti za wait pozivom.
617/1275
PRIORITETI
Priotiteti procesa kreu se u rasponu od -20 do 20. -20 predstavlja najvii prioritet izvoenja procesa, a 20 najnii. Korisnik moe procesima kojih je on vlasnik prilikom njihovog pokretanja smanjiti prioritet naredbom nice. Sintaksa naredbe nice je slijedea: nice broj naredba gdje je broj relativni prioritet koji se eli postii, dok naredba predstavlja proces koji emo pokrenuti. Tako npr. Moemo u pozadini (operator &) pokrenuti naredbu sleep koja e zavriti nakon 50 sekundi. $ nice -15 sleep 50 & Gornjom smo naredbom procesu sleep smanjili relativni prioritet na 15. Naredbom ps l mogue je vidjeti njezin prioritet (stupac PRI) i njezin relativni prioritet, tzv. Nice number (stupac NI). Stupac PRI predstavlja stvarni trenutni prioritet procesa. Stupac NI (nice number) predstavlja njegov relativni prioritet, broj prema kojem e mu se u vremenu pridjeljivati stvarni prioritet. Stvarni e prioritet biti manji (pozitivniji) to je manji (pozitivniji) nice broj i obrnuto. Uobiajeno je da proces prilikom pokretanja dobiva relativni prioritet 0. Samo superkorisnik (root) moe procesu poveati prioritet. Isprobati naredbu (biti logiran kao root): # nice 10 sleep 50 & Vidimo da je ovu naredbu mogue izvriti jedino ako smo logirani kao root. Uoite da je ovdje rije o negativnom nice broju (-10), dakle poveavamo relativni prioritet procesa. Ukoliko elimo ve aktivnom procesu promijeniti prioritet, koristimo naredbu renice: $ renice 7 432
618/1275
gdje je 432 PID (process ID), a 7 konani prioritet dotinog procesa. PID je broj koji je ispisan na ekranu nakon pokretanja procesa. Naravno, moe ga se doznati i koritenjem naredbe ps l.
STANJA PROCESA
SLIKA 1.2
Svaki proces se moe nai u jednom od 3 stanja: 1. Izvrava se (preciznije koristi CPU u tom trenutku) 2. Spreman je (izvriv (runnable) , privremeno zaustavljen jer neki drugi proces koristi procesor) 3. Blokiran (ne moe nastaviti izvravanje dok se ne dogodi vanjski uvjet)
619/1275
KREIRANJE PROCESA
etiri su razloga koji uzrokuju kreiranje procesa: 1. Inicijalizacija sustava 2. Poziv sistemskog poziva za kreiranje procesa od strane nekog drugog aktivnog procesa. 3. Korisniki zahtjev za kreiranje procesa. 4. Pokretanje neke skripte.
Kada se pokree operacijski sustav, obino se kreira nekoliko procesa. Neki od njih su prvom planu i komuniciraju sa korisnikom i obavljaju nekakav posao za njega, dok su ostali procesi u pozadini, nevezani za pojedinog korisnika, nego za pojedinu funkciju. Procesi koji ostaju u pozadini kako bi rukovali sa aktivnostima poput e-maila, web stranica, printanja i sl. zovu se daemons. Novi proces moe biti kreiran od nekog drugog procesa u bilo koje vrijeme. Npr. ako treba dohvatiti veliki broj podataka preko mree kako bi se sekvencijalno s njima neto raunalo, uobiajeno je da se kreira novi proces koji bi dohvaao te podatke preko mree i spremao ih u nekakvu zajedniku memoriju, dok bi prvi proces uzimao te podatke i raunao s njima. Posebno e doi do ubrzanja kod vieprocesorskih sustava kad bi se svaki od tih procesa odvijao na razliitim procesorima. U nekom interaktivnom sustavu korisnik moe startati program tipkajui naredbu ili klikom na ikonu. I jednim i drugim nainom starta se novi proces u kojem se izvrava odabrani program. Zadnji sluaj kad se proces kreira je npr. pokretanje neke skripte. Korisnik moe poslati sustavu nekakav zathjev ili skriptu (moe i preko 'udaljenih poziva'), nakon ega e operacijski sustav, kad odlui da ima dovoljno resursa za pokretanje idueg posla, kreirati novi proces i unutar njega pokrenuti posao iz reda zahtjeva.
620/1275
Tehniki gledano, u svim ovim sluajevima, neki postojei proces sistemskim pozivom kreaira novi proces. U UNIX-u postoji sam jedan sistemski poziv za kreiranje novog procesa: fork. Ovaj poziv klonira proces koji ga je pozvao. Nakon fork-a dva procesa, roditelj i dijete, imaju istu memorijsku sliku, jednaki vrijednosti u okruenju (enviroment strings) i iste otvorene fileove. Obino proces dijete sa sistemskim pozivom execve ili nekim slinim poziva neki novi program. Npr. kada korisnik u komandnoj ljusci utipka npr. sort, ljuska sa forkom klonira proces i u procesu dijetetu izvri sort. Razlog ovog postupka u 2 koraka je da bi se djetetu omoguila manipulacija sa file deskriptorima nakon fork-a, a prije izvravanja nekog drugog programa, kako bi se mogle izvriti redirekcije standardnih ulaza i izlaza. U Unix-u, nakon to se proces kreira i roditelj i dijete imaju vlastiti adresni prostor. Ako jedan od njih promijeni neto u svom adresnom prostoru, ta promjena nije vidljiva u drugom. U Unix-u je adresni prostor dijeteta kopija adresnog prostora roditelja, dok su u Windowsima ti adresni prostori razliiti od poetka.
Primjer 1: simuliranje komandne ljuske: U pseudo-jeziku opis ljuske bi mogli dati na ovaj nain: ponavljaj{ ispii_ prompt; uitaj_naredbu(N, P); kreiraj_novi_proces(); roditelj: ekaj dok proces dijete ne zavri; dijete: pokreni naredbu N sa parametrima P; }
621/1275
Primjer 2: specifinost fork naredbe pod Unixom; primjer da procesi imaju razliite adresne prostore.
ZAVRETAK PROCESA
1. 2. 3. 4. Normalni zavretak (dobrovoljno) Zavretak zbog greke (Error exit) (dobrovoljno) Nepopravljiva greka (Fatal error) (prisilno) Zavren (ubijen) od strane nekog drugog procesa (prisilno)
Nakon kreiranja childa,postoje dvije mogunosti:parent proces zavrava prije childa,ili child zavrava prije parenta.Prilikom zavretka child procesa,parent procesu je poslan signal,koji obavjetava parent proces o unistenju child procesa.Tada je child potpuno uklonjen iz sustava. Stanje izmeu child-ovog zavretka i prije nego sto to parent primi na znanje se naziva zombie.Ako postoji pogreka u kodiranju parent procesa,child ostaje u zombie stanju zauvijek. Mogue ga je uoit pokretanjem ps naredbe.Prepoznaje se po stringu <defunct> .Obavjetavanje procesa o unitenju child-a je najjednostavnije implementirati preko sistemskog poziva wait().Prilikom pozivanja wait() sistemskog poziva,proces je zaustavljen sve dok jedan od njegovih child procesa ne prekine s izvravanjem.Upotreba signala(SIGCHLD ili SIGCLD) je uinkovitija od uporabe wait sistemskog poziva.
622/1275
PIPE
Pipe (anonymous pipe ili unnamed FIFO) je jedan od naina preko kojeg procesi mogu meusobno komunicirat.Pipe je jednosmjerni mehanizam koji omoguuje razmjenu niza bajtova izmeu dva povezana procesa.Pipe moe biti koriten za prenoenje podataka ili za sinkronizaciju izmeu oba procesa.Mogua je i komunikacija u dva smjera,te su u tom sluaju potrebna dva pipe-a.Poredak u kojem su bajtovi zapisani na pipe je identian poretku kako se ti bajtovi itaju s pipe-a.Pipe spaja standardni izlaz(STDOUT) jednog procesa na standardni ulaz(STDIN) drugog procesa,tj STDOUT jednog procesa je STDIN drugog procesa.Jedna od glavnih karakteristika pipe-a je da samo procesi povezani s procesom koji je stvorio pipe mogu meusobno komunicirati preko tog pipe-a. Pipe() je sistemski poziv kojim se stvara read-write pipe koji slui za ostvarivanje komunikacije meu procesima.Poziv uzima za argument polje od dva integera koji e biti
623/1275
koriteni za uvanje dva file descriptora.Prvi integer koristimo za itanje s pipe-a,a drugi za pisanje na pipe. Primjer koritenja funkcije: int pipes[2]; int rc = pipe(pipes); if (rc = = -1) { perror("pipe"); exit(1); } Ako pipe() sistemski poziv uspije,pipe e biti kreiran.Pipes[0] e sadravati broj njegovog file descriptora za itanje,a pipes[1] e sadravati broj njegovog file descriptora za pisanje. Nakon poziva fork() funkcije,te kreiranja child procesa,polje pipes[] je identino unutar parenta i unutar child-a,te zbog toga oboje sadre file descriptor pipe-a. /* first, define an array to store the two file descriptors */ /* now, create the pipe */ /* pipe() failed */
Kreiranje pipe-a iz shell-a Unutar shell-a pipe se kreira oznakom |. Npr. ls | more -svaka se od te dvije naredbe izvodi kao zasebni proces.Oba procesa su spojena pipe-om.
Dvosmjerna komunikacije preko pipe-a Ostvaruje se upotrebom dvaju pipe-ova.,svaki za jedan smjer(od parenta prema childu i od childa prema parentu).Loa strana upotrebe dvaju pipe-ova je u tome to mogu uzrokovat stanje poznato pod nazivom deadlock.
624/1275
Deadlock- stanje u kojem grupa od dva ili vie procesa eka da se oslobode resursi koji su trenutno zauzeti od jednog ili vie procesa unutar iste grupe,ili ekaju na neki dogaaj za koji postoji pretpostavka da bi trebao biti poslan od nekog drugog procesa unutar grupe. Dvije su mogue situacije koje mogu uzrokovati deadlock: Oba pipe-a su prazna i oba procesa pokuavaju itati svoj ulazni pipe.Iz razloga to su oba pipe-a prazna,oba procesa su blokirana kod itanja,te zauvijek ostaju u tom stanju. Svaki pipe posjeduje buffer ograniene veliine.Kad proces zapisuje na pipe,podaci su smjeteni na buffer tog pipe-a,sve dok nisu proitani od drugog procesa.Ako je buffer pun,write() sistemski poziv se blokira sve dok se ne oslobodi mjesta na bufferu.Jedini nain da se oslobodi mjesto na bufferu je da drugi proces proita podatke s njega.Problem je u tome,ako oba procesa zapisuju podatke,svaki na svoj writing pipe,sve dok se bufferi ne ispune,oba procesa e se zablokirati na write() sistemski poziv.Nijedan proces ne ita s bilo kojeg pipe-a,pa oba procesa ulaze u deadlock.
625/1275
mknod prog_pipe p
Kreirani named pipe,kao i svaka druga datoteka unutar datotekog sustava posjeduje access permission koji definira korisnike koji mogu otvoriti named pipe,za itanje ili pisanje,ili oboje. Izvravanjem naredbe ls -l ,FIFO prepoznajemo po oznaci p na prvom mjestu. Npr. prw-r--r-- 1 root root 0 Jan 4 03:40 prog_pipe
Otvaranje named pipe-a se izvrava isto kao i otvaranje bilo koje druge datoteke unutar datotenog sustava,koristei sistemski poziv open() ili koristei standardnu C funkciju fopen().Ako je poziv uspjean,vraen je file descriptor(u sluaju open() )ili FILE pointer (u sluaju fopen() ).Njih se moe koristit ili za itanje ili za pisanje,ovisno o parametrima proslijeenima sistemskom pozivu open() ili funkciji fopen(). itanje i pisanje s named pipe-a je slino kao i itanje i pisanje u datoteku.Postoje dvije glavne razlike: - Named pipe ne moe biti istovremeno otvoren i za itanje i za pisanje.Proces koji otvara named pipe mora izabrati jedan od ta dva naina(ili itanje ili pisanje) i pridravat ga se sve dok ne zatvori pipe. Kad proces ita iz named pipe-a u kojem nema podataka,proces koji ita se blokira.Proces ne prima EOF (End Of File) vrijednost,kao kod itanja obine datoteke.Kad proces pokuava zapisivati na named pipe koji nema procesa koji ga ita,zapisivanje nije mogue,tj. Proces koji pokuava zapisivati se blokira sve dok drugi proces ponovo ne otvori named pipe.
SOCKETS
Socket je dvosmjerni nain komunikacije izmeu procesa na istom raunalu ili izmeu procesa koji se izvravaju na razliitim raunalima.Socket postoji unutar
626/1275
komunikacijske domene.Socket domain predstavlja strukturu adresiranja i skup protokola.Socketi se mogu spajati samo sa socketima unutar vlastite domene. Primjeri socket-a su : Internet domain (TCP/IP version 4) ,Novell's IPX ,i ``Unix domain'' socketi. Unix domain sockets Za razliku od ostalih vrsta socketa,Unix domain socket koristi interni protokol operativnog sustava za komunikaciju meu procesima na jednom raunalu.Postoji slinost s TCP socketima,ali jedna od glavnih razlika je u tome to klijent i server unutar Unix domain-a moraju biti na istom hostu.Upravo zbog toga se ne smatraju mrenim protokolom.Kada se koriste kao stream socketi,Unix domain socketi pokazuju veliku slinost named pipe-u,ali s velikom prednou-uspostavljanje svake nove veze sa socket-om rezultira stvaranjem novog komunikacijskog kanala.
SYSTEM V IPC
System V IPC je skup meuprocesnih komunikacijskih metoda koje originalno potjeu od Unix System V release 4 verzije unix operativnog sustava.Te metode ukljuuje message queues (za slanje i primanje poruka),dijeljenu memoriju (doputa da vie procesa dijeli iste podatke unutar memorije) i semafore (sinkronizacijski mehanizam potreban da bi se uskladio pristup vie procesa pojedinim resursima).Svaki System V IPC resurs je upravljan od sustava,te za razliku od unnamed pipe-a,moe postojati i ako ga je proces koji ga je stvorio uniten.Svaki resurs unutar System V IPC moe biti public ili private.Ako je private,to znai da mu moe pristupiti samo proces koji ga je stvorio ili njegov child.Ako je public,moe mu potencijalno pristupiti bilo koji proces unutar sustava,osim u sluaju ako to nije dozvoljeno permission modom.System V IPC resursi mogu biti zatieni pristupnim permission modom,veoma slino kao i datoteke i direktoriji unutar datotenog sustava.Svaki resurs ima svog vlasnika(korisnika i grupu). Permission mod-ovi definiraju kako procesi koji pripadaju drugim korisnicima na sustavu mogu pristupit pojedinom resursu.Permissioni mogu biti razliito postavljeni za vlasnika resursa,za korisnike iz vlasnikove grupe i za sve ostale.Takoer,permissioni mogu biti odreeni za itanje ili za pisanje. Permissione definira struktura ipc_perm:
627/1275
struct ipc_perm { key_t key; /* key identifying the resource ushort gid; ushort cuid; /* creator effective user ID and effective group ID */ ushort cgid; ushort mode; /* access modes ushort seq; /* sequence number }; Pri emu je: key identifikator resursa na kojeg se struktura odnosi uid efektivni user ID vlasnika resursa gid efektivni group ID od grupe koja je vlasnik resursa cuid efektivni user ID korisnika koji je kreirao resurs cgid efektivni group ID od grupe unutar koje je kreiran resurs mode- dozvola pristupa za resurs.Moe imati 6 razliitih vrijednosti: 0400 vlasnik moe itati iz resursa 0200 vlasnik moe pisati u resurs 0040 -grupa koja je vlasnik moe itati iz resursa 0020 -grupa koja je vlasnik moe pisati u resurs 0004 -bilo koji drugi korisnik moe itati iz resursa 0002 -bilo koji drugi korisnik moe pisati u resurs seq sadri interne informacije o resursu. */ */ */ ushort uid; /* owner effective user ID and effective group ID */
628/1275
Za upravljanje SysV IPC resursima se koriste : ipcs i ipcrm. ipcs provjerava upotrebu postojeih SysV IPC resursa. SYNOPSIS ipcs [-abcmopqstMQST] [-C system] [-N core]
ipcrm uklanja specificirani message queue,semaphore ili segment dijeljene memorije.Za uklanjanje resursa ,potrebna je odgovarajua dozvola. SYNOPSIS ipcrm [-q msqid] [-m shmid] [-s semid] [-Q msgkey] [-M shmkey] [-S semkey] ...
MESSAGE QUEUES
Message queue je niz u koji poruka moe biti smjetena. Poruka je sastavljena od tipa poruke(identifikacijski broj) i podataka.Message queue moe biti private ili public.Ako je private,moe mu pristupiti samo proces koji ga je stvorio ili child od toga procesa.Ako je public,moe mu pristupit bilo koji proces kojem je poznat queue key.Nekoliko razliitih procesa moe zapisivat poruke u message queue ili itat poruke iz niza.Poruke mogu biti iitavane po identifikacijskom broju,pa prema tome ne moraju biti itane u FIFO poretku,kao to je sluaj sa pipe-om. Message queue kreiramo sistemskim pozivom msgget().Msgget() prima dva parametra:queue key i flags. Key moe biti: IPC PRIVATE - stvara private message queue
629/1275
pozitivni integer - stvara message queue koji je dosutpan svima(public) Drugi parametar sadri flag-ove koji kontroliraju procesiranje sistemskog poziva.Moe sadravati flag-ove poput IPC_CREAT ili IPC_EXCL.Devet najniih bitova su koriteni za definiranje access permissona za message queue.Bitovi su podijeljeni unutar 3 grupe za vlasnika,grupu i sve ostale.U svakom skupu prvi bit se odnosi na dozvolu za itanje,drugi bit na dozvolu za pisanje,a trei se ignorira. Primjer koda koji kreira privatni message queue: #include <stdio.h> /* standard I/O routines. */ */
#include <sys/ipc.h> /* common system V IPC structures. */ #include <sys/msg.h> /* message-queue specific functions. */ /* create a private message queue, with access only to the owner. */ int queue_id = msgget(IPC_PRIVATE, 0600); /* <-- this is an octal number. */ if (queue_id == -1) { perror("msgget"); exit(1); } Poruke zapisujemo u message queue upotrebom msgsnd() sistemskog poziva.Msgsnd() sistemski poziv kopira strukturu poruke i stavlja je zadnju u red. Msgsnd() uzima slijedee parametre:
1. int msqid- id message queu-a,vraena vrijednost od msgget() sistemskog poziva 2. struct msgbuf* msg pointer za inicijalizaciju message strukture 3. int msgsz- veliina podatkovnog dijela poruke izraena u bajtovima int msgflg flag-ovi koji odreuju kako poslat message.Moe biti logiki ili IPC NOWAIT
630/1275
Poruke itamo iz message queua upotrebom sistemskog poziva msgrcv(). Msgrcv() uzima slijedee parametre: 1. int msqid id message queu-a,vraena od msgget() sistemskog poziva struct msgbuf* msg pointer na msgbuf strukturu int msgsz -veliina najvee poruke koju elimo primiti int msgtyp -tip poruke koju elimo itati-moe biti jedna od slijedeih: -0 -pozitivni integer -negativni integer int msgflg -kombinacija bilo koje od slijedeih vrijednosti: -IPC NOWAIT -MSG EXCEPT -MSG NOERROR
631/1275
SEMFORI (Semaphores)
Semafor je objekt koji ima funkciju brojaa.Slui za sinkronizaciju pristupa dijeljenim resursima kojima pristupa vie procesa.Najee se koriste kao lock-mehanizam koji sprijeava proces da pristupi odreenom resursu za vrijeme dok drugi proces obavlja neku operaciju nad tim resursom.Kroz semafor ne prolaze nikakvi podaci-njegova jedina funkcija je koordinacija pristupa dijeljenim resursima.Semafori se na UNIX-u implementiraju kao skup,iako skup moe sadravati samo jedan semafor.Skup semafora moe sadravati od jednog semafora pa nadalje,sve do predefiniranog limita.Operativni sustav osigurava da u jednom trenutku samo jedan proces moe upravljati setom semafora.Istovremeni zahtjevi se obavaljaju sekvencijalno. Prema originalnoj definiciji semafor je struktura ija je komponenta nenegativni integer - semval.Nad semaforom su definirane dvije operacije - P i V.Operacija V poveava vrijednost varijable semval za 1.Operacija P smanjuje vrijednost varijable semval za 1.Rezultat smanjivanja vrijednosti varijable semval ne moe biti negativan.Smanjivanje je mogue obavljati sve dok je rezultat nenegativan.V i P operacije su atomarne-ukoliko vie procesa izvrava operacije nad istim semaforom,svaka operacija je zavrena prije nego druga zapone s izvravanjem.Ne moe doi do preplitanja meu procesima u trenutku dok jedan proces obavlja operaciju nad semaforom. Unutar Unix sustava semafor izvrava dvije operacije pod nazivom wait i signal. Na primjer uzmimo da imamo semafor iji je broja postavljen na 1.Samo jedan proces moe izvriti operaciju wait-nazovimo ga proces A.Proces A izvravajui operaciju wait smanjuje vrijednost brojaa za jedan te ulazi u dijeljeni resurs.Kad proces A ue u dijeljeni resurs vrijednosr brojaa je jednaka 0.Proces A izvrava instrukcije nad dijeljenim resursom.Svaki drugi proces koji za to vrijeme pokua pristupit resursu,stavlja se u red ekanja.Proces A naputa resurs i izvrava operaciju signal.Ako postoji proces u redu ekanja,broja ostaje jedak 0.Slijedei proces iz reda ekanja ulazi u dijeljeni resurs i zapoinje s izvravanjem.Svi ostali procesi ostaju u redu ekanja.Ukoliko ne postoje procesi koji ekaju na pristup dijeljenom resursu,broja se poveava za 1 i time se omoguuje slijedeem procesu(u nekom buduem trenutku kad e neki proces pristupat resursu) da ue u taj resurs.
632/1275
Kreiranje semafora Kreiranje semafora je omogueno upotrebom semget() sistemskog poziva.Prilikom kreiranja semafora definira se ID,neki flag-ovi (za access permissione),te broj semafora koji elimo u skupu. int semget(key_t key, int nsems, int semflg); key - jedinstveni identifikator,prema kojem se prepoznaje set semafora.
SIGNALI
Signali su softwarski generirani prekidi,poslani procesu prilikom nekog dogaaja.Veina signala je asinkrona.Sinkroni signali mogu biti generirani prilikom pogreke u programu (SIGFPE i SIGSEGV).Signali mogu procesu biti poslani od aplikacije ili iz kernela OS-a (npr. prilikom greke na sabirnici ili izvoenja nedoputene instrukcije). Svaki signal ima jedno od podrazumijevanih djelovanja koja spadaju u jednu od slijedeih kategorija: 1. Signal je odbaen nakon primanja 2. Proces je uniten nakon to je signal primljen 3. Datoteka jezgre je zapisana,a zatim je proces uniten 4. Nakon primanja signala proces je zaustavljen Veina signala moe biti ignorirana ili blokirana.Jedna od iznimki je KILL signal koji ne moe biti ignoriran.
633/1275
F S 4 S 1 S 1 S 1 S 1 S 1 S 1 S 1 S 1 S 1 S 1 S 1 S 1 S 1 S 5 S 5 S 5 S 5 S 5 S 5 S 5 S 1 S 1 S 5 S 5 S 1 S 1 S 4 S 4 S 4 S 4 S 4 S 4 S 4 S
UID 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 29 0 0 0 0 51 0 0 43 0 2 0 0 0 0 0 0 0
PID 1 2 3 4 9 5 6 7 8 10 11 15 73 3056 3060 3078 3097 3164 3202 3216 3236 3245 3264 3275 3335 3344 3353 3361 3362 3363 3364 3365 3366 3367
PPID 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
C PRI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 75 75 94 85 75 75 75 75 75 85 75 75 75 75 75 85 84 85 75 75 85 75 75 75 99 75 82 82 82 82 82 82 75
NI ADDR 0 0 0 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 0 0 -
SZ WCHAN
TTY
TIME CMD 00:00:04 init 00:00:00 keventd 00:00:00 kapmd 00:00:00 ksoftirqd_C 00:00:00 bdflush 00:00:00 kswapd 00:00:00 kscand/DMA 00:00:00 kscand/Norm 00:00:00 kscand/High 00:00:00 kupdated 00:00:00 mdrecoveryd 00:00:00 kjournald 00:00:00 khubd 00:00:00 syslogd 00:00:00 klogd 00:00:00 portmap 00:00:00 rpc.statd 00:00:00 apmd 00:00:00 sshd 00:00:00 xinetd 00:00:00 sendmail 00:00:00 sendmail 00:00:00 crond 00:00:00 cupsd 00:00:00 xfs 00:00:00 anacron 00:00:00 atd 00:00:00 mingetty 00:00:00 mingetty 00:00:00 mingetty 00:00:00 mingetty 00:00:00 mingetty 00:00:00 mingetty 00:00:00 gdm-binary
342 schedu ? 0 contex ? 0 schedu ? 0 ksofti ? 0 bdflus ? 0 schedu ? 0 schedu ? 0 schedu ? 0 schedu ? 0 schedu ? 0 md_thr ? 0 end 0 end ? ?
360 schedu ? 342 do_sys ? 385 schedu ? 381 schedu ? 341 schedu ? 876 schedu ? 506 schedu ? 1477 schedu ? 1428 pause ?
354 schedu ? 1875 schedu ? 1290 schedu ? 350 rt_sig ? 352 schedu ? 338 schedu tty1 338 schedu tty2 338 schedu tty3 338 schedu tty4 338 schedu tty5 338 schedu tty6 3528 schedu ?
634/1275
00:00:00 gdm-binary 00:00:00 gpm 00:01:10 X 00:00:00 gnome-sessi 00:00:00 ssh-agent 00:00:00 gconfd-2 00:00:00 bonobo-acti 00:00:01 metacity 00:00:00 gnome-setti 00:00:00 fam 00:00:03 gnome-panel 00:00:04 nautilus 00:00:00 magicdev 00:00:00 eggcups 00:00:00 pam-panel-i 00:00:00 rhn-applet00:00:00 pam_timesta 00:00:00 notificatio 00:00:00 gnome-termi 00:00:00 gnome-pty-h 00:00:00 bash 00:00:00 ps
352 schedu ?
- 16038 schedu ? 4623 schedu ? 783 schedu ? 2806 schedu ? 1533 schedu ? 3209 schedu ? 4288 schedu ? 663 ?
5535 schedu ?
- 19369 schedu ? 4057 schedu ? 4156 schedu ? 2899 schedu ? 6061 schedu ? 352 schedu ? 4209 schedu ? 5003 schedu ? 463 schedu ? 1078 wait4 790 pts/0 pts/0
F Flag.Pokazuje vrijednost flag bitova za proces. S Oznaava stanje procesa.Dvije najee vrste S vrijednosti su : S (Sleeping) i R (Runnable).Ostale vrijednosti mogu biti: O (Running on processor) , Z (Zombie) i T (Stopped) UID Pokazuje UserID(UID) vlasnika procesa. PID Pokazuje ProcessID svakog pojedinog procesa.PID je jedinstven za svaki proces. PPID Parent Process ID.Identificira parent proces. C- Iskoritenje procesora. PRI Prioritet procesa.
635/1275
NI - Nice vrijednost.Koristi se pri raunanju prioriteta. ADDR - Memorijska adresa procesa SZ - Ukupna veliina procesa unutar virtualne memorije. WCHAN - Dogaaj na koji proces eka. TTY Terminal dodijeljen procesu.? je prikazan kad ne postoji terminal. TIME Ukupno vrijeme izvravanja procesa. CMD Naredba koja je pokrenula proces.
636/1275
KILL
kill-unitava proces SYNOPSIS kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] Kill alje odreeni signal specificiranom procesu.Ukoliko nijedan signal nije odreen,alje se TERM signal.Root moe unititi skoro bilo koji proces na sustavu.Nije mogue poslati signal init procesu,jer nema ugraen signal handler.Da unitimo proces koji je u naem vlasnitvu proslijeujemo naredbu kill i PID procesa. Npr. martyp $ ps -ef | grep martyp martyp 19336 19334 0 05:24:32 pts/4 0:01 -ksh martyp 19426 19336 0 06:01:01 pts/4 0:00 grep martyp martyp 19424 19336 5 06:00:48 pts/4 0:01 find / -name .login martyp $ kill 19424 martyp $ ps -ef | grep martyp martyp 19336 19334 0 05:24:32 pts/4 0:01 -ksh martyp 19428 19336 1 06:01:17 pts/4 0:00 grep martyp [1] + Terminated martyp $ U primjeru je najprije izvrena ps naredba da bi se izlistali svi procesi iji je vlasnik martyp,zatim je izvreno unitavanje procesa te provjera da je proces nestao s popisa. find / -name .login &
637/1275
Krunoslav Zeman
Signali
638/1275
UVOD
Signali su softverski prekidi koji se dostavljaju procesima. Svi procesi koji se izvravaju reagiraju na signale koje im alje jezgra operacijskog sustava. Operacijski sustav koristi signale kako bi procesu dojavio da se dogodila neka iznimna situacija. Takav signal moe biti proizveden od same jezgre, proces ga moe poslati sam sebi ili drugom procesu, ili ga moe poslati korisnik. Signali su klasini primjer nesinkronih dogaaja, jer se mogu pojaviti u bilo koje vrijeme u procesu.
639/1275
PROCESI
Proces je program koji je trenutno u izvravanju. Svaki proces zauzima odreene sistemske resurse, kao to si memorija i procesorsko vrijeme. Kernel prua korisnicima iluziju konkurentnog izvravanja vie procesa u isto vrijeme rasporeivanjem tih resursa meu procesima koji su spremni za izvravanje. Proces se izvrava ili u korisnikom ili u kernel modu. U korisnikom modu instrukcije se izvravaju u neprivilegiranom modu hardvera. Kada proces zatrai od kernela da izvri neki sistemski poziv, instrukcije se vre u privilegiranom, ali kernelom ogranienom i kontroliranom modu. Ovako su aplikacije odvojene od hardvera. Kernel razlikuje procese prema njihovom proces identifier (PID) broju. Korisnici mogu kreirati procese, kontrolirati izvravanje procesa i primiti obavjest kada se status izvravanja procesa promjeni. Procesi mogu stvoriti nove pozivanjem sistemskog poziva fork. Njime se stvara istovjetna kopija procesa, dobiju se dva ista programa i sa istim vrijednostima. Oba procesa (roditelj i djete) nastavljaju s izvravanjem instrukcije koja slijedi poslije pozivanja fork-a, s tim to postoji jedna razlika, djetetu fork vraa vrijednost nula, a roditelju vraa vrijednost PID-a djeteta.(koji je razliit od nule). Obino nakon pozivanja fork-a jedan od ova dva procesa poziva sistemski poziv execve, kojim se vri prepisivanje postojee memorijske slike procesa novom, koja sw ita iz binarnog faila, poslje ega poinje izvravanje novog programa. Proces moe zavriti svoje izvoenje pozivanjem sistemskog poziva exit. Ako je njegov roditelj pozvao sistemski poziv wait, PID djeteta se signalom alje roditelju tako da on moeznati koje je djete zavrilo s izvravanjem. Ako se proces dijete srui sistem simulira exit sistemski poziv i obavjetava roditelja. Prilikom izlaenja, proces dijete postaje zombi proces, koji se ne izvrava, ali postoji u memoriji, kako bi roditelj mogao, koristei wait4 sistemski poziv, da dobije vie informacija o djetetovom izvravanju.
640/1275
Multiprogramiranje
-predstavlja iluziju paralelnog izvravanja vie procesa ili programa. Kernel to omoguava pomou smjenjivanja kontksta procesa (context switching) . Kontekst procesa obuhvaa sve informacije koje kernel koristi za izvravanje procesa (PID,prioritet,stanje izvravanja,data,stack i text segmente,stanje signala,akcije signala,akcije na signale,tajmere,dekriptore...). Kernel odluuje koji e se proces sljedei izvravati, to se naziva scheduling vremensko planiranje.
Scheduling
Zadatak kernela je da isplanira i zakae izvravanje procesa tako da svi procesi mogu zauzeti podjednako resursa. Programi se ocjenjuju prema koliini raunanja i koliini I/O koje izvravaju i na osnovu toga im se odreuje prioritet. On se u FreeBSD-u izrunava svake sekunde, na osnovu koliine raunanja u prethodnom periodu, koliine memorije koju zauzima, ukupne zauzetosti resursa sistema i vrijednosti nice koju ima svaki proces i koja oznaava poeljni prioritet. Svi procesi naizmjenino dobivaju odreeni vremenski period izvravanja. U FreeBSD-u ovaj period je 0,1 sekunda, poslje ega kernel prelazi na izvravanje procesa sa najviim prioritetom. Procesi koji ekaju da se I/O operacija zavri imaju vei prioritet izvravanja, jer se izvravaju u kernel-modu. Nasuprot tome, procesima koji su zahtjevaju dosta raunanja (procesorskog vremana) prioritet im se smanjuje, kako ne bi zauzeli kompletan procesor i zaustavili izvravaje ostalih procesa. Na ovaj nain 4.4BSD kernel daje prednost interaktivnim programima (kakvi su npr. text editori) nad dugotrajnijim batch-type procesima koji zahtjevaju dosta procesorskog vremena i koji zaguuju sistem.
641/1275
Ogranenje resursa
Kernel podrava ograniavanje koliine resursa koji su dostupni pojedinim procesima. Ova ogranienja mogu biti: maksimalno CPU vrijeme koje proces moe zauzeti, koliina memorije koju moe alocirati, veliina i broj fajlova koje proces moe kreirati, broj simultanih procesa koje korisnik moe pokrenuti i dr. Za svako ogranienje postoje soft i hard limit. Kada proces pree soft limit site mu signal koji obino rezultira prekidanjem izvravanja procesa, ali proces moe i ignorirati ovaj signal i pokuati osloboditi resurse. Ukoliko to ne napravi sljedei pokuaj alociranja jo resursa nee uspjeti. Hard limit se ne moe prekoraiti. Svi korisnici mogu svojim procesima smanjiti hard limit, a jedino superuser ga moe poveati.
Sistemski procesi
Svi procesi u 4.4BSD-u (i naravno u FreeBSD-u) potiu od jednog procesa kojeg pokree kernel. Proolikom pokretanja sistema kreiraju se tri procesa i oni uvijek postoje i izvravaju se. Procesi swapper i pagedaemon su procesi koji se izvravaju u kernel modu. Swapper (PID 0) je odgovoran za vremensko planiranje premjetanja procesa i RAM memorije u sekundarni memorijski prostor (swap) ukoliko sistem ima manjak memorije. Pagedaemon (PID 2) je odgovoran za ispisivanje djelova adresnog prostora procesa swap. Init (PID 1) je proces koji se izvrava u korisnikom modu, van kernela i koji je odgovoran za administrativne zadatke, kao to je pokretanje drugih procesa (po jedan getty proces u svaki terminal maine) zatvaranje procesa prilikom gaenja sistema (ulaskom u beskonanu petlju ili resetiranjem sistema).
642/1275
Identifikatori korisnika
-Vana odgovornost operativnog sistema je da prui mehanizam za kontrolu i ogranienje pristupa privilegiranim operacijama kernela. U FreeBSD-u ovaj mehanizam se zasniva na razlikovanju korisnika i grupa korisnika sistema. Svaki korisnik ima jedinstveni user identifier (UID), 32-bitni broj koji mu je pripisao sistemski administrator. Korisnici su svrstani u grupe, koje se oznaavaju GID (group identifier) brojem. Jednom korisniku koji se naziva superuser dostupne su sve operacije kernela, dok su mnoge od njih nedostupne obinim korisnicima. Svakom procesu su pripisani UID i GID korisnka koji ga je pokrenuo, tako da obini korisnici mogu slati signale svojim procesima. Svaki fail ima pristupne dozvole za vlasnika faila,grupu korisnika kojoj pripada vlasnik i ostale korisnike. Ove dozvole ukljuuju itanje,prepravljanje i izvravanje faila. Ovako se osigurava kontrola pristupa failovima. U unix sistemima postoje setuid i setgid programi kioji omoguuju da korisnik kontrolirano izvri neke operacije koje mu nisu dozvoljene. Ovakvi programi moraju biti veoma paljivo napisani kako ne bi dolo do zloupotrebe privilegija.
Grupe procesa
Procesi su organizirani u grupe procesa. Prilikom pokretanja proces ulazi u grupu procesa u kojoj je i njegov roditeljski proces, a i sam moe napraviti novu grupu. Procesi unutar jedne grupe mogu meusobno slati signale , a signali se mogu poslati cijeloj grupi, tako da svi procesi te grupe prime signal. Ovo se koristi npr. Kada shell pokrene posao (job) kao to je pipeline. Vie procesa se spajaju pajpovima, a signali se mogu slati sviim procesima tog posla odjednom.
643/1275
SIGNALI
Signali su kratke poruke kojima je omogueno slanje zahtjeva za prekid odreenom procesu. Signali se mogu razmjenjivati izmeu dvaju procesa (jedan alje signal drugom) ili sama jezgra operacijskog sustava (kernel) moe slati signal odreenom procesu. Popis signala moe se nai u /usr/include/asm/signal.h header datoteci sustava.
Popis signala
#define SIGHUP #define SIGINT #define SIGQUIT #define SIGILL #define SIGTRAP #define SIGABRT #define SIGIOT #define SIGBUS #define SIGFPE #define SIGKILL #define SIGUSR1 #define SIGSEGV #define SIGUSR2 #define SIGPIPE #define SIGALRM #define SIGTERM #define SIGSTKFLT #define SIGCHLD #define SIGCONT #define SIGSTOP #define SIGTSTP #define SIGTTIN #define SIGTTOU #define SIGURG 1 2 3 4 5 6 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
644/1275
#define SIGXCPU #define SIGXFSZ #define SIGVTALRM #define SIGPROF #define SIGWINCH #define SIGIO #define SIGPOLL
24 25 26 27 28 29 SIGIO
Vidi se da svaki signal ima svoje ime i broj koji ga predstavlja. Funkcije veine navedenih signala su unaprijed dodijeljene. Tako npr. signal KILL (broj 9) uzrokuje zavretak procesa kojemu je namijenjen. Kaemo da smo proces 'ubili' signalom KILL. Signalima STOP i CONT moe se zaustaviti pa nastaviti izvoenje procesa. No, ima i signala kojima funkciju odreuje korisnik (programer). To su signali USR1 i USR2. Ponekad se moe dogoditi da
je isti signal predstavljen drugim brojem na drugom UNIX sustavu. Zbog toga je preporuljivo koristiti imena signala, a ne njihove brojeve. Isto tako, nisu ba svi signali definirani na svim UNIX sustavima. Slanje signala vri se pozivom sustava kill: int kill(int PID, int SIGNAL) gdje je PID cjelobrojna varijabla koja predstavlja Process ID procesa kojem se alje signal, a SIGNAL je cjelobrojna varijabla koja predstavlja broj signala koji se alje. No, postoji i u ljusku ugraena naredba istog naziva (koja se i zasniva na istoimenom pozivu sustava): kill. Ona slui za slanje signala odreenom procesu iz komandne linije. Naredbom kill l dobiva se popis svih signala. .
Od strane terminala generirani signali se pojavljuju kad korisnik pritisne odreene tipke (ili odreenu kombinaciju tipki). Npr. : obino CTRL+C generira signal za kraj izvravanja pojedinog programa Greke (iznimke, exceptions) takoer mogu generirati signal, npr. dijeljenje sa nulom, pogrena memorijska referenca i slino. kill funkcija, odnosno kill naredba na UNIX-u alje signal nekom drugom procesu ili grupi procesa. Softverski uvjeti generiraju signal kad se dogodi neto ega bi proces trebao biti svjestan, npr. kada sat alarma postavljen od strane procesa istekne.
Signal moe biti poslan u bilo kojem trenutku, ali uvijek ne mora biti primljen niti procesi koji ga prime ne moraju uvijek reagirati na njega. Signal ne sadri nikakve informacije i moe biti poslan samo odreenom procesu ili procesima. Signali se nikada ne koriste za normalnu komunikaciju, nego samo za posebne dogaaje.
Kada se signal genrira on postaje nerijeen (u toku, eng. pending) i takav ostaje neko kratko vrijeme dok ne bude dostavljen procesu kojem je namijenjen. Meutim, mogue je da je takav signal trenutno blokiran od strane sustava, pa moe ostati nerijeen proizvoljno dugo, tj. sve do onog trenutka dok ta vrsta signala ne bude deblokirana. Jednom deblokiran dostavlja se odmah. Postoje tri stvari koje proces moe rei jezgri to da uini s dostavljenim signalom: 1. Ignorirati signal. Ovo radi za veinu signala osim za dva signala koja nikad ne mogu biti ignorirana: SIGKILL i SIGSTOP. Razlog zato ova 2 signala ne mogu biti ignorirana lei u injenici da superuseru mora biti omoguena opcija sigurnog zaustavljanja ili ubijanja procesa. Takoer ako ignoriramo neke signale koji su generirani usljed hardverdske pogreke ponaanje procesa nije definirano. 2. Uhvatiti signal.
646/1275
Da bi ovo uradili, jezgri treba rei da pri pojavi signala pozove neku odreenu funkciju u kojoj moemo uraditi prouizvoljnu akciju. 3. Pustiti da se dogodi defaulana akcija. Svaki signal ima svoju defaultnu akciju. Veinom je ta akcija prekidanje rada procesa.
647/1275
Vrste signala:
Razliiti operativni sustavi definiraju razliite signale. Svaki signal ima ime. Imena svih signala poinju sa SIG, a popis svih signala u pojedinom operativnom sustavu moe se nai u datoteci signal.h. Imena signala su pozitivne cjelobrojne konstante. ANSI C standard specificira sljedeih 6 signala: SIGINT, SIGILL , SIGFPE, SIGSEGV, SIGTERM, SIGABRT.. Vrste signala Moderne implementacije UNIX-a definiraju oko tridesetak signala. Ovdje je pregled samo najznaajnijih. SIGINT alje se svakom procesu za koji je to kontrolni terminal u trenutku kada je pritisnuta tipka za prekid (standardno DEL, najee izmijenjeno u Ctrl-C). SIGQUIT Slino kao SIGINT, ali se odnosi na tipku za kraj izvravanja (standardno Ctrl-\, najee izmijenjeno u Ctrl-X). SIGKILL Jedini siguran nain unitavanja procesa je da mu se poalje ovaj signal, jer ne moe biti ignoriran niti uhvaen. SIGALARM alje se kada istekne traeno vrijeme ekanja procesa. SIGTERM Ovo je standardni signal za unitavanje procesa. Koristi se i kod iskljuivanja da ubije sve aktivne procese. Oekuje se da e proces koji ga primi uredno spremiti aktualno stanje prije zavretka. sigset i njemu bliski sistemski pozivi void (* sigset(int sig, void (* func)())() ;
648/1275
specificira ta se deava prilikom primitka odreenog signala. sig je broj signala. Drugi argument je kazaljka na funkciju i moe biti: SIG_DFL. U ovom sluaju postavlja se automatska reakcija na signal. Za veinu signala to znai unitavanje procesa. SIG_IGN. Ovime se postavlja da signal bude ignoriran. Signal SIGKILL se ne moe ignorirati. SIG_HOLD. Signal se prihvaa ali ne obrauje i obradit e se onda kada se definicija ponaanja za taj signal promijeni. Moe se uvati samo po jedan signal svake vrste. SIGFPE Signal koji se dogaa zbog aritmetike pogreke (dijeljenje s nulom, floating point overflow ili underflow) SIGUSR1 i SIGUSR2 signali slobodni u korisnike svrhe
649/1275
Rukovanje signalima
Funkcija kojom moemo promijenit defaultno ponaanje signala, te uhvatiti signal i proizvoljno ga obraditi je funkcija signal (i dio je ANSI C-a). Prototip funkcije je: void (*signal (int, void (*)(int))) (int);[3] Nekoliko objanjenja: signal() je sistemski poziv koji vraa adresu funkcije koja kao argumnet uzima int i ne vraa nikakvu vrijednost . Znai signal vraa sljedee: void (*)(int). signal() vraa prethodno asociranu funkciju za obradu prekida. signal() kao argumente uzima sljedee: Prvi parametar tipa int je broj signala. Obino se predaje konstanta sa nazivom signala, npr. SIGINT, SIGALRM ...) Drugi parametar je pokaziva na funkciju - void (*)(int) - koja kao argument prima cijeli broj i ne vraa nita. U sluaju da sustav detektira signal naveden kao prvi argument, pozvat e navedenu funkciju. Ova funkcija se naziva signal handler. elimo li ignorirati signal naveden kao prvi argument, za signal handler emo odabrati konstantu SIG_IGN: npr. signal(SIGINT, SIG_IGN) elimo li postaviti obradu signala na defaultnu postavku kao drugi argument emo postaviti SIG_DFL, npr: signal(SIGALRM, SIG_DFL) U sluaju uspjeha signal e vratiti adresu funkcije koja je prethodno sluila za obradu prekida, inae vratiti e konstantu SIG_ERR. Primjer: hvatanje signala za kraj programa, primjer za hvatanje aritmetikih pogreaka, primjer sa funkcijom alarm, primjer sa dva procesa i signalima. Funkcija signal ima odreene mane. Na starijim verzijama UNIX-a nije bila dobro implementirana, tako je prilikom svakog poziva signal handlera, trebalo ponovo postaviti signal handler. Druga mana, tj. nedostatak je bio da je ponekad bilo poeljno na neko vrijeme
650/1275
blokirati mogunost dostavljanja signala to je zahtjevalo malo drugaiju implementaciju signala. Svaki proces ima signalnu masku koja definira skup signala trenutno blokiranih od strane procesa. Moemo to predoiti na nain da svaki bit sadri predstavlja pojedini signal S obzirom da broj signala moe biti vei nego cijeli broj POSIX.1 definira novi tip sigset_t koji sadrava skup signala.
651/1275
Signalna maska
sigproc mask ispituje ili postavlja (ili oboje) signalnu masku. Ako je oset nenull pointer, trenutna signalna maska se vraa preko oset. Ako je set ne-null pointer tada how odreuje kako je e se signlna maska modificirati. Mogunosti su: SIG_BLOCK Nova signlna maska za proces je unija trenutne signalne maske i skupa signala definiranog sa set, tj. set sadri signale koje elimo blokirati. SIG_UNBLOCK Nova signlna maska je presjek trenutne signalne maske i skupa signala definiranog sa set, tj. set sadri signale koje elimo deblokirati SIG_SETMASK Postavlja se nova signalna maska. U sluaju da je set null pointer, signalna maska se ne mijenja i vrijednost od how je zanemariva. int sigfillset(sigset_t *set); vraa 0 ako je OK, -1 u sluaju greke Slui za dobivanje skupa signala koji su blokirani i ekaju dostavljanje. int sigaction(int signo, const struct sigaction *act,struct sigaction *oldact); vraa 0 ako je OK, -1 u sluaju greke
652/1275
Ova funkcija nasljeuje funkciju signal i slui za ispitivanje ili modificiranje (ili oboje) struct sigaction{ void (*sa_handler)(); /*adresa signal handlera ili SIG_IGN ili SIG_DFL*/ sigset_t sa_mask; /*dodatni signali koje treba blokirati*/ int sa_flags; /*signale opcije npr. SA_RESETHAND */ } int sigsuspend(const sigset_t *sigmask); vraa -1 i postvlja errno na EINTR
Signalna maska procesa se postavlja na sigmask i proces se zaustavlja dok se ne pojavi signal (malo neprecizno reeno: unlock and pause)
653/1275
Prekidi i signali
SIGNALI Jezgra moe poslati procesu signal. Taj signal moe biti proizveden od same jezgre, proces ga moe poslati sam sebi ili drugom procesu, ili ga moe poslati korisnik. Primjer signala koji potie od jezgre je signal koji je poslan kada proces pokua pristupiti memoriji koja nije u njegovom adresnom prostoru. Primjer signala koji proces alje sam sebi je alarm. Signal koji proces alje drugom procesu je signal koji unitava procese, a alje ga proces koji eli unititi svoju "porodicu" procesa. Tipini korisnikov signal je prekidni signal. Standardno je postavljeno da se taj signal generira tipkom DEL, meutim, veina korisnika to mijenja u Ctrl-C (stty intr ^C). Postoji tridesetak razliitih signala (u razliitim verzijama UNIX-a moe ih biti manje ili vie). Za veinu signala (izuzetak je SIGKILL i jo neki) proces moe kontrolirati to se deava nakon to primi neki signal. Moe prihvatiti ugraenu akciju to (za veinu signala) rezultira unitavanjem procesa, moe ga ignorirati ili moe uhvatiti signal i izvesti odreenu funkciju. Tip signala (cijeli broj) se prenosi u funkciju kao jedini argument i funkcija ne moe otkriti izvor signala. Nakon povratka iz funkcije proces moe nastaviti od mjesta prekida. Znaenje signala za procese je analogno znaenje prekidnih signala na razini procesora. Signal moe biti poslan u bilo kojem trenutku, ali ne mora biti primljen i ne mora nitko reagirati na signal. Ne sadre nikakve informacije i moe biti
poslan samo odreenom procesu ili procesima. Nikada se ne koriste za normalnu komunikaciju, nego samo za posebne dogaaje. Kazaljka na funkciju. Ovime se oznaava da po primitku signala treba pozvati funkciju. Ne moe se upotrijebiti za SIGKILL. Funkciji e biti predan jedan cjelobrojni argument - vrsta signala.
654/1275
Prototip je neto tee razumijeti jer je jedan od argumenata kazaljka na funkciju, a i sama funkcija kao rezultat vraa kazaljku na funkciju - prethodnu definiciju ponaanja za zadani signal. To se moe koristiti ako kasnije treba vratiti prijanje stanje.
Nakon povratka iz funkcije za obradu signala, proces nastavlja s radom od mjesta na kojem je prekinut primitkom signala. Meutim, ako je signal prihvaen za vrijeme ekanja na izvrenje poziva read, write, open, ioctl, wait, ili pause oni e biti prekinuti uz postavljanje greke EINTR u errno (ne odnosi se na pristup obinim datotekama). Neposredno pred poziv funkcije za obradu signala func, ponaanje kod prijema dotinog signala se mijenja u SIG_HOLD. Na povratku iz te funkcije restaurira se func kao funkcija za obradu signala i otputa eventualno pristigli signal. To se moe obaviti i prije zavretka same funkcije, pozivom sigrelse, to onda omoguava prijem novog signala prije nego to je prethodni obraen. int sighold(int sig) ; int sigrelse(int sig) ; Ovo su pozivi za manipulaciju sa signalima. sig je signal. sighold i sigrelse se koriste za zatitu kritinih odsjeaka u programu. sighold je analogan podizanju prioriteta i zadravanju signala dok se prioritet ne spusti sa sigrelse. sigrelse obnavlja akciju procesa prethodno specificiranu u sigset, te otputa ranije primljeni i zadrani signal.
655/1275
656/1275
U veini sluajeva kill se koristi za unitavanje procesa (od tuda dolazi ime) ili za testiranje ponaanja kod greke simuliranjem signala. Najee se koristi kao komanda, a ne kao poziv u programu. void (* signal(int sig, void (* func)())() ; specificira ta se deava prilikom primitka odreenog signala, slino kao i sigset. signal je stariji i razlikuje se po tome to ne poznaje SIG_HOLD. Takoer, ponaanje na ulasku u funkciju za obradu signala ini ga manje upotrebljivim od sigset. Neposredno pred poziv funkcije za obradu signala, ponaanje kod prijema dotinog signala se mijenja u SIG_DFL. To znai da e slijedei signal istog tipa ubiti proces. Ovo ponaanje se moe promijeniti unutar same funkcije za obradu signala, ali uvijek postoji interval (koji kod veeg optereenja moe biti i prilino dugaak) unutar kojeg prijem signala moe ubiti proces. UNIX ne dozvoljava pojedinom korisniku izravno koritenje prekida procesora. Zato prekide treba simulirati koristei signale koje jezgra operacijskog sustava alje procesima.
657/1275
658/1275
POSIX.1 standard Signal SIGINT SIGQUIT SIGILL SIGABRT SIGFPE SIGKILL SIGSEGV SIGPIPE SIGALRM SIGTERM SIGUSR1 SIGUSR2 SIGCHLD SIGCON SIGSTOP SIGTSTP SIGTTIN SIGTTOU Value 2 3 4 6 8 9 11 13 14 15 30,10,16 31,12,17 20,17,18 19,18,25 17,19,23 18,20,24 21,21,26 22,22,27 STOP STOP STOP STOP tty unos za pozadinske procese Tty izlaz za pozadinske procese Action TERM CORE CORE CORE CORE TERM CORE TERM TERM TERM TERM TERM IGN Coment Prekid s tipkovnice Quit s tipkovnice Ilegalna instrukcija Prekid Iznimka pominog zareza Kill signal Pogrena referenca memorije Pisanje Vremenski signal za alarm Signal prekida Samodefinirajui 1 Samodefinirajui 2 Zaustavljanje ili prekidanje djeteta Nastavi ako zaustavljeno Zaustavi prces
659/1275
Sljedei signali ne nalaze se u POSIX.1 standardu ali su opisani u SUSv2 i SUSv3 / POSIX 1003.1-2001
Signal SIGPROF SIGSYS SIGTRAP SIGURG SIGVTALRM SIGXCPU SIGXZSZ SIGEMT SIGIO SIGCLD SIGPWR SIGINFO SIGLOST SIGWINCH SIGUNUSED
Value 27,27,29 12,-,12 5 16,23,21 26,26,28 24,24,30 25,25,31 7,-,7 23,29,22 -,-,18 29,30,19 29,-,-,-,28,28,20 -,31,-
Action TERM CORE CORE ING TERM CORE CORE TERM TERM IGN TERM
Coment Profiling timer expired Loi argument u rutinu Breakpoint zamka Urgent condition on socket Virtual alarm sat CPU time limit exceeded File size limit exceeded Stack greka na coprocesoru I/O omoguen Sinonim za SIGCHLD Power failure Sinonim za SIGPWR
660/1275
ZAKLJUAK
LINUX implementira signale koristei signale pohranjene u task_struct za procese. Broj podranih signala je ogranien veliinom rijei procesora. Tako da procesor koji radi veliinom rijei od 32 bita moe imati 32 signala, dok 64 bitni procesori mogu raditi sa do 64 signala (Alpha AXP)
661/1275
Igor opec
FORK PROCESI
662/1275
FORK PROCESI
Svi procesi su stvoreni od strane drugog procesa (parent - roditeljskog procesa), no ponimo ispoetka, tj. od samog kernela. Nakon to se kernel uitao i pokrenuo svoje podatkovne strukture, on trai sve prikljuene ureaje na maini. U tom trenutku operativni sustav nije u stanju raditi nita, osim to nudi servise novonastalim procesima. Ali kako se stvaraju procesi ? Svaki proces na UNIX operativnom raunalu se stvara od stane drugog ve postojeeg procesa koji izvodi fork operaciju. Fork operacija stvara potpuno novi proces koji sadri kopiju koda i podataka od originalnog procesa. Stvaranje novog (child) procesa se sastoji od dvije operacije : a) stvaranje novog procesa (''forking'') - novi proces je stvoren, koji je skoro u potpunosti identian koristiti e isti dio koda b) preusmjeravanje kontrole na novonastali proces (''exec'') - u ovom koraku se mijenja kod sa onog kojeg je do sada koristio majinski proces, na kod kojeg sad koristi novonastali proces. Kada je novonastali proces napravljen, izvriti e naredbu ''exec'' kako bi se sve prebacilo na dio koda gdje je na novonapravljeni proces A tko je stvorio prvi proces? init je prvi proces kreiran na UNIX raunalu, i iz njega se kreiraju svi ostali procesi. Uvijek ima PID (proces ID) 1, to znai da je majinski proces. Njega je kreirao sami kernel operativnog sustava i on je jedini proces na raunalu koji nema majinski proces. init je proces koji je odgovoran za pokretanje svih ostalih servisa na UNIX raunalu. Servisi koje pokree su definirani u njegovoj konfiguracijskoj datoteci / etc / inittab. majinskom procesu, i
663/1275
664/1275
b) efektivni UID i GID - efektivni ili uinkoviti UID i GID se upotrebljavaju da bi se ustanovilo koje operacije moe dotini proces izvoditi, tj. koje dozvole (permission-e) ima - najee je efektivni UID i GID jednak stvarnom UID-u i GID-u, no upotrebom specijalnih dozvola (permission-a) pristupa datotekama, mogue je promijeniti efektivni UID i GID
665/1275
666/1275
procesov identifikacijski broj kontrolni terminal procesa procesovo radno stanje koliina procesorovog vremena koju je dotini process uspio pribaviti
COMMAND ime naredbe koja je pokrenula process TT kolumna daje imena terminala, koji se mogu saznati pomou naredbe WHO STAT (State of job) kolumna moe biti predstavljena sa etiri znaka ! R(runnable process) proces koji je mogue pokrenuti T(stopped process) zaustavljeni process S(process sleeping) proces koji spava manje od 20 sekundi I (idle process) process koji spava dulje od 20 sekundi
/**************************************************************/ #include <stdio.h> /***************************************************************/ ChildProcess() //globalna funkcija - definirana izvan main-a { int i; for (i = 0; i < 10; i++) { printf ("%d...\n",i);
667/1275
sleep(1); } } /**************************************************************/ int main(void) { int pid, cid; //deklariramo dvije varijable u koje emo pohraniti
//procesov id, pa emo znati da li se radi o majinskom //ili novonastalom procesu pid = getpid();//funkcija getpid() vraa 0 ili 1 printf ("Fork demo! Ja sam majcinski proc (pid = %d)\n",pid); if (! fork()) { cid = getpid(); printf ("Ja sam novonastali proc (cid = %d) of (pid=%d)\n",cid,pid); ChildProcess(); exit(0); } printf("Ovdje majc. proc. ceka na novonastali proces\n"); wait(NULL); printf("Novonastali proc. zavrsio, majc. proces isto zavrsava\n"); return 0; }
668/1275
669/1275
UNITAVANJE PROCESA
Proces moemo unititi koritenjem naredbe 'kill' . Jednostavno naemo procesov PID (na primjer koritenjem naredbe 'ps'), a potom ga unitimo ovako: kill -9 pid Ako proces trenutno radi u konzoli, tj. nije u pozadini moemo ga jednostavno unititi ovako control-C
670/1275
671/1275
Matija upen
672/1275
tijekom 1980. ARPA, kao dio U.S. Department of Defense, postala je DARPA (Defense Advanced Research Projects Agency) ali agencija i njena misija razvijanja naprednog istraivanja ostala je ista
673/1275
naveliko koriteni u komunikacijskoj organizaciji da je nemogue govoriti o podatkovnoj komunikaciji bez koritenja OSI terminologije. OSI model sadri sedam slojeva (layers) koji definiraju funkcije komunikacijskih protokola. Svaki sloj OSI modela predstavlja funkciju koja se izvodi kada se podaci transferiraju kroz kooperativne aplikacije i mree. Slika 1.1. prikazuje svaki sloj sa imenom i sadri kratki funkcionalan opis. Gledajui sliku, protokoli su kao blokovi stavljeni jedan na drugi. Zbog toga, struktura se esto naziva stack ili protocol stack.
slika 1.1. OSI model Sloj ne definira jedinstveni protokol. Svaki sloj definira podatkovne komunikacijske funkcije koje mogu biti koritene od bilo kojeg broja protokola. Dalje, svaki sloj moe sadravati vie protokola gdje svaki provodi uslugu odgovarajui funkciji sloja. Na primjer, file-transfer protokol i elektronika pota oboje provode korisnike usluge i oboje su dio aplikacijskog sloja (Application Layer).
674/1275
Isto kao i u OSI modelu, podaci se alju prema dolje niz stack kada su poslani na mreu i gore uz stack kada su primljeni sa mree. Struktura TCP/IP-a izgleda na nain da se podaci alju niz protokol stack iz aplikacijskog sloja sve do fizike mree. Svaki sloj u stacku dodaje kontrolnu informaciju da bi potvrdili sigurnu dostavu. Ova kontrolna informacija naziva se zaglavlje (header) jer je postavljen na poetak podataka koji se trebaju poslati. Svaki sloj tretira sve informacije koje primi iz sloja iznad kao podatke i stavlja svoje zaglavlje na poetak informacije. Kada su podaci primljeni, dogaa se suprotno, svaki sloj skida svoje zaglavlje prije nego alje podatke sloju iznad. Slika 1.3.
slika 1.3.
675/1275
NETWORKING Uvod
Linux kernel podrava mnogo razliitih mrenih arhitektura (TCP/IP je samo jedna od njih), sa nekoliko implementiranih alternativnih algoritama za razvrstavanje mrenih paketa, ukljuujui i programe koji olakavaju sistemskim administratorima postaviti router, gateway, firewall, pa ak i jednostavan World Wide Web server, direktno na nivou kernela. Trenutni kd, inspiriran sa originalnom Berkley Unix implementacijom, je Net-4. Kako i samo ime govori, ovo je etvrta glavna verzija Linux networkinga. Slino kao i VFS, kd koristi objekte za provedbu sukladnog interfacea do velikog broja dostupnih arhitektura. Suprotno od VFS-a, networking kd je organiziran u slojeve (layers), gdje svaki od njih ima vrlo dobro definiran interface. Poto podaci poslani mreom nisu ponovo upotrebljivi, nema potreba za spremanjem u cache. Potrebom za to veom isplativou, Linux izbjegava kopiranje podataka unutar slojeva. Originalni podaci su spremljeni u memory buffer, koji je dovoljno velik da sadri informacije potrebne svakom sloju.
Mrene arhitekture
Mrena arhitektura opisuje kako je pojedina kompjuterska mrea napravljena. Arhitektura definira grupu slojeva gdje bi svaki trebao imati vrlo dobro definiranu namjenu. Programi u svakom sloju komuniciraju koristei razmjenjive skupove pravila i konvencija (tzv. protokol). Generalno gledajui, Linux podrava veliki broj razliitih mrenih arhitektura. Neke od njih su: name PF_APPLETALK PF_BLUETOOTH PF_BRIDGE PF_DECnet PF_INET mrena arhitektura i/ili protokol Appletalk Bluetooth Multiprotocol bridge DECnet IPSs IPv4 protocol
676/1275
IPSs IPv6 protocol Novell IPX Unix domain socket (local communication) IPSs IPv4/IPv6 protocol low-level access X25
IPS (Internet Protocol Suite) je mrena arhitektura Interneta, ponekad nazvana TCP/IP mrena arhitektura zbog glavnih protokola.
Mrena kartica
Mrena kartica (NIC - Network interface card) je specijalna izlazno/ulazna jedinica koja plasira izlazne podatke do umreenog raunalnog sistema i prima pakete od istih sistema u memoriju kernela. Poevi sa BSD-om, svi Unix sistemi dodjeljuju razliito ime za svaku mrenu karticu instaliranu na raunalu; npr. prva mrena kartica dobiva ime eth0. Umjesto koritenja filesistema, sistemski administrator mora postaviti vezu izmeu imena i mrene adrese. BSD Unix je predstavio novu grupu sistemskih poziva koji su postali standard programiranja modela za mrene ureaje.
BSD sockets
Generalno gledajui, svaki operacijski sustav mora definirati odgovarajui Application Programming Interface (API) izmeu korisnikog moda programa i mrenog kda. Linux mreni API je baziran na BSD socketima. Predstavljeni su u Berkley UNIX 4.1cBSD i dostupni su u gotovo svakom operacijskom sustavu slinom Unixu. Socket je dvosmjerna komunikacijska jedinica koja moe biti koritena za komuniciranje sa drugim procesima na istom raunalu ili sa procesom pokrenutim na drugom raunalu. Internet programi kao Telnet, rlogin, talk ili World Wide Web koriste sockete.
677/1275
Socket je komunikacija izmeu tzv. ulaznih vrata i krajnje toke kanala koji povezuje dva procesa. Podaci se poalju na ulazna vrata i nakon nekog vremena pojave se na drugoj strani (izlazu). Komunikacijski procesi mogu biti na razliitim raunalima. Mreni kd Kernela prosljeuje podatke izmeu krajnjih toaka. Linux implementira BSD sockete kao datoteke koji pripadaju u sockfs special filesystem. Preciznije, za svaki novi BSD socket, Kernel kreira novi inode u sockfs filesistemu. Atributi BSD socketa su spremljeni u socket strukturi podataka koja je objekt ukljuen u polju u.socket_i sockfs inode-a. metode BSD socket objekta metoda release bind connect socketpair accept getname ioctl listen shutdown setsockopt getsockopt sendmsg recvmsg mmap sendpage opis zatvara socket dodjeljuje lokalnu adresu (ime) uspostavlja vezu (TCP) ili dodjeljuje remote adress (UDP) kreira par socketa za dvosmjernu razmjenu podataka eka zahtjev za spajanje vraa lokalnu adresu implementira ioctl()komande inicijalizira socket da prihvati zahtjev za spajanjem zatvara pola ili obje polovice full-duplex veze postavlja vrijednosti socket flagovima uzima vrijednosti socket flagova alje paket socketu prima podatak od socketa file memory-mapping (ne koriste mreni socketi) kopira podatke direktno iz/prema fajlu (sendfile() sistemski poziv)
678/1275
INET sockets
INET socketi su strukture podataka tipa struct sock. Svaki BSD socket koji pripada IPS mrenoj arhitekturi sadri adrese INET socketa u sk polju socket objekta. INET socketi su potrebni jer socket objekti (opisujui BSD sockete) ukljuuju samo polja koja su znaajna za sve mrene arhitekture. Ali, kernel mora takoer zapamtiti i nekoliko drugih informacija za svaki socket bilo koje mrene arhitekture. Na primjer, u svakom INET socketu, kernel zapisuje lokalne i udaljene IP adrese, lokalne i udaljene brojeve portova, relativni transportni protokl, podatke o primljenim paketima, podatke o paketima koji ekaju da budu poslani socketu, te nekoliko tablica metoda za slanje paketa do socketa. Ovi atributi su spremljeni, zajedno sa mnogim drugima, u INET socketima. INET socket objekt takoer definira neke metode specifine tipu transporta protokola (TCP ili UDP). Metode spremljene u strukturi podataka tipa proto: metode INET socket objekta metoda close connect disconnect accept ioct1 init destroy shutdown setsockopt getsockopt sendmsg recvmsg bind backlog_rcv hash unhash get_port opis close the socket uspostavlja vezu ili dodjeljuje remote adress prekida uspostavljenu vezu eka zahtjev za spajanje implementira ioctl()komande INET socket objekt konstruktor INET socket objekt destruktor zatvara pola ili obje polovice full-duplex veze postavlja vrijednosti socket flagovima uzima vrijednosti socket flagova alje paket socketu prima podatak od socketa dodjeljuje lokalnu adresu (ime) funkcija pozvana kada prima paket doda INET socket per-protocol hash tablici makne INET socket iz per-protocol hash tablice dodjeljuje broj porta INET socketu
679/1275
sock objekt sadri otprilike 80 polja od kojih su mnoga pokazivai na druge objekte, tablice, metode ili druge strukture podataka.
Koncepti socketa
Kada kreiramo socket moramo definirati tri parametra: nain komuniciranja (communication style) namespace protokol.
Communication style
Nain komuniciranja kontrolira kako socket tretira poslane podatke i specificira broj komunikacijskih partnera. Kada su podaci poslani kroz socket, raspakirani su u dijelove nazvane paketima. Stil komuniciranja odreuje kako su ti paketi podrani i kako su adresirani od poiljaoca do primatelja. - Connection style garantira isporuku svih paketa po redu kako su poslani. Ako su paketi izgubljeni ili je promijenjen redoslijed zbog problema na mrei, primatelj automatski zahtjeva njihovo ponovno slanje od poiljaoca. Connection-style socket je kao telefonski poziv: Adresa poiljaoca i primaoca je fiksna na poetku komunikacije kada je veza uspostavljena. - Datagram style ne garantira isporuku ili redoslijed dolaska paketa. Paketi mogu biti izgubljeni ili promijenjenog redoslijeda zbog problema na mrei. Svaki paket mora biti oznaen sa svojom destinacijom i nije zagarantirano da e biti isporuen. Sistem garantira samo najbolju volju, tako paketi mogu nestati ili stii u krivom redoslijedu kako su poslani. Datagram-style sockets ponaaju se vie kao slanje pisma potom: Poiljatelj specificira adresu primaoca za svaku individualnu poruku.
Namespace
Socket namespace odreuje kako su zapisane adrese socketa. Adresa socketa odreuje jedan kraj veze socketa. Na primjer, adrese socketa u local namespaceu su obina imena datoteka. U Internet namespaceu adresa socketa je sastavljena od Internet adrese (takoer
680/1275
znane kao Internet Protocol adress ili IP address) hosta spojenog na mreu i broj porta. Broj porta raspoznaje viestruke sockete na istom hostu.
Protokol
Protokol specificira kako su poslani podaci. Neki protokoli su TCP/IP, AppleTalk mreni protokol i UNIX lokalni komunikacijski protokol. Nisu sve kombinacije stilova, namespacea i protokola podrane.
Socket buffer
Svaki pojedini paket poslan kroz mrenu jedinicu sastoji se od nekoliko dijelova informacije. Svima osim payloada, podaci ije je slanje prouzroeno kreiranjem samoga paketa, svi slojevi mree, poevi od data link sloja i zavravajui na transportnom sloju, dodaju neke kontrolne informacije. Format paketa kontroliranih od mrene kartice su prikazani na slici.
Cijeli paket je napravljen razliitim funkcijama u nekoliko dijelova. Na primjer, UDP/TCP zaglavlje i IP zaglavlje su sastavljeni od funkcija zavisno transportnom i mrenom sloju IPS arhitekture, dok su zaglavlje hardvera i trailera, napisani odgovarajuom metodom specificiranom mrenom karticom. Mreni kd Linuxa sadri svaki paket u velikom memorijskom podruju nazvanom socket buffer. Svaki socket buffer je definiran sa strukturom podatka tipa sk_buff koja sadri, uz mnoge druge stvari, pokazivae na slijedee strukture podataka: socket buffer payload podaci korisnika (unutar socket buffera) the data link trailer (unutar socket buffera) INET socketi (sock object)
681/1275
descriptor zaglavlja transportnog sloja descriptor zaglavlja mrenog sloja descriptor of the data link layer header the destination cache cache entry (dest_entry object) Struktura podataka sk_buff sadri mnoga druga polja, kao identifikator mrenog protokola koriten za slanje podataka (checksum field) i vrijeme dolaska primljenih paketa. Kao glavno pravilo, kernel izbjegava kopiranje podataka ali jednostavno prosljeuje sk_buff descriptor pointer svakom mrenom sloju. Na primjer, kada priprema paket za slanje, transportni sloj poinje kopirati payload iz user mode buffera na viu poziciju socket buffera; tada transportni sloj dodaje svoje TCP ili UDP zaglavlje prije payloada. Nakon toga, kontrola se alje mrenom sloju, koji prima socket buffer descriptor i dodaje IP zaglavlje prije transportnog zaglavlja. Konano, data link layer dodaje svoje zaglavlje i trailer, ime pripremi paket za slanje.
Sistemski pozivi
Socketi su mnogo fleksibilniji nego mnoge druge komunikacijske tehnike. Ovo su sistemski pozivi za sockete: - socket kreira socket - closes unitava socket - connect kreira vezu izmeu dva socketa - bind imenuje server socket sa adresom - listen konfigurira socket da zapamti uvjete - accept prihvaa vezu i kreira novi socket za spajanje
682/1275
Za connection-style sockete koristimo SOCK_STREAM a za datagram-style sockete koristimo SOCK_DGRAM. Trei parametar, protokol, odreuje low-level mehanizme za slanje i primanje podataka. Svaki protokol je validan za odreenu namespace-style kombinaciju. Zato jer je uglavnom jedan protokol najbolji za svaki takav par, definirajui 0 je uglavnom ispravan protokol. Ako socket uspije, vraa file descriptor za socket. Moemo itati iz ili pisati u socket koristei read, write. Kada zavrimo sa socketom zovemo close da ga uklonimo.
Connect
Da bi ostvario vezu izmeu dva socketa, klijent zove connect, odreujui adresu server socketa da se spoji na nju. Klijent je proces koji inicira spajanje a server je proces koji eka da prihvati vezu. Klijent zove connect da potakne vezu od lokalnog socketa do server socketa specificiranu u drugom argumentu. Trei argument je duina, u byte-ovima, od adresne strukture na koju pokazuje sa drugim parametrom. Format adrese socketa razlikuje se prema socket namespaceu.
Serveri
ivotni ciklus servera ovisi o kreiranju connection-style socketa, dodijelivi mu adresu na njegov socket, postavljajui poziv na listen koji omoguuje veze do socketa, postavljajui pozive na accept dolazeim vezama, i na kraju zatvarajui socket. Podaci nisu itani i pisani direktno preko server socketa. Umjesto toga program svaki puta prima novu vezu; Linux kreira zasebne sockete za koritenje prijenosa podataka preko te veze. U ovom odlomku emo pokazati bind, listen and accept. Adresa mora biti dodijeljena socketu servera koristei bind ako je klijent mora pronai. Prvi argument bind metode je socket file descriptor. Drugi argument je pokaziva na adresnu strukturu socketa. Trei argument je duina adresne strukture, u byte-ovima. Kada je adresa dodijeljena connectionstyle socketu, mora pozvati listen ime e pokazati da je server. Prvi argument listen metode je socket file descriptor. Drugi argument odreuje koliko je prihvaenih veza u redu (queue). Ako je red pun, dodatna spajanje biti e odbijena. To ne ograniava ukupan broj veza koje server moe obraditi. Ograniava jedino broj klijenata koji se pokuavaju spojiti a nisu jo bili prihvaeni.
683/1275
Server prihvaa zahtjev za spajanjem od klijenta pokreui accept. Prvi argument accept metode je socket file descriptor. Drugi argument pokazuje na adresnu strukturu socketa koja je napunjena klijentovim adresama socketa. Trei argument je duina, u byteovima, adresne strukture socketa. Server moe koristiti klijentovu adresu da utvrdi hoe li stvarno komunicirati sa klijentom. Poziv za prihvaanje kreira novi socket za komunikaciju sa klijentom i vraa odgovarajui file descriptor. Originalni server socket nastavlja primati nove klijentove veze. Za itanje podataka iz socketa bez da ga se ukloni iz ulaznog reda, koristimo recv. Koristimo iste argumente kao read, plus dodatni FLAGS argument. Flag MSG_PEEK uzrokuje da moemo itati podatke ali ne i ih maknuti iz ulaznog reda.
Lokalni socketi
Proces spajanja socketa na istom raunalu moe koristiti lokalni namespace prezentiran kao sinonim PF_LOCAL i PF_UNIX. Zovu se lokalni socketi ili UNIX-domain socketi. Njihove socket adrese, specificirane po imenima datoteka, su koritene samo kod kreiranja veza. Ime socketima je specificirano u struct sockaddr_un. Moramo postaviti sun_family polje u AF_LOCAL, odreujui da je ovo lokalni namespace. Polje sun_path odreuje ime datoteke za koritenje i moe biti, najvie, 108 byte-ova dugako. Bilo koje ime moe biti koriteno, ali proces mora imati prava pisanja u direktoriju jer trebamo dodavati datoteke u direktorij. Da bi se spojili na socket, proces mora imati prava itanja za datoteku. Makar razliita raunala mogu dijeliti iste file-sisteme, samo procesi pokrenuti na istom raunalu mogu komunicirati sa lokalnim namespace socketima. Jedini dozvoljeni protokol za lokalni namespace je 0. Zbog toga to postoji u file-sistemu, lokalni socket se moe izlistati kao i datoteka. Na primjer: %ls l /tmp/socket srwxrwxx 1 user group 0 Nov 13 18:18 /tmp/socket
684/1275
685/1275
/* Ako klijent poalje poruku quit, gotovo je! */ if (!strcmp (text, "quit")) return 1; } } int main (int argc, char* const argv[]) { const char* const socket_name = argv[1]; int socket_fd; struct sockaddr_un name; int client_sent_quit_message; /* Kreira socket */ socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); /* Pokazuje da je ovo server */ name.sun_family = AF_LOCAL; strcpy (name.sun_path, socket_name); bind (socket_fd, &name, SUN_LEN (&name)); /* Listen for connections */ listen (socket_fd, 5); /* Konstantno prihvaa spajanja. Server radi sa svakim klijentom. Nastavlja sve dok klijent ne poalje quit poruku */ do { struct sockaddr_un client_name; socklen_t client_name_len; int client_socket_fd; /* Prihvaa vezu */ client_socket_fd = accept (socket_fd, &client_name, client_name_len); /* Handle the connection. */ client_sent_quit_message = server (client_socket_fd);
686/1275
/* Close our end of the connection. */ close (client_socket_fd); } while (!client_sent_quit_message); /* uklanja socket file */ close (socket_fd); unlink (socket_name); return 0; }
Internet-domain sockets
UNIX-domain socketi mogu se koristiti za komunikaciju izmeu dva procesa na istom raunalu. Internet-domain sockets, na drugoj strani, mogu se koristiti za spajanje procesa na razliitim umreenim raunalima. Proces spajanja socketa preko Interneta koristi internet namespace prezentirano sa PF_INET. Najei protokoli su TCP/IP. Internet protokol (IP), low-level protokol, pokree pakete kroz Internet, razdvajajui i sastavljajui pakete, ako je potrebno. On garantira samo best-effort dostavljanje, tako da paketi mogu nestati ili promijeniti redoslijed tijekom transporta. Svako participirajue raunalo je specificirano koristei jedinstveni IP broj. Transmission Control Protocol (TCP), prema slojevima iznad IP-a, provodi pouzdan connection-ordered transport. Zahtijeva vezu kao npr. telefonska linija da bi ostvario komunikaciju izmeu kompjutera i garantira da su podaci preneseni pouzdano i pravilnim redom. Internet socket adrese sadre dva dijela: stroj i broj porta. Ova informacija je pospremljena u struct sockaddr_in varijablu. Postavimo sin_family polje u AF_INET da pokaemo da je ovo Internet namespace adresa. sin_addr polje sadri internet adrese eljenog nam raunala kao 32-bitni integer IP broj. Broj porta odreuje raunalu drugaije sockete. Razliita raunala spremaju vrijednosti u razliitom redoslijedu byte-ova. Zbog toga koristimo htons da konvertiramo broj porta prema mrenom redoslijedu byte-ova.
687/1275
#include <stdlib.h> #include <stdio.h> #include <netinet/in.h> #include <netdb.h> #include <sys/socket.h> #include <unistd.h> #include <string.h> /* printa sadrzaj home-pagea za serverov socket. u slucaju uspjeha vraca informaciju. */ void get_home_page (int socket_fd) { char buffer[10000]; ssize_t number_characters_read; /* salje HTTP GET komandu za home-pageom */ sprintf (buffer, "GET /\n"); write (socket_fd, buffer, strlen (buffer)); /* cita iz socketa. Poziv za itanjem mozda ne vrati sve podatke odjednom, tako da pokuava i pokusava dok ne izadjemo */ while (1) { number_characters_read = read (socket_fd, buffer, 10000); if (number_characters_read == 0) return; /* pise podatke na standarni izlaz */ fwrite (buffer, sizeof (char), number_characters_read, stdout); } } int main (int argc, char* const argv[])
688/1275
{ int socket_fd; struct sockaddr_in name; struct hostent* hostinfo; /* kreira socket */ socket_fd = socket (PF_INET, SOCK_STREAM, 0); /* sprema ime servera u adresu socketa */ name.sin_family = AF_INET; /* konvertira string u broj */ hostinfo = gethostbyname (argv[1]); if (hostinfo == NULL) return 1; else name.sin_addr = *((struct in_addr *) hostinfo->h_addr); /* web server koristi port 80 */ name.sin_port = htons (80); /* spaja se na web server */ if (connect (socket_fd, &name, sizeof (struct sockaddr_in))== -1) { perror ("connect"); return 1; } /* prima home-page sa servera */ get_home_page (socket_fd); return 0; }
689/1275
Parovi socketa
Kao to smo prije vidjeli, pipe funkcija kreira dva file descriptora za poetak i za kraj pipe-a. Pipe-ovi su ogranieni jer file descriptori moraju biti koriteni kao povezani procesi i jer je veza nedirektna. socketpair funkcija kreira dva file descriptora za dva spojena socketa na istom raunalu. Ovi file descriptori omoguavaju dvosmjernu komunikaciju izmeu povezanih procesa. Njihova tri parametra su jednaka kao i kod poziva socket: odreuju domenu, stil spajana i protokol. Zadnji parametar je niz dva integera, koji se puni sa file descriptorima od dva socketa, slino pipe. Kada zovemo socketpair, moramo specificirati PF_LOCAL kao domenu.
690/1275
Saa Dragi
TCP/IP
691/1275
692/1275
Iz ove podjele, vidi se da je OSI model tako zamiljen da svaka razina koristi svoj protokol kojeg moemo proizvoljno zamijeniti a da razine, tj. protokoli iznad dalje rade bez problema. Npr. ethernet kao fiziki layer moe koristiti BNC ili UTP ili recimo radio valove, dok IP moe koristiti ethernet, ppp, token ring...
693/1275
Network Interface
Network interface sluzi za fiziki prijenos podataka izmeu raunala i uglavnom je implementiran u hardwareu. Npr. ethernet, token ring...
694/1275
10baseT koristi UTP kabel 100baseT koristi UTP kabel 10/100baseT koristi UTP kabel i ima mogunost automatskog prepoznavanja brzine veze, najee koritena Gigabit ethernet (1000baseX) postoji vise verzija, koristi ili optiki ili UTP kabel Ethernet koristi 2 protokola paralelno MAC i LLC. MAC se brine za fiziko adresiranje dok LLC obavlja neto malo vise funkcije vezane uz adresiranje na samom ureaju. Svaka proizvedena mrena kartica ima jedinstvenu MAC adresu (djelomino ju je mogue softwareski mijenjati).
695/1275
krenuti drugim putem kroz mreu. Ako paketi ne stignu pravim redoslijedom IP ce ih sastaviti u ispravan paket. IP datagram:
IP header:
696/1275
Version o 4 bita, verzija ip headera, trenutno se koristi verzija 4. Sljedea verzija je IPv6, koja se zasad koristi samo eksperimentalno. IP Header length o 4 bita, govori koliko je 32-bitnih rijeci ip header dugaak. Type of service o 8 bitova, govori o kvaliteti veze Total length o 2 bytea, oznaava ukupnu duljinu IP paketa Identification o 2 bytea, koristi se za da bi identificirali specifini datagram izmeu poiljatelja i primatelja. Za svaki sljedei IP paket vrijednost se inkrementira. Flags o 3 bita, oznaavaju da li je paket pogodan za fragmentaciju, te da li je fragmentiran Fragment offset o 13 bitova, oznaava mjesto gdje se fragment nalazi u cijeloj poruci (potrebno za sastavljanje poruke) Time to live o 1 byte, oznaava preko koliko prijelaza paket moe proi dok se ne odbaci. Svaki IP router prilikom prosljeivanja paketa dekrementira njegovu vrijednost, a ako je 0, paket se dalje ne prosljeuje. Protocol o 1 byte, oznaava koji protokol se nalazi iznad, tj. iji paket IP paket sadri Protokoli: 1 2 4 6 ICMP IGMP IP in IP encapsulation TCP
697/1275
17 41 47 50 51 89
UDP IPv6 Generic Routing Encapsulation (GRE) IP Security Encapsulating Security Payload (ESP) IP Security Authentication Header (AH) OSPF
Header checksum o 2 bytea, osigurava integritet headera Source address o 4 bytea, oznaava adresu poiljatelja poruke Destination address o 4 bytea, oznaava adresu primatelja poruke Options and Padding o dodatne opcije i dopuna paketa da bi njegova veliina bila djeljiva sa 32
Transport layer
Trasnportna razina je zaduena za dostavljanje paketa i osiguravanje njegovog integriteta. Najvie se koriste TCP i UDP.
TCP protokol:
TCP je obostrani spojni protokol koji spaja 2 raunala (TCP konekcija moe biti i unutar jednog raunala, mnoge aplikacije komuniciraju na taj nain, npr. X window system), te osigurava da paketi na odrediste dou traenim redoslijedom.
TCP uspostavlja i odrava konekciju transparentno korisniku. Objanjenje samog protokola uspostavljanja, odravanja i prekida komunikacije preopirno za ovaj dokument.
698/1275
TCP datagram:
TCP header:
Source port o polje od 2 bytea koje definira socket sa kojeg se alje TCP segment, tj. definira koja aplikacija na application layeru alje segment, source socket zajedno sa ip adresom jedinstveno definira mjesto sa kojeg je segment poslan Destination port
699/1275
polje od 2 bytea koje definira socket na koji se alje TCP segment, tj. definira
koja aplikacija na application layeru prima segment, source socket zajedno sa ip adresom jedinstveno definira mjesto sa kojeg je segment poslan Sequence number o polje od 4 bytea, redni broj poetnog okteta segmenta Acknowledgment numberpolje od 4 bytea, broj slijedeeg okteta korisnikove poruke, ujedno i kumulativna potvrda Data Offset o polje od 4 bytea, oznaava poetak podataka u paketu, ujedno oznaava veliinu TCP headera Reserved o 6 bitova rezerviranih za buduu uporabu, postavljeno na 0 Flags o 6 bitova koje oznaavaju TCP flagove: URG, ACK,PSH, RST, SYN, FIN Window o polje od 2 bytea, govori koliko velik buffer poiljatelj poruke ima za primanje poruka. TCP/IP stack drugog sudionika treba slati pakete velike maksimalno do veliine prozora. Ako je poslana 0, poruke se dalje ne alju, sve dok se ne poalje nova poruka sa vrijednosti veom od 0. Urgent pointer o polje od 2 bytea, govori lokaciju hitnih podataka u segmentu Options o proizvoljne opcije koje se dodaju TCP headeru u paketima od 4 btyea Poznatiji TCP portovi: 19 20 21 23 25 69 80 139 Network News Transfer Protocol (NNTP) FTP Server (data channel) FTP Server (control channel) Telnet Server Simple Mail Transfer Protocol (SMTP) Trivial File Transfer Protocol (TFTP) Hypertext Transfer Protocol (HTTP; Web server) NetBIOS Session Service
700/1275
339 445
Lightweight Directory Access Protocol (LDAP) Direct-Hosted Server Message Block (SMB)
UDP protokol:
UDP je bespojni protokol gdje nemamo informaciju da li je paket stigao ili nije. UDP samo prosljeuje pakete protokolu iznad koji se mora brinuti za njihovo pravilno tumaenje. Kako nema overheada i odmah prosljeuje pakete, znatno je brzi od TCP-a. UDP datagram:
UDP header:
Source port o polje od 2 bytea koje definira port sa kojeg se alje UDP poruka, tj. definira koja aplikacija na application layeru alje poruku, polje je opcionalno te ako se ne koristi moe biti 0 Destination port o polje od 2 bytea koje definira port na koji stie UDP poruka, tj. definira koja aplikacija na application layeru prima poruku, zajedno sa ip adresom iz ip headera jedinstveno oznaava kojem processu tj. aplikaciji je poruka poslana
701/1275
Length o polje od 2 bytea koje oznaava duljinu. Minimalna duljina je 8 byte-ova a teoretska maksimalna 65,515 (duljina ip paketa minus headeri). Prava maksimalna duljina je ograniena MTU-om linka preko kojeg se prenose paketi. Ovo polje je redundantno zato sto se duljina paketa uvijek moe izraunati iz duljine IP paketa. Checksum o polje od 2 bytea koje osigurava integritet podataka Poznatiji UDP portovi: 53 67 68 69 137 138 161 445 520 DNS BOOTP client (Dynamic Host Configuration Protocol [DHCP]) BOOTP server (DHCP) TFTP NetBIOS Name Service NetBIOS Datagram Service Simple Network Management Protocol (SNMP) Direct hosting of Server Message Block (SMB) datagrams over TCP/IP RIP
Application layer
Application razina definira protokol koji korisnik koristi da bi razmjenjivao njemu suvisle informacije. Npr. poslao mail, pogledao sadraj neke web stranice, udaljeno se spojio na drugo raunalo... Primjeri application protokola: Telnet, FTP, SMTP, NFS, DNS, HTTP
702/1275
Klase IP adresa:
IP adrese su podijeljene u klase, ovisno o primjeni i veliini organizacije kojoj se dodjeljuju. Najee koritene su A, B i C. Ovim klasama su definirane duljine mrene adrese i duljine adrese raunala. Klasa A koristi prvih 8 bitova za adresiranje mree, a zadnjih 24 za adresiranje raunala i dodjeljuje se uglavnom ogromnim organizacijama. Klasa B koristi 16 bitova za adresu mree i 16 bitova za adresu raunala i dodjeljuje se uglavnom velikim organizacijama i tvrtkama (ISP-ovi i slino), trenutno tih adresa najvie nedostaje. Klasa C koristi 24 bita za adresu mree, a 8 za adresu raunala. Dodjeljuje se veini organizacija i tvrtki. Ukoliko postoji potreba za vise od 254 ali znatno manja od 65.534 raunala, bolje je zakupiti vise adresa klase C nego jednu B jer time tedimo adrese. Class Addresses A 0.x.x.x to 126.x.x.x B 128.0.x.x to 191.255.x.x C 192.0.0.x to 223.255.255.x D 224.0.0.1 to 239.255.255.255 E 240.x.x.x to 255.255.255.255 Ako u IP adresi sve bitove adrese raunala postavimo na 0, dobili smo adresu mree, a ako ih sve postavimo na 1 dobili smo brodcast adresu. Npr.
703/1275
199.10.2.0 adresa mree 199.10.2.255 brodcast adresa mree 199.10.2.4 jedno raunalo na mrei
Loopback adrese:
Za testiranje i mrenu komunikaciju izmeu aplikacija na istom raunalu koristi se specijalna loopback mrena adresa: 127.0.0.0 Bilo koja regularna adresa na toj mrei je adresa samog raunala, najee se koristi: 127.0.0.1
Privatne IP adrese:
Za mree koje se ne planiraju spajati na internet, ili se planiraju spajati na internet pomou jednog gatewaya koji koristi NAT (Network Adress Translation, poznato jo kao i IP Masquarade, IP adresa se u tom sluaju maskira IP adresom gatewaya) predviene su privatne IP adrese. Zapravo, za lokalnu mreu moemo koristiti bilo koje adrese, ali bolje je koristiti privatne da ne bi imali problema sa sluajnim routanjem tih paketa prema van, dok se privatne IP adrese teoretski ne routaju na Internetu. Za svaku klasu imamo set privatnih mreznih adresa: A 10.0.0.0 B 172.16.0.0 - 172.31.0.0 C 192.168.0.0 - 192.168.255.0
704/1275
Kako smo doli do toga: N = network H = host Ovako izgleda IP adresa B klase: NNNNNNNN.NNNNNNNN.HHHHHHHH.HHHHHHHH Trenutna subnet maska je: 11111111.11111111.00000000.00000000 Kako je nama potrebno 256 adresa C klase subnet maska ce sad izgledati ovako: 11111111.11111111.11111111.00000000 255.255.255.0
705/1275
Primjer 2: Ako od adrese raunala u klasi C uzmemo 3 bita moemo kreirati 8 mrea po 30 lanova. Subnet maska nam je: 11111111.11111111.11111111.11100000
Kada to prevedemo u standardni oblik dobijemo: 255.255.255.224 Sad imamo 8 mrea sa sljedeim adresama: Network Hosts Address Range Broadcast 192.168.1.0 192.168.1.0 to 192.168.1.30 192.168.1.30 192.168.1.32 192.168.1.32 to 192.168.1.63 192.168.1.63 192.168.1.64 192.168.1.64 to 192.168.1.95 192.168.1.95 192.168.1.96 192.168.1.96 to 192.168.1.127 192.168.1.127 192.168.1.128 192.168.1.128 to 192.168.1.159 192.168.1.159 192.168.1.160 192.168.1.160 to 192.168.1.191 192.168.1.191 192.168.1.192 192.168.1.192 to 192.168.1.223 192.168.1.223 192.168.1.224 192.168.1.224 to 192.168.1.254 192.168.1.254
Routing
Kako fiziki nije mogue napraviti jednu veliku mreu na koju ce se spojiti sva raunala, koriste se routeri. Router je ureaj koji ovisno o svojoj routing tablici pakete sa jednog mrenog interfacea prosljeuje na drugi interface. Zapravo veina operativnih sustava unutar samog tcp/ip stacka ima implementirana osnovnu verziju routera kojeg onda
706/1275
konfiguriramo tako da mu upiemo adresu gatewaya (routera). U tom sluaju sve pakete za koje se raunalo ne zna gdje bi poslalo alje na gateway. Tako se npr. spajamo na Internet. Napredniji operativni sustavi (svi unix-i, noviji windowsi) imaju integriran pravi router. Kako na velikim mreama uglavnom postoji vise putova od jednog do drugog mjesta, tj. ip adrese, routeri tu uglavnom koriste neki od protokola za dinamiko routanje.
Primjer routing tablice na Linux raunalu: Kernel IP routing table Destination 192.168.0.0 169.254.0.0 127.0.0.0 default Gateway * * * 192.168.0.1 Genmask 255.255.255.0 U 255.255.0.0 255.0.0.0 0.0.0.0 U U 0 UG 0 Flags Metric Ref Use Iface 0 0 0 0 0 0 0 eth0 0 eth0 0 lo 0 eth0
Primjer routing tablice na windows XP raunalu: ============================================================== ============= Interface List 0x1 ........................... MS TCP Loopback interface 0x2 ...00 50 56 c0 00 08 ...... VMware Virtual Ethernet Adapter for VMnet8 0x3 ...00 50 56 c0 00 01 ...... VMware Virtual Ethernet Adapter for VMnet1 0x10005 ...00 30 05 55 51 e1 ...... Intel(R) PRO/100 VE Network Connection 0x10006 ...00 10 5a f6 87 d7 ...... 3Com EtherLink XL 10/100 PCI TX NIC (3C905BTX) ============================================================== ============= ============================================================== ============= Active Routes: Network Destination Netmask Gateway Interface Metric
707/1275
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1 1 1 1
255.255.255.0 141.29.127.160 141.29.127.160 127.0.0.1 192.168.0.1 127.0.0.1 192.168.0.1 192.168.61.1 127.0.0.1 192.168.61.1 127.0.0.1 127.0.0.1 192.168.0.1 127.0.0.1 192.168.0.1 192.168.61.1 127.0.0.1 192.168.61.1 127.0.0.1
141.29.255.255 255.255.255.255 141.29.127.160 141.29.127.160 192.168.0.1 255.255.255.255 192.168.0.255 255.255.255.255 192.168.61.0 255.255.255.0 192.168.61.1 255.255.255.255 192.168.61.255 255.255.255.255 192.168.132.0 255.255.255.0 192.168.132.1 255.255.255.255 192.168.132.255 255.255.255.255 224.0.0.0 224.0.0.0 224.0.0.0 224.0.0.0 240.0.0.0 240.0.0.0 240.0.0.0
255.255.255.255 255.255.255.255 141.29.127.160 141.29.127.160 255.255.255.255 255.255.255.255 255.255.255.255 255.255.255.255 255.255.255.255 255.255.255.255 Default Gateway: ============= Persistent Routes: None 141.29.127.254 192.168.0.1 192.168.61.1
192.168.132.1 192.168.132.1
==============================================================
708/1275
SOCK_SEQPACKETOnly used in AF_NS protocol SOCK_RDMNot implemented Gotovo uvijek emo koristiti SOCK_STREAM tip socketa. Trei argument je broj protokola, za primjere emo koristiti 0. bind Bind funkcija spaja proces sa socketom. Bind uglavnom koristimo u serverskim procesima da postavimo socket koji eka na konekcije. Argumenti za bind poziv su: int socket struct sockaddr * my_addr int my_addr_length Prvi argument je socket deskriptor koji nam je vratio socket poziv. Drugi argument je sockaddr struktura ija je definicija u /usr/include/linux/socket.h. struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address }; Sockaddr mora biti alociran i predan kao drugi argument i dalje se po njemu iz programa ne smije direktno prestupati. Primjer: struct sockaddr_in sin; bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(port); bind(sock_descriptor, (struct sockaddr *)&sin, sizeof(sin);
710/1275
listen Nakon smo socket kreirali i vezali uz proces, proces serverskog tipa moe pozvati listen funkciju da eka na nadolazee socket konekcije. Argumenti su: int socket int input_queue_size Prvi argument je socket deskriptor koji nam je vratio socket, drugi je veliina queua, tj. koliko konekcija moe ekati u redu. Ako emo koristiti fork da bi obraivali svaku konekciju u posebnom procesu broj ne mora biti velik, ali za jednostavnije servere lake je postaviti vrijednost na neto veu i obraivati konekcije po redu. connect Connect koristimo da bi se spojili na socket na nekom serveru. Argumenti su: int socket struct sockaddr * server_address int server_address_length Socket je deskriptor koji nam vrati funkcija socket. Sockaddr smo ve djelomino objasnili i jo emo objasniti u primjeru. recv Recv koristimo za prihvaanje poruka sa socketa kojeg smo ve spojili. Postoje jo recvfrom i recvmsg ali oni se koriste za prihvaanje poruka koje nisu spojno orijentirane pa ih za sad neemo spominjati. Argumenti su: int socket void * buf int buf_len unsigned int flags
711/1275
Socket, deskriptor spojenog socketa. Buf je pointer na komad memorije gdje emo spremiti podatke. Drugi argument govori koliko je velik alociran komad memorije. A trei su zastavice koje kombiniramo sa |. MSG_OOBProcess out-of-band data (useful for handling high priority control messages), usually zero is used for normal (not out of band) behavior MSG_PEEKPeek at an incoming message without reading it MSG_WAITALLWait for the receiving data buffer to be completely full before returning
send Send se koristi za slanje podatka preko socketa drugom programu. Parametri su: int socket const void * message_data int message_data_length unsigned int flags Socket, deskriptor spojenog socketa. Drugi argument ja pointer na podatke koji se trebaju poslati. Trei argument govori koliko je velika poruka koju treba poslati. etvrti parametar je uvijek 0 u slijedeim primjerima, ali moe biti (iako se koristi jako rijetko): MSG_OOBProcess out of band data (out of band send calls are useful for high priority control messages), usually zero is used for normal (not out of band) behavior MSG_DONTROUTEDo not use routing
Ovaj server ce samo proslijediti dobivenu poruku nazad. struct sockaddr_in sin; struct sockaddr_in pin; int sock_descriptor; int temp_sock_descriptor; int address_size; sock_descriptor = socket(AF_INET, SOCK_STREAM, 0); bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(8000); // we will use port 8000 bind(sock_descriptor, (struct sockaddr *)&sin, sizeof(sin)); listen(sock_descriptor,20); //queue up to 20 connections while(1) { // get a temporary socket to handle client request: temp_sock_descriptor &address_size); // receive data from client: recv(temp_sock_descriptor, buf, 16384, 0); // ... here we can process the client request ... // return data to the client: send(temp_sock_descriptor, buf, len, 0); // close the temporary socket (we are done with it) close(temp_sock_descriptor); } Kada ubijemo program, operativni sustav automatski zatvara sve konekcije. = accept(sock_descriptor, (struct sockaddr *)&pin,
713/1275
714/1275
715/1275
sendto(socket_descriptor, buf, sizeof(buf), 0, (struct sockaddr *)&address, sizeof(address)); iter++; } while (process); }
716/1275
// set socket using SOCK_DGRAM for UDP: socket_descriptor = socket(PF_INET, SOCK_DGRAM, 0); bind(socket_descriptor, (struct sockaddr *)&sin, sizeof(sin)); while (1) { sin_len = sizeof(sin); recvfrom(socket_descriptor, message, 256, 0, (struct sockaddr *)&sin, &sin_len); printf(\nResponse from server:\n\n%s\n, message); if (strncmp(message, stop, 4) == 0) break; } close(socket_descriptor); }
717/1275
TCP/IP API
718/1275
Uvod
tijekom 1980. ARPA, kao dio U.S. Department of Defense, postala je DARPA (Defense Advanced Research Projects Agency) ali agencija i njena misija razvijanja naprednog istraivanja ostala je ista
719/1275
OSI model sadri sedam slojeva (layers) koji definiraju funkcije komunikacijskih protokola. Svaki sloj OSI modela predstavlja funkciju koja se izvodi kada se podaci transferiraju kroz kooperativne aplikacije i mree. Slika 1.1. prikazuje svaki sloj s imenom i sadri kratak opis. Gledajui sliku, protokoli su kao blokovi stavljeni jedan na drugi. Zbog toga se struktura esto naziva stack ili protocol stack.
7. Aplikacijski sloj (APPLICATION) Mrene primjene poput SMTP, HTTP, FTP i sl. 6. Prezentacijski sloj (PRESENTATION) Formatiranje podataka i zatita 5. Sjedniki sloj (SESSION) Uspostavljanje i odravanje sesija 4. Prijenosni sloj (TRANSPORT) Osiguranje prijenosa s kraja na kraj 3. Mreni sloj (NETWORK) Isporuka jedinica informacije, ukljuujui usmjeravanje (routing) 2. Podatkovni sloj (DATA LINK) Prijenos jedinica informacije s provjerom greke 1. Fiziki sloj (PHYSICAL) Prijenos binarnih podataka kroz medij
Slika - OSI model Sloj ne definira jedinstven protokol. Svaki sloj definira podatkovne komunikacijske funkcije koje mogu biti koritene od bilo kojeg broja protokola. Dalje, svaki sloj moe sadravati vie protokola gdje svaki provodi uslugu odgovarajui funkciji sloja. Na primjer, protokol za prijenos podataka (FTP) i elektronika pota (SMTP) provode korisnkike usluge i dio su aplikacijskog sloja (Application Layer).
720/1275
OSI Model Application Presentation Session Transport Network Data link Physical Slika - Usporedba OSI i TCP/IP modela Isto kao i u OSI modelu, podaci se alju prema dolje niz stack, kada su poslani na mreu, i gore uz stack, kada su primljeni sa mree. Podaci se u TCP/IP-u alju niz protokol stack iz aplikacijskog sloja sve do fizike mree. Svaki sloj u stacku dodaje kontrolnu informaciju da bi potvrdio sigurnu dostavu. Ova kontrolna informacija naziva se zaglavlje (header) jer je postavljen na poetak podatka koji se treba poslati. Svaki sloj tretira sve informacije koje primi iz sloja iznad kao podatke i stavlja svoje zaglavlje na poetak informacije. Kada su podaci primljeni, dogaa se suprotno, svaki sloj skida svoje zaglavlje prije nego poalje podatke sloju iznad.
User data TCP header IP header Network header Application byte stream TCP segment IP datagram Network-level packet
721/1275
Networking na Linuxu
Linux kernel podrava mnogo razliitih mrenih arhitektura (TCP/IP je samo jedna od njih), s nekoliko implementiranih alternativnih algoritama za razvrstavanje mrenih paketa, ukljuujui i programe koji olakavaju sistemskim administratorima postaviti router, gateway, firewall, pa ak i jednostavan World Wide Web server, direktno na nivou kernela. Trenutni kd Net-4 je inspiriran orginalnom Berkley Unix implementacijom. Kako i samo ime govori, ovo je etvrta verzija Linux networkinga. Networking kd je organiziran u slojeve (layers), gdje svaki od njih ima vrlo dobro definiran interface. Poto podaci poslani mreom nisu ponovo upotrebljivi, nema potreba za spremanjem u cache. Linux izbjegava kopiranje podataka unutar slojeva. Originalni podaci su spremljeni u memoriju (memory buffer), koji je dovoljno velik da sadri informacije potrebne svakom sloju.
Mrene arhitekture
Mrena arhitektura opisuje kako je pojedina raunalna mrea napravljena. Arhitektura definira grupu slojeva gdje bi svaki trebao imati vrlo dobro definiranu namjenu. Programi u svakom sloju komuniciraju koristei razmjenjive skupove pravila i konvencija (tzv. protokol). Generalno gledajui, Linux podrava veliki broj razliitih mrenih arhitektura. Neke od njih su:
name PF_APPLETALK PF_BLUETOOTH PF_BRIDGE PF_DECnet PF_INET PF_INET6 PF_IPX PF_LOCAL, PF_UNIX PF_PACKET PF_X.25 mrena arhitektura i/ili protokol Appletalk Bluetooth Multiprotocol bridge DECnet IPSs IPv4 protocol IPSs IPv6 protocol Novell IPX Unix domain socket (local communication) IPSs IPv4/IPv6 protocol low-level access X25
Tablica - Podrane arhitekture pod Linux-om IPS (Internet Protocol Suite) je mrena arhitektura Interneta, ponekad mrena arhitektura zbog glavnih protokola. nazvana TCP/IP
722/1275
10baseT koristi UTP kabel 100baseT koristi UTP kabel 100baseFX koristi optiki kabel Gigabit ethernet (1000baseX) postoji vie verzija o 1000baseTX koristi UTP kabel o 1000baseSX, 1000baseLX koriste optiki kabel Data link sloj Ethernet protokola se sastoji od dva podsloja, Media Access Control
sloja (MAC) i Logical Link Control sloja (LLC) kako je prikazano na slici. LLC sublayer Data link layer Slika - Data link sloj Ethernet protokola Podjelu je napravio Institute of Electrical and Electronics Engineers (IEEE). Logical Link Control (LLC) upravlja komunikacijom izmeu mrenih ureaja unutar jednog mrenog spoja. LLC je definiran IEEE 802.2 specifikacijom te podrava spojne i bespojne servise. Media Access Control (MAC) upravlja pristupom mediju za prijenos podataka. IEEE MAC specifikacija definira jedinstvene MAC adrese tako da su mreni ureaji jednoznano identificirani na mrei. Svaka proizvedena mrena kartica ima jedinstvenu MAC adresu koju je, djelomino, mogue softverski mijenjati. Kada MAC sloj primi transmit-frame zahtjev za pripadajuom adresom i podacima iz LLC sloja, MAC poinje slati sekvencu (paket) na mreu prebacivanjem LLC podataka u MAC frame buffer. Svaka mrena kartica prije slanja paketa na mreu provjerava da li moe poslati paket na mreu ili treba ekati da se medij oslobodi. Protokol kojim se to obavlja se naziva Carrier Sense, Multiple Access with Collision Detection (CSMA/CD). MAC sublayer
723/1275
IP header IP datagram
IP payload
Network-level packet
Slika - IP datagram
Bit: 0 Version 4 IHL 8 Type of service 16 19 31
Identification Time to live 20 byte Source address Destination address Options + Padding Protocol
Header checksum
Slika - IPv4 header Version IP Header length Type of service Total length Identification 4 bit 4 bit 8 bit 2 byte 2 byte Verzija ip headera, trenutno se koristi verzija 4. Slijedea verzija je Ipv6, koja se za sada koristi samo eksperimentalno Duina IP headera (broj 32-bitnih rijei) Kvaliteta veze Ukupna duljina IP paketa Identifikaciju specifinog datagrama izmeu poiljatelja i primetelja. Za svaki sljedei IP pakeet vrijednost se inkrementira Flags 3 bit Da li je paket pogodan za fragmentaciju, te da li je fragmentiran
724/1275
13 bit 1 byte
Mjesto gdje se fragment nalazi u cijeloj poruci (potrebno za sastavljanje poruke) Vrijeme ivota paketa, tj. Preko koliko prijelaza paket moe proi dok se ne odbaci. Svaki IP router prilikom prosljeivanja paketa dekrementira njegovu vrijednost, a ako je 0, paket se dalje ne prosljeuje
Protocol Header checksum Source address Destination address Options Padding and
Koji protokol se nalazi iznad, tj. iji paket IP paket sadri Osigurava integritet headera Adresa poiljatelja poruke Adresa primatelja poruke Dodatne opcije i dopuna paketa da bi njegova veliina bila djeljiva sa 32
Payload length
Source address
725/1275
TCP protokol
TCP je obostrani spojni protokol koji spaja 2 raunala, te osigurava da paketi dolaze na odredite traenim redoslijedom. TCP koneckija moe biti i unutar jednog raunala (mnoge aplikacije komuniciraju na taj nain, npr. X window system).
Network interface header Network interface trailer
IP header
Segment
10
16 Destination port
31
Unused
Flags
726/1275
Programski alati na Unix raunalima UDP TCP/IP stack drugog sudionika treba slati pakete velike maksimalno do veliine prozora. Ako je poslana 0, poruke se dalje ne alju, sve dok se ne poalje nova poruka sa vrijednou veom od 0.
2 byte
Lokacija hitnih podataka u segmentu Proizvoljne opcije koje se dodaju TCP headeru u paketima od 4 bytea
727/1275
UDP protokol
UDP je bespojni protokol gdje nemamo informaciju da li je paket stigao ili nije. UDP samo prosljeuje pakete protokolu iznad koji se mora brinuti za njihovo pravilno tumaenje. Kako nema overheada i odmah prosljeuje pakete, znatno je bri od TCP-a.
Network interface header Network interface trailer
IP header
Message
728/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb 69 137 138 161 119 520 1812, 1813 TFTP Trivial File Transfer Protocol NetBIOS Name Service NetBIOS Datagram Service SNMP Simple Network Management Protocol NNTP Network News Transfer Protocol RIP Routing Information Protocol
Tablica - Poznatiji UDP portovi UDP (User data protocol) je nii nivo protokola od TCP-a. UDP ne garantira dostavu paketa na odredite. Takoer UDP ne garantira dostavu paketa u originalnom poretku, odnosno u onom poretku kojim su bili poslani. Koritenjem UDP socket-a nai programi mogu postati znatno sloeniji nego to to mogu biti TCP socket-i. Evo savjeta i pod kojim uvjetima treba koristiti UDP socket-e: podaci koje trebamo poslati odgovaraju jednom fizikom UDP paketu. UDP paketi su veliki 8192 byte-a, ali zbog podataka za header, preostaje nam jos 5000 byte-a neki podaci se mogu izgubiti bez naruavanja integriteta sistema svaki izgubljeni paket se nemora ponovno slati
Najvea prednost UDP protokola nad TCP-om je ta to je puno bri, ali mu je sigurnost prijenosa, odnosno dostave paketa mana.
Aplikacijska razina
Aplikacijska razina (Application layer) definira protokol koji korisnik koristi da bi razmjenjivao njemu suvisle informacije. Npr. poslao mail, pogledao sadraj neke web stranice, udaljeno se spojio na drugo raunalo i sl. Primjeri su Telnet, FTP, SMTP, NFS, DNS, HTTP i sl.
729/1275
IP adresiranje, stvaranje podmrea i usmjeravanje IP adresiranje IP protokol zahtjeva da svako raunalo, tonije mreni interface, na mrei ima jedinstvenu IP adresu. IP adresa se sastoji od 4 bytea, a mi je pisemo dekatski, svaki byte posebno odvojeno tokama. Prvi dio IP adrese je mrena adresa, a drugi dio je adresa raunala, a odnos izmeu njihovih duljina ovisi o klasi mree i subnet maski.
Klase IP adresa
IP adrese su podjeljene u klase, ovisno o primjeni i veliini organizacije kojoj se dodjeljuju. Najee koritene su A, B i C. Ovim klasama su definirane duljine mrene adrese i duljine adrese raunala. Klasa A koristi prvih 8 bitova za adresiranje mree (od kojih je MSB (most significant bit) postavljen na 0), a zadnjih 24 za adresiranje raunala i dodjeljuje se uglavnom ogromnim organizacijama. Klasa B koristi 16 bitova za adresu mree (MS bitovi postavljeni na 10) i 16 bitova za adresu raunala i dodjeljuje se uglavnom velikim organizacijama i tvrtkama (ISP-ovi i slino). Klasa C koristi 24 bita za adresu mree (MS bitovi postavljeni na 110), a 8 za adresu raunala. Dodjeljuje se veini organizacija i tvrtki. Ukoliko postoji potreba za vie od 254 ali znatno manja od 65.534 raunala, bolje je zakupiti vie adresa klase C nego jednu B jer time tedimo adrese. Klasa D ima 4 najznaajnija bita postavljena na 1110, dok klasa E 4 najznaajnija bita ima postavljena na 1111.
Class Addresses A 0.x.x.x to 126.x.x.x B 128.0.x.x to 191.255.x.x C 192.0.0.x to 223.255.255.x D 224.0.0.1 to 239.255.255.255 E 240.x.x.x to 255.255.255.255
Ako u IP adresi sve bitove adrese raunala postavimo na 0, dobili smo adresu mree, a ako ih sve postavimo na 1 dobili smo broadcast adresu.
730/1275
Loopback adrese
Za testiranje i mrenu komunikaciju izmeu aplikacija na istom raunalu koristi se specijalna loopback mrena adresa 127.0.0.0. Bilo koja regularna adresa na toj mrei je adresa samog raunala, najee se koristi 127.0.0.1.
Privatne IP adrese
Za mree koje se ne planiraju spajati na internet, ili se planiraju spajati na internet pomou jednog gatewaya koji koristi NAT (Network Adress Translation, poznato jos kao i IP Masquarade, IP adresa se u tom sluaju maskira IP adresom gatewaya) predviene su privatne IP adrese. Zapravo, za lokalnu mreu mozemo koristiti bilo koje adrese, ali bolje je koristiti privatne da ne bi imali problema sa sluajnim routanjem tih paketa prema van, dok se privatne IP adrese teoretski ne routaju na Internetu. Za svaku klasu imamo set privatnih mrenih adresa:
A 10.0.0.0 B 172.16.0.0 - 172.31.0.0 C 192.168.0.0 - 192.168.255.0
731/1275
N = network H = host Ovako izgleda IP adresa B klase: NNNNNNNN.NNNNNNNN.HHHHHHHH.HHHHHHHH Trenutna subnet maska je: 11111111.11111111.00000000.00000000 Kako je nama potrebno 256 mrea C klase, subnet maska e sad izgledati ovako: 11111111.11111111.11111111.00000000 ili 255.255.255.0 Primjer 2: Ako od adrese raunala u klasi C uzmemo 3 bita moemo kreirati 8 mrea po 30 lanova. Subnet maska nam je: 11111111.11111111.11111111.11100000 Kada to prevedemo u standardni oblik dobijemo: 255.255.255.224 Sad imamo 8 mrea sa slijedeim adresama:
Network 192.168.1.0 192.168.1.32 192.168.1.64 192.168.1.96 192.168.1.128 192.168.1.160 192.168.1.192 192.168.1.224 Hosts 192.168.1.1 192.168.1.30 192.168.1.33 192.168.1.62 192.168.1.65 192.168.1.94 192.168.1.97 192.168.1.126 192.168.1.129 192.168.1.158 192.168.1.161 192.168.1.190 192.168.1.193 192.168.1.222 192.168.1.225 192.168.1.254 Broadcast address 192.168.1.31 192.168.1.63 192.168.1.95 192.168.1.127 192.168.1.159 192.168.1.191 192.168.1.223 192.168.1.255
732/1275
Usmjeravanje (Routing)
Kako fiziki nije mogue napraviti jednu veliku mreu na koju e se spojiti sva raunala, koriste se usmjerivai (router). Usmjeriva je urejaj koji ovisno o svojoj routing tablici pakete sa jednog mrenog suelja proslijeuje na drugo suelje. Zapravo veina operativih sustava unutar samog TCP/IP stacka ima implementiranu osnovnu verziju usmjerivaa kojeg onda konfiguriramo tako da mu upiemo adresu gatewaya (routera). U tom sluaju sve pakete za koje raunalo ne zna gdje bi poslalo alje na gateway. Napredniji operativni sustavi (svi UNIXoidi, noviji Windowsi) imaju integriran pravi usmjeriva. Kako na velikim mreama postoji vie puteva od jednog do drugog mjesta, tj. vie IP adresa, usmjerivai tu uglavnom koriste neki od protokola za dinamiko usmjeravanje (rutanje). Primjer routing tablice na Linux racunalu:
user@localhost:/$ route -n Kernel IP routing table Destination 192.168.0.0 169.254.0.0 127.0.0.0 0.0.0.0 Gateway * * * 192.168.0.1 Genmask 255.255.255.0 255.255.0.0 255.0.0.0 0.0.0.0 Flags Metric Ref U U U UG 0 0 0 0 0 0 0 0 Use Iface 0 eth0 0 eth0 0 lo 0 eth0
user@localhost:/$
733/1275
734/1275
Mreno programiranje
Mreno programiranje obuhvaa pisanje programa koji komuniciraju sa drugim programima preko raunalne mree. Jedan program se uobiajeno naziva klijent, a drugi server. Primjer klijent-server komunikacije je Web browser kao klijent i Web server kao server. Veina mrenih aplikacija se moe podijeliti u dvije skupine: klijent i server.
klijent
komunikacijski link
server
Klijenti (klijents) uobiajeno komuniciraju sa jednim serverom u isto vrijeme, premda koristimo Web browser kao primjer, moemo komunicirati sa vie razliitih servera. Sa serverske strane, sasvim je uobiajeno da server u jednom trenutku ima uspostavljenu vezu (komunicira) sa vie razliitih klijenata.
klijent
...
klijent server
...
klijent
735/1275
Klijent server mogu se nalaziti u istoj lokalnoj mrei, na primjer Ethernet, ali takoer mogu biti i u razliitim mreama, to je u veini situacija sluaj, povezanim preko wide area network-a (WAN) koristei routere. Slike prikazuju klijent server vezu unutar iste mree i klijent server vezu kada se nalaze u razliitim mreama.
user process
Web klijent
application protocol
Web server
application layer
TCP
TCP
transport layer
IP protocol
IP
IP
network layer
Ethernet driver
Ethernet protocol
Ethernet driver
datalink layer
Ethernet
Bitno je napomenuti, iako izgleda da klijent i server komuniciraju koristei application layer, transport layer komunicira koristei TCP itd., da u stvarnosti to nije tako, ve se sve sputa na najniu razinu, a zatim se vri prijenos podataka od najnie razine do odgovarajue razine.
736/1275
klijent application
server application
LAN
LAN
router
router
737/1275
Minimalan broj potvrdnih paketa za ovu izmjenu je tri i zbog toga se uspostava TCP veze i naziva three way handshake. Slika 2.1. pokazuje opisan postupak.
klijent
socket connect (blocks) (active open)
SYN J
server
socket, bind,listen accept (blocks) SYN K, ack J+1
connect returns
ack K+1
Raskidanje veze
Dok je za uspostavljanje veze bila potrebna tri segmenta, za raskid veze su potrebna etiri segmenta. 1. Jedna aplikacija prva zove close, kae se da je kraj izvoenja active close. Ta strana alje FIN segment, to znai da je zavreno slanje podataka. 2. Druga strana koja primi FIN izvodi passive close. Primljeni FIN je potvren od TCP-a. Primitak FIN-a se takoer prosljeuje aplikaciji kao end-of-file (EOF) (nakon svakog podatka koji je moda ve u redu da ju primi aplikacija), budui da primitak FIN-a znai da aplikacija nee primit nit jedan suvian podatak preko veze. 3. Malo kasnije aplikacija koja primi end-of-file e zatvoriti (close) socket. To uzrokuje da TCP poalje FIN. 4. TCP na sistemu koji je primio taj konani FIN (kraj sa active close) potvruje FIN.
738/1275
klijent
close (active close)
FIN M
server
(passive close) read return 0
ack M + 1 FIN N
close
ack N+1
Socketi
Socket se definira kao jedan kraj komunikacijskog kanala. Za komunikaciju para procesa potreban je par socketa za svaki proces po jedan. Socket je odreen IP adresom i brojem port-a. Uglavnom socketi se koriste u klijent-server arhitekturi. Server eka zahtjeve klijenata tako da "slua" na odreenom portu socketa. Serveri obino implementiraju specifine servise na odreenom portu(telnet-23, ftp21, http-80). Svi brojevi portova ispod 1024 su uglavnom koriteni od strane poznatih aplikacija. Kad se klijent spoji na socket dodjeljuje mu se broj porta koji je vei od 1024 npr 1625. Kad se jo jedan klijent spoji na server aplikaciju njemu se dodjeljuje broj porta vei od 1024, ali razliit od 1625. Na taj nain uvijek imamo jedinstveni par socketa za svaki par klijent-server. Dvije vrste socketa su najkoritenije: stream sockets datagram sockets
Stream socketi su pouzdani dvosmjerni komunikacijski kanal. Sve to se upisuje s jedne strane socketa izlazi na drugoj strani u istom obliku. Ako upiete string '1,2,3' na izlazu
739/1275
ete proitati '1,2,3'. Takoer sve mogue greke prilikom transporta paketa su ispravljene tako da korisnik ima dojam da je socket "error free". Stream sockete koriste aplikacije poput telnet-a i web browsera koji koriste http protokol. Datagram sockets se jo nazivaju i connectionless. Nisu toliko pouzdani jer datagram koji je poslan moe i ne mora stii, ne moraju stii istim redoslijedom kojim su poslani ali ako stigne biti e ispravan. Datagram socketi koriste IP ali ne i TCP. Nazivaju se connectionless jer se ne mora drugi kraj drati otvoren cijelo vrijeme nego se samo alju paketi sa odredinom adresom. Koriste ga aplikacije poput tftp i bootp. Internet programi kao to su Telnet, rlogin, FTP, talk, i World Wide Web koriste socket za komunikaciju. Na primjer, moemo doi do www stranice preko Web servera koristei socket za mrenu komunikaciju. Da bi uspostavili vezu sa www serverom koristei Telnet program, neka je stranica na koju se spajamo www.imestranice.com, tada emo prilikom spajanja navesti i port koji oznaava da se spajamo na www server, a on je 80. Port 80 je standardni port dodijenjen od IANA-e na kojem 'slua' (listen) web server. Primjer: Dohvaanje HTML-sourca pomu Telnet programa
% telnet www.imestranice.com 80 Trying 206.168.99.1... Connected to oznaka.imestranice.com (206.168.99.1) Escape character is '^]'. GET / <html> <head> <meta http-equiv = Content Type content = text/html; charset iso 8859 1> . . .
740/1275
BSD socketi
Generalno gledajui, svaki operacijski sustav mora definirati odgovarajui Application Programming Interface (API) izmeu korisnikog programa i mrenog kda. Linux mreni API je baziran na BSD socketima. Predstavljeni su u Berkley UNIX 4.1cBSD i dostupni su u gotovo svakom operacijskom sustavu slinom Unixu. Socket je dvosmjerna komunikacijska jedinica koja moe biti koritena za komuniciranje sa drugim procesima na istom raunalu ili sa procesom pokrenutim na drugom raunalu. Internet programi kao Telnet, rlogin, talk ili World Wide Web koriste sockete. Socket je komunikacija izmeu tzv. ulaznih vrata i krajnje toke kanala koji povezuje dva procesa. Podaci se poalju na ulazna vrata i nakon nekog vremena pojave se na drugoj strani (izlazu). Komunikacijski procesi mogu biti na razliitim raunalima. Mreni kd Kernela prosljeuje podatke izmeu krajnjih toaka. Linux implementira BSD sockete kao datoteke koji pripadaju u sockfs special filesystem. Preciznije, za svaki novi BSD socket, Kernel kreira novi inode u sockfs filesistemu. Atributi BSD socketa su spremljeni u socket strukturi podataka koja je objekt ukljuen u polju u.socket_i sockfs inode-a.
Metode BSD socket objekta metoda release bind connect socketpair accept getname ioctl listen shutdown setsockopt getsockopt sendmsg recvmsg mmap sendpage opis zatvara socket dodjeljuje lokalnu adresu (ime) uspostavlja vezu (TCP) ili dodjeljuje remote adress (UDP) kreira par socketa za dvosmjernu razmjenu podataka eka zahtjev za spajanje vraa lokalnu adresu implementira ioctl()komande inicijalizira socket da prihvati zahtjev za spajanjem zatvara pola ili obje polovice full-duplex veze postavlja vrijednosti socket flagovima uzima vrijednosti socket flagova alje paket socketu prima podatak od socketa file memory-mapping (ne koriste mreni socketi) kopira podatke direktno iz/prema fajlu (sendfile() sistemski poziv)
741/1275
INET socketi
INET socketi su strukture podataka tipa struct sock. Svaki BSD socket koji pripada IPS mrenoj arhitekturi sadri adrese INET socketa u sk polju socket objekta. INET socketi su potrebni jer socket objekti (opisujui BSD sockete) ukljuuju samo polja koja su znaajna za sve mrene arhitekture. Ali, kernel mora takoer zapamtiti i nekoliko drugih informacija za svaki socket bilo koje mrene arhitekture. Na primjer, u svakom INET socketu, kernel zapisuje lokalne i udaljene IP adrese, lokalne i udaljene brojeve portova, relativni transportni protokol, podatke o primljenim paketima, podatke o paketima koji ekaju da budu poslani socketu, te nekoliko tablica metoda za slanje paketa do socketa. Ovi atributi su spremljeni, zajedno sa mnogim drugima, u INET socketima. INET socket objekt takoer definira neke metode specifine tipu transporta protokola (TCP ili UDP). Metode spremljene u strukturi podataka tipa proto:
metode INET socket objekta metoda close connect disconnect accept ioct1 init destroy shutdown setsockopt getsockopt sendmsg recvmsg bind backlog_rcv hash unhash get_port opis zatvara socket uspostavlja vezu ili dodjeljuje remote adress prekida uspostavljenu vezu eka zahtjev za spajanje implementira ioctl()komande INET socket objekt konstruktor INET socket objekt destruktor zatvara pola ili obje polovice full-duplex veze postavlja vrijednosti socket flagovima uzima vrijednosti socket flagova alje paket socketu prima podatak od socketa dodjeljuje lokalnu adresu (ime) funkcija pozvana kada prima paket doda INET socket per-protocol hash tablici makne INET socket iz per-protocol hash tablice dodjeljuje broj porta INET socketu
742/1275
sock objekt sadri otprilike 80 polja od kojih su mnoga pokazivai na druge objekte, tablice, metode ili druge strukture podataka.
Koncepti socketa
Kada kreiramo socket moramo definirati tri parametra: nain komuniciranja (communication style), namespace, i protokol.
Communication style
Nain komuniciranja kontrolira kako socket tretira poslane podatke i specificira broj komunikacijskih partnera. Kada su podaci poslani kroz socket, raspakirani su u dijelove nazvane paketima. Stil komuniciranja odreuje kako su ti paketi podrani i kako su adresirani od poiljaoca do primatelja. Connection style garantira isporuku svih paketa po redu kako su poslani. Ako su paketi izgubljeni ili je promijenjen redoslijed zbog problema na mrei, primatelj automatski zahtjeva njihovo ponovno slanje od poiljaoca. Connection-style socket je kao telefonski poziv: adresa poiljatelja i primatelja je fiksna na poetku komunikacije kada je veza uspostavljena. Datagram style ne garantira isporuku ili redoslijed dolaska paketa. Paketi mogu biti izgubljeni ili promijenjenog redoslijeda zbog problema na mrei. Svaki paket mora biti oznaen sa svojom destinacijom i nije zagarantirano da e biti isporuen. Sustav garantira samo najbolju volju, tako paketi mogu nestati ili stii u krivom redoslijedu u odnosu na to kako su poslani. Datagram-style sockets nain slanja je mogue usporediti sa slanjem pisma potom: poiljatelj specificira adresu primatelja za svaku individualnu poruku.
Namespace
Socket namespace odreuje kako su zapisane adrese socketa. Adresa socketa odreuje jedan kraj veze socketa. Na primjer, adrese socketa u local namespaceu su obina imena datoteka. U Internet namespaceu adresa socketa je sastavljena od Internet adrese (Internet
743/1275
Protocol adress ili IP address) raunala spojenog na mreu i broj porta. Broj porta raspoznaje viestruke sockete na istom raunalu.
Protokol
Protocol specificira kakvim socketom se podaci prenose. Neki protokoli su TCP/IP, primarni mreni protokol koriten kod Interneta; Apple Talk mreni protokol; UNIX lokalni komunikacijski protokol.
Socket buffer
Svaki pojedini paket poslan kroz mrenu jedinicu sastoji se od nekoliko dijelova. Svi slojevi mree, dodaju neke kontrolne informacije na osnovni payload, tj. podatak koji se prenosi putem mree. Format paketa se mijenja prolaskom kroz TCP/IP slojeve. Cijeli paket je napravljen u nekoliko dijelova koritenjem razliitih funkcija. Na primjer, UDP/TCP zaglavlje i IP zaglavlje su sastavljeni od funkcija zavisno transportnom i mrenom sloju IPS arhitekture, dok su zaglavlje i trailera, napisani odgovarajuom metodom specificiranom mrenom karticom. Mreni kd Linuxa sadri svaki paket u velikom memorijskom podruju nazvanom socket buffer. Svaki socket buffer je definiran sa strukturom podatka tipa sk_buff sadri, uz mnoge druge stvari, pokazivae na slijedee strukture podataka: socket buffer payload podaci korisnika (unutar socket buffera) the data link trailer (unutar socket buffera) INET socketi (sock object) deskriptor zaglavlja transportnog sloja deskriptor zaglavlja mrenog sloja deskriptor data link layer zaglavlja the destination cache entry (dest_entry object) koja
744/1275
Struktura podataka sk_buff sadri identifikator mrenog protokola koriten za slanje podataka (checksum field) i vrijeme dolaska primljenih paketa. Kernel izbjegava kopiranje podataka ve jednostavno proslijeuje sk_buff descriptor pointer svakom mrenom sloju. Na primjer, kada priprema paket za slanje, transportni sloj poinje kopirati payload iz korisnikog buffera na viu poziciju socket buffera; tada transportni sloj dodaje svoje TCP ili UDP zaglavlje prije payloada. Nakon toga, kontrola se predaje mrenom sloju, koji prima socket buffer descriptor i dodaje IP zaglavlje prije transportnog zaglavlja. Konano, data link sloj dodaje svoje zaglavlje i trailer, ime pripremi paket za slanje.
Serveri
ivotni ciklus servera ovisi o kreiranju connection-style socketa, dodjelivi mu adresu na njegov socket, postavljajui poziv na listen koji omoguuje veze do socketa, postavljajui pozive na accept dolazeim vezama, i na kraju zatvarajui socket. Podaci nisu itani i pisani direktno preko server socketa. Umjesto toga program svaki puta prima novu vezu; Linux kreira zasebne sockete za koritenje prijenosa podataka preko te veze. U ovom odlomku emo objasniti bind, listen i accept. Adresa mora biti dodjeljena socketu servera koristei bind tako da se klijent moe spojiti na taj socket. Prvi argument bind-a je socket file descriptor. Drugi argument je pokaziva na adresnu strukturu socketa. Trei argument je duina adresne strukture, u byte-ovima. Kada je adresa dodijeljena connection-style socketu, potrebno je pozvati listen ime e pokazati da je server. Prvi argument listen metode je socket file descriptor. Drugi argument odreuje koliko je prihvaenih veza u redu (queue). Ako je red pun, dodatna spajanje biti e odbijena. To ne ograniava ukupan broj veza koje server moe obraditi. Ograniava jedino broj klijenata koji se pokuavaju spojiti a nisu jo bili prihvaeni. Server prihvaa zahtjev za spajanjem od klijenta pokretanjem accept-a. Prvi argument accept-a je socket file descriptor. Drugi argument pokazuje na adresnu strukturu socketa koja je napunjena klijentovim adresama socketa. Trei argument je duina adresne strukture socketa u byte-ovima. Server moe koristiti klijentovu adresu da utvrdi hoe li stvarno komunicirati sa klijentom. Poziv za prihvaanje kreira novi socket za komunikaciju sa klijentom i vraa odgovarajui file descriptor. Originalni server socket nastavlja primati nove klijentove veze. Za itanje podataka iz socketa bez da ga se ukloni iz ulaznog reda,
745/1275
koristimo recv. Koristimo iste argumente kao read, plus dodatni FLAGS argument. Flag MSG_PEEK omoguava itanje podataka ali ne i micanje iz ulaznog reda.
Lokalni socketi
Proces spajanja socketa na istom raunalu moe koristiti lokalni namespace prezentiran kao sinonim PF_LOCAL i PF_UNIX. Zovu se lokalni socketi ili UNIX-domain socketi. Njihove socket adrese, specificirane po imenima datoteka, su koritene samo kod kreiranja veza. Socketima je ime specificirano u struct sockaddr_un. Moramo postaviti sun_family polje na AF_LOCAL, ime odreujemo da se radi o lokalnom namespaceu. Polje sun_path odreuje ime datoteke koja e se koristiti i moe biti, najvie, 108 byteova dugako. Moe biti koriteno bilo koje ime, a proces mora imati prava pisanja u direktoriju jer trebamo dodavati datoteke u direktorij. Da bi se spojili na socket, proces mora imati prava itanja iz datoteke. Makar razliita raunala mogu dijeliti iste file-sisteme, samo procesi pokrenuti na istom raunalu mogu komunicirati sa lokalnim namespace socketima. Jedini dozvoljeni protokol za lokalni namespace je 0. Zbog toga to postoji u filesistemu, lokalni socket se moe izlistati kao i datoteka. Na primjer:
$ls l /tmp/socket srwxrwxx 1 user group 0 Nov 13 18:18 /tmp/socket
746/1275
/* /* /* /* /* /* /*
lenght of structure (16) */ AF_INET */ 16-bit TCP or UDP port number */ network byte ordered */ 32-bit IPv4 adress */ network byte ordered */ unused */
Socket adresna struktura se moe prosljeivati od procesa prema kernelu, i obratno, od kernela prema procesu. etiri socket funkcije prosljeuju socket adresnu strukturu od procesa prema kernelu, a to su: bind, connect, sendto, i sendmsg. Pet funkcija kojima kernel prosljeuje socket adresnu strukturu su: accept, recvfrom, recvmsg, getpeername, i
getsockname.
Socket adresna struktura se uvijek alje po referenci, kada je prosljeujemo kao argument bilo koje socket funkcije. Kako bi se ostvarila generika socket adresna struktura, neovisna o protokolu bilo je potrebno osmisliti kako e se kroz jednu funkciju slati strukture razliitih protokola. U ANSI C-u rjeenje bi bilo vrlo jednostavno koritenjem void * (void pointera), koji je generiki tip pointera. Ali kako su socket funkcije raene prije nego to je doneen ANSI C, bilo je potrebno pronai nekakvo rjeenje, koje je izabrano 1982. godine kao generika socket adresna struktura i koja je definirana u <sys/socket.h> header-u a izgled strukture je slijedei:
struct sockaddr { uint8_t sa_family_t char };
747/1275
Socket funkcije su definirane tako da uzimaju pointer na generiku strukturu, kao to je prikazano u ANSI C prototipu funkcije za bind funkciju:
Ovo dreuje da za svaki poziv ove funkcije mora se cast-ati pointer socket adresne strukture specifinog protokola na pointer generike socket adresne strukture. Na primjer,
int sockfd; struct sockaddr_in serv; ... bind (sockfd, (struct sockaddr *) &serv, sizeof(serv));
Ako izostavimo cast (struct sockaddr *) compiler generira upozorenje. Slika prikazuje izgled struktura sockaddr_in (IPv4), sockaddr_un (Unix), i sockaddr_dl (Datalink).
IPv4 sockaddr_in() lenght
AF INET
variable lenght
748/1275
#include <sys/socket.h> int socket (int family, int type, int protocol); Returns: nonnegative descriptor if OK, -1 on error
- odreuje vrstu protokola - tip podataka koji se prenose socket-om (tip socket-a) - protokol
749/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb AF_ROUTE AF_KEY Routing sockets Key sockets
Za protocol argument koristimo nulu, osim ako ne koristimo raw socket. Nisu podrane sve kombinacije parametara. Tablica prikazuje pregled kombinacija koje su podrane.
AF_ROUTE
AF_KEY
Yes
Yes
AF_xxx vs. PF_xxx AF_ prefiks dolazi od address family, a PF_ prefiks dolazi od protocol family. U povijesti je bila intencija da jedna porodica protokola moe podravati vie adresnih porodica i za to je koritena PF_ vrijednost za kreiranje socket-a, dok je AF_ vrijednost koritena u socket address strukturama. Trenutno je PF_ vrijednost postavljena na AF_, ali nema garancije da se to u budunosti nee promijeniti.
750/1275
connect funkcija connect funkciju poziva TCP klijent da bi uspostavio vezu sa TCP serverom.
#include <sys/socket.h> int connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); Returns: 0 if OK, -1 on error
sockfd je socket deskriptor koji nam vrati funkcija socket. Drugi i trei argument je pointer na socket address strukturu i veliina te strukture. socket address mora sadravati IP adresu i broj porta servera. Klijent ne mora zvati bind funkciju prije connect funkcije. Kernel e izabrati oboje, polazan port i izvor IP adrese ako je to potrebno. U sluaju TCP socket-a, veza se inicijalizira u tri sinhronizacijska koraka (three way handshake). Ako se veza uspostavi funkcija vraa nulu, inae ako se dogodi error ili se veza ne moe uspostaviti funkcija vraa -1. bind funkcija
bind funkcija oznaava socket sa lokalnom adresom protokola.
#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
Returns: 0 if OK, -1 on error
myaddr argument je pointer na socket adresnu strukturu kojom se odreuju osnovne informacije pojedinog protokola, a trei argument je veliina adresne strukture.
bind funkcija je zapravo dodjeljivanje adrese serveru. Adresa koja se postavi ovom
funkcijom je ujedno i adresa na koju se klijenti spajaju kada ele uspostaviti vezu sa serverom.
751/1275
listen funkcija
listen funkciju zove jedino server i izvrava dvije akcije:
1. Kada je socket kreiran pomou socket funkcije tada je predodreen da bude aktivan socket, to je, klijentov socket e pozvati connect. listen funkcija pretvara nepovezan socket u pasivan socket, naznauje da kernel mora oslukivati ima li zahtjeva za uspostavljanjem veze i ako ima da ih povee na taj socket. U TCP terminima to znai prelazak socket-a iz stanja CLOSED u stanje LISTEN. 2. Drugi argument funkcije odreuje maksimalan broj veza koje kernel treba poredati za uspostavljanje vez za taj socket.
#include <sys/socket.h>
listen funkcije se uobiejeno zove nakon oba poziva socket i bind funkcija i mora biti
pozvana prije poziva accept funkcije. Kernel mora podrati dva reda: 1. incomplete connection queue, koji sadrava ulaz za svaki SYN koji dolazi od klijenta za koje server eka da se kompletira TCP three way handshake. Takvi socket-i su u SYN_RCVD stanju. 2. completed connection queue, koji sadrava ulaz za svakogklijenta sa kim je TCP three way handshake zavren. Ovakvi socket-i su ESTABLISHED stanju.
752/1275
server
accept
TCP
3WHS complete
arriving SYN
klijent
connect called
SYN J
server
RTT
RTT
connect returns
ack K+1 entry moved from incomplete queue to completed queue, accept can return
753/1275
Koju vrijednost izabrati za backlog? Kod odabira vrijednost backlog-a najbolje bi bilo provjeriti posljednju dokumentaciju pojedinog operacijskog sustava. U tablici nalaze se trenutne vrijednost za backlog.
Maximum actual number of queued connections Dunix AIX backlog 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 2 4 5 7 8 10 11 13 14 16 17 19 20 22 4.2, Linux 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 BSD/OS 3.0 4.0, 2.0.27, HP-UX 10.30 1 1 3 4 6 7 9 10 12 13 15 16 18 18 19 SunOS 4.1.4 1 2 4 5 7 8 8 8 8 8 8 8 8 8 8 Solaris 2.5.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Solaris 2.6 1 3 4 6 7 9 10 12 13 15 16 18 19 21 22
Uware 2.1.2
connection queue. Ako je red zavrenih veza prazan, proces prelazi u sleep stanje (blocking socket). Kada server prihvati novu vezu, kreira se i novi socket preko kojeg se nastavlja komunikacija izmeu servera i klijent-a.
#include <sys/socket.h>
754/1275
close funkcija
close funkcija se koristi da bi se zatvorila i terminirala TCP veza.
Podrazumijevana akcija close funkcije je da oznai socket kao zatvoren za dajlnju komunikaciju. Socket deskriptor vie nije valjan i ne moe se koristiti kao argument funkcija
read i write. Jedina nezgodna stvar kada koristimo close funkciju je to e naa TCP veza i
dalje pokuavati (neko odreeno vrijeme) poslati odnosno primiti podatke. close funkcija se ponaa kao dekrementirajua, dok se funkcija accept ponaa kao inkrementirajua funkcija. Ako drugoj strani elimo odmah poslati FIN signal, kako bi joj dali do znanja da se veza raskida tada emo koristiti funkciju shutdown.
#include <sys/socket.h>
755/1275
int main (void) { int sockfd; struct sockaddr_in servaddr; char buffer[64] = {0}; /* kreiranje klijent-ovog socket-a za komunikaciju */ sockfd = socket (PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("socket() error!\n"); return 1; } /* dogovorno se struktura inicijalizira na nulu */ memset(&servaddr, 0, sizeof(servaddr)); /* osnovne informacije servera */ servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8000); servaddr.sin_addr.s_addr = INADDR_ANY;
756/1275
/* spajanje klijent-a sa serverom, i to na onaj koji je odreen adresnom strukturom */ if ( connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1 ) { printf("connect() error!\n"); return 2; } /* primamo podatke koje nam je server poslao */ recv(sockfd, buffer, sizeof(buffer), 0); puts(buffer); /* zatvaramo socket, kraj komunikacije */ close(sockfd); return 0; }
int main (void) { int sockfd, klijent; struct sockaddr_in servaddr, cliaddr; char buffer[64] = {0}; char * begin; int addr_sz; time_t tmp_time; /* kreiranje serverovog socket-a */ sockfd = socket (PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("socket() error!\n"); return 1; } memset(&servaddr, 0, sizeof(servaddr)); /* informacije servera */ servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8000); servaddr.sin_addr.s_addr = INADDR_ANY; /* oznaavanje da je ovo server */ if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) { printf("bind() error!\n"); return 2; } /* oslukivanje konekcije */ if (listen(sockfd, 2) == -1) { printf("listen() error!\n"); return 3; } /* prihvaanje konekcije koja eli uspostaviti vezu */ addr_sz = sizeof(cliaddr); if ( (klijent = accept(sockfd, (struct sockaddr *) &cliaddr, &addr_sz)) == -1) { printf("accept() error!\n"); return 4; } /* dohvaanje trenutnog vremena */
757/1275
Primjeri socket-server.c i klijent-server.c su u potpunosti pojednostavljeni kako bi to bolje pokazali najjednostavnije spajanje klijent-a sa serverom. U stvarnosti serverski program je onaj koji radi bez prestanka i tako omoguuje klijent-ima da se spoje u bilo koje vrijeme. Prvo se pokree serverov program koji kreira socket i zatim eka na klijent-a sa funkcijom
accept. Kada se klijent spoji na serverov socket, accept funkcija vrati novi socket preko
kojega e se vriti komunikacija. Nakon toga server klijent-u alje svoje trenutno vrijeme i zavrava sa radom. Klijent dobiva informaciju od servera i takoer zavrava sa radom.
Konkurentni server
Ako elimo da na server program bude to sliniji pravom serveru tada bi accept funkciju stavili u beskonanu while petlju zajedno sa send funkcijom koja alje klijent-u vrijeme servera. Sada je sasvim oit jedan veliki problem, a to je to ako imamo puno klijenata koje se ele spojiti u isto vrijeme? Neki od klijenata bi bili prisiljeni da ekaju one koji imaju uspostavljenu vezu sa serverom. Kako nitko ne voli ekati, a pogotovo klijent, postoji rjeenje ovoga problema, a to je konkurentni server, server koji moe u jednom trenutku izmjenjivati podatke sa vie klijenata. Konkurentan server radi na nain da svaku komunikaciju sa pojedinim klijentom vri u zasebnom thread-u. Pomou thread-ovo dobivamo paralelnu komunikaciju servera sa klijentom. Jedino to treba paziti kod multithread aplikacija je sinhronizacija pristupa dijeljenim resursima i da neke funkcije ne garantiraju ispravan rad u thread funkciji.
758/1275
Primjer prikazuje kako server komunicira sa vie klijenata u isto vrijeme pomou thread-ova. server-thread.c
#include #include #include #include #include #include #include #include <stdio.h> <sys/types.h> <sys/socket.h> <netinet/in.h> <unistd.h> <string.h> <time.h> <pthread.h>
/* thread definicije */
/* thread funkcija, za sve klijente jednaka */ void * ThreadFun (void *arg) { /* klijent-ov socket */ int clifd = *((int *) arg); time_t tmp_time; char buffer[64] = {0}; char * begin; int i; /* oslobaamo zauzete resurse */ free(arg); /* dohvaanje trenutnog vremena, (ctime() ne garantira ispravan rad) */ tmp_time = time (NULL); begin = ctime(&tmp_time); strcpy(buffer, begin); /* aljemo trenutno vrijeme klijent-u */ send(clifd, buffer, strlen(buffer), 0); /* svaki thread optereujemo dugotrajnom operacijom */ for (i = 0; i < 1000000; i++) printf("Ovo je thread %d\n", i); /* zatvaramo komunikacijski socket */ close(clifd); return NULL; } int main (void) { int sockfd; struct sockaddr_in servaddr, cliaddr; int addr_sz; pthread_t tid; sockfd = socket (PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("socket() error!\n"); return 1; } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(7000); servaddr.sin_addr.s_addr = INADDR_ANY; if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) { printf("bind() error!\n"); return 2; } if (listen(sockfd, 10) == -1) { printf("listen() error!\n"); return 3;
759/1275
addr_sz = sizeof(cliaddr); printf("Server ceka na klijent-a!\n"); while (1) { /* za svaku novu konekciju dinamiki alociramo resurse */ int *clifd = (int *) malloc (sizeof(int)); if ( (*clifd = accept(sockfd, (struct sockaddr *) &cliaddr, &addr_sz)) == -1) { printf("accept() error!\n"); return 4; } /* za svaku prihvaenu vezu kreiramo novi thread */ pthread_create(&tid, NULL, ThreadFun, (void *) clifd); } /* kraj rada servera */ close(sockfd); return 0; }
Klijent-ov kod se nije mijenjao, on se i dalje spaja na server kao i prije promjene, samo sada se ne moe dogoditi zastoj, jer server svaku novu konekciju pokree u zasebnom thread-u. Sad server moe biti samo zauzet ako se dosegne maksimalan broj thread-ova koje server moe opsluivati. Kod koritenja thread-ova imamo mali problem, a to je, ako server ostvari veliki broj konekcija, odnosno, u nekom trenutku imamo puno klijenata koji su trenutno spojeni na na server i ako iz nekog razloga se na server srui, klijenti koji se obrauju u zasebrni thredovima, oni postaju zombiji, ostaju bez onoga tko ih je stvorio. Da bi se izbjegla takva situacija koriste se procesi. Sada emo za svaku uspostavljenu vezu umjesto kreiranja thread-a kreirati novi proces. Jedina mana ovakvom pristupu je ponesto sporiji odziv servera prema klijentu i zauzimanje neto vie osnovnih resursa. Za kreiranje procesa pod UNIX-om koristi se funkcija fork().
760/1275
Ako do sada niste vidjeli ovu funkciju, najtei dio za shvatiti je da se fork funkcija poziva jednom, a da njezin poziv izaziva vrijednosz dva puta. Vraa jednom rezultat pozivajuem procesu (roditelju) i to ID novonastalog procesa, i jednom vraa vrijednost novonastalom procesu (djetetu) i to vrijednost nula. Vraena vrijednost nam ujedno slui da bi znali da li se na program trenutno izvrava kao roditelj ili kao dijete. Ono to je najznaajnije kada koristimo fork funkciju je to da svi deskriptori otvoreni prije samog poziva fork funkcije su dijeljeni izmeu roditelja i dijeteta. Dva tipina naina koritenja fork funkcije: 1. Proces radi vlastitu kopiju tako da jedna kopija moe upravljati osnovnim operacijama, dok druga kopija moe sluit kao pomoni task za obavljanje nekih drugih poslova. 2. Proces eli izvravati drugi program. Jedini nain za kreiranje novog procesa je pozivanjem fork funkcije. Proces prvo poziva fork da bi kreirao vlastitu kopiju, a tada jedna od kopija (najee proces djeteta) poziva exec da bi zamijenio sebe sa novim programom. To je tipino za shell programe.
#include <unistd.h>
int execl (const char *pathname, const char *arg0, ... /* (char *) 0 */ ); int execv (const char *pathname, char *const argv[]); int execle (const char *pathname, const char *arg0, ... /* (char *) 0, char *const envp[] */ ); int execve (const char *pathname, char *const arv[], char *const envp[]); int execlp (const char *filename, const char *arg0, ... /* (char *) 0*/ ); int execvp (const char *filename, const char argv[]);
761/1275
Kako tema ovoga seminara nije interprocesna komunikacija, ve TCP/IP API i socket-i, tako da se neemo uputatit u detaljna razmatranja ovih funkcija. Za detalje pogledajte neku od odgovarajuih referenci ili man stranice. Jedina bitna napomena, i to vrlo vana, je to da se esto u ponekim knjigama spominje da upravo ovih est funkcija slue za kreiranje novih procesa ili pokretanje novih programa, to je donekle tono, ali moe biti vrlo krivo shvaeno. Naime, ako ne koristimo fork funkciju, a koristimo jednu od navedenih exec funkcija tada moramo biti svjesni da smo kreirali novi proces unutar adresnog prostora procesa koji pokuava kreirati novi proces. Za kreiranje novog procesa u zasebnom adresnom prostoru, moramo koristiti prvo fork funkciju, a tek tada jednu od navedenih exec funkcija. server-fork.c
#include #include #include #include #include #include #include #include #include <stdio.h> <sys/types.h> <sys/socket.h> <netinet/in.h> <unistd.h> <string.h> <time.h> <signal.h> <sys/wait.h>
/* Funkcija koja hvata signal od childa i poziva waitpid da se ocisti memorija * od child procesa */ void sigchld_handler(int signum) { int status; waitpid(WAIT_ANY, &status, WNOHANG); printf("PARENT: Child exited with signal %d and status %d\n", signum, status); } int main(void) { int sockfd, client; struct sockaddr_in servaddr, cliaddr; char buffer[64] = {0}; char * begin; int address_size; time_t tmp_time; pid_t childpid; /* variable to store the child's pid */ /* kreiranje serverovog socket-a */ sockfd = socket (PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("socket() error!\n"); return 1; } memset(&servaddr, 0, sizeof(servaddr)); /* informacije servera */ servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8000); servaddr.sin_addr.s_addr = INADDR_ANY; /* oznavanje da je ovo server */ if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1)
762/1275
/* prihvaanje konekcije koja zeli uspostaviti vezu */ address_size = sizeof(cliaddr); while(1) { if ( (client = accept(sockfd, (struct sockaddr *) &cliaddr, &address_size)) == -1) { printf("accept() error!\n"); return 4; } /* Forkanje osnovnog procesa */ if ((childpid = fork())== -1) { perror("fork"); /* display error message */ exit(0); } /* Obrada unutar child procesa */ if (childpid == 0) { /* dohvaanje trenutnog vremena */ tmp_time = time (NULL); begin = ctime(&tmp_time); strcpy(buffer, begin); /* posalji client-u vrijeme spajanja */ send(client, buffer, strlen(buffer), 0); sleep(10); strcpy(buffer, "Zdravo!!!\n"); send(client, buffer, strlen(buffer), 0); /* zatvaranje privremenog komunikacijskog socket-a */ shutdown(client,SHUT_RDWR); _exit(0); } /* Serverski proces */ else { /* Hvatanje signala od Childa i njegovog exit statusa */ signal(SIGCHLD, sigchld_handler); printf("PARENT: Childpid is %d\n", childpid); } } /* zatvaranje serverovog socket-a */ close(sockfd); return 0; }
763/1275
"lutajui" thread-ovi mogu nakoditi drugim thread-ovima unutar istog procesa zato to thred-ovi dijele isti virtualni memorijski prostor i druge resurse. Na primjer, jedan thread moe pisati po neautoriziranom dijelu memorije, koja je moda dostupna u drugom thread-u unutar istog procesa. Sa druge strane "lutajui" procesi to ne mogu zato to svaki proces ima vlastitu kopiju memorijskog prostora.
Kopiranje memorije za novi proces je skuplja operacija, od operacije kreiranja threada, zato to se kod kreiranja novog thread-a kopira manji broj potrebnih informacija nego sto je to sluaj kod kreiranja novog procesa.
Thread-ovi bi se trebali koristiti za programe kojima je potrebniji finiji paralelizam, dok bi se procesi trebali koristiti tamo gdje je potrebniji grublji paralelizam.
Dijeljenje podataka izmeu thread-ova je jednostavnije zato to thread-ovi koriste istu memoriju. Jedinu brigu koju moramo paziti kada radimo sa thread-ovima je utrka za resursima. Dijeljenje memorije izmeu procesa je poneto sloenije, ali zato kod njih nema toliko problema oko dijeljenih resursa i puno su rijei bugovi koji se pojavljuju kod konkuretnosti.
764/1275
//
765/1275
strcat(buff, "Date: "); tmp_time = time (NULL); strcat(buff, ctime(&tmp_time)); strcat(buff, "Server: "); strcat(buff, SRV_NAME); strcat(buff, "\n"); strcat(buff, param2); strcat(buff, "Content-Type: text/html; Charset: UTF-8\n\n"); } /* Obrada HTTP zahtjeva i vracanje odgovora klijentu */ int obrada(int client) { char param[BUF_SIZE/4] = {0}; /* Buffer za parametre HTTP protokola */ char html[BUF_SIZE] = {0}; /* Buffer za isporuku HTML stranice */ char buf1[BUF_SIZE/4] = {0}; /* Privremeni buffer za prihvacanje zahtjeva */ char tmpbuf[BUF_SIZE] = {0}; /* Privremeni buffer za potrebe obrade zahtjeva */ char fpath[128] = {0}; /* relativni path i ime datoteke koja se servira */ char *cmd; /* Parametri zahtjeva koji se ovdje samo ispisuju na strani servera, ali inace sluze HTTP protokolu */ FILE *datoteka; /* Dohvacanje komande od klijenta */ do { recv(client, tmpbuf, sizeof(tmpbuf), 0); if(tmpbuf[0]=='\r') break; strcat(buf1,tmpbuf); } while(tmpbuf[strlen(tmpbuf)-3]!='\n'); /* ako u prvoj liniji nije GET onda se vraca bad request */ if (strncmp(buf1, "GET /", 5)) { memset(param, 0, sizeof(param)); parametri_odgovor(400, param); strcat(html, "12a\n"); strcat(html, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"); strcat(html, "<HTML><HEAD>\n"); strcat(html, "<TITLE>400 Bad Request</TITLE>\n"); strcat(html, "</HEAD>\n<BODY>\n"); strcat(html, "<H1>Bad Request</H1>\n"); strcat(html, "Your browser sent a request that this server could not understand.\n<P>"); strcat(html, "Invalid URI in request "); strcat(html, buf1); strcat(html, "</P>\n<HR>\n<ADDRESS>"); strcat(html, SRV_NAME); strcat(html, " at localhost Port 8000</ADDRESS>\n"); strcat(html, "</BODY></HTML>\n"); strcat(html, "\n0\n"); send(client, param, sizeof(param), 0); send(client, html, sizeof(html), 0); shutdown(client,SHUT_RDWR); return 0; } /* parsiranje komandi koje su dobivene */ strcpy(tmpbuf, buf1); cmd = strtok(tmpbuf, "\n"); /* Uzimanje imena filea iz trazenog zahtjeva * ako je filename / onda se postavlja na index.html */ sscanf(strstr(cmd, "/"), "%s", &tmpbuf); if (strlen(tmpbuf)==1) strcpy(tmpbuf, "/index.html"); strcpy(fpath, "htdocs"); strcat(fpath, tmpbuf); /* nastavak parsiranja s time da se parametri klijenta u ovoj * verziji ne uzimaju u obzir vec se samo ispisuju na strani * servera na stdout */ while(cmd = strtok(NULL,"\n")) { printf("%i: %s\n", strcmp(cmd,"\r"), cmd); }
766/1275
/* Otvaranje trazene datoteke, ili vracanje greske ako trazena * datoteka ne postoji */ if((datoteka=fopen(fpath, "r"))==NULL) { memset(param, 0, sizeof(param)); parametri_odgovor(404, param); strcat(html, "10a\n"); strcat(html, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"); strcat(html, "<HTML><HEAD>\n"); strcat(html, "<TITLE>404 Not Found</TITLE>\n"); strcat(html, "</HEAD>\n<BODY>\n"); strcat(html, "<H1>Not Found</H1>\n"); strcat(html, "<P>The requested URL "); strcat(html, tmpbuf); strcat(html, " was not found on this server."); strcat(html, "</P>\n<HR>\n<ADDRESS>"); strcat(html, SRV_NAME); strcat(html, " at localhost Port 8000</ADDRESS>\n"); strcat(html, "</BODY></HTML>\n"); strcat(html, "\n0\n"); } else { memset(param, 0, sizeof(param)); parametri_odgovor(200, param); /* Citanje iz trazene datoteke i slanje klijentu */ while(!feof(datoteka)) { memset(tmpbuf, 0, sizeof(buf1)); fgets(tmpbuf, BUF_SIZE, datoteka); strcat(html, tmpbuf); /* zadnju liniju dva puta ispisuje!!! */ } fclose(datoteka); } /* slanje HTTP komandi klijentu */ send(client, param, strlen(param), 0); send(client, html, strlen(html), 0); /* zatvaranje privremenog komunikacijskog socket-a */ shutdown(client,SHUT_RDWR); /* close(client); */ return 0; } int main (void) { int sockfd, client; struct sockaddr_in servaddr, cliaddr; char * begin; int address_size; pid_t childpid; /* variable to store the child's pid */ /* kreiranje serverovog socket-a */ sockfd = socket (PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("socket() error!\n"); return 1; } memset(&servaddr, 0, sizeof(servaddr)); /* informacije servera */ servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8000); servaddr.sin_addr.s_addr = INADDR_ANY; /* oznavanje da je ovo server */ if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) { printf("bind() error!\n");
767/1275
/* prihvaanje konekcije koja eli uspostaviti vezu */ address_size = sizeof(cliaddr); while(1) { if ( (client = accept(sockfd, (struct sockaddr *) &cliaddr, &address_size)) == -1) { printf("accept() error!\n"); return 4; } if ((childpid = fork())== -1) { perror("fork"); /* display error message */ exit(0); } if (childpid == 0) { /* Obrada kompletnog sessiona u posebnoj funkciji */ obrada(client); _exit(0); } else { /* serverski proces */ printf("Childpid is %d\n", childpid); /* Hvatanje signala od Childa i njegovog exit statusa */ signal(SIGCHLD, sigchld_handler); } } /* zatvaranje serverovog socket-a */ close(sockfd); return 0; }
768/1275
int main(int argc, char *argv[]) { struct sockaddr_in their_addr; struct sockaddr_in my_addr; struct hostent *he; int sockfd; int addr_len; char data[32]={0}; int nRet=0; if (argc != 3) { printf("usage: application celsius hostname\n"); return EXIT_FAILURE; } sprintf(data, "%s", argv[1]); he = gethostbyname(argv[2]); if (he == NULL) { printf("Error in gethostbyname\n"); return EXIT_FAILURE; } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { printf("Error Creating Socket\n"); return EXIT_FAILURE; } their_addr.sin_family = AF_INET; their_addr.sin_addr = *((struct in_addr *)he->h_addr); their_addr.sin_port = htons(1092);
if (sendto(sockfd, data, strlen(data), 0, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { printf("Error in sendto\n"); return EXIT_FAILURE; }
memset(data, 0, sizeof data); addr_len = sizeof(struct sockaddr); if (recvfrom(sockfd, data, sizeof data, 0, (struct sockaddr *)&their_addr, &addr_len) == -1) {
769/1275
data);
Server:
/* uss.c - UNIX UDP Server Code <stdio.h> <stdlib.h> <signal.h> <string.h> <sys/types.h> <sys/time.h> <sys/select.h> <sys/socket.h> <netinet/in.h> */
void inthandler(int Sig) { done = 1; } int CheckForData(int sockfd) { struct timeval tv; fd_set read_fd; tv.tv_sec=0; tv.tv_usec=0; FD_ZERO(&read_fd); FD_SET(sockfd, &read_fd); if(select(sockfd+1, &read_fd,NULL, NULL, &tv)== -1) { return 0; } if(FD_ISSET(sockfd, &read_fd)) { return 1; } return 0; }
int main(int argc, char **argv) { int sock; struct sockaddr_in my_addr; struct sockaddr_in their_addr; int address_length; char data[32]= {0}; int celc=0; int farh=0;
770/1275
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { printf("Error Creating Socket\n"); return EXIT_FAILURE; }
if (bind(sock, (struct sockaddr *)&my_addr,sizeof(struct sockaddr)) ==-1) { printf("Unexpected error on bind\n"); shutdown(sock,2); return EXIT_FAILURE; } address_length = sizeof(struct sockaddr_in);
while(!done) { if(0 != CheckForData(sock)) { memset(data, 0, sizeof data); if (recvfrom(sock, data, sizeof data, 0, (struct sockaddr *)&their_addr, &address_length) == -1) { printf("Error on recvfrom\n"); }
celc=atoi(data); farh=(celc*2)+32; memset(data, 0, sizeof data); sprintf(data, "%d", farh); if (sendto(sock, data, strlen(data), 0, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { printf("Error on sendto\n"); } printf("%s\n", data); } } shutdown(sock,2); printf("User requested program to halt.\n"); return EXIT_SUCCESS; }
771/1275
/* ita tekst sa socket-a i ispisuje ga na standardni izlaz. Ponavljaj * dok se socket ne zatvori. Vraa broj razliit od nule ako klijent * poalje "quit" poruku, nulu u suprotnom. */ int server (int client_socket) { while (1) { int length; char* text; /* Prvo, itamo duljinu tekst poruke sa socket-a. ako read vrati nulu, klijent je zatvorio konekciju. */ if (read (client_socket, &length, sizeof (length)) == 0) return 0; /* Alociramo buffer dovoljne veliine. */ text = (char*) malloc (length); /* itamo tekst te ga ispisujemo. */ read (client_socket, text, length); printf (%s\n, text); /* Oslobaamo zauzete resurse. */ free (text); /* Ako klijent poalje "quit" poruku, zavravamo */ if (!strcmp (text, quit)) return 1; } } int main (int argc, char* const argv[]) { const char* const socket_name = argv[1]; int socket_fd; struct sockaddr_un name; int client_sent_quit_message; /* Kreiramo socket. */ socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); /* Oznaavamo da je ovo server. */ name.sun_family = AF_LOCAL; strcpy (name.sun_path, socket_name); bind (socket_fd, &name, SUN_LEN (&name)); /* Oslukujemo konekcije. */ listen (socket_fd, 5); /* Uzastopno prihvaamo konekcije. Ponavljamo dok klijent ne poalje "quit". */ do { struct sockaddr_un client_name; socklen_t client_name_len; int client_socket_fd; /* Prihvaamo konekciju. */ client_socket_fd = accept (socket_fd, &client_name, &client_name_len); /* Obrada konekcije. */ client_sent_quit_message = server (client_socket_fd); /* Zatvaramo nau stranu konekcije. */ close (client_socket_fd); } while (!client_sent_quit_message); /* Briemo socket file. */
772/1275
Klijent:
/* (socket-client.c) Local Namespace Socket Client */ #include #include #include #include #include <stdio.h> <string.h> <sys/socket.h> <sys/un.h> <unistd.h>
/* Piemo na socket dan imenom file deskriptora SOCKET_FD. */ void write_text (int socket_fd, const char* text) { /* Zapisujemo broj byte-ova stringa, ukluujui NUL-terminator. */ int length = strlen (text) + 1; write (socket_fd, &length, sizeof (length)); /* Piemo string na socket. */ write (socket_fd, text, length); } int main (int argc, char* const argv[]) { const char* const socket_name = argv[1]; const char* const message = argv[2]; int socket_fd; struct sockaddr_un name; /* Kreiramo socket. */ socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); /* Spremamo serverovo ime u socket adresnu strukturu. */ name.sun_family = AF_LOCAL; strcpy (name.sun_path, socket_name); /* Spajamo se na socket. */ connect (socket_fd, &name, SUN_LEN (&name)); /* Piemo tekst sa komandne linije na socket. */ write_text (socket_fd, message); close (socket_fd); return 0; }
773/1275
int main(void) { int sockfd, new_fd; // listen on sock_fd, new connection on new_fd struct sockaddr_in my_addr; // my address information struct sockaddr_in their_addr; // connector's address information int sin_size; int yes=1; WSADATA wsaData; if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) { fprintf(stderr,"WSAStartup failed with error %d\n",WSAGetLastError()); WSACleanup(); return -1; } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = INADDR_ANY; memset(&(my_addr.sin_zero), '\0', 8); // // // // host byte order short, network byte order automatically fill with my IP zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { perror("accept"); } printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr)); if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send"); closesocket(new_fd); // parent doesn't need this WSACleanup(); return 0; }
774/1275
Klijent:
/* client.c -- a stream socket client demo */ #include <winsock2.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define PORT 3490 // the port client will be connecting to #define MAXDATASIZE 100 // max number of bytes we can get at once int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; // connector's address information WSADATA wsaData; if (argc != 2) { fprintf(stderr,"usage: client hostname\n"); exit(1); } if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) { fprintf(stderr,"WSAStartup failed with error %d\n",WSAGetLastError()); WSACleanup(); exit(1); }
if ((he=gethostbyname(argv[1])) == NULL) { // get the host info fprintf(stderr,"gethostbyname"); WSACleanup(); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr,"socket"); WSACleanup(); exit(1); } their_addr.sin_family = AF_INET; // host byte order their_addr.sin_port = htons(PORT); // short, network byte order their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) { fprintf(stderr,"connect"); WSACleanup(); exit(1); } if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { fprintf(stderr,"recv"); WSACleanup(); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); closesocket(sockfd); WSACleanup(); return 0; }
775/1275
Majk Jednakovi
776/1275
777/1275
778/1275
mreu.U suradnji sa slojem 2.odreuje koji je put najoptimalniji za prijenos podataka do odredita.U Internet mrei to je IP protokol. Sloj podatkovne veze (Data Link Layer) opisuje logiku organizaciju podatkovnih bitova za prijenos kroz medije.Npr. ovaj sloj definira strukturu okvira i paketiranje podataka, adresiranje paketa, metodologiju odreivanja sume, i slino. Fiziki sloj (Physical Layer), opisuje fizikalne karakteristike razliitih komunikacijskih medija kroz elektronike karakteristike signala koji nose podatke. (Mpr. Ethernet kablove, utinice, zavretke, naponske razine signala, modeme i modemske standarde, i dr). 1. 2. 3. 4. 5. 6. 7.
779/1275
780/1275
Telnet
Telnet prua mogunost rada na udaljenog raunalu. Korisnik se s jednog raunala moe logirati (prijaviti) na drugo i ponaati se kao da je tono na tipkovnici drugog raunala. Ova veza moe biti stvorena u lokalnoj mrei ili izmeu bilo koje dvije na svijetu, dokle god korisnik ima doputenje ulogirati se na udaljeno raunalo. Telnet se moe koristiti za rad na raunalima po cijeloj zemlji. Obino se ne koristi osim u LAN / WAN kontekstu, ali postoje raunala koja doputaju telnet pristup kako bi korisnici, primjerice, mogli testirati nove aplikacije ili operativni sustav.
Kerberos
Kerberos je sigurnosni protokol. Koristi posebni server za autentifikaciju korisnika kako bi provjeravao lozinke i korisno se enkripcijskim algoritmima. Jedan je od sigurnijih sustava za komunikaciju i dosta est na UNIX-u.
781/1275
782/1275
Internet Protocol
Brine se za prijenos paketa podataka koje je sloio TCP ili UDP. Koristi set unikatnih adresa za svaki ureaj na mrei da bi utvrdio smjer i odredite podatka.
783/1275
CLIENT-SERVER KOMUNIKACIJA
TCP/IP je skup protokola koji se koristi za povezivanje raunala i srodnih ureaja. Iako unutar njega postoji vie protokola promatrat emo samo dva, TCP(Connection oriented) i UDP (Connectionless) te emo priati o StreamSocket-ima odnosno Datagram Socket-ima. to je zapravo socket. Ako za trenutak izuzmemo sockete na lokalnom voru (Unix Sockets) i promatramo samo one Internet sockete, moemo rei da je socket pristupna toka (definirana odreenim parametrima) koja slui za komunikaciju izmeu aplikacija na razliitim raunalima. Karakteristike: Bespojna uluga (Connectionless) UDP protokol osnovna jedinica prijenosa je datagram bespojna veza ne garantira se isporuka pojedinog datagrama, ali se takoer moe desiti isporuka vie identinih kopija istog datagrama ne garantira se ouvanje redoslijeda poslanih datagrama nema kontrole protoka Spojna usluga: pouzdanost: svaki niz poslanih okteta e sigurno stii na odredite, osim u sluaju prekida veze ili neke druge greke na posluitelju o emu e aplikacija poiljatelj biti obavijetena kontrola toka nije mogue zaguenje primatelja od strane poiljatelja ouvani redoslijed isporuke
784/1275
char };
--------------------------------------------------------------------------meutim zbog jednostavnijeg koritenje razvijena je struktura: ---------------------------------------------------------------------------------------------------------struct sockaddr_in { short int sin_family; // Address family (AF_xxx) sin_addr; // Internet address unsigned short int sin_port; // Port number struct in_addr unsigned char }; ---------------------------------------------------------------------------------------------------------(Napomena: sin_zero element strukture slui da bi ova struktura imala istu veliinu kao i struktura struct_sockaddr. sockaddr_in je izvedeno zbog lakeg rukovanja.). Pokaziva na ovu strukturu moe se castati u struct sockaddr* i obrnuto. struct in_addr je struktura sa samo jednim lanom (unsigned long s_addr).U sluaju klijenta ovo polje sadri adresu raunala kojem se pristupa i na kojem se oekuje posluitelj, dok kod servera ovo polje sadri adresu suelja na koje se vee server. U sluaju da elimo da server prima pakete na sva suelja koristi se konstanta INADDR_ANY. lanovi strukure sin_port i sin_addr moraju imati vrijednost u network-byte orderu, pa se koriste funkcije: The htonl() function converts the long integer hostlong from host byte order to network byte order. The htons() function converts the short integer hostshort from host byte order to network byte order. The ntohl() function converts the long integer netlong from network byte order to host byte order. The ntohs() function converts the short integer netshort from network byte order to host byte order. sin_zero[8]; // postaviti na 0 sa memset
785/1275
Adrese koje se koriste i stavljaju unutar ove strukture su 32-bitne adrese. U sluaju da imamo (s naeg gledita) standardni zapis adrese (npr. 161.53.119.118) ona se mora pretvoriti u 32-bitni broj za to moemo iskoristiti funkciju : int inet_aton(const char *cp, struct in_addr *inp); int inet_pton(int af, const char *cp, struct in_addr *inp); (novija) (obrnuta funkcija je inet_ntoa ) U sluaju da ove gornje funkcija ne postoje moe se koristiti funkcija inet_addr() koja u sluaju greke vraa -1 to moe biti krivo interpretirano kao (255.255.255.255)
786/1275
Redoslijed pozivanja
Slika prikazuje redoslijed pozivanja za TCP protokol. Funkcija accept blokira program sve do trenutka dok se neka od konekcija ne pojavi Server: create endpoint (socket()) bind address (bind()) specify queue (listen()) wait for conection (accept()) transfer data (read() write()) Client: create endpoint (socket()) connect to server (connect()) transfer data (read() write())
UDP protokol: Server: create endpoint (socket()) bind address (bind()) transfer data (sendto() recvfrom()) Client: create endpoint (socket()) bind address (bind()) connect to server (connect()) transfer data (sendto() recvfrom())
787/1275
domain predstavlja grupu komunikacijskih usluga koju elimo koristiti. (AF_INET (IPv4) mreni protokol, AF_INET6, AF_UNIX (cjevovod)..[1].) type oznaava koji tip socketa elimo koristiti (npr. SOCK_STREAM , SOCK_DGRAM) protocol oznaava protokol koji e se koristiti za komunikaciju. Ako za vrijednost stavimo 0, protokol e biti odabran od strane jezgre ili funkcije (to i najbolja opcija) U sluaju greke funkcija e vratiti -1, a inae vrijednost deskriptora. Jednom kad je socket kreiran da bi ga se moglo koristiti treba ga vezati (asocirati) na port na lokalnom stroju. (Ovo radi samo server)
#include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
sockfd je socket file deskriptor kojeg je vratio poziv funkcije socket(). my_addr je pokaziva na strukturu struct sockaddr koja sadri informacije o adresi i pristupnom broju (port). Portovi ispod 1024 su rezervirani. Mogue je koristiti bilo koji broj porta do 65535 ako ve nije zauzet od strane nekog drugog programa. U sluaju da se za port ostavi 0 vee se na bilo koji broj koji jezgra ili funkcija odredi. addrlen je veliina prethodne strukrure i moe se postaviti na sizeof(struct sockaddr). Dok posluitelj mora vezati socket na neki port i oslukivati, klijent se kod spojne usluge treba konektirati na neki odreeni stroj na neki odreeni port i to pomou funkcije connect
788/1275
#include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd je socket file deskriptor kojeg je vratio poziv funkcije socket(), serv_addr je struktura struct sockaddr koja sadri odredinu IP adresu i odredini port, a addrlen je veliina prethodne strukrure i moe se postaviti na sizeof(struct sockaddr). Primijetimo da klijent ne zove bind() jer ga ne zanima lokalni port, ve samo onaj odredini. Da bi se klijent spojio na odredini stroj, tamo mora netko i ekati i oslukivati, za to slui funkcija listen
sockfd je socket file deskriptor kojeg je vratio poziv funkcije socket(),a backlog je broj dozvoljenih konekcija u redu ekanja. Konekcije se prihvaaju funkcijom accept().
sockfd je socket deskriptor od socketa na kojem se oslukuje. addr je obino pokaziva na strukturu struct sockaddr_in i predstavlja informaciju o klijentu(adresa, port). addrlen je cijeli broj kojeg bi trebalo postaviti na sizeof(struct sockaddr_in) prije poziva. accept nee staviti vie od toliko byteova u addr. Ako stavi manje promijenit e vrijednost varijable addrlen. Za slanje i primanje podataka sluit e funkcije send i recv kod spojne usluge, odnosno sendto i recvfrom kod bespojne.
int send(int sockfd, const void *msg, int len, int flags);
int recv(int sockfd, void *buf, int len, unsigned int flags);
789/1275
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
elimo li zatvoriti socket to moemo uiniti pomou close, ili ako elimo malo vie kontrole (npr. zatvoriti ga samo u jednom smjeru) shutdown
how (0-Daljnji primitak je onemoguen, 1-Daljnje slanje je onemogueno, 2-oboje (kao close) Od korisnih funkcija spomenimo jo dvije koje slue za dobivanje informacije o klijentu, odnosno o vlastitom stroju.
#include <sys/socket.h> int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
790/1275
Koritenje DNS-a
Openito je lake pamtiti simboliko ime stroja, a ne njegovu IP adresu. Za pretvaranje simbolikog imena u IP adresu i obrnuto mogu nam posluiti sljedee funkcije. Funkcija gethostbyname vraa
#include <netdb.h> struct hostent *gethostbyname(const char *name); struct hostent { char *h_name; char **h_aliases; int int }; #define h_addr h_addr_list[0] h_addrtype; h_length;
char **h_addr_list;
Struktura struct hostent ima sljedea polja: h_name slubeno ime stroja h_aliases -- NULL-terminated polje alternativnih imena. h_addrtype tip adrese,obino AF_INET. h_length Duljina adrese u byte-ovima. h_addr_list 0 zavreno-terminated polje mrenih adresa stroja. Adresu su u Network Byte Order. h_addr prva adresa u h_addr_list. gethostbyname() vraa pokaziva na popunjenu struct hostent, ili NULL u sluaju greke. Kod greke se stavlja u h_errno (herror().funkcija). Neke bitnije su: HOST_NOT_FOUND (zadano raunalo ne postoji), NO_ADDRESS/NO_DATA (raunalo postoji, ali nema IP adresu), NO_RECOVERY (neoporavljiva greka), TRY_AGAIN (greka privremenog karaktera). Primjer: getip.c
791/1275
Client import java.io.*; impoert java.net.*; public class SocketTest { public static void main(String argv[]) { try { Socket t = new Socket("java.sun.com", 13); DataInputStream is = new DataInputStream(t.getInputStream()); boolean more = true; while (mnore) { String str = is.readLine(); if (str == null) more = false; else System.out.println(str); } } } catch(IOException e) { System.out.println("Error" + e); } } }
792/1275
Server import java.io.*; import java.net.*; public class EchoServer { public static void main(String argv[]) { try { ServerSocket s = new ServerSocket(8189); Socket incoming = s.accept(); //za adresu od klijenta vidi incoming.getInetAddress DataInputStream in = new DataInputStream(incoming.getInputStream()); PrintStream out = new PrintStream(incoming.getOutputStream()); out.println("Hello. Enter BYE to exit"); boolean done = false; while ( ! done) { String str = in.readLine(); if (str == null) done = true; else { out.println("Echo: " + str); if (str.trim().equals("BYE")) done = true; } incoming.close(); } catch(Exception e) { System.out.println(e); } } }
793/1275
Sockets in Perl
Perl has a C-like interface to sockets. It also has a higher level one using the IO::Socket module. This example is a client to fetch documents from a Web server. #!/usr/bin/perl -w use IO::Socket; unless (@ARGV > 1) { die "usage: $0 host document ..." } $host = shift(@ARGV); $EOL = "\015\012"; $BLANK = $EOL x 2; foreach $document ( @ARGV ) { $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => "http(80)", ); unless ($remote) { die "cannot connect to http daemon on $host" } $remote->autoflush(1); print $remote "GET $document HTTP/1.0" . $BLANK; while ( <$remote> ) { print } close $remote; } Here is a server that will execute some commands and return a result #!/usr/bin/perl -w use IO::Socket; use Net::hostent; $PORT = 9000; # for OO version of gethostbyaddr # pick something not in use => 'tcp',
794/1275
Listen Reuse
die "can't setup server" unless $server; print "[Server $0 accepting clients]\n"; while ($client = $server->accept()) { $client->autoflush(1); print $client "Welcome to $0; type help for command list.\n"; $hostinfo = gethostbyaddr($client->peeraddr); printf "[Connect from %s]\n", $hostinfo->name || $client->peerhost; print $client "Command? "; while (<$client>) { next unless /\S/; if (/quit|exit/i) { last; } elsif (/date|time/i) { printf $client "%s\n", scalar localtime; } elsif (/who/i ) { print $client `who 2>&1`; } elsif (/cookie/i ) { print $client `/usr/games/fortune 2>&1`; } elsif (/motd/i ) { print $client `cat /etc/motd 2>&1`; } else { print $client "Commands: quit date who cookie motd\n"; } } continue { print $client "Command? "; } close $client; } # blank line
795/1275
Boris Ivanievi
796/1275
UVOD
Cilj seminarskog rada je upoznati itatelja sa osnovama file sistema i programiranja unutar unix okruenja. Seminar je podijeljen na vie zasebnih cjelina: unix file sistem gdje se obrauje struktura unix file sistema, odnosno objanjava glavna filozofija. Spomenut e se osnovne stvari koje ine unix file sistem onim to je kao to su to je inode, koje vrste fileova postoje, koje razine ovlasti povezane sa manipulacijom fileova poznajemo, to je root direktorij i koji ostali direktoriji su bitni za funkcioniranje sistema. Komande na unixoidnom operativnom sustavu gdje se navode najvanije komande s kojima manipuliramo fileovima odnosno direktorijima i ovlastima nad njima. Spomenut e se komande man, cp, mv, rm, more, lpr, cd, pwd, ls, mkdir, rmdir i chmod. Programiranje u unixu gdje se navodi zato elimo programirati u C-u, koje emo alate koristiti (gcc kompajler, make alat) i koje standardne biblioteke su nam potrebne u radu. Za kraj dajem dva mala programa. Primjeri programa gdje dajem dva primjera programa pisanih u C programskom jeziku
797/1275
to je inode
U unix file sistemu inode igra veliku ulogu. Sadrava sve relevantne informacije o nekom file-u. Zapravo bi ga mogli shvatiti kao posrednika izmeu operativnog sustava i fizikih podataka. Slika 2.3.1. pokazuje okvirnu strukturu inode-a:
798/1275
Tip i modovi User i group ID Broj hard linkova Veliina u bajtovima Direktni pointer 1 Direktni pointer 2 ........... Jednostruki indirektni pointer Dvostruki indirektni pointer Trostruki indirektni pointer Slika 2.3.1. Svaki inode sadri podatke o tipu i modovima filea odnosno govori koji je file tipa (direktorij, obini file, pipeline...) i koje su mogunosti pristupa fileu na razini vlasnika (ownera), grupe i ostalih korisnika. To se odnosi na postavke itanja, pisanja odnosno izvravanja fajla ukoliko se on moe pokrenuti. Dalje sadri podatke o vlasniku i grupi za kontrolu pristupa (ti podaci se sastoje od brojeva userID i groupID koji su postavljeni u password fileu). Osim toga tu je i zapisana veliina filea i broj hard linkova na file. I jasno, na kraju tu su pointeri na stvarne fizike blokove memorije i indirektni pointeri. Indirektni pointeri slue za mogunost adresiranja veih fajlova.
799/1275
Data blokovi
Legenda Direktni pointer Jednostruki indirektni pointer Dvostruki indirektni pointer Trostruki indirektni pointer Slika 2.3.2.
800/1275
Slika 2.3.2. pokazuje kako je pomou indirektnih pointera mogue ostvariti adresiranje veih fajlova. Vano je naglasiti da razliite implementacije unixoidne arhitekture file sistema razliito tretiraju strukturu inodea na nain da poveanjem ili smanjenjem broja direktnih i indirektnih pointera doputaju mogunost spremanja i manipuliranja veim ili manjim fajlovima. To doputa veliku fleksibilnost jer ogranienje veliine najveeg mogueg filea nije dobro. Valja napomenuti da ipak vei broj pointera moe stvoriti dodatni memorijski overhead.
801/1275
originalni file. Kod brisanja je bitno uvidjeti da ako izbriemo originalni file soft link vie nije validan. Jo jedna vana razlika je u tome to da bismo stvorili hard link originalni file mora postojati dok kod symbolic linka to nije preduvjet.
802/1275
bin
boot
dev
etc
home
lib
sbin
tmp
usr
Slika 2.6.1. Bitno je naglasiti da je ishodite svih direktorija root direktorij (oznaka /). Stoga kad smo na nekoj poziciji unutar stabla direktorija moemo promatrati svoju poziciju s obzirom na direktorij u kojem jesmo (relative path) i poziciju s obzirom na root direktorij (absolute path). Pojedini vani direktoriji su: bin - komande dostupne svima u obliku izvrnih datoteka boot fileovi potrebni bootanju sistema dev kolekcija drivera za hardverske komponente etc sistemski konfiguracijski fileovi i baze podataka home tu se nalaze home direktoriji korisnika lib kolekcija dinamikih biblioteka sbin specijalne komande tmp skladite privremenih fileova usr sve povezano sa pojedinim korisnikom (dodatne komande, man stranice, headeri, standardne biblioteke)
803/1275
804/1275
lpr Koristi se za ispis filea na printer. Izgled: lpr file Primjer: lpr blablah.h printa sadraj filea blabla.h
805/1275
rmdir Koristi se za brisanje direktorija. Izgled: rmdir direktorij Primjer: rmdir mhm brie direktorij mhm
806/1275
PROGRAMIRANJE U UNIXU
Unix i C
Teko je uope zamisliti kakvo bi bilo stanje u raunalnom svijetu da je unix bio bez C programskog jezika i da je C bio bez unixa. Zapravo popularnost unixa i ostalih slinih operativnih sustava se isto tako duguje C-u. Mase programera napravilo je svoje prve korake pisajui C instrukcije na unixu. Dananji C, kojeg jo i nazivaju moderni asembler, zbog efikasnosti, jednostavnosti i povezanosti sa unixom je vjerojatno najvie upotrebljavan programski jezik na unix platformi (uz veliku upotrebu i nekih ostalih programskih jezika perl, awk...)
Make alat
I jo na kraju, prije programiranja, bitno je spomenuti jo jednu stvar koja nam iz dana u dan moe olakati posao. Svaki put dok programiramo mogli bismo ponavljati jednu te istu stvar kompajlirati .c fileove, dobiti .o fileove sa objektnim kodom, zatim linkati i dobiti izvrne fileove. Meutim taj posao bi postao ogroman kada bismo morali istu stvar raditi za mnogo fileova. Zato nam je ponuen alat koji omoguuje unaprijed zadano ponaanje svih
807/1275
fileova od source koda do izvrnog filea. Primjer: Uzmimo situaciju da smo napravili program koji se sastoji od ovih datoteka: stack.h, stack.c, list.h, list.c i main.c. S time da su u main.c includani stack.h i list.h, u stack.c je includan stack.h, a u list.c je includan list.h. Na temelju toga bismo napravili slijedei jednostavni Makefile. program : main.o stack.o list.o gcc -o program main.o stack.o list.o main.o : main.c stack.h list.h gcc -c main.c stack.o : stack.c stack.h gcc -c stack.c list.o : list.c list.h gcc -c list.c clean : rm program main.o stack.o list.o Da bi ovo proradilo file moramo nazvati Makefile. U make fileu navodimo koji file elimo stvoriti i o emu je taj file ovisan. Nakon toga upisujemo komandu kojom ga stvaramo. Linija clean govori da clean nije ovisan niti o jednom fileu i izvrit e se brisanje fileova komandom rm. Make file pokreemo naredbom make koja e nai u trenutnom direktoriju Makefile i pokrenuti ga. Naredba make clean e pokrenuti ienje fileova odnosno pokretanje naredbe rm. Pomou Makea je mogue raditi svata, mogue je koristiti varijable unutar njega, uglavnom s njim radimo proces kompajliranja i linkanja automatiziranim od poetka do kraja.
808/1275
Tipovi podataka
Za potrebe programiranja dostupni su nam tipovi podataka u unix okruenju. Oni su definirani u <sys/types.h> datoteci. To su: blkcnt_t blksize_t dev_t gid_t ino_t mode_t off_t uid_t /* int - koristi se za oznaavanje broja blokova */ /* int - koristi se za oznaavanje veliine blokova */ /* int - koristi se za oznaavanje device IDa */ /* int - koristi se za oznaavanje group IDa */ /* unsigned int - koristi se za oznaavanje broja inodea /* int - koristi se za oznaavanje modova filea*/ /* int - koristi se za oznaavanje veliine filea */ /* int - koristi se za oznaavanje user IDa */
Izabrane funkcije
Od mnogih funkcija koje su definirane u raznim unix header fileovima izdvojit emo one koji omoguuju operacije sa fileovima i direktorijima. int symlink(const char *path1, const char *path2); /* <unistd.h> */ int unlink(const char *path); int mkdir(const char *path, mode_t mode); int rmdir(const char *path); int chmod(const char *path, mode_t mode); mode_t umask(mode_t cmask); /* <unistd.h> */ /* <sys/stat.h> */ /* <unistd.h> */ /* <sys/stat.h> */ /* <sys/stat.h> */
Funkcija symlink kreira symbolic link imena path2 koji pokazuje na file imena path1. Funkcijom unlink uklanjamo link. Ukoliko smo uklonili symbolic link brie se file, a ukoliko smo uklonili hard link onda se umanjuje link counter inodea. Funkcije mkdir odnosno rmdir su identine istoimenim unix komandama. Funkcijom chmod mijenjamo modove odreenog filea. Sve navedene funkcije vraaju 0 ukoliko je operacija prola u redu, a u sluaju greke vraaju -1. I na kraju funkcija umask postavlja u trenutnom procesu postavke umaska (u umasku su upisani default modovi koji e se koristiti pri kreiranju fileova). Vraa dosadanju vrijednost umaska.
809/1275
Stat struktura
Za dobivanje temeljnih informacija o fileu koristimo stat strukturu. Da bi nam ona bila dostupna unutar koda trebamo ukljuiti (includati) <sys/types.h> i <sys/stat.h> header fileove. struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; blkcnt_t st_blocks; mode_t st_attr; }; Za upisivanje stat strukture u varijablu koristimo ove funkcije: int fstat(int filedescriptor, struct stat *buff); int stat(const char *pathname, struct stat *buff); int lstat(const char *pathname, struct stat *buff); Funkcijom fstat dobivamo stat strukturu koritenjem file deskriptora, dok kod funkcija stat i lstat koristimo path filea. Funkcija lstat u sluaju dohvaanja simbolic linka referencira sami link dok stat referencira file na koji link pokazuje. U povratnoj vrijednosti tipa int dobivamo greku u vidu vrijednosti -1 ukoliko funkcija nije mogla biti izvrena na normalan nain. /* ID devicea koji sadri file */ /* broj inodea filea */ /* modovi pristupa fileu */ /* broj linkova na file */ /* userID vlasnika filea */ /* groupID vlasnika filea */ /* device ID ukoliko je file tipa devica */ /* veliina filea u bajtovima */ /* vrijeme zadnjeg pristupa */ /* vrijeme zadnje modifikacije */ /* vrijeme kreiranja filea */ /* broj blokova koje je file alocirao */ /* atributi filea */
810/1275
Dalje tu postoje i razliite konstante (defineovi) za tipove i modove fileova te predprocesorske direktive (macroi) koje ispituju tip filea. One svojim razumljivim imenima daju mogunost da ih lagano koristimo. Predprocesorske direktive su iskoritene u primjeru programa u poglavlju 5.
Dirent struktura
Za dohvaanje direktorija odnosno fileova unutar njega trebaju nam dvije stvari. Jedna od njih je tip podataka DIR koji predstavlja direktorij, dok je druga struct dirent (skraenica od directory entry) koji predstavlja jedan unos unutar direktorija. Za koritenje je potrebno ukljuiti (includati) <dirent.h>. struct dirent { ino_t d_ino; }; Da bismo mogli manipulirati s direktorijima dane su nam na raspolaganje ove funkcije. DIR *opendir(const char *pathname); int closedir(DIR *directory); void rewinddir(DIR *directory); long telldir(DIR *directory); void seekdir(DIR *directory, long location); struct dirent *readdir(DIR *directory); Funkcijom opendir otvaramo direktorij odnosno upisujemo ga u DIR* tip varijable, a kao parametar aljemo path eljenog direktorija. Funkcija closedir zatvara direktorij. Vraa 1 u sluaju greke. Funkcija rewinddir nam koristi da vratimo pointer na poetak direktorija. Moe nam koristiti za viestruko iteriranje po direktoriju. Funkcijom telldir dobivamo trenutnu lokaciju unutar direktoija koju onda moemo iskoristiti u funkciji seekdir koja nas postavlja na tu lokaciju. Te dvije funkcije moemo koristiti za pamenje pozicije unutar direktorija i kasnije postavljanje na nju putem argumenta tipa long. I na kraju tu je funkcija readdir koja iz direktorija uitava unos u struct dirent pomou kojega moemo dobiti ime filea.
811/1275
char d_name[];
PRIMJERI PROGRAMA
Napisat emo program koji e raditi kao ls komanda bez opcionalnih parametara. #include <unistd.h> #include <dirent.h> int main(int argc, char **argv) { DIR *dir; struct dirent *dentry; dir = opendir("."); while(dentry = readdir(dir)) printf("%s ", dentry->d_name); closedir(dir); return 0; } U ovom primjeru emo unijeti ime filea i dobiti koje je vrste. #include <unistd.h> #include <sys/stat.h> int main(int argc, char **argv) { int i; struct stat info; for(i = 1; i < argc; ++i) { printf("%s: ", argv[i]); if(!stat(argv[i], info)) { if(S_ISLNK(info)) printf("symbolic link/n"); else if(S_ISREG(info)) printf("obicni file/n");
812/1275
else if(S_ISDIR(info)) printf("direktorij/n"); else if(S_ISCHR(info)) printf("character device/n"); else if(S_ISBLK(info)) printf("blok device/n"); else if(S_ISFIFO(info)) printf("named pipe/n"); else if(S_ISSOCK(info)) printf("socket/n"); } else { printf("nema tog filea"); } return 0; }
813/1275
Literatura
Kao literaturu sam koristio man i web stranice, bez kojih bi ovaj seminar bio teko izvediv, pa se zahvaljujem svim ljudima koji su uloili svoj trud da bi izgradili stranice i pomogli ljudima u otkrivanju znanja. Koristio sam i dvije knjige: Mitchel, M., Oldham, J., Samuel, A., Advanced Linux programming, New Riders Publishing, 2001. Stevens, R.W., Advanced programming in the Unix environment, Addison Wesley, 1996.
Napomene
Zbog nemogunosti odluke i definiranih stajalita struke oko upotrebe raunalnog nazivlja, a isto tako i zbog vlastitog odnosa prema toj temi izabrao sam rjeenja koja mi zvue kao dobra, znajui da e biti onih koji se s njima ne slau. Kod nekih poglavlja se moe primijetiti da nisu opisana do kraja, netko e rei da neto fali, meutim kao to sam i sam uio o ovoj temi pisajui ovaj seminar odluio sam da ono to mi se uinilo kao nepotrebnim, odnosno moda suvie tekim i zbunjujuim, izbacim odnosno pojednostavnim. Poglavlje 3 navodi osnovne oblike komandi. Za njihovo potpuno svladavanje nuno je dalje prouiti man stranice. Ovo sam vie zamislio kao popis najbitnijih komandi.
Nepoznati pojmovi
I jo na kraju bitno je rei da se u seminaru koristi pojam unixoidni file sistem odnosno unixoidni operativni sustav. Tijekom povijesti unix su razvijale mnoge kompanije pa su tako nastale i razne varijante unixa. Zatim se pojavio linux sa svojim mnogim distribucijama, a i bsd operativni sistemi. Teko bi bilo izbrojati koliko operativnih sistema je nastalo na temelju unixa odnosno na temelju nekih njegovih glavnih postavaka koji su isto tako ovdje opisani. Zato se pojam unixoida odnosi na jednu veliku porodicu operativnih sustava koja dijeli istu filozofiju, dok se njene implementacije i posebnosti razlikuju.
814/1275
Jurica Boikovi
INETD I TCPD
815/1275
INETD
to je INETD
INETD se odnosi na ''Internet Super-Server'' zato jer rukovodi vezama za nekoliko daemon-a (daemoni su programi koji osiguravaju mrene usluge). INETD slui kao upravljajui server za druge daemone. INETD se pokree pri podizanju sustava, a za njegovo pokretanje je zasluan rc(skripte kod podizanja i gaenja). rc je komandna skripta koja kontrolira pokretanje razliitih servicea(usluga) i operacija , a rc.shutdown je komandna skripta koja gasi razliite operacije i usluge. Nakon pokretanja,INETD ''slua'',trai veze na odreenim internet socketima (ulazima). Kada pronae vezu na jednom od ''ulaza'', odluuje kojem je deamonu veza namijenjena i pokree program da obradi zahtjev. Nakon to je program zavrio, nastavlja ''sluati'' ulaze.
816/1275
Nakon toga restartamo inetd s: /etc/init.d/inet restart ( killall -1 inetd) ( /etc/rc.d/init.d/inet restart) I testiramo s: ps awk | grep ftp ftp localhost Polja u /etc/inetd.conf file-u imaju sljedea znaenja: ftp ime service-a(pogledamo li u etc/services file,vidimo da je to TCP port 21) stream tcp tip socketa I protocol nowait ne eka da process zavri prije nego pone sluati druge veze root inicijalni korisniki ID pod kojim se service izvrava in.ftpd komandna linija
817/1275
Nakon toga restartamo inetd.Ove alternativne linije omoguuju tcpd-u pokretanje in.ftpd (ili in.wuftpd) za inetd. Tcpd provodi razliite testove dolazeih veza da bi provjerio da li im moe vjerovati. Provjerava host (domaina) veze,tj. kojem korisniku veza pripada i usporeuje tog korisnika s podacima u file-u /etc/hosts.allow i /etc/hosts.deny. Znai,tcpd na osnovu ovih provjera moe omoguiti ali i zabraniti pristup.
Naredbe
Omoguene su sljedee opcije: inetd -d inetd l inetd w inetd W inetd c maximum inetd c rate inetd R rate inetd s maximum inetd a inetd p pokree debugger pokree logiranje uspjenih veza(connections) ukljuuje TCP Wrapping za vanjske service(usluge) ukljuuje TCP Wrapping za unutarnje service koje su ugraene u inetd odreuje maximalan broj istovremenih pokretanja za svaki service odreuje maximalan broj koliko puta service moe biti pokrenut iz jedne IP adrese u jednoj minuti odreuje maximalan broj koliko puta service moe biti pokrenut u jednoj minuti,defaultna vrijednost je 256 odreuje maximalan broj istovremenih pokretanja svake usluge(service-a) iz jedne IP adrese odreuje jednu specifinu IP adresu koje se dri odreuje alternativnu datoteku u koju sprema ID procesa
818/1275
Konfiguracijska datoteka
Nakon izvravanja, inetd ita svoje konfiguracijske informacije iz konfiguracijske datoteke,koja je obino /etc/inetd.conf . Mora postojati unos za svako polje konfiguracijske datoteke, a svaki unos u polju odvojen razmakom (tab ili space). Komentari se oznaavaju s # na poetku linije.Konfiguracijska datoteka izgleda ovako: [addr:] service-name socket-type protocol [,sndbuf=size] [,rcvbuf=size] wait / nowait [:max] user [:group] server-program server program arguments Postoje dvije vrste usluga(service-a) koje inetd moe pokrenuti: standardna i TCPMUX. Standardni service ima poznati port koji mu je dodijeljen, moe biti service koji izvrava slubene Internet standarde ili je BSD Ns-specific service. TCPMUX services predstavljaju nestandardne usluge koje nemaju dodijeljen port. Oni se pozivaju iz inetd-a kad se program spoji na ''tcpmux'' poznati port i specificira ime service-a. Ova karakteristika je korisna za dodavanje lokalno razvijenih servera. Ime usluge(service-name) je ime valjane usluge u datoteci /etc/services ili specifikacija Unix domain socket-a. Za ''unutarnje'' usluge,ime service-a treba biti slubeno ime te usluge (to je prvi unos u /etc/services). Za TCPMUX usluge vrijednost polja service-name sastoji se od stringa ''tcpmux'', slasha i jedinstvenog imena usluge. Rezervirana imena su imena usluga izlistana u /etc/services i rije ''help''. Socket-type mora biti ''stream'', ''dgram'', ''raw'', ''rdm'' ili ''seqpaclet''. TCPMUX usluge moraju koristiti ''stream''. Protocol mora biti valjani protocol zadan u etc/protocols(npr. ''tcp'' i ''udp''). Wait/nowait odreuje da li server pozvan od inetd-a treba preuzeti socket povezan s pristupnom tokom usluge(service access point) i da li inetd treba priekati da server zavri s radom prije nego pone sluati nove zahtjeve. User treba sadravati korisniko ime(user name) korisnika. Server-program treba sadravati ime staze(pathname) programa koji e se izvriti od strane inetd-a kada je zahtjev pronaen na ulazu(socket-u).
819/1275
XINETD
Umjesto uobiajene kombinacije inetd-a i tcpd-a, RedHat se prebacio na xinetd. XINETD kombinira svojstva, karakteristike tcpd-a i inetd-a u jedan paket, koji se sastoji od konfiguracijske datoteke(/etc/xinetd.conf), izvrne datoteke(/usr/sbin/xinetd) i konfiguracijskih datoteka za svaku uslugu(service) u direktoriju /etc/xinetd.d/. XINETD nije samo zamjena za inetd. Svatko ga moe koristiti da bi startao servere koji ne zahtijevaju privilegirane portove zato je xinetd ne zahtijeva da usluge(services) u njegovoj konf. datoteci budu izlistani u /etc/services. XINETD nije kompatibilan s inetd-om zbog razliitih konfiguracijskih datoteka,njegova konf. datoteka je drukijeg formata od inetd-ove i razumiju razliite signale. Ali proces signal u akciju(signal-to-action) moe biti izmijenjen i dodan je program koji konvertira inetd.conf u xinetd.conf. Platforme na kojima radi su Solaris 2.6, Linux,BSDi i IRIX 5.3 I 6.2. Primjer konfiguracijske datoteke xinetd-a: defaults { instances log_type = 25 = FILE /var/log/servicelog
log_on_success = HOST PID log_on_failure = HOST RECORD # only_from # only_from disabled } service imap { socket_type = stream protocol wait user only_from = tcp = no = root = 198.72.5.0 localhost = 128.138.193.0 128.138.204.0 = localhost
= tftp
820/1275
banner server }
= /usr/local/etc/deny_banner = /usr/local/sbin/imapd
service telnet { flags wait user redirect bind } service telnet { flags wait user server bind } #service chargen #{ # type # id = INTERNAL = chargen-stream = tcp = root = REUSE = no = root = /usr/sbin/in.telnetd = 192.168.1.11 socket_type = stream = REUSE = no = root = 192.168.1.1 23 = 127.0.0.1 socket_type = stream
log_on_failure += USERID
log_on_failure += USERID
821/1275
# wait #}
= no
service xadmin { type protocol user wait port } = INTERNAL = tcp = root = no = 7000 socket_type = stream
822/1275
4) Poveava mogunosti loggiranja: a) za svaki pokrenuti server moe ispisati: I ) vrijeme pokretanja servera II ) adresu udaljenog korisnika(remote host) III ) tko je korisnik IV ) koliko dugo server radi b) za neke usluge(service), ako doe do neuspjenog kontrolnog pristupa, moe zapisati informacije o pokuaju pristupa(npr. moe zapisati korisniko ime i komandu za rsh service) 5) Nema ogranienja broja argumenata servera 6) Korisnik moe povezati odreene usluge sa odreenim IP-ima na svojem raunalu
823/1275
TCPD
to je tcpd
TCPD predstavlja kontrolni pristup za internet service(usluge).TCPD (TCP Wrapper) radi kao omota programa pokrenutih od inetd-a, a poziva se iz /etc/inetd.conf linijom: telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
TCPD program moe biti podeen da nadgleda nadolazee zahtjeve za telnet, finger, ftp, exec, rsh, rlogin, tftp, talk i comsat. Program podrava oba 4.3BSD-style socket-a(ulaza) i System V.4-style TLI. Funkcionalnost e biti ograniena kada protocol pod TLI nije internet protocol.
Login
Veze koje tcpd nadgleda se prijavljuju preko syslog-a. Svaki zapis sadri zapis o vremenu,ime korisnika i zatraenu uslugu(service). Ta informacija moe biti korisna da bi se detektirale neeljene aktivnosti, posebno kad se informacije o loginu vie korisnika spoje. Ako elite saznati gdje idu informacije o vaem loginu pretraite syslog konfiguracijsku datoteku, koja je obino /etc/syslog.conf.
824/1275
daemon_list : client_list [ :shell_command ] daemon_list lista jednog ili vie imena daemon procesa client_list lista jednog ili vie imena korisnika, adresa korisnika koji e se usporeivati Lista elemenata treba biti razdvojena razmacima ili zarezima. Jezik kontrolnog pristupa implementira sljedee uzorke: string koji poinje znakom .. Korisniko ime odgovara ako zadnji dio njegovog imena odgovara odreenom uzorku. Npr. uzorak .tue.nl odgovara korisnikom imenu wzv.win.tue.nl. string koji zavrava sa znakom . Korisnika adresa odgovara ako njeno prvo numeriko polje odgovara danom stringu. Npr. uzorak 131.155 odgovara adresi skoro svakog korisnika mree Eindhoven univerziteta (131.155.x.x) string koji poinje znakom @ se tretira kao ime NIS(nekada YP) netgrupe. Korisniko ime odgovara ako je korisnik lan odreene netgrupe.
825/1275
Greke(bugs)
Neki UDP I RPC daemon-i zadre se jo neko vrijeme nakon to su zavrili svoj posao, u sluaju da doe novi zahtjev. U inetd konfiguracijskoj datoteci ove usluge(services) ekaju,tj. registrirane su u stanju ekanja. Samo zahtjev koji je pokrenuo neki daemon e biti zapisan. Program ne radi s RPC service-ima preko TCP-a. Ove usluge su registrirane kao rpc / tcp u inetd konfiguracijskoj datoteci. Jedina jednostavnija usluga koja je zahvaena ovim limitiranjem je rexd, koju koristi komanda on 1. Ali to nije veliki gubitak zato jer je na veini sustava rexd manje siguran od wildcard-a u /etc/hosts.equiv.
826/1275
Goran Vlahovi
INTERNET SERVICES
827/1275
UVOD
Poetkom 1970-tih, ameriko ministarstvo obrane (United States Department of Defence), zapoelo je istraivaki program zvan DARPA (Defence Advanced Research Projects Administration). Jedan od ciljeva DARPA-e je bio da naprave Internet, skup meusobno povezanih mrea, koji bi omoguio interakciju istraivakih laboratorija preko cijele drave. Mrea je prozvana ARPAnet, a protokol koji bi kontrolirao vezu IP (Internet Protocol). Dani originalnog ARPAnet-a su davno proli, a mrea je toliko narasla i sada je to jedna nevjerojatna stvar zvana Internet, koja omoguuje meusobno spajanje raunala preko cijelog svijeta. Internet Protocol omoguuje slanje paketa izmeu bilo koja dva raunala spojena na Internet. IP je samo primitivan servis i potrebni su drugi nivoi protokola koji koriste IP u pozadini. Dva takva protokola su TCP/IP (Transmition Control Protocol) i UDP/IP User Datagram Protocol). TCP/IP spaja dva programa na slian nain kao i serijska linija izmeu dva raunala, dok UDP/IP omoguava jednostavan nain slanja poruka izmeu dva raunala. Najinteresantniji korisniki programi koriste TCP za kreiranje veze, tako da je TCP/IP esto definiran kao interkonekcijski protokol Interneta.
828/1275
829/1275
Programi zvani name serveri predstavljaju polovicu DNS-ovog klijent-server mehanizma. Name serveri sadre informaciju o nekom segmentu baze i omoguuju je klijentima zvanim resolveri. Resolveri su obino samo library rutine koje kreiraju upite i alju ih preko mree name serveru.
Struktura DNS-a
Struktura DNS baze podataka slina je strukturi UNIX datotenog sustava. Cijela baza se moe prikazati kao naopako stablo, s korijenskim vorom na vrhu. Za razliku od UNIX-a gdje je root direktorij oznaen sa slash ("/"), kod DNS-a se oznaava kao jedna toka (".").
Svaki vor tj. domena u DSN svijetu, je ujedno i korijen za novo podstablo ili poddomenu. Svaka poddomena predstavlja posebnu zonu i crtaju se kao djeca njihovih roditeljskih domena. Svaka domena ima jedinstveno ime, kao i direktorij u UNIX datotenom sistemu. Razlika je jedino da su domene odvojene tokom, dok su putanje datoteka odvojene kosom crtom. Svaka domena moe biti administrirana od razliite organizacije, a svaka organizacija moe tu domenu podijeliti u odreen broj poddomena i predati odgovornost nad njima drugim
830/1275
organizacijama. Npr. InterNIC, koji dri domenu .edu, moe dodijeliti pravo domene berkeley.edu fakultetu U.C. Berkeley.
831/1275
Organizations .int 1998 ne established by international treaties between governments .mil 1995 da United States military US DoD Network Information Center Museum Domain Management Association, (MuseDoma) Global Name Registry, LTD Internet Assigned Numbers Authority
.museum 2001
da
.name
2001
ne
.net
1995
ne
VeriSign, Inc.
Public Interest Registry. Until 31 December 2002, .org was operated by VeriSign Global Registry Services.
.org
1995
ne
.pro
2002
ne
RegistryPro, LTD
Osim tih "generikih", postoje i posebni TLD-i sa 2 slova, tzv. "country-code", koji su uspostavljeni za preko 240 drava i teritorija.
Zone
Poddomene koje zahtijevaju posebnu administraciju nazivamo zone. Jednom kada je odreen autoritet za neku zonu, osoba koja je za nju zaduena mora osigurati vie name servera za tu zonu. Kad god je instaliran novi sistem (host) unutar zone, DNS administrator
832/1275
za zonu alocira ime i IP adresu za novi sistem, te ih unese u bazu podataka name servera. Osoba zaduena za zonu takoer mora osigurati i najmanje jedan redundantni sekundarni name server da bi name servis radio ak i u sluaju ispad jednog sustava. Podaci o novom sistemu se upisuju na disk primarnog name servera, a onda se ti podaci preko zone transfer-a prenose na sekundarne servere, koji redovito (uglavnom svaka 3 sata) auriraju svoju bazu podataka s primarnim serverom. to ako name server radi ako ne sadri informaciju koja se trai upitom? Mora kontaktirati drugi server (to je ta distribuirana priroda DNS-a). Svaki server ipak ne zna kako kontaktirati svaki drugi server. Zato, svaki name server mora znati kako kontaktirati root name server. Taj proces se zove resolution. Root name serveri su glavni DNS serveri za cijeli svijet i svaki ima imena i adrese autoriteta za sve top-level domene (http://www.rootservers.org). Trenutno su u funkciji slijedeih trinaest root name servera:
833/1275
Root Name Serveri (A-M) na dan 29.01.2004. Host a.rootservers.net b.rootservers.net c.rootservers.net d.rootservers.net e.rootservers.net f.rootservers.net g.rootservers.net h.rootservers.net i.rootservers.net j.rootservers.net k.rootservers.net l.rootservers.net m.rootservers.net VeriSign Organizacija IP adresa 198.41.0.4 Mjesto Herndon, VA, USA Marina del Rey, CA, USA Herndon, VA, USA College Park, MD, USA
192.228.79.201
Cogent Communications
192.33.4.12
University of Maryland
128.8.10.90
Internet Systems Consortium, Inc U.S. DoD Network Information Center U.S. Army Research Lab
192.5.5.241
192.112.36.4
128.63.2.53
Autonomica/NORDUnet
VeriSign Reseaux IP Europeens - Network Coordination Centre Internet Corp. for Assigned Names and Numbers WIDE Project
192.58.128.30 Herndon, VA, USA London, United Kingdom Marina del Rey, CA, USA Tokyo, Japan
193.0.14.129
198.32.64.12
202.12.27.33
834/1275
BIND
Najee koritena implementacija DNS-a, protokola, resolvera i name servera zove se BIND tj. Berkley Internet Name Domain. Sastoji se od: Domain Name System server Domain Name System resolver library razni alati za provjeru i ispravan rad DNS servera BIND se obino sa UNIX-om distribuira u paketu s standardnim TCP/IP mrenim software-om. Zadnja verzija se moe pronai na stranicama Internet Software Consortiuma kao Open Source: http://www.isc.org/products/BIND i http://www.bind9.net/
835/1275
836/1275
Telnet naredbe
Ako u naem shell prompt-u napiemo telnet bez ikakvih argumenata, pokreemo telnet servis u naredbenom modu (command mode). Vidje emo poseban telnet prompt (telnet>). Tada moemo unijeti bilo koju telnet naredbu. Ovo su neke od najeih naredbi, a za kompletnu listu treba pogledati manual na naem sistemu.
Opis Spaja se na navedeno raunalo (host) Prekida vezu i vraa se u naredbeni mod Prekida vezu (ako postoji) i zatvara telnet Mijenja vrijednost danog argumenta alje naredbu na remote (udaljeno raunalo) Pokazuje trenutno postavljenu konfiguraciju telnet-a Pokazuje trenutno stanje veze Daje pomo
Kako to sve radi? Naredba open prima 2 argumenta, host i port (opcionalno). Ime host-a je naravno obavezno i odreuje s kojim raunalom se spajamo. To raunalo mora biti dostupno i podravati telnet servis. Ako ne navedemo broj porta, tada se spaja na default-ni port 23. Kada doe do spajanja, remote raunalo preuzima vezu i pokree login proceduru. Nakon logiranja, sve je isto kao da smo se direktno logirali na to, sada udaljeno raunalo. Ukoliko nam je samo potrebno prenijeti datoteke izmeu udaljenih raunala, koristit emo FTP.
837/1275
FTP veza
FTP radi na aplikacijskom nivou OSI (Open System Interconnection) modela i ovisi o TCP-u da bi mogao sigurno prenijeti podatke izmeu host-ova na mrei. Kao takav, ne brine se oko komunikacijske arhitekture i oslanja se na TCP za uspostavljanje veze i prijenos podataka bez pogreke. Kad god FTP klijent pokrene FTP session sa serverskim procesom (kontroliranim in.ftpd daemon-om), TCP uspostavlja dvije konekcije za oba entiteta. Te konekcije su poznate kao control connection i data connection. Konekcije se po default-u otvaraju preko portova 20 (data port) i 21 (control port), ali FTP server (ftpd daemon) moe biti namjeten da slua i na nekim drugim portovima. To se ak moe i vrlo lako napraviti tako da editiramo /etc/service file i zamijenimo broj porta koji je naveden za FTP servis.
838/1275
839/1275
! $
debug dir
Mget Mkdir
account disconnect Mls append form ascii bell get glob Mode
Modtime reget Mput Newer Nmap Nlist Ntrans Open Prompt Proxy
Ipak, nisu sve naredbe implementirane na svim UNIX varijantama ftp-a. Evo jednog primjera gdje je naredba implementirana na lokalnom raunalu, a ne i na udaljenom: ftp> rstatus 502 STAT command not implemented. ftp> Ako naredba nije implementirana lokalno, odgovor e biti drukiji: ftp> rstatus ?Invalid command ftp>
840/1275
Evo jo jednog primjera koritenja ftp-a. Pokreemo ftp, logiramo se, provjeravamo radni direktorij, mijenjamo radni direktorij, postavljamo tip prijenosa na ASCII, aljemo lokalnu datoteku na remote, prekidamo vezu: # ftp canopus Connected to canopus.austin.century.com. 220 canopus.austin.century.com FTP server (Version 4.1 Sat Nov 23 12:52:09 CST 1991) ready. Name (canopus:eric): dee 331 Password required for dee. Password: 230 User dee logged in. ftp> pwd 257 "/home/dee" is current directory. ftp> cd desktop 250 CWD command successful. ftp> type ascii 200 Type set to A. ftp> send typescript 200 PORT command successful. 150 Opening data connection for typescript (128.114.4.99,1412). 226 Transfer complete. ftp> bye 221 Goodbye. #
841/1275
Ovo su neke vanije naredbe koje bi trebale sve varijante ftp-a na UNIX raunalima podravati:
Naredbe vezane za spajanje Open Close Quit Otvara vezu s navedenim host-om. Zatvara trenutno otvorenu vezu. Zatvara vezu i izlazi iz ftp-a. Naredbe vezane za prijenos datoteka binary ascii put mput get mget Mijenja reprezentaciju datoteke u binarni tip. Mijenja reprezentaciju datoteke u ASCII tip. Prenosi jednu datoteku s lokalnog na udaljeno raunalo (remote). Prenosi vie datoteka s lokalnog na udaljeno raunalo. Prenosi jednu datoteku s udaljenog na lokalno raunalo. Prenosi vie datoteka s udaljenog na lokalno raunalo. Naredbe vezane za upravljanje datotekama i direktorijima cd cd .. ls pwd mkdir rmdir mv rm rm Promijeni lokalni ili udaljeni radni direktorij. Promijeni da trenutni radni direktorij bude korijenski direktorij. Prikaz trenutnog radnog direktorija na udaljenom raunalu. Ispis trenutnog radnog direktorija udaljenog raunala. Kreiraj novi direktorij na udaljenom raunalu. Izbrii direktorij na udaljenom raunalu. Promijeni ime datoteke ili direktorija na udaljenom raunalu. Izbrii datoteku na udaljenom raunalu (rm, ime nove datoteke). Izbrii vie datoteka na udaljenom raunalu (rm, vie datoteka). Razne naredbe ? ! Prikaz pomoi za ftp. Izlazak u shell.
Osim prijenosa datoteka, vrlo vana Internet usluga je elektronika pota ili email.
842/1275
843/1275
odnosa razmotrite primjer iz stvarnog ivota kada neka osoba poalje pismo. MUA predstavlja osobu koja alje pismo. On pismo napie, stavi ga u omotnicu, napie adresu i zalijepi marku i zatim ga dostavi u potanski ured. MTA je poput osoblja potanskog ureda oni pismo zaprime, provjere adresu i ako je potrebno preformatiraju je i zatim pismo usmjere ili u potanski sandui u istom potanskom uredu (ako je pismo lokalno) ili u drugi potanski ured (za udaljena odredita). MDA odgovara potaru koji potu iz potanskog ureda isporuuje na namijenjenu lokaciju. Ako je koriten prolaz, ta se slinost moe proiriti MTA koji zaprimi pismo za odredite u drugoj dravi treba tu poruku prenijeti drugom MTAu koji zna kako pismo isporuiti u ciljnoj dravi.
Povijest sendmail-a
Eric Allman je u kasnim 1970-ima bio na University of California u Berkeleyu. Tamo je napisao prethodnika sendmail-a, nazvanog delivermail, koji je izdan 1979. radi rjeavanja problema prijenosa email-a izmeu triju mrea u krugu sveuilita u to vrijeme. Te su tri mree bile ARPANET (koja je koristila NCP - Network Control Protocol), UUCP email sustav i unutarnja mrea nazvana BerkNet. Sljedee je godine ARPANET zapoeo prijelaz s NCP-a na TCP (Transmission Control Protocol). Prije toga je email isporuivan upotrebom FTP-a (File Transfer Protocol), meutim, SMTP je razvijen zbog oekivanja mogueg porasta email prometa na mrei u rasponu od nekoliko puta. U odazivu na te promjene Allman je prihvatio sveobuhvatan pristup formatima poruka elektronike pote. Ako poruka nije odgovarala prihvaenom formatu, sendmail je umjesto odbacivanja poruka radije njen format pokuao prilagoditi. Allman se takoer odluio na ograniavanje namjenskog cilja sendmaila na usmjeravanje pote, umjesto da ukljui i mogunosti email aplikacije za krajnjeg korisnika. Inaica 4.1 BSD (Berkeley Software Distribution) UNIX-a je sadravala i prvo javno izdanje sendmail-a. Drugi su se u meuvremenu, odvojeno od Allmana, bavili proirivanjem mogunosti sendmail-a. Pored razliitih neslubenih nastojanja, bilo je i nekoliko komercijalnih proizvoaa, poput Suna i Hewlett-Packarda, koji su razvili svoje vlastite verzije sendmail-a kada su ustanovili potrebu za poboljanjima koja u trenutnim verzijama nisu bila ukljuena. Iz tih je usporednih razvoja proizalo nekoliko verzija sendmail-a s razliitih razinama kompatibilnosti. Allman je 1998. godine sendmail-u od verzije 8.9 dao komercijalan status, dok je verziju 8.8.x ostavio besplatnom kakva je uvijek i bila.
844/1275
Email protokoli i osnovne SMTP naredbe Email Protokoli Protokol SMTP Opis Simple Mail Transport Protocol, protokol koriten za prijenos pote s jednog Internet host-a na drugi POP Post Office Protocol, definira metodu kako mali host moe dohvatiti potu s veeg host-a bez pokretanja MTA (kao to je sendmail). RFC 1725, 1734 IMAP Internet Message Access Protocol, dozvoljava klijent mail programima pristup i manipuliranje email-om na serveru. RFC 1730, 1731 MIME Multipurpose Internet Mail Extensions, definira metode slanja binarnih podataka kao to su slike, zvuk, datoteke i sl. preko email-a koji su distribuirani kao tekst. RFC 1521, 1522 i drugi PEM Privacy-Enhanced Mail, enkripcija poruke i procedure autentifikacije. RFC 1421, 1422 i 1423 Format of text Standardni forma za Internet email opisan u RFC 822 messages
Osnovne SMTP naredbe Naredba Hello From Recipient Data Reset Verify Expand Help Quit Sintaksa HELO <sending-host> MAIL FROM:<from-address> RCPT TO:<to-address> DATA RSET VRFY <string> EXPN <string> HELP [string] QUIT Funkcija Identificira host-a poiljaoca Adresa poiljaoca Adresa primaoca Poetak poruke Odustanak od poruke Provjera korisnikog imena Otvaranje mailing liste Traenje online pomoi Kraj SMTP session-a
845/1275
Osnovne POP3 naredbe Command USER username PASS password STAT RETR n Funkcija Korisnikovo korisniko ime Korisnikova lozinka Prikaz broja neproitanih poruka/bajtova Povrati poruku broj n
846/1275
Izbrii poruku broj n Prikaz broja zadnje pristupanoj poruci Prikaz veliine poruke n ili svih poruka Povrati sve poruke; resetiraj broj na 1 Ispii zaglavlja i jednu liniju poruke n Ne radi nita Kraj POP3 session-a
Evo jednog primjera kako se, koristei POP3, logirati na server, proitati i izbrisati tri poruke, koristei telnet. # telnet almond 110 Trying 172.16.12.1 ... Connected to almond.nuts.com. Escape character is '^]'. +OK almond POP3 Server Process 3.3(1) at Mon 15-May-95 4:48PM-EDT user hunt +OK User name (hunt) ok. Password, please. pass Watts?Watt? +OK 3 messages in folder NEWMAIL (V3.3 Rev B04) stat +OK 3 459 retr 1 +OK 146 octets The full text of message 1 dele 1 +OK message # 1 deleted retr 2 +OK 155 octets The full text of message 2 dele 2 +OK message # 2 deleted
847/1275
retr 3 +OK 158 octets The full text of message 3 dele 3 +OK message # 3 deleted quit +OK POP3 almond Server exiting (0 NEWMAIL messages left) Connection closed by foreign host.
848/1275
RFC-i
RFC-i (Request for Comments) su izdani od strane radne grupe Internet Engineering Task Force (IETF) i prilagoeni su Internet standardima. Moe ih se smatrati nunim za kompatibilnost. Njihova kompletna arhiva i novosti mogu se nai na: http://www.rfcarchive.org. Ako elite razmjenjivati news s drugim Internet NNTP serverom, morate potivati ono to je propisano standardima RFC 977 i RFC 1036. O emu se zapravo radi:
849/1275
USENET mrea ovisi o radu NNTP servera koji se koriste kao centralne jedinice za pohranu news informacija i podataka. Korisnicima se dozvoljava pristup informacijama preko klijentskih programa tzv. newsreader-ima. Informacije se prenose cijelim USENET-om procesom serverske replikacije, poznatim kao newsfeed. Pristup i klijenata i servera je uspostavljen TCP vezom preko dobro znanog porta 119. NNTP daemon je proces koji se konstantno vrti u pozadini news servera, sluajui na portu 119 ba kao to i SMTP server slua na portu za email konekcije. NNTP klijent programi se tada spajaju na NNTP server i alju komande za itanje i slanje lanaka (articles).
850/1275
Kao i HTTP protokol, NNTP koristi sustav request i response poruka za razmjenu informacija izmeu klijenata i servera. Te poruke su kodirane standardnim setom ASCII znakova. Ovdje je saetak USENET request naredbi za poruke:
Request naredba article <message-id> body <message-id> group newsgroup head <message-id> Help ihave <message-id> last list listgroup newgroups date time newnews date time
Opis Prikazuje zaglavlje poruke, praznu liniju, te tijelo poruke. Prikazuje samo tijelo poruke. Selektira izabranu newsgrupu. Prikazuje zaglavlja selektirane poruke. Daje listu moguih naredbi. Obavjetava server da klijent ima izabranu poruku. Dekrementira trenutni pokaziva na poruku. Vraa listu postojeih news grupa. Izlista trenutne poruke selektirane grupe. Izlista nove grupe nakon navedenog datuma. Izlista nove poruke unutar selektirane grupe nakon navedenog datuma..
next post
Inkrementira trenutni pokaziva na poruku. Pokree postanje poruke s terminatorom tokom (.) na inae praznoj liniji.
Quit slave
Zatvara TCP vezu klijenta sa serverom. Pokazuje da je ovo veza na slave server koji osigurava news servis.
stat
Ovo je primjer operacija s jednom NNTP aplikacijom: klijent se spaja na izabrani news server: 200 usenetserver news server ready - posting ok klijent zahtijeva listu moguih newsgrupa
851/1275
LIST 215 list of newsgroups follows alt.2600 alt.2600.aol ... ... comp.protocols.snmp comp.protocols.frame-relay comp.protocols.tcp-ip ... ... ... select a particular group GROUP comp.protocols.tcp-ip 211 86 1001 1087 comp.protocols.tcp-ip group selected ARTICLE 1002 220 1002 <13343@darkstar.com> Article retrieved, text follows Path: From: Newsgroup: comp.protocols.tcp-ip Subject: HTTP Request Formats Date: 8 March 1997 20:21:32 EST Organization: Deloitte Touche Consulting Group Ovdje dolazi tijelo poruke . kraj poruke je definiran jednom tokom klijent zavrava session koristei naredbu QUIT. QUIT
852/1275
Header approved control date distribution expires followup-to from keywords lines message-id newsgroups organization path references reply-to sender subject summary xref
Opis Za moderiranu newsgroup-u Kontrolna serverska, a ne korisnika poruka. Datum kad je poruka post-ana.. Doseg poruke. Datum kada istjee trajanje. Iza koje poruke dolazi. E-mail adresa poiljaoca. Kljune rijei koje se tiu teme. Broj linija tijela poruke. Jedinstveni ID poruke. Kojoj grupi pripada. Opis organizacije Path u trenutnom sustavu. Na koji se message-id odnosi. Odgovor autoru. Runo unijeto u polje. Tema poruke. Kratki saetak. Ime host-a
Obavezno Opcionalno X X X X X X X X X X X X X X X X X X X
853/1275
854/1275
comp. Computer. Od programiranja do hardware-a i periferija i svega to se tie raunala. misc. news. Miscellaneous. Kad se jednostavno nije znalo kuda strpati grupu, dolazila je ovamo. News o USENET-u. Ovdje ljudi priaju o USENET administraciji, predlau nove grupe... Recreational. Ovdje dolaze razne slobodne aktivnosti, hobiji, a isto tako i umjetnost, muzika... Science. Sve to se tie znanosti, pa i medicine... Social. Razne kulturne grupe, religije, alternativni naini ivota... Talking. Najvie se pria o politici, ali i napada se ne sve i svata.
Sada je to drastino proireno, a jedna od popularnijih je i svakako .alt grupa sa mnogim zanimljivostima. Takoer i skoro svaka drava ima svoju top-level grupu. Tako ljubitelji UNIX-a u Hrvatskoj imaju grupu hr.comp.os.unix.
855/1275
WWW
WWW je velika skupina HTTP servera na Internetu i Web je ustvari najvie zasluan za eksploziju aktivnosti Interneta. WWW je baziran na konceptu koji je 1991. razvijen u European Particle Physics Laboratory (CERN) u Genevi u vicarskoj, od strane Tim BernersLee-a i njegovih suradnika. Velik dio temeljnog posla na Web klijentima, napravljen je u National Center for Supercomputing Applications (NCSA) u University of Illinois u UrbanaChampaign. Danas postoje mnoge organizacije i pojedinci koji razvijaju software za Web klijente i servere, a i mnogi drugi koji te tehnologije koriste za razne svrhe. Nitko ne kontrolira Web, kao to nitko ne kontrolira ni Internet. Ipak postoje ljudi koji se brinu o njemu, a poznati su kao W3 konzorcij: http://www.w3.org.
HTTP
HTTP je primarni aplikacijski protokol koji se nalazi u temelju WWW-a. Omoguuje korisnicima pristup datotekama koje ine Web. Te datoteke mogu biti u mnogo razliitih
856/1275
formata (tekst, grafika, audio, video, ...), ali najei format na Web-u je HyperText Markup Language (HTML). HTML je standardizirani jezik za opis stranice, koji slui za kreiranje Web stranica. Omoguuje osnovne mogunosti za formatiranje dokumenata, ukljuujui i mogunost ukljuivanja grafikih elemenata, te dozvoljava specificiranje hypertext linkova na ostale servere i datoteke.
Preglednici
Mosaic, koji je razvio Marc Andreessen i drugi u NCSA-u, je HTTP klijent, koji se koristi kao preglednik za Web. NCSA Mosaic je besplatan i moe se pokrenuti na razliitim platformama: od raznih varijanti UNIX-a pa sve do Macintosh-a i Windows-a. Naravno, postoje i mnogi drugi preglednici kao to su Opera, Netscape i danas najpopularniji Internet Explorer. HTTP je samo jedan od protokola koji razumije Mosaic. Mosaic klijenti tipino razumiju i najmanje FTP, Gopher te WAIS protokole, dok neki drugi preglednici, npr. Netscape, podravaju i NNTP i SMTP protokole. Web preglednici su nevjerojatno popularni, to je i razumljivo. Omoguuju bogat grafiki interface ogromnom broju resursa na Internetu. Informacije i servisi koje su prije mogli koristiti samo strunjaci, postali su lagano dostupni. Tako se danas preko Interneta moe rezervirati mjesto u restoranu, kupiti karta za kazalite ili provjeriti stanje na cestama. Da bi krenuli na putovanje Internetom, dovoljno je pokrenuti najomiljeniji preglednik za Web i upisati ime stranice koju elimo ili pokrenuti jednu od brojnih trailica Interneta, npr. www.google.com te pronai eljenu stranicu. Samo ime koje upisujemo locira se pomou URL-a (Uniform Resource Locator), i izgleda uglavnom ovako protocol://hostname/path. "Protocol" kae na koji nain se pristupa podacima (uglavnom http). "Hostname" kae ime raunala domaina kojem pristupamo, a "path" je putanja do same datoteke, specifina za host raunalo. Naalost, sigurnost Web preglednika i servera predstavlja veliki problem. Iskoristivost Web-a je velikim djelom njegova fleksibilnost, a fleksibilnost ini kontrolu vrlo tekom. Ba kao to je lake prenijeti i pokrenuti neki program sa Web preglednika nego preko FTP-a, tako je i lake prenijeti i pokrenuti tetni program. Web preglednici ovise o vanjskim programima, tzv. plug-innovima, koji tada pokreu tipove podataka koje sami preglednici ne razumiju. Ponekad i takvi dodaci pregledniku mogu biti maliciozni i opasni, tako da je uvijek potrebno biti oprezan pri pokretanju instalacije takvih dodataka.
857/1275
Dario Dugi
858/1275
to je RPC ?
RPC je mona tehnika za konstrukciju distribuiranih aplikacija koje rade na klijent-server principu.Baziran je na proirenju ideje o uobiajenom ili lokalnom pozivanju procedura tako da pozivana procedura nemora biti smjetena na istom adresnom prostoru na kojem je i procedura koja ju poziva.Dva procesa mogu biti na istom sustavu ili na razliitim sustavima koji su meusobno mreno povezani. Upotrebom RPC-a programeri distribuiranih aplikacija izbjegavaju detalje mrenog suelja.Prijenosna neovisnost RPC-a izolira aplikaciju od psihikih i fizikih elemenata mehanizama podatkovne komunikacije i dozvoljava joj da koristi raznoliki prijenos. RPC ini klijent-server model izraunavanja monijim i lakim za programiranje.U kombinaciji s ONC RPCGEN protokol kompajlerom klijenti vre pozive transparentno kroz lokalno suelje procedure.
client program
MACHINE B (SERVER)
callrpc() function
execute request
call service
execute request
return reply
request completes
program continues
859/1275
Klijent stvara proceduralni poziv koji alje zahtjev na server i zatim eka. Kada stigne zahtjev server poziva izvrnu rutinu koja izvodi uslugu zahtjeva i alje odgovor klijentu.Nakon izvravanja RPC poziva klijentov program se nastavlja. Napomena. RPC osobito podrava mrene aplikacije. ONC RPC protokol je zasnovan na modelu poziva udaljene procedure,to je slino s modelom pozivanja lokalne procedure.U sluaju lokalnog pozivanja.poziva postavlja argumente proceduri na nekoj tono specificiranoj lokaciji (kao npr. prozor registrija). On tada kontrolu prenosi poceduri i s vremenom ju opet dobije nazad.U tom trenutku, rezultat procedure je otpakiran s tono specificirane lokacije i poziva nastavlja s izvravanjem. RPC model je slian tome.Jedan djeli kontrole se logiki "vrti" izmeu dva procesa.To su proces pozivaa i serverski proces.Proces pozivaa prvo alje pozivnu poruku serverskom procesu i zatim eka (blokira se) poruku primitka.Pozivna poruka ukljuuje parametre procedure i pruka primitka ukljuuje rezultate procedura.Jednom kada poruka primitka pristigne rezultati procedure se odpakiravaju i ponovno se nastavlja izvravanje procesa pozivaa. Na strani servera proces miruje ekajui dolazak pozivne poruke.Kada pristigne pozivna poruka,serverski proces otpakirava parametre procedure,proraunava rezultat,alje poruku primitka i tada eka sljedeu pozivnu poruku.U ovom modelu samo je jedan od ta dva procesa aktivan u bilo kojem datom trenutku.Bilo kako bilo,ovaj model je dan samo kao primjer.ONC RPC protokol nema nikakva ogranienja na taj model. Npr. implementacija moe koristiti asinkrone RPC pozive tako da klijent moe raditi neto korisno dok eka potvrdu od servera.Sljedea mogunost je da server kreira odvojene zadatke za procesuiranje dolaznog poziva tako da izvorni server moe biti slobodan za primanje drugih zahtjeva. Postoji nekoliko vanih stvari u kojima se pozivanje udaljenih procedura razlikuje od pozivanja lokalnih: Kontrola pogrijeaka: kada se koristi pozivanje udaljenih procedura greke u radu udaljenih servera i mrea moraju biti uklonjene i pod kontrolom. Globalne varijable: pojedinani argumenti ne mogu biti poslani kao globalne varijable Performanse: udaljene procedure rade neto sporije od lokalnih procedura. Autentifikacija: zbog slanja kroz nesigurne sustave mrea autentifikacija je nuna. Zakljuak je da iako postoje alati za automatsko generiranje klijentskih i serverskih biblioteka za danu uslugu,protokoli svejedno moraju biti paljivo dizajnirani. Mehanizam udaljenog poziva procedure. Udaljena procedura je jednoznano odreena s tri stvari: programskim brojem,brojem verzije i brojem procedure. Programski broj identificira grupu povezanih udaljenih procedura od kojih svaka ima svoj poseban broj procedure.Program se moe sastojati od jedne ili vie verzija..Nadalje,svaka od tih verzija sastoji se od kolekcije procedura koje su dostupne za poziv iz udaljene lokacije.Brojevi verzije omoguuju da mnogobrojne verzije RPC protokola budu istovremeno dostupne.Svaka verzija sadri odreen broj procedura koje se mogu pozvati sa neke udaljene lokacije.Opet,svaka od tih procedura sadri i svoj identifikacijski broj.
860/1275
Na primjeru: Klijent-serv er pogled na bazu podataka koja se nalazi na nekom udaljenom raunalu. Pretpostavimo da moemo pristupiti bazi podataka s neke lokalne stanice(putem NFS-a). Koristimo UNIX za pokretanje shell-a (ljuske) na udaljenom raunalu i preko njega izvravamo naredbu. U tom sluaju javljaju se neki problemi: Postoji mogunost da se naredba izvrava jako sporo Zahtjeva se korisniki raun na udaljenom raunalu Alternativa iz RPC-a je: Instalira se server na udaljenom raunalu koji moe odgovarati na upite Dobiva se povratna informacija pozivanjem upita to e biti puno bre nego u prethodnom pristupu. Za razvoj RPC aplikacije potrebne su sljedee stvari: Specificiranje protokola za klijent-server aplikaciju Razviti program na klijentu i Razviti program na serveru. Ti programi e biti kompajlirani odvojeno.Komunikacijski protokol je ostvaren generiranjem prijelaza i ti prijelazi i RPC (i druge biblioteke) moraju biti povezane. Definiranje protokola
Najlaki nain za definiranje i izvoenje protokola je koritenje npr kompajlera rpcgen. Napomena.Za protokol se mora identificirati ime uslunih procedura te tipovi parametara i povratnih argumenata. Kompajler ita definicije i automatski izvodi prijelaze za klijenta odnosno server. .rpcgen koristi vlastiti jezik (RPC ili RPCL) koji je slinog izgleda kao pretprocesorske direktive. .rpcgen postoji kao samostalni izvrni kompajler koji moe itati posebne datoteke s .x prefiksom. Stoga se za kompajliranje RPCL datoteke jednostavno upisuje: -rpcgen rpcprog.x To e po potrebi izvriti sljedee 4 datoteke: rpcprog_clnt.c klijent prijelaz rpcprog_svc.c server prijelaz rpcprog_xdr.c (ako je potrebno) XDR filteri rpcpro.h datoteka zaglavlja potrebna ako se koriste XDR filteri XDR je apstrakcija podataka za mogunost nezavisne raunalne komunikacije Napomena.Klijent i server ne moraju biti raunala istog tipa.
861/1275
Definiranje klijentovog i serverskog koda aplikacije Sada je potrebno upisati kod klijenta i aplikacije.Oni meusobno moraju komunicirati putem procedura i tipova podataka specificiranih u protokolu. Usluna strana e morati registrirati procedure koje mogu biti pozvane od strane klijenta i morati e vratiti sve podatke potrebne za procesuiranje. Postoji nekoliko razina aplikacijskog suelja koje se mogu koristiti za razvoj RPC aplikacije. Kompajliranje i pokretanje aplikacije Razmorimo cjelokupni potrebni model za pokretanje jedne RPC aplikacije.Stvarane datoteke su korisne za manju optereenost kompajliranja RPC aplikacija,ali je vano prije razumjeti cjelokupni model da bi se mogla sastaviti prikladna takva stvarana datoteka. Pretpostavimo da je naziv klijentovog programa rpcprog.c,usluni program je rpcsvc.c, zatim da je protokol definiran u rpcprog.x te da je rpcgen upotrebljen za stvaranje prijelaza i filterskih datoteka: rpcprog_clnt.c, rpcprog_svc.c, rpcprog_xdr.c,rpcprog.h. Klijentski kao i serverov program moraju sadravati datoteku zaglavlja #include pcprog.h. Zatim je potrebno: kompajlirati kod klijenta cc c rpcprog.c kompajlirati prijelaz klijenta cc c rpcprog_clnt.c kompajlirati XDR filter cc c rpcprog_xdr.c bildati izvravanje klijentovog cc o rpcprog rpcprog.o rpcprog_clnt.o rpcprog_xdr.c kompajlirati uslune procedure cc c rpcsvc.c kompajlirati server prijelaz cc c rpcprog_svc.c bildati izvravanje serverovog cc o rpcsvc rpcsvc.o rpcprog_svc.o rpcprog_xdr.c Nakon toga jednostavno pokrenemo programe rpcprog i rpcsvc na klijentu odnosno serveru. Napomena.Serverske procedure moraju biti registrirane prije no to ih klijent moe pozvati.
862/1275
Gornji nivo
Na gornjem nivou suelje je i dalje jednostavno,ali program mora ostvariti kontrolu nad klijentom prije pozivanja i isto tako prije primanja poziva mora uspostaviti kontrolu nad serverom.Ako elite pokretati aplikaciju na svim prijenosima koristite ovo suelje.
clnt_create() opi nain stvaranja klijenta.Program kae clnt_create() gdje se nalazi server i koji tip prijenosa treba koristiti. clnt_create_timed () slino kao clnt_create() ali dozvoljava programeru da specificira maksimalno dozvoljeno vrijeme za svaki pokuaj neke vrste prijenosa u toku stvaranja.
svc_create() stvara kontrolu nad serverom za sve prijenose odreenog tipa.Program govori svc_create() koju izvrnu funkciju treba koristiti. clnt_call() klijent zahtjeva od procedure da poalje zahtjev na server.
Srednji nivo
Suelje srednjeg nivoa RPC-a omoguava kontrolu nad detaljima.Programi napisani na ovim niim razinama su kompliciraniji ali rade puno djelotvornije.Srednji nivo omoguuje specificiranje prijenosa koji e se koristiti. clnt_tp_create() stvara kontrolu nad klijentom za odreeni prijenos. clnt_tp_create_timed() slino kao i clnt_tp_create() ali dozvoljava programeru da specificira i maksimalno dozvoljeno vrijeme.
863/1275
svc_tp_create() stvara kontrolu nad serverom za odreeni prijenos. clnt_call() klijent poziva proceduru za slanje zahtjeva na server.
Struni nivo
Struna nivo sadri vei broj rutina s kojima specificiramo parametre povezane s prijenosom. Upotreba tih rutina: clnt_tli_create() stvara kontrolu nad klijentom za odreeni prijenos. svc_tli_create() stvara kontolu nad serverom za odreeni prijenos. rpcb_set() poziva RPC obvezu za postavljanje puta izmeu RPC usluge i mrenih adresa. rpcb_unset() brie mapiranje postavljeno s rpcb_set(). rpcb_getaddr() poziva RPC obvezu za dobivanje adresa prijenosa od specificiranih RPC usluga. svc_reg() povezuje specificirani par programa i broj verzije s odreenom izvrnom rutinom. svc_unreg() brie povezivanje postavljeno s svc_reg(). clnt_call() -- klijent poziva proceduru za slanje zahtjeva na server.
Donji nivo
Donji nivo sadri rutine koje se koriste za potpunu kontrolu nad opcijama za prijenos. clnt_dg_create() stvara RPC kontrolu kljineta za odreeni udaljeni program koristei bezspojnu vezu. svc_dg_create() stvara RPC kontrolu servera koristei bezspojnu vezu. clnt_vc_create() stvara RPC kontrolu klijenta za odreeni udaljeni program,koristei normalni spojni prijenos. sc_vc_create() stvara RPC kontrolu nad serverom koristei spojni prijenos. clnt_call() klijent poziva proceduru za slanje zahtjeva na server.
864/1275
Ovaj dio objanjava kako je izvedeno C suelje prema RPC-u i opisuje kako napisati mrenu aplikaciju koristei RPC. Napomena.Za kompletnu specifikaciju rutina u RPC biblioteci pogledati u rpc i s njima povezane man dokumente.
Pojednostavljeno suelje
Pojednostavljeno suelje je najlaka razina,jer ne zahtjeva koritenje bilo kojih drugih rutina RPC-a.Razvoj programa na ovoj razini moe biti vrlo brz i direktno je podran od strane rpcgen kompajlera.Z veinu aplikacija,lakoa rukovanja rpcgen-om je dovoljna. Neke RPC usluge nisu dostupne kao funkcije C-a ali su stoga dostupne kao RPC programi.Pojednostavljeno suelje uskladitenih rutina omoguava lakou upravljanja RPCom za programe koji ne zahtjevaju veu razinu kontrole. Rutine poput rusers nalaze se u RPC biblioteci librpcsvc.rusers.c. Sljedi primjer programa koji ispisuje broj korisnika na udaljenom raunalu hostu. On poziva rusers RPC rutinu iz biblioteke.
---program.c ----
main (int argc,char **argv) { int num; if (argc != 2) { fprintf (stderr, "usage: %s hostname\n",argv[0] ); exit(1); } if (( num = rnusers ( argv[1] )) <0 ) { fprintf (stderr, error: rusers\n"); exit(0); }
865/1275
Zatim program treba kompajlirati s lijnijom koda: cc program.c lrpcsvc lnsl Klijentska strana Pojednostavljeno rpc_call() suelje ima samo jednu funkciju na strani klijenta. Sadri 9 parametara: int rpc_call (char *host, u_long prognum, u_long versnum, xdrproc_t inproc, char *in, xdr_proc_t outproc, char *out, char *nettype ); Funkcija poziva funkciju koja je specificirana od prognum, versum i procnum-om na hostu.Argument koji se alje udaljenoj proceduri odreen je in parametrom i inproc je XDR filter za enkodiranje tog parametra.Izlazni parametar out je adresa gdje se rezultat (te udaljene procedure) treba staviti.outproc je XDR filter koji dekodira rezultat i postavlja ga na tu adresu. Klijent blokira rpc_call() dok ne dobije povratnu informaciju od servera.Ako server prihvaa,on vraa RPC_SUCCESS koji ima vrijednost 0.RPC_SUCCESS e vratiti vrijednost 1 ako je poziv neuspjean. Ta vrijednost moe biti pokaziva na tip clnt_stat, enumerirani tip definiran u datoteci zaglavlja <rpc/rpc.h> i interpretiran s clnt_sperrno() funkcijom.Ova funkcija vraa pokaziva na standardnu RPC poruku ogreci. U primjeru su pokuani svi "vidljivi" prijenosi nabrojeni u /etc/netconfig. Prilagoavanje broja pokuaja zahtjeva koritenje niih nivoa RPC biblioteke.Brojni Argumenti i rezultati su rjeeni sakupljanjem istih u strukture. Primjer izmjenjen tako da koristi pojednostavljeno suelje izgleda poput:
#include<stdio.h> #include<utmp.h> #include<rpc/rpc.h> #include <rpcsvc/rusers.h> /* program koji poziva rusersprog RPC program*/ main (int argc, char **argv) { unsigned long nusers; enum clnt_stst cs; if ( argc != 2 ) { fprintf (stderr, "usage: rusers hostname\n");
866/1275
if ( cs = rpc_call(argv[1], RUSERSPROG, RUSERSVERS, RUSERSPROC_NUM, xdr_void, (char *) 0 , xdr_u_long, (char *) &nusers, "visible" ) != RPC_SUCCESS ) { clnt_perrno (cs); exit(1); } fprintf(stderr, "%d users on %s\n", nusers,argv[1] ); exit(0); }
Budui da tipovi podataka mogu biti drugaije zastupljeni na razliitim raunalima rpc_call() treba i tip i pokaziva RPC argumenta(slini i za rezultat). Za RUSERSPROC_NUM povratna vrijednost je unsigned long stoga je prvi povratni parametar rpc_call() a xdr_u_long (koji je za unsigned long) i drugi je &nusers ( koji pokazuje na unsigned long skladite).Zbog toga to RUSERSPROC_NUM nema argumenata, xdr enkodirajua funkcija rpc_call()-a je xdr_void i njen argument je NULL vrijednost.
Serverska strana Serverski program je vrlo jednostavan jer korisi pojednostavljeno suelje. Jednostavno poziva rpc_reg() za registraciju procedure koja se treba pozvati i tada se poziva svc_run() (prosljeiva udaljenih procedura iz RPC biblioteke) da eka zahtjev za ulaskom. rpc_reg() ima sljedei prototip: rpc_reg ( u_long_prognum, u_long_versnum, u_long_procnum, char *procname, xdrproc_t inproc, xdrproc_t outproc, char *nettype ); svc_run() poziva servisne procedure kao odgovor na RPC pozivne poruke. Prosljeiva u rpc_reg()-u vodi brigu o dekodiranju argumenata udaljenih procedura i rezultata enkodiranja, koristei XDR filtere specificirane u toku registriranja udaljene procedure. Neke biljeke o programu servera: veina RPC aplikacija prati dogovoreno imenovanje dodajui _1 imenu funkcije. Sekvenca _n je dodana imenu procedure da pokae broj verzije n odreene usluge.
867/1275
Argument i rezultat alju se kao adrese.To vrijedi za sve udaljeno pozivane funkcije.Ako se poalje NULL kao rezultat funkcije tada se klijentu ne alje potvrda.Pretpostavlja se da nema potvrde za slanje. Rezultat mora postojati u statinom prostoru podataka jer se njegovoj vrijednosti pristupa nakon to se izalo iz aktualne procedure.funkcija RPC biblioteke koja stvara RPC poruku potvrde pristupa rezultatu i alje vrijednost nazad klijentu. Dozvoljen je samo jedan argument.Ako postoji vei broj podataka oni trebaju biti povueni unutar procedure koja tada moe biti poslana kao jedna informacija. Procedura je registrirana za svaki prijenos odreenog tipa.Ako je tip parametra (char *) NULL ,procedura je registrirana za sve prijenose specificirane u NETPATH-u. Ponekad se moe implementirati puno bri ili kompaktniji kod od rpcgena a. Sljedei program je primjer runo programirane registracijske rutine.Ona registrira pojedinu proceduru i pristupa svc_run()-u na zahtjev usluge.
#include<stdio.h> #include<rpc/rpc.h> #include<rpcsvc/rusers.h> void *rusers ();
main() { if (rpc_reg(RUSERSPROG, RUSERSVERS,RUSERSPROC_NUM, rusers, xdr_void, xdr_u_long, "visible" ) = = -1 ) { fprintf (stderr, "Couldn't Register\n"); exit (1); }
rpc_reg() moe biti pozvan toliko puta koliko je potrebno registrirati razliite programe, verzije i procedure.
868/1275
obrnuti proces se naziva deserializing.Argumenti prijevoda rpc_call() i rpc_reg() mogu specificirati XDR primitivne procedure kao npr xdr_u_long(). Sljedee primitivne XDR rutine su dostupne: xdr_int() xdr_netobj() xdr_u_long() xdr_enum() xdr_long() xdr_float() xdr_u_int xdr_bool() xdr_short() xdr_double() xdr_u_short() xdr_wrapstring() xdr_char() xdr_quardruple() xdr_u_char() xdr_void() Takozvana, neprimitivna rutina xdr_string(), koja uzima vie od dva parametra,poziva se iz xdr_wrapstring(). Primjer programerske rutine,struktura:
struct simple { int a; short b; } simple;
sadri pozivajui argument procedure.XDR rutina xdr_simple() prevodi strukturu na sljedei nain:
#include <rpc/rpc.h> #include "simple.h" bool_t { if ( !xdr_int ( xdrsp, &simplep -> a )) return (FALSE); if ( !xdr_short (xdrsp, &simplep -> b )) return (FALSE); return (TRUE); } xdr_simple (XDR *xdrsp, struct simple *simplep)
Njoj ekvivalentna rutina moe se automatski generirati rpcgen-om. XDR rutina vraa nulu ako se izvri neuspjeno,u protivnom vraa broj razliit od nule.
869/1275
Za jo kompleksnije podatkovne strukture koriste se XDR rutine; xdr_array() xdr_bytes() xdr_string() xdr_opaque() xdr_reference() xdr_vector() xdr_union() xdr_pointer()
Npr. Za slanje polja integera,sadrane su u strukture koje sadre polje i njegovu veliinu.
bool_t xdr_varintarr(XDR *xdrsp, struct varintarr *arrp) { return(xdr_array(xdrsp, (caddr_t)&arrp -> data,(i_int *) &arrp ->arrlnth, MAXLEN, sizeof(int), xdr_int)); }
Argumenti XDR polja su XDR upravljana,pokaziva na polje,pokaziva na veliinu polja i pokaziva na XDR rutinu za prijevod svakog elementa polja. Ako je veliina polja unaprijed poznata,koristi se xdr_vector() jer je puno efikasnija.
int intarr[SIZE]; bool_t xdr_intarr(XDR *xdrsp,int intarr[]) { return (xdr_vector(xdrsp, intarr, SIZE, sizeof(int), xdr_int)); }
Za polje tipa char svaki znak zauzme 32 bita.xdr_bytes() pakira znakove.Ima 4 parametra koji su slini s prva 4 parametra xdr_array()-a.
870/1275
Stringovi s null vrijednostima su prevedeni s xdr_string().Isto kao xdr_bytes() samo bez parametra za duljinu.Kod "serializing"-a uzima duljinu stringa od strlen(),a kod "deserializing"-a stvara string s null vrijednou. xdr_reference() poziva funkcije xdr_string() i xdr_reference(), koje prijevode pokazivae na nain da alju stringove.
struct fileexample { char *string; struct simple *simplep; } finalexample; bool_t xdr_finalexample(XDR *xdrsp, struct finalexample *finalp) { if (! xdr_string(xdrsp, %finalp -> string, MAXSTRLEN)) return (FALSE); if (! xdr_reference(xdrsp, &finalp -> simplep, sizeof(struct simple), xdr_simple)) return(FALSE); return(TRUE); }
871/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb strcpy (dir,argv[1]); read_dir(dir); printf("%s\n", dir); exit(0); }
zasigurno moramo djeliti veliinu meu datotekama.Kasnije kada razvijemo RPC verzije, vie informacija e biti potrebno unjeti u tu datoteku. Lokalni program se kompajlira sljedeom datotekom: cc lls.c read_dir.c o lls Sada elimo prilagoditi ovaj program da radi na cijeloj mrei; dozvoljavajui nam nadziranje direktorija udaljenog servera. Sljedei koraci su potrebni: Trebamo konvertirati read_dir.c da se pokree na serveru. - trebati emo registrirati server i rutinu read_dir() na tom serveru
872/1275
Klijent lls.c e trebati pozvati rutinu kao udaljenu proceduru. Morati emo definirati protokol za komunikaciju izmeu klijentskih i serverskih programa.
Definiranje protokola
Moemo koristiti string s null vrijednou za slanje i primanje naziva direktorija i njegovog sadraja.tovie, moemo ugraditi slanje tih parametara direktno u kod klijenta i servera.Zbog toga moramo odrediti program,proceduru i brojeve verzija za klijenta i servera.To se moe uiniti automatski koristei rpcgen ili oslanjajui se na predefinirane makroe u pojednostavljenom suelju. Ovdje emo ih specificirati runo.Server i klijent se u toku izvoenja moraju sloiti koje e logike adresekoristiti. Brojevi programa su definirani na standardni nain: 0x00000000 0x1FFFFFFF: definirani od Sun-a 0x20000000 0x3FFFFFFF: runo definirani 0x40000000 0x5FFFFFFF: gost 0x60000000 0xFFFFFFFF: rezervirani
Jednostavno emo izabrati korisniki definirane vrijednosti za na broj programa. Verzija i brojevi procedura su postavljeni na temelju standardne prakse. I dalje imamo DIR_SIZE definiciju zahtjevanu od lokalne verzije. Naa nova datoteka rls.h sadri:
#define #define #define #define DIR_SIZE 8192 DIRPROG ((u_long) 0x20000001) DRIVERS ((u_long) 1) READDIR ((u_long) 1)
Djeljenje podataka
Ve smo prije napomenuli da podacima moemo prosljediti stringove. Moramo definirati XDR filtersku rutinu xdr_dir() koja djeli podatke. To je jednostavno i definirano je preko standardne xdr_string() rutine. XDR datoteka rls_xdr.c izgleda ovako:
#include<rpc/rpc.h> #include "rls.h" bool_t xdr_dir(XDR *xdrs, char *objp)
873/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb { return (xdr_string(xdrs, &objp, DIR_SIZE)); }
Serverska strana Moemo upotrijebiti orginalnu read_dir.c datoteku.Sve to trebamo uiniti je registrirati proceduru i pokrenuti server.Procedura je registrirana s registerrpc() funkcijom. To je prototip: registerrpc(u_long prognum, u_long versnum, u_long procnum, char *procname, xdrproc_t inproc, xdrproc_t outproc); Parametri jednostavno definirani kao i u rpc_reg pojednostavljenom suelju. Ve smo raspravljali o postavkama parametara s rls.h datotekama zaglavlja i rls_xdr.c XDR filterskom rutinom. svc_run() rutina je isto opisana ranije u tekstu. Kompletni kod datoteke rls_svc.c je sljedei:
#include<rpc/rpc.h> #include "rls.h" main() { extern bool_t xdr_dir(); extern char *read_dir(); registerrpc(DIRPROG, DRIVERS, READDIR, read_dir, xdr_dir, xdr_dir); svc_run(); }
Klijentska strana Na strani klijenta jednostavno moramo pozvati udaljenu proceduru.To radi funkcija callrpc(). Njezin prototip je sljedei: callrpc(char *host, u_long prognum, u_long versnum, char *in, xdr_proc_t inproc, char *out, xdr_proc_t outproc pozivamo lokalnu funkciju read_dir() koja koristi callrpc() za pozivanje udaljene procedure koja je registrirala READDIR na serveru.
874/1275
#include<stdio.h> #include<strings.h> #include<rpc/rpc.h> #include"rls.h" main (argc,argv) int argc;char *argv[]; { char dir[DIR_SIZE]; strcpy(dir,argv[2]); read_dir(argv[1], dir); printf("%s\n", dir); exit(0); } read_dir(host-dir) char *dir, *host; { extern bool_t xdr_dir(); enum clnt_stat clnt_stat; clnt_stat=callrpc( host, DIRPROG, DRIVERS, READDIR, xdr_dir, dir,xdr_dir,dir); if (clnt_stat !=0) clnt_perrno(clnt_stat); }
Savjet: Za vjebu kompajlirajte i pokrenite udaljenu datoteku rls.c. Pokrenite oboje,klijent i server program lokalno te ako imate mogunosti preko mree.
875/1275
Zvonimir Jankovi
RLOGIN RSH
876/1275
TELNET
Telnet je Internet servis koji omoguava spajanje na udaljeno raunalo (remote computer) preko Interneta. Telnet program spaja nae (lokalno) raunalo na drugo raunalo kao obini terminal. Prikaz je iskljuivo tekstualni. Za rad s telnetom potrebno je imati instalirani Telnet program (telnet, TeraTerm, Netterm...). Neke osnovne UNIX naredbe koje emo koristiti pri telnetu na neki UNIX server: - pwd - ispisuje apsolutni put do radnog direktorija - cd - mijenja radni direktorij - mkdir - stvara novi direktorij - ls - ispisuje sadraj direktorija (opcija -al za detalje) - cp - kopira datoteke i direktorije - mv - premjeta datoteke - rm - brie datoteke - chmod - mijenja prava pristupa direktoriju - logout - prekida vezu sa serverom - passwd - omoguuje mijenjanje passworda
telnet host Naredbe telnet koristi se za uspostavljanje virtualne terminalske sesije sa drugim raunalom u mrei. Parametar u pozivu ove naredbe host moe biti ime ili IP adresa ciljnog hosta. Nakon uspostavljanja veze sa remote hostom, pojavljuje se standardni login prompt i od korisnika se oekuje da proe uobiajenu proceduru logiranja. Telnet sesija se zavrava odjavljivanjem sa remote hosta takoer na standardni nain (logout komandom ili sa < Ctrl >D). Escape karakterom (< Ctrl > ]) telnet prelazi u lokalni mod i posjeduje izvjestan skup lokalnih naredbe i. Jedna od znaajnijih je close kojom se prekida sesija. Ovaj nain se obino koristi u neregularnim sluajevima kada je, recimo zbog loih veza, nemogue regularno prekinuti telnet sesiju.
877/1275
primjer: venus 1% hostname venus venus 2% telnet ban.junis Traying 160.99.1.1... Connected to ban.junis.ni.ac.hr Escape character is '^]' IRIX 5.3 (ban.junis.ni.ac.hr) ban login: user_name passwd: ******* ban 1% logout Connection closed by foreign host. venus 3% % telnet afrodita.rcub.zg % telnet 160.99.1.72 % telnet zmaj.eecs.wsu.edu
878/1275
879/1275
rlogin
rlogin -l login_name host Ovo je jo jedan nain startanja virtualne terminalske sesije. Program rlogin prijavljuje korisnika na udaljeno raunalo. Obino imate tako namjetena raunala u kojima hrpa raunala koristi isto korisniko imena. NIS (Network Information Service) je distribuirani sustav baza podataka koji dozvoljava sustavima dijeljenje datoteka s lozinkama i druge datoteka preko mree. Olakava odravanje mree jer se sve konfiguracijske informacije o korisnikim raunima spremaju na jedno raunalo, NIS glavni posluitelj. Zbog toga to dri tako osjetljive materijale poput lozinki, vrlo ga je vano ispravno konfigurirati. Nakon prijavka na jedan stroj, svi drugi mogu pretpostaviti da ete koristiti isto ime i lozinku , kada se prijavljuje na jedan od njih. rlogin takoer prebacuje i tip terminala koji koriste , pa cak i ako drugi sustav zatrai da unesete tip terminala. Ako udaljeni sustav ne prepoznaje vae korisniko ime pita vas za njega i lozinku.Dvije datoteke odreuju rlogino-ov zakljuak ako da elite koristiti isto korisniko ime tada se prijavite na drugo raunalo.Prva se zove/etc/hosts.eguiv. Na svakom stroju, ova datoteka daje popis svih strojeva koja imaju ista korisnika imena.Pojedinani korisnici mogu imati accounte (manipulacija korisnikim raunima, obraunavanje koritenja resursa dodijeljenih odreenom klijentu) na strojevima izvan lokalne grupe ili odjelu ima svoje. Datoteka rhosts. Korisnik moe imati takvu datoteku na bilo kojem raunalu na kojem ima korisniki raun. Na taj nain eljelo se olakati rad time to se lozinka trai samo kod prijave na neko od tih raunala i omoguuje automatska prijava za rad na bilo kojem pouzdanom domainu. Korisnik ne gubi vrijeme upisujui lozinke kad se poeli prijaviti na neko drugo raunalo. Dovoljno je znati lozinku na jednom od raunala, umjesto pamtiti sve lozinke. Logika kojom su se autori rukovodili bila je: ako zna lozinku, ti si autentificiran; raunala u .rhosts datoteci vjeruju jedno drugom polazei od principa da nitko od njih ne moe biti kompromitiran; ako te jedno raunalo autentificiralo, ostala mogu vjerovati njegovoj izjavi. login_name - login ime korisnika na remote hostu. Ako se ne zada koristi se ime korisnika sa lokalnog hosta. host - IP adresa ili ime remote hosta.
880/1275
primjeri: % rlogin ban.junis % rlogin melmack % rlogin afrodita.rcub.zg.ac.hr % rlogin afrodita.rcub.zg % rlogin zmaj.eecs.wsu.edu
ftp(1)
ftp host FTP (File Transfer Protocol) sluzi za prijenos fajlova sa jednog raunala u mrei na drugi. Kao i do sada, host predstavlja adresu ili ime udaljenog hosta sa koga (ili na koji) se eli transfer fajlova. Po uspostavljanju veze sa udaljenim hostom, od korisnika se zahtjeva da obavi login proceduru koja je vrlo slina standardnoj pri uspostavljanju terminalske sesije. Dakle, korisnik navede login ime i password koji odgovaraju remote hostu. Ukoliko je procedura identifikacije uspjeno obavljena, ftp ulazi u interaktivni mod i korisnik moe poeti sa radom. U suprotnom se preporuuje izlazak iz programa i ponavljanje procedure.
881/1275
U sljedeoj tabeli su date najznaajnije interaktivan naredbe programa ftp. pwd Daje potpuni put tekueg direktorijuma na remote hostu. Izvrava komandu command u lokalnom shell-u. Na primjer: !ls !command lista sadraj tekueg direktorijuma a !pwd ispisuje tekui direktorijum na lokalnom hostu. ls,dir cd path lcd dir prikazuju sadraj tekueg direktorijuma na remote hostu. Mijenja tekui direktorijum na remote hostu. Promjena tekueg direktorijuma na lokalnom hostu. Bez argumenata ispisuje tekui direktorijum na lokalnom hostu. Postoje dva reima prijenosa fajlova, zavisno od njihovog tipa. Tekstualni fajlovi ascii, bin se prenose u ascii a binarni u bin reimu. Tekstualni fajlovi se mogu prenositi i u bin modu, meutim prijenos binarnih fajlova u ascii modu dovodi do oteenja sadraja tako da o ovome treba voditi rauna. put file_name get file_name mget file_name mput file_name quit Transfer fajla file_name sa lokalnog na remote host.
Transfer fajla file_name sa remote na lokalni host. Slino kao i get samo sto file_name u ovom sluaju moe da sadri univerzalne znake (*, ?, []). Slino kao i put samo sto file_name moze da sadri univerzalne znake. Prekid ftp sesije.
882/1275
primjer: % ftp venus.elfak.ni.ac.zg Connected to venus.elfak.ni.ac.zg. Name (venus:srle): mirko 331 Password required for mirko. Password: **** 230 User mirko loged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls ftp> ascii ftp> put paper.txt ftp> get config.txt ftp> bin ftp> mget *.Z ftp> quit % U veini raunalnih mrea velikih ustanova obino postoji po jedan javni ftp server (anonymous ftp) na kome se nalaze podaci dostupni korisnicima bez obzira da li oni posjeduju raun na serveru ili ne. Kod pristupa ovakvim serverima korisnik kao login ime navodi ftp ili anonymous a kao password bilo sta, obino e-mail adresu. primjer: % ftp ftp.elfak.ni.ac.zg Name (venus:srle): ftp Password: srle@elfak.ni.ac.zg
883/1275
FINGER(1)
finger [user[@host]] Naredba finger se dobivaju podaci o korisniku user na hostu host. Ti podaci obuhvaaju njegovo login ime, puno ime, HOME direktorijum, shell koji koristi i slino. Ako se host parametar ne zada, podrazumijeva se da se radi o korisniku na lokalnom hostu. Ako se izostavi user, finger daje spisak korisnika koji su trenutno logovani na raunaru host. primjeri: % finger Daje spisak prijavljenih korisnika na lokalnom hostu. Slino kao who ili w. % finger srle Daje podatke o korisniku srle na lokalnom hostu. % finger @ban.junis.ni.ac.hr Daje spisak logovanih korisnika na hostu ban.junis.ni.ac.yu. %finger srle@ban.junis.ni.ac.hr Daje podatke o korisniku srle na hostu ban.junis.ni.ac.zg.
884/1275
PING(1)
ping host Naredba ping moze biti od koristi pri provjeri veze ka nekom hostu. Parametar host moze biti ime ili IP adresa hosta ka kome se veza eli provjeriti. Ova naredba konstantno alje pakete specificiranom hostu i ako je veza u redu, spomenuti host vraa pakete iste sadrzine lokalnom hostu. Na korisnikom terminalu se ispisuju informacije o vraenim paketima. Naredba se prekida sa < Ctrl >C nakon ega se dobiva zbirna statistika koja govori o kvalitetu veze ka ciljnom hostu (broj poslanih, primljenih i izgubljenih paketa kao i srednja vremena kanjenja). Za sluaj da veza nije u redu svi poslati paketi ce biti izgubljeni i od ciljnog hosta ne treba oekivati nikakve mrene usluge. Principali su sustavi koji se koriste da se autentificira korisnik posluitelju ili usluzi. Svaki sustav definira neki skup principala. Neki od najeih su: korisniko ime (username) identitet korisnika ime domainskog raunala (hostname) identitet domainskog raunala (host) klijent (client) raunalo koje zahtjeva uslugu od nekog radnog (domainskog) raunala u ime korisnika posluitelj (server) domainsko raunalo koje prua usluge
885/1275
Marija Bili
SAMBA I NFS
886/1275
SAMBA POSLUITELJ
Samba programski paket je skup programskih modula, koji omoguuju dijeljenje raunalnih resursa izmeu meusobno umreenih raunala sa instaliranim razliitim operativnim sustavima. U dananje vrijeme se esto unutar iste lokalne raunalne mree koriste raunala sa instaliranim razliitim vrstama i inaicama operativnih sustava, gdje se tipino radi o koritenju razliitih inaica Windows operativnih sustava (Win98/NT/2000) u kombinaciji sa nekom od brojnih Linux distribucija (RedHat, Mandrake, Debian, SuSe). Samim time javlja se potreba za meusobnim dijeljenjem resursa izmeu spomenutih platformi, kako bi se to bolje iskoristili svi raspoloivi resursi unutar raunalne mree. Upravo Samba programski paket je taj koji omoguuje integraciju Linux raunala u Microsoft okolinu, u kojoj Windows raunala nee biti niti svjesna da komuniciraju i pristupaju raunalima sa nekim drugim operativnim sustavom. Na taj nain mogu je prikaz Linux raunala sa instaliranim Samba paketom unutar Network Neighbourhood ili Windows Explorer okruja. Osnovni razlog zbog kojeg je potrebno koritenje Samba paketa je taj to Microsoft koristi neto drugaije protokole i servise koji omoguuju mrenu komunikaciju meu raunalima u odnosu na ostale operativne sustave. Osnovni protokol koji omoguuje meusobno dijeljene resursa izmeu Windows raunala je SMB (Service Message Block) protokol. Taj protokol dalje koristi NetBIOS (Network Basic I/O System) i druge protokole nie razine, kako bi se omoguilo lociranje te meusobna komunikacija izmeu pojedinih raunala. Takav pristup bitno se razlikuje u odnosu na klasine mrene protokole (TCP, UDP, IP), koji su udomaeni kod veine drugih operativnih sustava, to je u osnovi izvor svih problema. Razlog tomu je taj to Microsoftovi protokoli bili prvenstveno namijenjeni za koritenje u LAN mreama.
887/1275
NetBIOS protokol
Za meusobnu komunikaciju unutar Windows okruja, raunala koriste NetBIOS imena. NetBIOS imena vezana su iskljuivo za Windows platforme, i u osnovi nemaju nikakvih slinosti sa imenima strojeva kakva koristi DNS sustav imenovanja. NetBIOS imena za razliku od FQDN (Fully Qualified Domain Name) imena kakve koristi DNS sustav, sastoje se od 15 znakova, koji odreuju njegovo ime, plus esnaesti znak koji odreuje servise koje to raunalo nudi. Kako bi se rijeio problem spajanja lokalne mree koja koristi NetBIOS (LAN u Windows okruju) sa mreama koje koriste TCP/IP i UDP/IP protokole (Internet) razvijen je NBT (NetBIOS over TCP/IP) standard koji odreuje kako bi NetBIOS trebao raditi preko TCP/UDP mrea. Standard odreuje tri osnovne usluge: usluga za povezivanje NetBIOS imena sa IP adresom, datagrami, sesije. Usluga za povezivanje imena sa IP adresom omoguava svakom raunalu da koristi specifino ime na mrei koje e biti prevedeno u IP adresu (slino kao DNS usluga na Internetu). Datagrami i sesije su sekundarni komunikacijski protokoli koji se koriste za razmjenu podataka izmeu NetBIOS raunala preko mree.
888/1275
Osim toga, potrebno je osigurati pretvaranje NetBIOS imena u specifine IP adrese ( name resolution). I za ovo postoje dva razliita pristupa: svako raunalo moe vratiti svoju IP adresu kad se prozove njegovo NetBIOS ime (Slika 1.3). NBNS se moe koristiti za povezivanje NetBIOS imena sa IP adresama (Slika 1.4).
889/1275
Prilikom ukljuivanja raunala na mreu koja ne koristi NBNS posluitelj, novo raunalo alje poruku, u kojoj specificira NetBIOS ime s kojim se eli prikljuiti na mreu, svim raunalima u mrei (broadcast). Ako to ime ne koristi niti jedno drugo raunalo tada e ga novo raunalo zadrati. U sluaju da to ime ve koristi neko raunalo u mrei, ono e javiti novom raunalu da je to ime zauzeto. Problem s broadcast-om, osim to zaguuje mreu, je i u tome to ima problema sa mreama koje imaju vie od jedne podmree zbog usmjerivaa koji su esto konfigurirani tako da blokiraju pakete koji su broadcast svim raunalima na podmrei. Ako se koristi NBNS posluitelj tada se deava ista stvar samo to se komunikacija odvija samo izmeu novog raunala i NBNS-a. Novo raunalo javlja NBNS-u koje ime eli koristiti a NBNS javlja novom raunalu je li to ime slobodno ili nije. Slino je i sa povezivanjem NetBIOS imena i IP adresa. Ako se ne koristi NBNS tada se svim raunalima u mrei alje NetBIOS ime, a raunalo kojem to ime pripada vraa svoju IP adresu. Ako se koristi NBNS tada se njemu alje NetBIOS ime a on vraa odgovarajuu IP adresu. Iz svega reenog lako se moe vidjeti da koritenje NBNS posluitelja uvelike rastereuje mreu i ubrzava komunikaciju zbog uklanjanja potrebe za slanjem poruka svim raunalima u mrei (broadcast).
890/1275
WINS (Windows Internet Name Service) je Microsoft-ova implementacija NBNS-a. Kad se raunalo spoji na mreu, ono mora prijaviti svoje ime i IP adresu lokalnom WINS posluitelju. WINS posluitelj e zadrati tu informaciju sve dok novo raunalo periodiki osvjeava svoju registraciju, to pokazuje da je jo uvijek spojeno na mreu.
Kontrolor domene
Kontrolor domene je glavni dio Windows domene (slino kao NIS posluitelj u Linux/Unix svijetu). On ima vie zadataka. Jedan je briga oko pravilne provjere autentinosti korisnika. Provjera autentinosti je proces dodjele ili zabrane pristupa korisniku dijeljenim resursima na drugom raunalu spojenom na mreu (koritenjem korisnike zaporke). Svaki kontrolor domene koristi SAM (security account manager) za odravanje liste korisnikih imena i zaporki. Kontrolor stvara centralni repozitorij zaporki i korisnikih imena to je mnogo efikasnije nego da svako raunalo na mrei mora odravati stotine zaporki za svaki dijeljeni resurs koji je dostupan na mrei. U Windows domeni, kada neautentian klijent zatrai pristup dijeljenom resursu na nekom posluitelju, posluitelj e pitati kontrolor domene da li je taj korisnik autentian. Ako je, posluitelj e dati korisniku pristup resursu, a ako nije posluitelj e korisniku zabraniti pristup. Jednom kad je korisnik provjeren od strane kontrolora domene, on dobiva poseban identifikacijski token tako da se ne mora ponovo identificirati prilikom pristupa ostalim resursima u toj domeni. Moe se rei da je korisnik prijavljen na samu domenu.
Kontrolor domene koji je trenutno aktivan naziva se primarni (primary domain controller, PDC). Na domeni moe biti vie pomonih kontrolora (backup domain controller, BDC) koji e preuzeti ulogu primarnog ako ovaj postane nedostupan. Pomoni kontrolori
891/1275
esto sinkroniziraju svoje SAM podatke (korisnika imena i zaporke) sa primarnim kontrolorom kako bi u sluaju potrebe mogli preuzeti kontrolu domene i imaju kopije SAM podataka samo za itanje i nove podatke mogu dobiti samo sinkronizacijom sa primarnim kontrolorom. Posluitelj u Windows domeni moe koristiti SAM podatke bilo kojeg kontrolora u domeni (primarnog ili pomonih) za autentikaciju korisnika koji se eli prijaviti na domenu, ali unos novih korisnika koji smiju pristupati domeni mora ii preko primarnog kontrolora domene. Samba moe preuzeti ulogu primarnog kontrolora domene dok funkcije pomonog kontrolora domene jo uvijek nisu podrane od strane Samba-e.
892/1275
Samba programski paket dolazi u distribuciji sa veinom Linux distribucija, te se instalira klasinim instalacijskim postupcima.
Konfiguracija Sambe
Osnovni element koji je kljuan u konfiguraciji Samba programskog paketa je smb.conf datoteka. Sama instalacija Samba paketa nee stvoriti spomenutu smb.conf datoteku. Sa Samba programskim paketom dolazi vrlo koristan alat (Swat), koji omoguuje konfiguraciju i administraciju Sambe putem grafikog suelja, ime se djelomino otklanjaju problemi za manje iskusne korisnike. Swat je programski paket koji administratorima omoguuje, da se putem bilo kojeg preglednika spoje lokalno na svoje raunalo preko TCP 901 porta (http://localhost:901), te da na taj nain upravljaju Samba programskim paketom. Smb.conf datoteka se u osnovi sastoji od sekcija (oznaene uglatim zagradama) i njihovih parametara. Parametri svake sekcije navode se u obliku
ime = vrijednost
Sekcije i njihovi parametri nisu osjetljivi na velika i mala slova. Svaka linija koja poinje sa znakovima # ili ; smatra se komentarom, te kao takva nee biti tumaena. Svaka sekcija u smb.conf datoteci opisuje jedan dijeljeni resurs, sa njegovim parametrima. Iznimka je sekcija [global], koja se odnosi na sve sekcije, te sadri neke openite postavke. Osim [global] sekcije postoje jo dvije sekcije, koje se neto razlikuju u odnosu na obinu sekciju koja predstavlja neki dijeljeni resurs, a to su sekcije [printers] i [homes]. Ostale obine sekcije sastoje se u osnovi od imena direktorija koji se eli dijeliti, plus dodatni parametri koji opisuju ovlasti, odnosno dozvole pristupa. Primjer:
893/1275
Ovdje je dan primjer jednostavne smb.conf datoteke u kojoj je stvorena sekcija [test], koja predstavlja dijeljene /export/samba/test direktorija bez dozvole pisanja (read only parametar). Naveden je i guest ok parametar koji dozvoljava pristup navedenom direktoriju bez davanja korisnike zaporke. Parametar workgroup u sekciji [global], svrstati e ovaj Samba posluitelj u Simple radnu grupu. Unutar [global] sekcije, osim gore spomenutih, moe se nai i velik broj drugih parametara, koji se mogu definirati, i koji e se kao takvi odnositi na sve sekcije. Tu se mogu nai razni parametri vezani za definiciju nekih opih sigurnosnih nivoa, enkripcija, korisnikih opcija i sl. Pored [global] sekcije potrebno je spomenuti [homes] sekciju, koja moe biti vrlo korisna u odreenim situacijama. Naime, u sluajevima kada valjani korisnik (korisnik koji ima korisniki raun na posluitelju) Samba posluitelju poalje zahtjev za pristup sekciji koja nije definirana u smb.conf datoteci, a ujedno u istoj datoteci postoji definirana [homes] sekcija, Samba posluitelj e takvom korisniku omoguiti pristup direktoriju koji je unutar [homes] sekcije naveden pod path parametrom. Ukoliko path parametar nije naveden unutar te sekcije, korisniku e biti dan pristup njegovom radnom direktoriju na tom raunalu. Upravo na opisani nain [homes] sekcija se moe iskoristiti za efikasnije rasporeivanje i dodjeljivanje resursa korisnicima. Sve ostale sekcije koje se definiraju unutar smb.conf datoteke mogu imati proizvoljno ime navedeno unutar uglatih zagrada, te e kao takve sa navedenim parametrima predstavljati resurs kojemu korisnici sa valjanim korisnikim imenom i zaporkom mogu pristupiti. Korisna opcija koja se moe navesti unutar pojedinih sekcija su parametri valid users i invalid users. Pomou ovih parametar moe se tono definirati za svaku sekciju, tko ima prava pristupa, a tko ne. Koristei opciju read only = yes, korisnicima je sekcija unutar koje se nalazi naveden ovaj atribut otvorena iskljuivo za itanje. Ukoliko posebnoj grupi korisnika elimo dozvoliti pisanje unutar te sekcije, koristan je parametar write list iza kojeg slijedi niz imena korisnika, kojima se eli iznimno dozvoliti i pisanje unutar te sekcije. Vrijedi i obrnuti sluaj, pri emu se onda koristi read list parametar.
894/1275
Samba dozvoljava koritenje nekih varijabli unutar smb.conf datoteke. Varijable se mogu lako prepoznati po znaku % ispred svog imena. Sve varijable unutar smb.conf datoteke se zamjenjuju pravim vrijednostima tokom izvoenja programa. Neke od korisnijih varijabli su: %I - IP adresa klijenta, %m - NetBIOS ime klijenta, %M - DNS ime klijenta, %H - home direktorij korisnika, %u - korisniko ime korisnika, %U - korisniko ime traenog korisnika, %h - DNS ime Samba posluitelja, %L - NetBIOS ime Samba posluitelja, %v - verzija Samba posluitelja. Postoji jo niz opcija koje se mogu definirati za pojedine sekcije unutar smb.conf datoteke, a mogu se nai na adresi http://us1.samba.org/samba/docs/man/smb.conf.5.html. Nakon svake modifikacije smb.conf datoteke potrebno je ponovno pokrenuti Samba posluitelje (nmbd i smbd), kako bi se aktivirale nainjene izmjene. Bez ovog koraka promjene nainjene u smb.conf datoteci nee biti vaee. Komande kojima se obavlja ponovno pokretanje Samba posluitelja su slijedee:
895/1275
koji e predstavljati prvi korak u omoguavanju takvog pristupa. Svaki korisnik koji se eli spojiti na Linux Samba posluitelj s nekog udaljenog raunala, mora na tom Linux stroju posjedovati svoj valjan korisniki raun. Postoji i vrlo korisna opcija mapiranja korisnika (username map), koja omoguuje dijeljene resursa izmeu korisnika koji imaju razliita korisnika imena na razliitim raunalima. Budui da Windowsi i Linux koriste drugaije algoritme za kriptiranje zaporki, na Linux raunalu potrebno je stvoriti posebnu smbpasswd datoteku, u kojoj e biti sadrana korisnika imena korisnika, s kriptiranim zaporkama koje odgovaraju Windows enkripciji. Ta datoteka se moe vrlo jednostavno popunjavati za svakog korisnika zasebno naredbom:
# smbpasswd a ime_korisnika
(korisnik mora imati otvoren korisniki raun na tom raunalu) nakon ega slijedi upit za unosom zaporke ili automatski koritenjem skripte koja dolazi u paketu sa Samba posluiteljem, na slijedei nain:
Ova linija e za svakog registriranog korisnika koji posjeduje korisniki raun na tom Linux stroju, stvoriti odgovarajue polje u smbpasswd datoteci, to e omoguiti valjanu identifikaciju korisnika koji pokuava pristupiti sa Windows raunala. Nakon ovoga ne bi trebalo biti problema sa pristupom Windows raunala koja koriste enkripciju. Postoji i
896/1275
jednostavnije rjeenje tj. mogunost da se u Windowsima u njihovom registry-u iskljui kriptiranje zaporki, ali to se ne preporua iz sigurnosnih razloga, budui da se u tom sluaju korisnike zaporke mreom prenose u njihovom izvornom obliku.
preko mree na njemu ispisivati dokumente jednako kao da je pisa spojen direktno na njega. Windows klijenti e dijeljeni pisa vidjeti u svojem Network Neighbourhood okruju. Kod ispisa preko mree odvija se na sljedei nain: otvara se veza prema posluitelju, datoteka koja se eli poslati na pisa kopira se preko mree na posluitelj, veza sa posluiteljem se zatvara, posluitelj alje kopiju datoteke na pisa i nakon toga ju brie. Kad datoteka koju treba ispisati stigne na posluitelj, ona se privremeno sprema na lokalni disk u direktorij koji je odreen opcijom path. Nakon toga Samba pokree Linux naredbu kojom se ta datoteka alje na pisa.
Ova naredba kopira dokument u direktorij /var/spool, dohvaa ime pisaa iz konfiguracijske datoteke /etc/printcap (u ovoj su datoteci pohranjeni parametri svih pisaa spojenih na raunalo) i na temelju parametara proitanih u njoj odluuje kako e podaci biti obraeni prije slanja na pisa i na koji ureaj u /dev direktoriju ih treba poslati. Zbog opcije -r datoteka e biti obrisana nakon ispisa. Obrisana datoteka je samo kopija originalne datoteke, pohranjena na Samba posluitelju. Ovo nema utjecaja na originalnu datoteku na klijentu. Imena svih pisaa na raunalu mogu se nai u datoteci /etc/printcap. Dokumenti koji su predani Sambi ne alju se odmah na pisa, nego se stavljaju na listu ekanja. To osigurava da trenutna zauzetost pisaa ne smeta prilikom predaje dokumenata Samba posluitelju. Nakon to je neki dokument predan posluitelju on stoji na listi ekanja dok pisa ne zavri s poslom koji trenutno obavlja i nakon toga se alje na ispis. Samba omoguava klijentu da pogleda status dokumenata koji trenutno ekaju na ispis, klijent moe pauzirati ispis nekog dokumenta, ponovno ga pokrenuti ili ga maknuti s liste za ekanje. Koritenje jednog ili vie Samba raunala kao printer posluitelja daje fleksibilnost lokalnoj mrei. Pisae se vrlo lako moe rasporediti na razliite korisnike ili se moe dozvoliti
898/1275
svima da ih koriste. Dodatno, pristup pisau moe se ograniiti samo na par korisnika koritenjem opcije valid user. Primjer: Koritenje opcije valid user. [printer1] printable = yes print command = /usr/bin/lpr -r %s printer = lp printing = BSD valid users = marko mirko
U ovom primjeru samo korisnici marko i mirko smiju koristiti pisa. U datoteci smb.conf moe se definirati posebna sekcija pod imenom [printers] koja slui za automatsko kreiranje sekcija za pisae. Ako se u datoteci smb.conf definira sekcija [printers] Samba e automatski napraviti sekcije za sve pisae koje nae u datoteci /etc/printcap. Ako klijent zatrai resurs s imenom koje nije eksplicitno definiranu u smb.conf datoteci: ako ime resursa odgovara nekom korisnikom imenu na posluitelju i postoji sekcija [homes] u datoteci smb.conf tada se stvara nova sekcija s imenom korisnika u kojoj su parametri podeeni na vrijednosti dane u [homes] i [global] sekcijama. inae, ako ime resursa odgovara imenu pisaa u datoteci /etc/printcap i postoji [printers] sekcija u datoteci smb.conf tada se stvara nova sekcija s imenom pisaa u kojoj su parametri podeeni na vrijednosti dane u [printers] sekciji. ako nita od to dvoje ne uspije, Samba trai resurs definiran opcijom default service. Ako ga ne nae, vraa se greka. Iz ovoga se moe vidjeti da ako se pisau i korisniku dodijeli isto ime moe doi do greke tj. umjesto da se dijeli pisa dijeliti e se direktorij. Ako je pisa spojen na raunalo sa Windows operativnim sustavom njemu je mogue pristupati preko Sambe koritenjem skripte smbprint koja dolazi sa Samba paketom. Da bi stvar funkcionirala, pisa na Windows raunalu mora biti postavljen kao dijeljeni resurs.
899/1275
Kako bi Linux prepoznao udaljeni pisa potrebno je uiniti dvije stvari: potrebno je dodati pisa u datoteku /etc/printcap napraviti konfiguracijsku datoteku u direktoriju /var/spool za pisa
Da bi se demoni pokrenuli automatski prilikom podizanja sustava potrebno je gore navedena dva reda upisati u neku od datoteka koje se izvravaju prilikom podizanja sustava. Koje su to datoteke to ovisi o operativnom sustavu koji se koristi.
900/1275
901/1275
/etc/hosts.allow /etc/hosts.deny Za rad posluitelja dovoljno je podesiti datoteku /etc/exports ali takva postava je, gledano s aspekta sigurnosti posluitelja, vrlo loa. Naime, iako je za samo pokretanje posluitelja i omoguavanje dijeljenja datoteka preko mree dovoljno u datoteci /etc/exports rei koji e direktoriji biti dijeljeni, u datotekama /etc/hosts.allow i /etc/hosts.deny se navodi koja raunala imaju pristup posluiteljskom raunalu.
902/1275
no_subtree_check - ako se dijeli samo dio particije a ne cijela, tada je potrebna provjera da li se datoteka koju je zatraio klijent nalazi na dijeljenom dijelu particije. Ako se dijeli cijela particija tada ova provjera nije potrebna i ukljuivanje ove opcije e ubrzati prijenos datoteka. sync - verzija 2 NFS posluitelja e obavijestiti klijenta da je proces zapisivanja datoteke na disk zavren kad posluitelj pozove write sistemski poziv i preda datoteku lokalnom datotenom sustavu na posluitelju. Ali to ne znai da je ta datoteka doista u tom trenutku zapisana na disk. Zbog toga moe doi do gubitka podataka i pokvarenih datoteka ako doe do pada posluitelja. Opcija sync osigurava da datoteni sustav na posluitelju datoteku doista snimi na disk onog trenutka kad od NFS-a dobije write sistemski poziv. NFS verzije 3 nema ovih problema i kod njega ukljuivanje ove opcije nije potrebno. Za velike lokalne mree moda e biti potrebno omoguiti pristup velikom broju klijenata. Kako bi se u takvim sluajevima izbjeglo navoenje imena svakog od raunala zasebno postoji par naina koji pojednostavljuju referenciranje velikog broja raunala. Ako se eli omoguiti pristup svim raunalima na lokalnoj mrei, to se moe postii specificiranjem IP adrese mree i mrene maske (eng. netmask). Primjer: Izgled unosa u /etc/exports datoteci koji svim raunalima u lokalnoj mrei omoguava pristup direktorijima /usr/local i /home. /usr/local /home 192.168.0.0/255.255.255.0(rw) 192.168.0.0/255.255.255.0(ro)
Druga je mogunost specificiranje NIS (Network Information Service) mrene grupe u unosu. Da bi se specificiralo ime mrene grupe u exports datoteci potrebno je ispred imena dodati simbol @. Primjer: Primjer omoguavanja pristupa mrenoj grupi. /usr/local /home @student(rw) Mrena grupa u ovom primjeru ima ime student. @student(ro)
903/1275
Trea je mogunost koritenje asteriksa (*) (npr. *.apm.hr) umjesto cijelih imena raunala. Ista stvar se moe postii primjenom djelominih IP adresa tako da se navede samo dio IP adrese koji se odnosi na lokalnu mreu bez da se adresira neko odreeno Kod koritenja ovih pojednostavljenja treba biti oprezan, jer se moe desiti da se omogui pristup neeljenim raunalima. Sa stajalita sigurnosti, ak je i za velike lokalne mree najbolje navesti ime svakog raunala zasebno jer se time smanjuje opasnost od pogreke i omoguavanja neeljenog pristupa resursima. Napomena o tome to se ne moe (i ne smije) dijeliti: ako je neki direktorij dijeljen tada njegov naddirektorij i njegovi poddirektoriji ne mogu biti dijeljeni ako se nalaze u istom datotenom sustavu. Za tako neto nema niti potrebe jer se dijeljenjem jednog direktorija dijele i svi njegovi poddirektoriji, ali treba paziti kako se ne bi potkrala greka u /etc/exports datoteci. nije dobra ideja dijeliti FAT ili VFAT (MS DOS, MS Windows) datotene sustave. FAT nije predvien za rad s viekorisnikim raunalima i operacije koje ovise o datotenim dozvolama nee raditi. ureaji koji se nalaze u /dev direktoriju i ostale posebne datoteke ne mogu se pravilno dijeliti sa klijentima koji nisu pokrenuti na Linux operativnom sustavu.
904/1275
ako klijent nije naveden u datoteci hosts.allow tada se provjerava datoteka hosts.deny. Ako se ime klijenta nalazi u njoj, tada pristup klijentu nije odobren. ako se ime klijenta ne nalazi niti u jednoj od datoteka tada mu se dozvoljava pristup. Pomou ovih datoteka moe se uvesti kontrola pristupa NFS usluzi tako da se pristup demonima koji su za nju zadueni dozvoli samo nekim raunalima.
Portmapper demon
NFS ovisi o portmapper demonu koji se zove ili portmap ili rpc.portmap i nalazi se u direktoriju /sbin ili /usr/sbin. On mora biti pokrenut na NFS posluitelju i klijentu kako bi ovi ispravno radili.
NFS demoni
O NFS usluzi se brine pet demona: rpc.nfsd - radi veinu posla oko NFS usluge, rpc.lockd - brine se oko zakljuavanja datoteka, rpc.statd - zajedno s rpc.lockd se brine oko zakljuavanja datoteka, rpc.mountd - brine se oko inicijalnih zahtjeva za montiranjem datotenog sustava , rpc.rquotad - brine se oko korisnikih kvota (koliina diskovnog prostora koju korisnik smije zauzeti svojim podacima) na dijeljenim particijama. Prvi demon kojem treba ograniiti pristup je portmapper. Ovaj demon govori klijentima kako nai sve NFS usluge na posluitelju. Ogranienje pristupa portmapper demonu onemoguava neautorizirani pristup NFS-u jer neautorizirani korisnici nee znati gdje se nalaze NFS demoni. Ovaj pristup ima i svojih mana. Prvo, ograniavanje pristupa portmapper-u ne pomae ako potencijalni uljez unaprijed zna kako nai potrebne demone. Drugo, ako je pokrenuta NIS usluga, ograniavanje portmapper-a e takoer ograniiti pristup NIS usluzi. U pravilu to ne predstavlja vei problem jer je poeljno ograniiti NFS i NIS na slian nain. Pokretanje NIS usluge zajedno s NFS-om je poeljno zato to klijentu olakava odreivanje vlasnitva nad pojedinim datotekama i direktorijima dijeljene particije. Openito je dobra ideja kod NFS-a (kao i kod ostalih mrenih usluga) inicijalno zabraniti pristup svim raunalima u datoteci hosts.deny, a nakon toga omoguiti pristup eljenim raunalima u
905/1275
datoteci hosts.allow. Tako e pristup posluitelju biti omoguen samo raunalima navedenim u datoteci hosts.allow dok e svim ostalim raunalima pristup biti zabranjen. Primjer: Zabrana pristupa portmapper demonu za sva raunala. U datoteku hosts.deny je potrebno dodati sljedeu liniju: portmapp:ALL
Primjer: Zabrana pristupa svim NFS demonima za sva raunala. U datoteku hosts.deny je potrebno dodati sljedee linije: lockd:ALL mountd:ALL rquotad:ALL statd:ALL
Mogue je u datoteku hosts.deny staviti samo liniju ALL:ALL koja uzrokuje zabranu pristupa svim uslugama koje koriste ovu datoteku osim ako nije drugaije naznaeno u datoteci hosts.allow. Sa stajalita sigurnosti, ovo je najbolje rjeenje premda moe predstavljati problem ako se potrebne dozvole za pristup zaborave dodati u datoteku hosts.allow. Sljedea stvar koju je potrebno napraviti je dodavanje potrebnih dozvola za pristup u datoteku hosts.allow. Unosi u toj datoteci imaju oblik: service: host [ili network/netmask] , host [ili network/netmask] gdje je service ime demona kojem elimo omoguiti pristup, a host IP adresa raunala kojem se eli omoguiti pristup. Isto kao i u sluaju datoteke exports moe se umjesto IP adrese pojedinog raunala koristiti kombinacija IP adrese mree i mrene maske kako bi se dozvolio pristup grupi raunala.
906/1275
stop - zaustavljanje demona, status - stanje demona, restart - ponovno pokretanje demona. Kod Debian distribucije skripte postoje sline skripte koje se takoer nalaze u /etc/init.d direktoriju. Njihova imena su portmap, nfs-server i nfs-common. Skripta nfs-common slui za pokretanje programa potrebnih za NFS klijent dok skripta nfs-server pokree dodatne demone potrebne za NFS posluitelj (za NFS klijent dovoljno je pokrenuti skriptu nfs-common, dok za NFS posluitelj moraju biti pokrenute obije skripte). Skripta portmap ista je kao i kod Mandrake (RedHat) distribucije. Skripte se pokreu automatski prilikom podizanja sustava a koriste se na jednak nain kao i u Mandrake (RedHat) distribuciji.
908/1275
1 3 4 1 3 4
1042 nlockmgr 1042 nlockmgr 1042 nlockmgr 1629 nlockmgr 1629 nlockmgr 1629 nlockmgr
U ispisu moraju postojati barem linije u kojima se spominju portmapper, nfsd i mountd. Ako ih nema NFS nije ispravno pokrenut. Nakon to je NFS posluitelj pokrenut, potrebno je podesiti NFS klijente.
909/1275
Primjer: Ako se NFS posluitelj zove maja.apm.hr a ime klijenta je ivana.apm.hr. Da bi na klijentu montirali /home direktorij s posluitelja u /mnt/home direktorij klijenta potrebno je upisati naredbu: # mount maja.apm.hr:/home /mnt/home
Da bi odmontirali montirani direktorij potrebno je upisati naredbu: # umount /mnt/home ba kao da se radi o lokalnom datotenom sustavu.
910/1275
hard - program koji pristupa datoteci preko NFS datotenog sustava e stati ako se dogodi pad posluitelja ili mree. Proces ne moe bit prekinut ili ubijen (naredbom kill, osim ako se ne upotrijebi kill -9) ako se uz opciju hard ne upotrijebi i opcija intr. Kad se NFS posluitelj ponovno digne program e nastaviti tamo gdje je stao. Preporua se koritenje hard, intr kombinacije na svim NFS montiranim datotenim sustavima. Primjer: Isti primjer kao i proli ali su koritene opcije hard i intr. maja.apm.hr:/home /mnt/home nfs rw,hard,intr 0 0
Ako se direktorij eli montirati runo koritenjem mount naredbe tada u komandnoj liniji treba upisati: # mount -o hard,intr naomi.zesoi.fer.hr:/home /mnt/home
911/1275
ovo uvelike razlikuje od sustava do sustava ne postoji pravilo kojim bi se moglo odrediti koja je veliina najbolja za dani sluaj ve se to mora eksperimentalno utvrditi. Primjer: Testiranje brzine prijenosa podataka putem NFS-a. Testiranje brzine NFS sustava moe se obaviti pomou par jednostavnih naredbi. Prva od tih naredbi kopira 16384 bloka podataka od kojih je svaki veliine 16Kbyte iz datoteke /dev/zero (/dev/zero nije prava datoteka ve program koji samo vraa nule kad ga se pozove) na montiranu particiju. Potrebno je jo izmjeriti vrijeme potrebno da se to obavi. Sve navedeno moe se obaviti upisivanjem naredbe na klijentu: # time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
Ovo stvara datoteku veliine 256Mbyte na montiranoj particiji. U pravilu trebalo bi napraviti datoteku koja je barem dvostruko vea od veliine RAM-a na posluitelju, ali treba paziti da za to ima dovoljno mjesta na tvrdom disku. Nakon toga je potrebno ponovno proitati stvorenu datoteku sa klijenta. To se moe postii naredbom: # time dd if=/mnt/home/testfile of=/dev/null bs=16k
Ova naredba datoteku s posluitelja ita u datoteku /dev/null (/dev/null nije obina datoteka ve program koji brie sve to se kopira u njega). Ovo je potrebno ponoviti vie puta kako bi se dobila srednja vremena potrebna za stavljanje datoteke na posluitelj i za dohvaanje datoteke natrag na klijent. Svaki put je potrebno datoteni sustav s posluitelja prvo odmontirati i nakon toga ga ponovno montirati kako bi se ispraznio meuspremnik. Cijeli postupak potrebno je ponoviti za razliite vrijednosti opcija rsize i wsize. Veliine bi trebale biti potencije broja 2 i ne smiju biti vee od 8192 byte-a budui da je to maksimalna dozvoljena veliina za NFS verziju 2 (ako se koristi NFS verzija 3 mogu se koristiti vrijednosti do 32768 byte-a). Odmah nakon montiranja datotenog sustava s novim vrijednostima za rsize/wsize potrebno je otii u taj direktorij naredbom cd i pokuati izlistati njegov sadraj naredbom ls kako bi se vidjelo da li NFS uope moe raditi s novim vrijednostima. Tipina greka kod prevelikih vrijednosti je nepotpuna lista datoteka kod ls naredbe. Nakon to se ustanovi da li nove vrijednosti za rsize/wsize rade moe se ponoviti test mjerenja brzine.
912/1275
Nakon to su odreene optimalne vrijednosti za opcije rsize/wsize potrebno ih je unijeti u datoteku /etc/fstab. Primjer: Redak koji treba dodati u /etc/fstab datoteku kako bi se direktorij montirao uz odreene opcije rsize i wsize. maja.apm.hr:/home /mnt/home nfs rsize=8192,wsize=8192 0 0
913/1275
Glavni prozor NFS-Server programa Odabirom opcije Exports otvara se prozor u kojem se mogu postaviti particije i direktoriji koji se ele dijeliti preko mree. Opcijom Add directory dodaju se direktoriji koji e biti dijeljeni preko NFS-a, dok opcija Add User Access slui za davanje pristupa dijeljenim direktorijima klijentima
914/1275
Ovdje je potrebno upisati IP adresu klijenta kojem se eli dati pristup, korisniki i grupni identifikacijski broj (UID i GID) za eljenog korisnika i nain na koji korisnik smije koristiti dijeljeni direktorij (samo za itanje ili i za pisanje). Nakon to je pristup odobren, klijenti mogu montirati dijeljene direktorije bez obzira da li su pokrenuti na Linux ili na Windows raunalu.
NFS klijent
Prije koritenja NSF klijenta potrebno je podesiti neke parametre potrebne za rad. Za to je potrebno odabrati opciju Settings. Tu se mogu podesiti korisniki i grupni identifikacijski broj, dodati IP adrese NFS posluitelja, odrediti nain konverzije Linux imena datoteka u Windows imena datoteka i sl. Nakon to su odabrane eljene postavke, klijent je spreman za rad. ProNFS klijent se integrira u suelje Windows Explorer programa tako da za njegovo koritenje nije potrebno otvarati dodatne prozore.
915/1275
ZAKLJUAK
NFS omoguava jednostavno, brzo i transparentno dijeljenje datoteka i podataka preko lokalne mree. Korisnici dijeljene podatke (datoteke) mogu drati na dijeljenoj particiji kojoj svi imaju pristup ime je razmjena podataka znatno olakana i ubrzana. Diskovni prostor na pojedinim raunalima primjenom NFS-a prestaje biti problem jer se otvaraju mogunosti postavljanja mrenih diskova (mrenih disk posluitelja) iji diskovni prostor mogu koristiti sva raunala spojena na lokalnu mreu. Na mrenim diskovima mogu se nalaziti i baze podataka, repozitoriji i slino. Dodatna prednost NFS-a je jednostavnost instalacije (standardno dolazi sa svim novijim Linux distribucijama) i koritenja koje se vrlo malo razlikuje od koritenja lokalnih datotenih sustava kao to su floppy disk ili CD-ROM. NFS se pokazao vrlo stabilnim, ak i u sluajevima pada mree ili posluitelja nije dolo do gubitka podataka i do pojave pokvarenih datoteka. Brzina prijenosa podataka ovisi o koritenoj Ethernet vezi. Iako se NFS pokazao upotrebljivim u manjim lokalnim mreama baziranim iskljuivo na Linux operativnom sustavu, u 'mijeanim' mreama koje se sastoje od Windows i Linux raunala puno bolje rjeenje je Samba. Samba u takvom okruenju radi bre od NFS-a i pouzdanija je. I sa stajalita sigurnosti Samba je bolja zbog sigurnosnih rupa koje u NFS-u jo uvijek nisu rijeene. Zbog toga se preporua koritenje Sambe i na mreama koje se sastoje samo od Linux raunala. Samba paketom omoguava se meusobno dijeljenje diskovnog prostora ( shares), zatim pisaa, pa ak i serijskih portova izmeu razliitih operativnih sustava. Velika prednost Samba paketa lei u injenici da Samba moe zamijeniti Windows posluitelje potrebne za uspostavu lokalne mree (WINS posluitelj i kontrolor domene). Iako Samba paket jo uvijek nema potpunu funkcionalnost NT posluitelja, on se bez problema moe koristiti u manjim lokalnim mreama (do 30 raunala) kod kojih nema potrebe za pomonim WINS posluiteljem i pomonim kontrolorom domene koje Samba jo uvijek ne podrava. Moe se zakljuiti da je Samba dobra (i jeftinija) zamjena za Windows NT posluitelje u malim lokalnim mreama kao to su SOHO mree.
916/1275
Jakov Mihaljevi
X WINDOW SYSTEM
917/1275
UVOD
X Window System (u daljnjem tekstu X) razvijen je 1984.g. na Massachusetts Institute of Technology (MIT) zbog potrebe za transparentnim mrenim protokolom primarno za Unix operacijske sustave. Nekoliko godina kasnije 1987. projekt X Window Systema se izdvaja sa IMT-a te brigu o njemu preuzima skupina nazvana X consortium. X consortium je bio zaduen za razvoj i standardizaciju X-a sve do 2004.g. Uslijed razmimoilaenja u pogledima na daljnji razvoj X originalni lanovi X consortiuma 22.sijenja. 2004.g. osnivaju X.org Foundation i preuzimaju brigu o razvoju X window Systema.
918/1275
Slika 1. Prednosti ovakve arhitekture su mnogobrojne: ekvivalentnost rada sa lokalnim ili mrenim raunalima za krajnjeg korisnika i ili programera X Server je visoko portabilan to omoguava potporu za razliite jezike i operacijske sustave X klijenti su takoer visoko portabilni X moe podravati veinu mrenih protokola, lokalno ili na daljinu Na aplikacije se ne odraava nedostatak procesorske snage
Klijent-Server dizajn
Klijent-Server dizajn X Windows Sustava specificira odnos izmeu aplikacije i njezinog grafikog prikaza. Kod X protokola proces koji upravlja zaslonom, tipkovnicom i miem naziva se X server. Klijent je proces koji se prikazuje na i uobiajeno se naziva X klijent ili aplikacija. X klijent alje zahtjeve X serveru, na primjer zahtjev za prikaz zadanih informacija. X server prihvaa zahtjeve vie klijenata i vraa X klijentima odgovore na traene informacije, korisnike unose i greke. Komunikacija izmeu klijenta i servera odvija se X protokolom. X protokol se moe naslanjati na TCP/IP, lokalnu komunikaciju pod Unix-om preko socket-a ili DECneta. Tehniki, X protokol predstavlja definiciju X Windows systema. Naravno kad govorimo O X Windows system-u ne mislimo samo na protokol, ve i na raspoloive klijente, servere i biblioteke koje koristi ovaj protokol.
920/1275
U komunikaciji izmeu klijenta i servera postoje etiri vrsti poruka: Zahtjev: X klijent trai od X servera odreenu akciju npr. Create Windov Da bi poboljao performanse, X klijent uobiajeno ne oekuje odgovor. Server se uobiajeno oslanja na pouzdanost mree kao garanciju isporuke . Duina zahtjeva je 4 bajta(ili umnoak 4 bajta) Odgovor: X server e odgovoriti na zahtjev ako isti zahtjeva odgovor. Svi zahtjevi ne zahtijevaju odgovor. X odgovor je svaki umnoak 4 bajta; minimum 32 bajta Dogaaji: X Server e proslijediti X klijentu svaki dogaaj koji aplikacija oekuje . Ovo ukljuuje ulaze od strane mia i tipkovnice. Da bi se minimalizirao mreni promet klijentu e se proslijediti samo dogaaji koje oekuje. X dogaaji su duine 32 bajta.
921/1275
X Server
Osnovne znaajke: Pokree se lokalno Prihvaa i demultipleksira zahtjeve X klijenata te odgovara i djeluje na osnovu njih prikazuje zadane informacije na zaslonu odgovara na zatraene informacije prijavljuje greke u zahtjevu Upravlja sa tipkovnicom, miem i zaslonom Prosljeuje ulaze tipkovnice i mia do klijenata kreira, upravlja i unitava prozore pie i crta po prozorima
Dizajn:
Dizajn X servera ovisi o platformi(hardverskoj) i operacijskom sustavu na koji je implementiran. Stoga se poveavanjem mogunosti tehnologija na kojima je izgraen poveavaju mogunosti i X servera. Karakteristika je X servera je velika zavisnost od hardvera, razlikuje se nain pristupa hardveru kroz operativni sustav. Pored kompatibilnosti, za X server je vrlo bitna efikasnost, jer na njemu je da optimalno iskoristi grafike kartice. Kod X servera uobiajeno je da se za svaki tip adaptera(ili za nekoliko slinih) postoji poseban X server. Dakle, pod X-om traimo server za pojedini adapter kao to na npr. MS Windows sustavu traimo drajver. Uz X server idu konfiguracijske datoteke, softver za podeavanje tih datoteka, datoteka i sl. Prozori X servera su hijarajhijski organizirani. Na vrhu hijarajhije je korijeni prozor(odgovara pojmu desktopa na MS Windowsima). Klijent kada otvori prozor kontrolira samo sadraj unutar prozora, a ne i okvir, liniju sa naslovom i slino. Tako X server koji radi pod MS Windowsima postie da se X prozorima rukuje kao i sa ostalima. Nije tipino da server preuzme rukovanje prozorima, on tipino taj posao preputa posebnom klijentuWindow menager-u.(WM) WM daje prozorima , okvir, naslov, kontrolira promjenu veliine, pomicanje, svodi prozore na ikone i vraa u punu veliinu, dodjeljuje i oduzima fokus,
922/1275
regulira koji je ispred, a koji je iza, hvata klikove mia na prozor i sl. Sa razliitim WM-ovima dobiju se razliito dekorirani prozori, ali i razliite politike manipuliranja. Za jedan server u jednom trenutku moe biti vezan jedan WM. Ukoliko nije tako prozori izgledaju ogoljeno(bez okvira), a korisnik moe raditi samo u prozoru koji trenutno ima fokus, ali i da ga mie ili mu mijenja veliinu.
X Klijent
X klijent je aplikacija koja se vrti na udaljenom raunalu(moe i lokalno). U cijeloj temi X Windows system-a ovo je dio koji je krajnjem korisniku najmanje vidljiv te, naravno uvjetno reeno, najmanje bitan. Naime u klijent server koncepciji X Window System-a kako, gdje i na koji nain X klijent radi(tj. obrauje zadane zadatke) za krajnjeg korisnika nije bitno. Sve stvari potrebne za rad X servera sa X klijentom su odreene X protokolom te X klijent moemo smatrati crnom kutijom. Npr. Klijenta moemo shvatiti ovako: Klijenta ne zanima gdje se neto prikazuje na zaslonu, on samo trai od X servera X, Y koordinate u kojim moe crtati te nakon toga trai da se pozovu eljene funkcije(npr. crtaj liniju od toke A do toke B) i sl.
923/1275
Xfree86
Xfree86 je organizacija koja razvija i besplatno distribuira open-source implementacije X Window System-a pod nazivom XFree86. Xfree86 je stvoren primarno za UNIX i UNIX-oidne operacijske sustave kao to su Linux, BSD(sve varijante), Sun Solaris(podrana je 32 i 64 bitna verzija), Solaris x86, Mac OS X i dr. Xfree86, sadri klijent/server suelje i desktop okolinu, te takoer i prozorsku infrastrukturu i standardizirano aplikacijsko suelje(API). Xfree86 je platformski neovisan, mreno-transparentan i proiriva implementacija X Windows Systema. Primarni cilj Xfree86 Projekta je razvijati XFree86 i stvoriti najbolji slobodno distribuirajui Open-source implementacija X Window Systema implementirajui ga na to vie razliitih hardverskih i softverskih platformi. Projekt tei ovim ciljevima na nain da daje najvie panje tehnikom integritetu ideja, implementaciji i individualnim sudjelovanjem . Xfree86 je sve do 2004g bio najzastupljeniji open-sorce paket koji je dolazio uz veinu Linux distribucija, no sa pojavom verzije Xfree86 4.4 stvari su se promijenile. Naime licenca Xfree86 4.4 je promijenjena u odnosu na verzije do 4.3, te je ona sada GPL (Genereal Public
924/1275
Licence) nekompatibilna. Taj potez je podigao dosta praine te je i jo uvijek tema rasprava i previranja na temu dali je Xfree86 4.4. doista GPL nekompatibilan ili to nije tako. No kako god bile u ovom trenutku veliki Linux distributeri nisu sa odobravanjem prihvatili Xfree86 te su se priklonili X.org organizaciji. X.org je organizacija nastala od strane Xfree86 razvojnih organizacija nezadovoljnih odstupanjem od GPL licence.
925/1275
KDE
926/1275
UVOD
K Desktop Environment jest mono grafiko okruje za UNIX radne stanice. KDE suelje kombinira jednostavnost uporabe, funkcionalnost i izvanredan grafiki dizajn sa teholokom superiornou UNIX operacijskog sustava. KDE je zbirka programa, tehnologija i dokumentacije koji pokuavaju olakati rad raunalnim korisnicima. KDE je prilagoen za rad na UNIX radnim stanicama. Kombinira jednostavnu upotrebu mrenih tehnologija i contemorary radnu filozofiju. Tvoritelji KDE-a su grupa software programera iz cijelog svijeta. Cilj ove grupe u razvoju besplatnog software-a jest, pruiti visoko kvalitetni software koji korisnicima daje jednostavnu kontrolu nad resursima njihovog raunala. KDE zadovoljava zahtjeve korisnika za jednostavnom radnom okolinom. Ideje koje se koriste da bi se postigao taj cilj su: pojaana komunikacija izmeu aplikacija, viekratno koritenje objekata, poboljani drag and drop, jedinstveni izgled itd. Na taj nain KDE nudi mnogo vie nego tradicionalni UNIX window manageri. Stabilnost i otvorenost su neke od kvaliteta UNIX-a, koje su ga uinile nezamjenjivim izborom raunalnih profesionalaca. Tokom godina, UNIX je bio prva platforma za raunalne servere i znanstvene institucije, no nije bio atraktivan za obine korisnike. KDE sve to mijenja.
927/1275
KDE Povijest
Od poetka razvitka UNIX operacijskog sustava postojao je jedan velik problem. Postojala je stabilna jezgra, dobre i mone aplikacije. Na nesreu, samo mali broj ljudi je mogao koristiti UNIX jer je on bio napisan za studente i profesionalce koji su ga prouavali due vrijeme. Primjer: standardna metoda za itanje USENET vijesti bila je:
find /var/spool/news name '[0-9]*' exec cat {} \; | more
Iako je bio relativno efikasan, nije se mogao nazvati jednostavnim za upotrebu. Sve to vodi ka tomu da UNIX nije bio za iru publiku. Povedena tom misli grupa od stotinjak programera predvoena Matthias Etrichom poinje raditi na KDE-u. Prva objava rada na KDE-u je bila 14.10.1996. Ve idue godine 20.10.1997. objavljena je prva verzija KDE 1.0 Beta1 iroj javnosti, gdje se postavilo zanimljivo pitanje: to znai slovo K u nazivu K Desktop Environment? Odgovor je isto tako zanimljiv: Nita. Jednostavno je tako nazvan bez nekog posebnog razloga. Nakon jo nekoliko Beta verzija 12.7.1998. objavljena je konana verzija KDE 1.0. Slijede mnogobrojne poboljane verzije KDE 1.0 sve dok 23.10.2000. nije objavljena skoro u potpunosti izmjenjena verzija KDE 2.0. koja je zapamena po tome to je lansirala Konqueror, Koffice, Kparts, KIO... Zaredale su ponovno mnogobrojne verzije 2.0., a 3.4.2003. lansirana je trea generacija KDE-a 3.0. sa mnogobrojnim poboljanjima. Zadnje objavljena verzija je KDE 3.3.2 (08.12.2004.). Iako ne pokuava zamijeniti tradicionalnu UNIX ljusku, KDE je alat koji e uiniti koritenje UNIX-a lakim, privui vie ljudi UNIX okruju. Uz KDE, koritenje UNIX-a postaje jednostavno.
928/1275
to je KDE?
KDE je desktop okruenje, tj. to je kolekcija programa, tehnologija, i dokumentacije, koji omoguavaju laki rad na UNIX radnim stanicama. Filozofija KDE-a je besplatan software kako bi se razvilo kvalitetno okruje koje prua korisniku kontrolu raunalnih resursa. KDE je jedan veliki projekt koji se neprestano poboljava i raste. Glavne misli vodilje i filozofija ovog projekta su: o uini to odmah!, o koncentriraj se!, o koristi dostupne alate radije nego da izmilja ve postojee!, o Kada neto predlae umjesto trebali bi... koristi ja u... jer su ogromni planovi beskorisni ako se ne primi posla, o neprekidno poboljavaj, o poni sa razumnom razinom funkcionalnosti i podesivosti i onda poboljavaj tijekom vremena! KDE je fokusiran na korisnikove potrebe, dajui mu najbolje alate. Napravljen je najboljim raunalnim tehnologijama modernog doba koje ponajprije ukljuuju DCOP (Desktop Communication Protocol) i Kparts (the component object model), KIO (I/O libraries), XML baziranu GUI class te KHTML(standards compliant HTML rendering engine). Zajedno sa itavim KDE library programerskim sueljem DCOP/Kparts je postao konkurencija slinim tehnologijama, u prvom redu Microsoft MFC/COM/ActiveX tehnologiji. Radi tako dobro iz tog razloga to otvoreni razvojni model potie zaprimanje izvjea o grekama i zakrpe te potie vjete programere. KDE 1.1. je proglaen inovacijom godine na CeBIT-u '99. svjetskom najveem raunalnom show-u, a iste godine je proglaen najboljim izborom u Desktop Environment kategoriji od LinuxWorld's-a. KDE libraries pruaju mogunosti koje pomau programerima da zadre razinu sofisticiranosti koja se oekuje od moderne desktop aplikacije. Klase pruaju mogunost pristupa mreama kroz HTTP, FTP i dr. Protokole, drag-and-drop meu aplikacijama, interprocesorsku komunikaciju te internacionalizaciju i lokalizaciju funkcija.
929/1275
Velika zbirka widgets-a u KDE i Qt libraries, implementiranih u C++ klasama, su vrlo dobro dizajnirani i funkcionalni. Budui su implementirani u C++ klasama, mogue je modificirati (poboljati) njihovo ponaanje. Qt signal/slot mehanizam koji je odlina alternativa C callback funkcijama, omoguuje brzo povezivanje widgets-a u svrhu kreiranja grafikog korisnikog suelja. Libraries takoer pruaju klase za rukovanje stringovima, linked liste i druge strukture podataka, socket programiranje, interprocesorsku komunikaciju kao i funkcijski kompleksne widgets (npr. Web pretraiva). KDE libraries isto tako ukljuuju framework za ugraivanje jedne aplikacije u drugu (application embedding) nazvan Kparts koji omoguuje lako dodavanje funkcionalnosti aplikacije u vlastiti program. KDE office program, nazvan Koffice koristi ugraivanje aplikacija kako bi se stvarali dokumenti koji sadre tekst, grafike elemente, tablice, koji se svi nalaze na istom dokumentu. Konano, KDE prua smisao kreiranju aplikacija koje su mreno transparentne, to znai da korisnik moe otvarati i spremati dokumente koristei poznate tehnike. Bit mrene transparentnosti se provlai kroz cijeli KDE. Idealan primjer za to jest file manager, Konqueror. U njegovu prozoru se mogu pretraivati datoteke i manipulirati lokalnim datotekama, FTP stranicama, i HTTP listama direktorija koristei dobro znanu dokument/direktorij metaforu. DCOP messaging DCOP je client-to-client komunikacijski protokol sa serverom kao posrednikom preko X11ICE library standarda. Protokol podrava prolaz poruka kao i pozive procedura koristei XML-RPC do DCOP prolaza. Izvedbe za C/C++ i Phyton te Javu su dostupne. KIO Network Tehnology KIO implementira aplikacijske I/O u odvojene procese kako bi se omoguilo grafiko korisniko suelje bez blokada i to bez koritenja thread-ova. Klasa je mreno transparentna i lako se moe koristiti za pristup HTTP, FTP, POP, IMAP, NFS, SMB, LDAP, i lokalnim dokumentima. Jo bolje, ova fleksibilna modularna tehnologija doputa programeru da ubaci dodatne protokole kao npr. WebDAV, koji e tada automatski biti dostupan u svim KDE aplikacijama. KIO ujedno ugrauje trader koji moe locirati handler za specifini mimetype. Ti handleri tada mogu biti ugraeni u odgovarajue aplikacije koristei Kparts tehnologiju. Kparts komponente
930/1275
Kparts je KDE-ov komponentni objektni model koji doputa aplikaciji da ugradi drugu u sebe. Tehnologija obrauje sve aspekte ugraivanja, kao to je pozicioniranje toolbars-a i unoenje pravih menia kada se ugraena komponenta aktivira odnosno deaktivira. Kparts moe takoer suraivati sa KIO traderom u pronalasku handlera za pojedini mimetype ili uslugu/protokol. Ovu tehnologiju koriste specifino Koffice i Konqueror. XML-GUI Builder XML grafiko korisniko suelje(GUI) trai od XML-a da kreira pozicijske menije , toolbarsove i druge aspekte grafikog korisnikog suelja. Ova tehnologija daje korisniku i programeru na raspolaganje mogunost pojednostavljivanja configurability elemanata korisnikog suelja kroz aplikaciju i automatski zadovoljava KDE standarde i Style Guide baz potrebe za modifikacijom standarda. KHTML Rendering Engine KHTML je HTML 4.0 compliant rendering and drawing engine. Klasa u potpunosti podrava trenutne internet tehnologije kao to su JavaScript, Java, HTML 4.0, CSS-2 (Cascading Style Sheet), SSL(Secure Socket Layer for secure communications) and Netscape communicatore plugins (za pregledavanje tehnologija kao to su: Flash, RealAudio, RealVideo i sl.). KHTML klasa moe lako biti upotrebljena sa strane aplikacije bilo kao widgets (koristei normalno window roditeljstvo-pareting) ili kao komponenta (koristee Kparts tehnologiju). KHTML ima mogunost ugraivanja komponenta u sebe koristei Kparts tehnologiju.
931/1275
O izgledu KDE-a
Pri pokretanju KDE-a prvo to emo uoiti jesu radna povrina i panel. Velika prednost KDE-a jest mogunost koritenja viestrukih radnih povrina. Na taj nain organizacija rada se viestruko poboljava. Svoje programe moemo staviti na razliite radne povrine koje moemo nazvati prema vrsti posla tako da se u svakom trenutku moemo lako snai to poveava uinkovitost rada. Vrlo je dobro koristiti viestruke radne povrine kada surfamo internetom umjesto da radimo i ef nenadano uleti u sobu?! Radne povrine mjenjamo jednostavno klikom na jednu od njih, dok dvostrukim klikom moemo promjeniti imena radnih povrina. Meu radnim povrinama mogue je razmjenjivati i prozore tako to na title bar prozora kliknemo deni gumb mia i odaberemo opciju To Desktop. Kada se KDE pokrene panel je smjeten na dnu ekrana. Odavde se pokreu programi i prelazi se u virtualne radne povrine. K gumb je najvaniji dio radne povrine, preko njega se dolazi do veine instaliranih aplikacija. Na panelu se nalaze i gumbi nazvani One, Two, Three i Four koji predstavljaju virtualne radne povrine. Koritenje viestrukih radnih povrina je jedno od najmonijih orua KDE-a i X window sistema. Icon bar predstavlja preice do esto koritenih programa, nalazi se odmah do K gumba, a korisnik moe sam postavljati ili micati ikone sa iconbar-a.
Trenutni sadraj KDE-a: aRts: program za reprodukciju zvuka KDE-Libs: razne run time libraries KDE-Base: osnovni elementi (window manager, desktop, panel, Konqueror) KDE-Network: Knode, KNewsTicker, Kppp KDE-Pim: Kmail, KadressBook, Korganizer, KPilot KDE-Grafics: grafike aplikacije kao to su KDIV, KGhostview, Kpaint KDE-Multimedia: Noatun, Kmidi, KSCD KDE-Utilities: Kedit, Kcalc, KhexEdit, Knotes KDE-Edu: programi namijenjeni obrazovanju KDE-Games: Kasteroids, Kpat, Ktetris KDE-Toys: zanimljive stvari KDE-Addons: dodaci za Konqueror, Kate, Kicker i Noatun
932/1275
KDE-Artwork: Dodatne ikone, stilovi, podloge, uvari ekrana i window dekoracije KDE-Admin: raznoliki alati i pomo sistemskoj administraciji KDE-SDK: skripte i alati koji pojednostavljuju razvoj KDE aplikacija KOffice: integrirano office okruje KDevelop: C/C++ integrirano razvojno okruje Quanta: razvojni alat za web stranice
933/1275
934/1275
Uspostava veze
KApplication je uspostavila metodu nazvanu KApplication::dcopClient() koja vraa pointer na DCOPClient instancu. Prvi puta kada se metoda pozove, kreirat e se klijentska klasa. DCOPClients imaju jedinstvene identifikatore koji nose sa sobom a koji ovise o tome to e KApplication::name() vratiti. Ustvari, ako postoji samo jedinstvena instanca programa koji je pokrenut, appId e biti jednak KApplication::name(). Kako bi se stvarno pokrenula DCOP komunikacija mora se koristiti DCOPClient::attach(). Ovo e rezultirati vezom sa DCOP serverom. Ako nema servera ili ako se pojavi bilo kakva greka attach e vratitit false. KApplication e primjetiti dcop signal i prikazati e se odgovarajui msgbox sa opisom greke. Nakon to je uspjela veza sa serverom, sljedei korak je registracija appId-a kako bi server znao o kome se radi, u protivnom komunikacija je anonimna. Kako bi se registracija izvrila potrebno je uiniti sljedee: DCOPClient::registerAs(const QCString &ime). U sluaju da se elimo prekinuti rad moramo napravitit detach, pozivajui funkciju DCOPClient::detach(). Ako nakon toga ponovno elimo napraviti attach moramo se i reregistrirati. Ako samo elimo promjeniti Id pod kojim smo registrirani pozivamo funkciju DCOPClient::registerAs() sa novim imenom. KUniqueApplication se automatski registrira na DCOP, pa ako koristimo KUniqueApplication ne moramo raditi attach niti register jer je to ve uinjeno.
935/1275
936/1275
bool BarObject::process(const QCString &fun, const QbyteArray &data, QCString &replyType, QbyteArray &replyData) { if (fun == doIt(int)) { QdataStream arg(data, IO_ReadOnly); int i; // parameter arg >> i; Qstring result = self->doIt (i); QdataStream reply(replyData, IO_WriteOnly); reply << result; replyType = Qstring; return true; } else { qDebug(unknown function call to BarObject::process()); return false; } }
937/1275
938/1275
DCOP signali
Ponekad pojedina komponenta raunala eli poslati potvrdu putem DCOP-a drugoj komponenti ali ne zna zapravo koja komponenta e biti zainteresirana za te potvrde. Kako bi se to omoguilo smiljeni su DCOP signali. DCOP signali su vrlo slini Qt signalima. DCOP signal se moe spojiti na DCOP funkcije. Kada god se DCOP signal emitira, DCOP funkcija na koju je signal spojen je pozvana. DCOP signali su kao i Qt signali jednosmjerni, ne mogu vratiti vrijednost. DCOP signali potjeu iz DCOP Object/DCOP Cliant kombinacije. Mogu se spojiti na funkciju druge DCOP Object/DCOP Cliant kombinacije. Postoje dvije glavne razlike izmeu veza Qt signala i veza DCOP signala. U DCOP-u , za razliku od Qt-a, signalne veze mogu imati anonimnog poiljaoca, i te veze mogu biti nonvolatile. Sa DCOP-om moe se spojiti signal bez specifikacije DCOP objekta ili klijenta. U tom sluaju signali od bilo kojeg DCOP objekta i/ili DCOP klijenta e biti isporueni. Ovo doputa specifikaciju pojedinih dogaaja bez poznavanja objekta koji e prouzroiti dogaaj. Druga znaajka DCOP su tzv. Non-volatile veze. Sa Qt signalnim vezama, veze se briu u sluaju da se izbrie primaoc ili poiljaoc signala. Volatile DCOP veza e se ponaati isto tako, no non-volatile DCOP signalna veza nee biti izbrisana u sluaju da se izbriu poiljaoc ili primaoc. Jednom kada se objekt kreira sa isti imenom kao i originalni objekt poiljaoc, veza e se povratiti(restore). Nema razlike u sluaju da se objekt primaoc izbrie, u tom sluaju signalna veza e se uvijek izbrisati. Primaoc moe kreirati non-volatile vezu bez obzira da li poiljaoc uope kreiran, to su tzv. anonimne DCOP veze i one bi u pravilu uvijek trebale biti anonimne. Sljedei primjer pokazuje kako Klauncher emitira signal svaki puta kada dobije potvrdu da se zavrila aplikacija pokrenuta sa Klauncherom
QbyteArray params; QdataStream stream(params, IO_WriteOnly); stream << pid; kapp->dcopClient()->emitDCOPSignal(clientDied(pid_t), params);
Task manager KDE panela se spaja na signal, koristi anonimnu non-volatile vezu.
connectDCOPSignal(0, 0, clientDied(pid_t), clientDied(pid_t), false);
939/1275
Spaja clientDied(pid_t) signal na svoj clientDied(pid_t) DCOP funkcije. U tom sluaju signal i funkcija imaju isto ime. Funkcija koja prima moe ignorirati jedan ili vie argumenata signala.
940/1275
Kao to se vidi, kreirana je apstraktna bazna klasa, koja je virtualno nasljeena od DCOPObject. Ako koristimo standardne KDE building skripte, onda se ovaj dokument jednostavno dodaje u sources direktorij. Building skripte e koristiti dcopidl za parsiranje MyInterface.h, konvertirajui ga u XML pa dobijemo MyInterface.kidl. Nadalje, dokument nazvan MyInterface_skel.cpp e biti automatski kreiran, kompajliran i linkan. Sljedee to treba uiniti je izabrati koje klase e biti implementirane u suelje opisano u MyInterface.h. Suprotne nasljeu ovih klasa, a takve da virtualno nasljeuju od MyInterface. Zatim treba dodati deklaraciju u klasno suelje slino onome u MyInterface.h, ali virtualno.
Class MyClass: public Qobject, virtual public MyInterface
941/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb { Q_OBJECT public: MyClass(); ~MyClass();
U implementaciji nae klase moramo moramo eksplicitno inicijalizirati one klase od kojih nasljeujemo. Ovo je naravno dobra praksa, ali moramo rei DCOPObject-u ime suelja koje implementirmo. Primjer:
MyClass::MyClass() : Qobject(), DCOPObject(MyInterface) { // biloto... }
Sada moemo jednostavno implementirati deklarirane metode u suelje, onako kako bi to i inae radili. Primjer:
void MyClass::myAsynchronousMethod(Qstring someParameter) { qDebug(myAsyncMethod called with param ` + someParameter + '); }
942/1275
Nakon to je kdesu dobio root lozinku, pokree kcmroot kao root, i razgovara sa korisnikovim dcop serverom. Vano je napomenuti da DCOP komunikacija nije zatiena, pa nije zahvalno slati vane informacije na ovaj nain.
943/1275
KDE XmlRpc
KDE XmlRpc doputa da klijent implementiran na gotovo bilo kojem programskom jeziku (python, perl, java, itd) ili na bilo kojoj platformi (Unix, Windows, MacOS) pristupi KDE DCOP klijentu (serveru). Niti klijent, a niti server ne treba dodatne modifikacije. Budui su sve KDE aplikacije (ili e to postati) DCOP klijen/server, to efektivno znai da se sve KDE aplikacije mogu manipulirati (skriptati) od strane bilo kojeg jezika na bilo kojoj platformi. XmlRpc je standardni nain implementacije poziva udaljenih procedura (RPC) koristei XML i HTTP. Njegov cilj je koristiti ugodne alate za sve kako bi implementacija bila to jednostavnija. Kako bi se to ostvarilo koristi XML za oznaavanje svih poziva metoda (i parametara) kao i povratnih vrijednosti. Nakon toga koristi HTTP za transfer poziva metoda. Prednost ovog pristupa je ta, to skoro svaki pristojan jezik (bilo skriptni ili ne) ima jednostavan pristup koritenju XML parsera i HTTP klijentima. Ovo ini implementaciju za veinu XmlRpc dijelova relativno jednostavnom. Iako je XmlRpc stvarno jednostavan za koritenje, bilo bi besmisleno oekivati da e se ovaj pristup implementirati u sve aplikacije, kada ve postoji jednostavan za koritenje RPC/IPC protokol DCOP. Kao rjeenje na ovo KDE ima XmlRpc DCOP vrata. KDE XmlRpc Deamon kxmlrpcd je ustvari web server koji prevodi XmlRpc zahtjeve u DCOP pozive i obrnuto. Ovo rjeenje je mnogo bolje od drugog koje je takoer bilo opcija, a ija je ideja bila da je prevoenje transparentno izmeu dva protokola. Tako i XmlRpc klijent i DCOP server oboje misle kako komuniciraju pomou svog protokola sa deamonom. Kako bi se ostvarila ova vrsta komunikacije potrebno je sljedee: provjeriti da je port kxmlrpcd ukljuen auth token za autorizaciju ime DCOP servera kojem elimo pristupiti ime DCOP objekta kojem elimo pristupiti Posljednje dvije stvari moemo saznati na jednostavan nain, npr. ako elimo pristupiti KDesktop Execute Command dijalogu vidjeli bi smo kako je ime servera 'kdesktop', a ime objekta 'KDesktopIface'. Port i auth token se mogu nai u dokumentu $HOME/.kxmlrpcd. Ako je komunikacija lokalnog karaktera sve to treba uiniti jest parsirati file, no ako je komunikacija udaljena te informacije moramo dobaviti na neki drugi nain. Neke mogunosti su mountiranje home direktorija sa NFS ili SMB ili poslati sebi e-mail sa tim vrijednostima ili staviti te vrijednosti na FTP server ili kako god... Auth token je 16 bitni
944/1275
string koji mora popratiti sve dolazne XmlRpc zahtjeve. Prvi parametar upozivu metode mora biti string i to auth token string. Osim ovog protokol je isti kao i standard. Kod KDE-a XmlRpc se ne koristi kao server, umjesto toga kreira se DCOP server. I to je u biti to! Ako je neka aplikacija postavljena kao DCOP server automatski ima mogunost komunicirati sa XmlRps klijentom. No, postoji jedno malo ogranienje. Mora se propustiti samo QCString kao tip stringa i koritenje <struct> i <array> je ogranieno.
#!/bin/sh port=`sed -e 's/,.*//' ~/.kxmlrpcd` auth=`sed -e 's/.*,//' ~/.kxmlrpcd` cat > cmd.xml <<EOF <?xml version="1.0"?> <methodCall> <methodName>KDesktopIface.popupExecuteCommand</methodName> <params> <param> <value>$auth</value> </param> </params> </methodCall> EOF length=`wc -c cmd.xml | sed -e 's/cmd.xml//;s/ //g'` cat > head.xml <<EOF POST /kdesktop HTTP/1.0 Content-Type: text/xml Content-length: $length EOF ( echo open localhost $port sleep 1 cat head.xml cmd.xml ) | telnet -8E
Primjer kako KDesktop podie Execute Command dijalog Ovo znai da se moe skriptati bilo koja KDE aplikacija koristei samo /bin/sh i telnet!
945/1275
Iako Knotes nema menubar ili toolbar ostatak programa (pri tome se misli na dijaloge i upotrebu mia) bi trebao potivati dizajn KDE-a.
946/1275
947/1275
koriste MDI, ve SDI Single Document Interface. SDI aplikacije nemaju glavni mother prozor koji sadri sve ostale prozore u sebi. Prozori aplikacija su svi odreda dijeca X root prozora to znai da su pod kontrolom window mamagera i mogu se pomicati po desktop okruenju prema eljama korisnika. Ako aplikacija mora otvoriti dodatni prozor on je takoer otvoren kao dijete root prozora. Postoji nekoliko nivoa SDI-a. Neki ljudi vjeruju da je prvi, poznat kao Pure SDI, jedini potreban, i da sve aplikacije mogu biti napisane koristei ovaj model. Ovo moe i ne mora biti istina, po ovom pitanju se vode debate. Vrijeme, i rad programera, e presuditi, no u meuvremenu, ovaj stil e opiasati ostale nivoe SDI, poznate kao Cooperating SDI i Controlled SDI. Kreatori aplikacija su ohrabreni koristiti Pure SDI model, te koriste ostale modele jedino kada se pojavi ozbiljan problem.
Suelje koje koristi KDE je bazirano na SDI the Single Document Interface. SDI pristup se koristi u svim KDE aplikacijama. isti SDI je preferirani model, i trebao bi se koristiti kada god je to mogue. Kada isti SDI model nije prihvatljiv programer bi trebao koristiti kooperacijski SDI model, za aplikacije koje moraju dijeliti konfiguracijske informacije izmeu instanca aplikacija, ili kontrolni SDI model za aplikacije koje zahtjevaju vie otvorenih dokumenata nego to ih je mogue prikazati na ekranu.
948/1275
949/1275
to tehniki mogue, zbog naina na koji aplikacija treba biti implementirana. Drag and drop operacija nad prozorom treba pozvati otvaranje dokumenta koji se vue u tom prozoru.
950/1275
951/1275
952/1275
Konqueror
Konqueror je file manager za K Desktop okruenje. Podrava osnovne file managenent na lokalnom UNIX file sistemu, poevi od jednostavnih izree/kopiraj naljepi operacija do naprednih kako udaljenih tako i lokalnih mrenih operacija. Na prvi pogled Konqueror izgleda kao normalni file manager, no njegove mogunosti ga ine tako zanimljivim. Prikazuje dokumente pomou ikona ili stabla, doputa kopiranje micanje i brisanje drag and drop tehnikom, prikazuje znaajke dokumenata, u njemu se mogu prikazivati tablice, prezentacije, web stranice, te svi dokumenti nainjeni u Koffice-u. Jako zanimljiva znaajka Konquerora je da on prua automatski update direktorija, tako naprimjer ako kreiramo novi dokument u direktoriju koji se trenutno gleda u Konqueroru nemoramo osvjevati ve e se novi dokument automatski pojaviti na ekranu. Isto se dogaa i sa izbrisanim dokumentima. Konqueror je osnova za sve novije KDE tehnologije, od KIO-a do komponenta ugraenih sa KPart sueljem, te predstavlja aplikaciju sa najveim stupnjem podesivosti, tako da ju svaki korisnk moe podesiti prema svojim potrebama. To omoguavaju XML konfiguracijski dokumenti za Konqueror. Kako se i cijelo Knqueror odijelo moe podesiti pomou XML-a, korisnik moe prikazati cijelu aplikaciju kako njemu odgovara (za korisnike prijenosnih raunala male ikone i sl.). Konqueror je Open Source web preglednik koji podrava HTML 4.0, Java aplete, Java Script, CSS1 i dijelom CSS2, kao i Netscape plugin-ove. Konqueror koristi khtml. Ovaj engine je implementiran u Kpart i kao takav se moe koristiti u drugim KDE programima. Konqueror je univerzalna view aplikacija, koja je u stanju ugraivati u sebe dokumente smo za itanje bez pokretanja drugih aplikacija. Moe prikazivati slike, KOffice dokumente, prezentacije, tablice i sl. Gledano sa tehnike strane zanimljivo je da ovi vieweri nisu dio Konquerora i nisu izraeni specifino za njega. Konqueror ugrauje komponente (dijelove) drugih aplikacija. Za svaki novi tip dokumenta koji elimo prikazivati u Konqueroru moramo samo napisati dio za view i ragistrirati ga sa desktop dokumentom, nema potrebe dirati Konqueror. Ugraene dijelove drugih aplikacija moemo pronai u library Kparts.
953/1275
KDE Network
KDE Network obuhvaa programe vezane uz mree, kako Internet tako i lokalne mree. U ovom poglavlju emo rei ukratko poneto o tim programima uz napomenu da neke neemo spominjati (koji nam se nisu inili toliko vani ili zastupljeni).
Kdict
Kdict je grafiki klijent za DICT protokol. Omoguava korisniku da pretrauje kroz bazu podataka kako bi naao pojedinu rije ili frazu, te mu tada prikazuje pogodnu definiciju.Kdict pojednostavljuje jednostavne ali isto tako i napredne upite. Lista odvojena separatorom predstavlja dobar nain za pretraivanje rijei koje imaju isto ili slino znaenje, a koje nam je napredan upit prikazao. Kdict svojim izgledom uvelike podsjea na web browser. U njega je implementirana naprijed/natrag tj back/forward tehnologija. Rijei koje su u listi a za koje elimo vidjeti znaenje moramo samo kliknuti i znaenje rijei e se prikazati analogno tome u web browseru je link. Kdict je u stanju raditi sa sadrajem clipboarda pa ga jednostavno moemo kombinirati sa web browserom ili text editorom. Ako je na raunalo postavljen firewall, ako raunalo nema pristup internetu ili ako je server koji se nalazi na dict.org prespor korisniku, korisnik moe postaviti svoj vlastiti lokalni server. Pri tome korisnik dobiva odreene prednosti kao to je mogunost dodavanja baza podataka.
KNewsTicker
KNewsTicker je dodatni programi za Kpanel, poznat jo i po nazivu Kicker, koji prua jednostavan pristup vijestima koje omoguuju stranice kao to su: SlashDot, Linux Weekly News, Frashmeat itd. Ovo je mogue na taj nain to KNewsTicker zatrai od stranice potreban RSS dokument koji sadri glavne vijesti kao i linkove na cijelokupne lanke. Takvi dokumenti su vrlo popularni u dananje vrijeme, a KNewsTicker sa sobom nosi popis stranica koje omoguavaju ovaku vrstu usluge. No, to su to RSS dokumenti? Ukratko moemo rei da su RSS dokumenti bazirani na XML-u kako bi se omoguio kontakt sa pojedinom stranicom. RSS se koristi kao simonim za Rich Site Summary, to nije ispravna definicija no daje nam ideju o emu se zapravo radi. RSS je kreiran od strane NetScape-a 1999 za potrebe njihove stranice my.netscape.com. Prva verzija putena u javnost je bila RSS 0.9. RSS je zamiljen kako bi na jednostavan nain
954/1275
prosljeivao sadraj web stranica u obliku jednostavnih vijesti. Pojedina stranica prosljeduje svoje ime, adresu, naslovne vijesti te link koji vodi do cjelokupnog lanka. Te informacije zatim generira KNewsTicker. Do danas su izale brojne verzije RSS-a, zadnja je 2.0, no prve dvije verzije koriste se za ak 85% dokumenata koji se prosljeuju ovom tehnikom.
Kopete
Kopete je KDE-ov instant messaging (IM) klijent. Omoguava jednostavnu komunikaciju to prvenstveno znai da premouje zapreke koje stvaraju razliite IM sistemi.
kpf
KPF je alat koji prua jednostavno dijeljenje dokumenata koristei HTTP. Kpf je iskljuivo javni fileserver, to znai da nema ogranienja pristupa shared dokumentima. To u principu znai da dokumentu koji je postavljen za djeljenje moe pristupiti bilo tko. U samom poetku razvoja kpf-a njegova namjena je bila za dijeljnje dokumenata na IRC-a (Internet Relay Chat). Danas uvelike olakava dijeljenje dokumenata meu udaljenim korisnicima te u neku ruku zamjenjuje priloge kod slanja e-mail.
Kppp
Kppp je dialer i korisniko suelje prema shell programu pppd. Doputa interaktivno generiranje skripta i network podeavaja. Jednom kada se kppp spoji daje korisniku iroku lepezu statistika i biljei vrijeme provedeno online. Ugraeni terminal i skriptni generator olakava uspostavu veze i podeavanja. Uz kppp korisniku vie nije potreban dodatni terminal program kao to je seyon ili minicom. Ujedno prua stalno praenje telefonskog rauna.
KWiFiManager
KWiFiManager je skup alata koji omoguuju podeavanje wireless LAN PC-kartice na K desktop okruenje. Prua informacije o trenutnoj konekciji i doputa korisniku podeavanje ak do 4 razliite nezavisne konfiguracije koje mogu biti pokrenute prilikom pokretanja Kde-a. KWiFiManager podrava sve wireless LAN kartice koje koriste wireless extensions suelje, to ukljuuje i mnoge kartice koje podrava wlan-ng projekt.
955/1275
Pim KAddressBook
KAddressBook je glavna adresar-aplikacija za KDE. Budui je bazirana na kabc library, podrava resurse koji se mogu koristiti za podizanje i spremanje kontakata na mnogo razliitih lokacija, ne samo na local file sistem nego i LDAP server te SQL bazu podataka. Korisniko suelje izgledom podsjea na MS Outlook.
KAlarm
Kalarm je jedan koristan program pomou kojeg se mogu postavljati alarmi-poruke, slati e-mail poruke ili se moe narediti pokretanje programa u odreeno vrijeme.
KPilot
KPilot je aplikacija koja sinkronizira PlamPilot ili sline ureaje sa KDE desktopom kao to to ini HotSync za Windows. Moe sinkronizirati ugraene aplikacije.
Knode
Knode je jednostavan za koritenje ita vijesti. Omoguava itanje vijesti ak i poetnicima u KDE-u, no ujedno ima i naprednije funkcije za one upuenije. Knode je online ita ali uz pomo newsservera kao to je leafnode moe postati offline ita.
956/1275
KGhostView
GhostView prikazuje i printa PostScript (.ps, .eps) i Portable Document Format (.pdf) dokumente. PostScript je glavni jezik za opis strnica za printanje na UNIX sistemima i ova aplikacija se moe koristiti za prikazivanje materijala za printanje ili za itanje dokumenata online.
KView
KView je preglednik slika na KDE desktopu. U ovom programu mogue je gledati grafike razliitih formata kao to su PostScript, TIFF i sl. Spremanjem slike sa drugom ekstenzijom mogue je na jednostavna nain konvertirati slike u bilo kakve druge grafike formate. KView ujedno omoguuje jednostavne procese nad slikama kao to su suavanje/razvlaenje rotacija i filtriranje. Pomou KView programa mogue je postaviti sliku kao pozadinu ekrana ili kreirati svoj slideshow.
957/1275
KEdit
Kedit je malen, jednostavan editor kao to je to dobro poznati Notepad na Windows sistemima. Pogodan je za upotrebu kod jednostavnijih zadataka ili kao jednostavan preglednik tekstualnih datoteka.
Kgpg
Kgpg je jednostavno suelje za GNUpg (poznat kao i gpg), snaan alat za enkripciju. Sa Kgpg alatom jednostavno je enkriptati i dekriptati dokumente i e-mail, to prua mnogo sigurniju komunikaciju. Kgpg je olakao ivot mnogim korisnicima UNIX operativnih sistema utoliko to se vie ne mora pamtiti sve gpg komande ve se enkripcija i dekripcija mogu izvriti sa nekoliko klikova miem.
958/1275
KDE Admin
KDE Admin je sveobuhvatni naziv za alate namjenjene administratorima.
Kcron
Kcron je aplikacija za raspored programa koji rade u pozadini. To je zapravo grafiko suelje napravljeno za cron, alat na UNIX radnim stanicama za raspored programa.
KDat
KDat je alat za arhiviranje na traku baziran na tar-u. Dizajniran je kako bi radio sa vie arhiva na jednoj traci. KDat je kreiran sa ciljem da se stvori grafiko korisniko suelje za tar koje podrava brze selektivne ekstrakcijske odlike programa dds2tar. Mogunosti koje prua KDat su: jednostavno grafiko suelje do lokalnog filesistem-a i sadraja traka, mnogobrojne arhive na jednoj (fiziki jednoj) traci, kompleksan zbir arhiva i dokumenata je pohranjen na lokalnom hard disk-u, selektivan povratak dokumenata iz arhive i backup profili za esto koritene backup-ove.
Kpackage
KPackage je grafiko korisniko suelje do RPM, Debian, Slackware i BSD managera. KPackage je dio K Desktop Environment i kao rezultat toga, dizajniran je kako bi se integrirao sa KDE file managerom.
959/1275
KOffice
KOffice je integrirano office okruenje za K Desktop Environment. Sastoji se od sljedeih dijelova: KWord, KSpread, KPresenter, Kivio, KArbon 14, Krita, Kugar, KChart, KFormula, Kexi, Filters.
KWord
KWord je sposoban kreirati zahtjevne dokumente profesionalnog izgleda. KWord je wordprocessor baziran na okvirima. Odlike Kworda su: stil za pojedini paragraf ( granice, poravnanja, font, boje...), okvirna orjentacija pogodna za DTP (Desktop Publishing), numeriranje, viestruke kolone na stranici, zaglavlja i podnoja, tablice, ugraivanje teksta slika i sl. I jo mnoge druge.
KSpread
KSpread je program namjenjen izradi tablinih dokumenata, no koristan je i kada su nam potrebne matematike formule ili statistiki izrauni. Mogunosti KSpread programa su: izrada viestrukih tablica u istom dokumentu, zaglavlja i podnoja, uzorci, koritenje vie od 100 matematikih formula ukljuujui devijacije varijance i sl, sortiranje, komentari, nizovi (dani u tjednu i sl), odabir boje za pojedinu eliju, hiperlinkovi itd.
KPresenter
KPresenter je program namjenjen izradi prezentacija. Ovaj program moe: ugraivati clike i clipart u dokument, unositi auto- forme, podeavati znaajke objekata kao to su boja rotacija sjena i sl, grupirati ili od grupirati objekte, podeavati pozadinu, napredno ponitavati/ponavljati, prezentirati uz efekte. Uz sve to moe printati kao PostScript, kreirati HTML slideshow sa samo nekoliko klikova miem i koristiti XML kao format dokumenta.
Kivio
Kivio je program za izradu dijagrama. Ima slino suelje kao Visio. U potpunosti je integriran u KOffice i moe se npr. ugrditi u KWord. Karakteristike ovog programa su skriptne matrice (stencile) koje korist Python, podrka za Dia matrice, plugin strukture za dodavanje funkcionalnosti.
960/1275
Karbon
Karbon je aplikacija KOffice-a za crtanje vektora.
Krita
Krita je program za crtanje i editiranje slika u KOffice. Jo je uvijek u izradi, a trenutno su u potpunosti funkcionalne sljedee mogunost programa: crtanje sa bojama i kistovima, kreiranje vlastitih kistova pomou krugova i kvadrata, ispunjavanje objekata bojama i uzorcima, brisanje, airbrush, jednostavni geometrijski oblici, ponitavanje/ponavljanje, podizanje i spremanje dokumenata, unoenje i izvlaenje slika u sve formate podrane od ImageMagick, dodavanje pomicanje i promjene redosljeda slojeva, zumiranje, odabir boja, podrka za Wacom tablets i jo mnogo toga. Krita ovisi o sljedeim library: ImageMagick X11, Little CMS (besplatan sistem za management boja).
Kugar
Kugar je program za izradu poslovnih izvjea koja se mogu pregledavati i ispisivati. Izvjea se mogu pregledavati Konqueror programom, a isto tako moguse ugraivati i u bilo koju KDE aplikaciju. Kugar radi na principu spajanja aplikacijski generiranih podataka sa template-ima kako bi se stvorio zavrni izvjetaj. Podaci i template su specificirani XML-om, to znai da se aplikacija treba brinuti samo za podatke, dok se template moe referencirati preko URL-a to doputa da se stvori centralni template library. Ima podrku za direktan pristup bazama podataka.
KChart
KChart je program za kreiranje dijagrama(chart). Dokumenti stvoreni KChart programom se mogu ugraivati u KOffice dokumente npr KWord.
KFormula
KFormula je program koji nam olakava ivot pri pisanju matematikih ili slinih formula. Znaajke ovog programa su: jednostavnounoenje slova grke abecede, inteligentno pomicanje pokazivaa, napredno oznaavanje sintakse, ogunost izlaza dokumenta u LaTeX program. Ovaj program se nastoji unaprijediti tako to e podravati unos dokumenata iz LaTeX i MathML programa.
961/1275
Kexi
Kexi je program koji trenutno ne dolazi sa KOffice ali sljedea KOffice verzija programa e sadravati Kexi. To je program za manipulaciju podacima. Pomou njega mogu se kreirati baze podataka te kreirati upiti. Ideja za ovakav program dola je iz nedostataka postojeih programa kao to su MSAccess, FoxPro, Oracle Forms i File Maker. Trenutno Kexi podrava sljedee sisteme baza podataka: SQLite, PostgreSQL, MySQL i FireBird/Interbase. Planirano je da podrava i druge sisteme baza podataka, ponajprija ODBC suelje.
962/1275
KDevelop
KDevelop je projekt koji je pokrenut 1998. godine sa ciljem stvaranje jednostavnog za koritenje IDE-a (Integrated Development Environment) za KDE. Od tada pa do danas KDevelop IDE podrava brojne programske jezike, a dostupan je i pod GPL-om. 8.12.2004. izdana je zadnja promjenjena verzija tj. KDevelop 3.1.2. Znaajke KDevelop-a su: rukuje sa svim razvojnim alatima za programiranje pod C++ programskim jezikom to prvenstveno znai complier-om, linker-om, debugger-om i build sistemom; dri dostupnim aplikacijski arobnjak koji generira kompletne, spremne za rad, pokazne aplikacije; doputa korisniku da odabere integrirani editor baziran na KDE-ovom programskom editoru Kwrite, Trolltec-ovom Qeditoru ili drugim; posjeduje klasni generator za kreiranje novih klasa i integriranje istih u postojei projekt; posjeduje File management za izvore, zaglavlja, dokumentaciju itd; prua pomo pri kreiranje aplikacijskog korisnikog prirunika napisanim sa KDE tools; posjeduje automatsku HTML baziranu API dokumentaciju za klase projekta sa cross referencama koritenih library-a; prua internacionalnu podrku koja doputa prevodiocima da dodaju eljeni jezik u projekt s lakoom, to ukljuuje podrku za Kbabel; prua podrku za manipulaciju projektom kroz CVS na taj nain to posjeduje jednostavan za upotrebu frontend za veinu potrebnih funkcija; posjeduje frontend za debugger; posjeduje integrirani shell console emulator; oznaava sintaksu koda kako bi se izbjegle sintaksne pogreke (npr. naglaava zagrade); prua korisniku automatsko zavravanje koda za varijable klasa, metode klasa, argumente funkcija i sl; posjeduje template za kreiranje razliitih projekata (KControl module, Kicker applete, KIOSlaves, Konqueror plugins i desktop stilove); posjeduje 4 pogleda na navigacijska stabla za lake prebacivanje izmeu dokumenata; ima podrku za cross kompajler sa mogunou odabira razliitih kompajlera, zastavica kompajlera, ciljane arhitekture itd.; sadrava podrku za Qt-ugraene projekte kao to su Zaurus i iPAQ i na kraju ima mogunost za dodavanje bilo kojeg programa koji korisnik treba za razvoj jednostavnim dodavanjem tog programa u Tools meni.
963/1275
KDE libraries
Libraries: Kdecore Kdecore je osnovni programski framework za svaki kde program. Prua prisup konfiguracijskom sistemu, rukovanje komandnim linijama, podizanje i manipulaciju ikona, neke posebne vrste interprocesorske komunikacije, rukovanje dokumentima i raznim drugim programima. Kdeui Kdeui librarie prua mnoge widgets-e i standardne dijaloge koje Qt nema, ili imaju vie znaajki nego njihov Qt suparnik. Prua ujedno i nekoliko widgets-a koji su subclassed od Qt-ovih i bolje su integrirane u kde desktop potivajui korisnikove postavke. Kio i ksycoca Kio i ksycoca libraries sadre postrojenja za asinkroni mreno transparentni ulaz/izlaz i pristup rukovanju mimetype-om. Kfile Kfile libraries sadri kde dokument dijalog i njegove pomone klase. Kjs Kjs libraries prua implementaciju JavaScript jezika. Khtml Khtml libraries sadri KHTML dio, HTML widget, DOM API i parser, ukljuujui suelje prema Java i JavaScript jezicima.
Grupne klase Core application skeleton klase koje su potrebne u skoro svakoj aplikaciji KApplication inicijalizira i kontrolira KDE aplikacije KUniqueApplication brine se da se samo instance aplikacija mogu vrtiti simultano KaboutData dri informacije za about box KcmdLinesArgs procesuiranje argumenata s komandne linije
964/1275
Configuration settings pristup KDE-ovoj hijerarhijskoj konfiguracijskoj bazi podataka, globalnom podeavanju i aplikacijskim resursima Kconfig prua pristup KDE ovoj konfiguracijskoj bazi podataka KsimpleConfig pristup jednostavnim, ne hijerarhijskim konfiguracijskim dokumentima KdesktopFile pristup .desktop dokumentima KglobalSettings jednostavan pristupne ne specificiranim aplikacijskim podeavanjima File and URL handling dekodiranje URLa, privremenih dokumenata itd KURL predstavlja i parsira URLe KtempFile kreira jedinstveni dokument za privremene podatke KsaveFile doputa automatsko spremanje dokumenata Interprocesorska komunikacija DCOP help klase i podprocesno pozivanje Kprocess poziva i kontrolira child procesima KshellProcess poziva child procese putem shell-a PtxProcess komunikacija sa child procesima preko pseudo terminala KIPC jednostavan IPC mehanizam koji koristi X11 ClientMessages DCOPClient DCOP razmjena poruka KDCOPPropertyProxy proxy klasa koja predsravlja Qt znaajke kroz DCOP KDCOPActionProxy proxy klasa koja predstavlja DCOP suelje za akcije Utility classes raspodjela memorije, regularni izrazi, manipulacije stringovima, sluajni brojevi KregExp POSIX mehanizam za regularne izraze KstringHandler ekstravagantno sueljeza manipulaciju stringovima
965/1275
KzoneAllocator efikasno alociranje memorije za velike grupe malih objekata KrandomSequence generator sluajnih brojeva Keyboard accelerators klase koje pomau uspostavi konzistentnih preica koristei tipkovnicu koji rade bilo gdje na desktopu Kaccel kolekcija preica na tipkovnici KstdAccel jednostavan pristup uobiajenim tipkama preica na tipkovnici KglobalAccel kolekcija preica na tipkovnici koje su dostupne na cijelom sistemu Procesuiranje slika podizanje i manipulacija ikonama KiconLoader uitava ikonu iz teme KiconTheme pomone klase za KiconLoader Kpixmap pixmap klasa sa irokim spektrom mogunosti KpixmapEffect pixmap efekti kao to su uzorci KpixmapIO zadnji Qimage -> Qpixmap pretvorba Drag and Drop . odvuci i pusti KURLDrag vuni objekt za URL-ove KcolorDrag vuni objekt za boje KmultipleDrag dopute kreiranje vunog objekta iz nekoliko drugih Auto-Completion Kcompletion generiko automatsko dovravanje stringova KURLcompletion automatsko dovravanje URLova KshellCompletion automatsko dovravanje izvrnih datoteka
966/1275
Widgets widget klase za pregled lista, doputenja, odabir boja itd. KlistView varijanta QlistView koja potuje KDE-ove sistemske postavke KlistBox varijanta QlistBox koja potuje KDE-ove sistemske postavke KiconView varijanta QiconView koja potuje KDE-ove sistemske postavke KlineEdit varijanta QlineEdit sa potpunom podrkom KcomboBox varijanta QcomboBox sa potpunom podrkom KfontCombo combo box za odabir font-ova KcolorCombo combo box za odabir boja KcolorButton gumb za odabir boja KURLCombo combo box za odabir imena datoteka i URLa KURLRequest line edit za odabir imana datoteka i URLa Krulerwidget za ravnalo KanimWidget animacije KnumInput widget za unos brojeva KpasswordEdit widget za unos lozinke Dijalozi dijalozi za izbor dokumenata, boja i font-ova KfileDialog dijalog za izabir dokumenata KcolorDialog dijalog za izbor boja KfontDialog dijalog za izbor font-ova KiconDialog dijalog za izbor ikona KkeyDialog dijalog za editiranje bindings sa tipkovnice KeditToolBar dijalog za dodavanje toolbars-a KtipDialog dijalog za natuknicu dana KaboutDialog dijalog about KlineEditDlg jednostavan dijalog za unos teksta KURLRequestDlg jednostavan dijalog za unos URL-a KmessageBox dijalog za signalizaciju greaka i upozorenja
967/1275
KpassworeDialog dijalog za unos lozinke Akcije i XML GUI Kaction apstrakcija za akciju koja moe biti dodana u traku s menuima i alatnu traku KactionCollection set akcija KXMLGUICliant GUI dio koji se sastoji od kolekcija akcija i DOM stablinog prezentiranja njihove lokacije u GUIu KpartManager upravlja aktivacijom XMLGUI klijenata Plugins i komponente Klibrary predstavlja dinamiki uitani library KlibLoader uitavanje dijeljenih library KlibFactory object factory u plugin-ovima KserviceType predstavlja tipove servisa Kservice predstavlja servise KmimeType predstavlja MIME type KserviceTypeProfile korisnike postsvke za MIME type mapiranja Ktrader pitanja za servise
968/1275
969/1275
Marina Petrovska
970/1275
UVOD
UNIX je vieprogramski, viekorisniki operativni sistem ope namjene. Razvili su ga Ken Thompson i Dennis Ritchie (firma Bell Laboratories) i prvi puta predstavili javnosti u asopisu Communications of the ACM, July 1974. UNIX je vieprocesni multiuser operativni sistem i za sada se veinom koristi za jednoprocesorskim kompjuterima. Kako je procesor (CPU) samo jedan, on je, u cijelosti, u svakom trenutku posveen samo jednom procesu. Drugim rijeima, svi aktivni procesi dijele vrijeme jednog istog procesora. Ova pojava se naziva time-sharing. Vrijeme kontinuiranog rada svakog procesa veoma je kratko, to daje utisak da su svi procesi aktivni u isto vrijeme. UNIX omoguava aktiviranje interaktivnih i pozadinskih procesa. Interaktivni zahtijevaju ulazne podatke sa tipkovnice tijekom svojeg rada i time i direktno sudjelovanje korisnika. Za razliku od njih, procesi aktivirani u pozadini od poetka imaju sve potrebne podatke i ne zahtijevaju direktno sudjelovanje korisnika. Vrijeme je pokazalo da se rad s komandnim linijama, kao svojevrstan stereotip "nerd" drutva, sve vie odbacuje (ali nikad u potpunosti zbog nekih svojih prednosti) i da je stvorena potreba za komunikacijom s raunalom, tj. operativnim sustavom pomoi grafikog suelja. Ne samo zbog toga to obini korisnik nije "nerd" i trai user friendly suelje nego i zbog same ljudske prirode i percepcije: ljudi bre rade sa slikama nego tekstom. Danas najpopularniji i najee koriteni komercijalni operativni sustavi Windows i MacOSX svoju popularnost (i monopol na softverskom tritu) dobivaju zbog vrlo jednostavne uporabe i integracije raznih aplikacija u sam sustav, to korisnika poteuje stvari koje on ne mora raditi. S druge strane, prednost sustava baziranih na Unixu (kao i sama filozofija Unixa) je upravo suprotna - potpuna fleksibilnost i mogunost da korisnik u potpunosti prilagodi rad na raunalu svojim potrebama. Kao alternativa Windowsima, Linux nudi svoje GUI-e (Graphical User Interface).
971/1275
POVIJEST
1973. Xerox proizvodi prvo raunalo (Alto) s grafikim sueljem da bi 1981. napravili The Star, iji sustav je imao veinu obiljeja koje imaju dananji GUI-i: prozore koji se mogu preklapati i prikaz datoteka kao ikona. 1983. Apple predstavlja sustav Lisa, koji prvi predstavlja trake s menijima (menu bars) i padajue izbornike, a 1984. izbacuje prvog Macintosha na trite. Iste godine na MIT sveuilitu je predstavljen "Window System X" - prvi Unixov GUI.
1985. izlazi Geos za Commodore 64 i kasnije Apple II, Commodore proizvodi raunalo Amiga 1000 s Workbench 1.0 sustavom, a Microsoft izbacuje prvu verziju Windowsa, najavljenu 1983.
1987. Apple izbacuje Macintosha II, prvo Apple raunalo s prikazom u boji, izlaze Ms Windows 2.03 s prozorima koji se mogu preklapati i mijenjati veliinu. 1988. Apple predstavlja 16-bitni GS/OS a IBM OS/2 1.10 SE kojeg je napravio Microsoft. 1990. Izlazi Amiga Workbench 2 za Amiga 3000 raunala, Microsoft izbacuje Windows 3.0 (koji u sebi ima Program Manager).
972/1275
1992. Se pojavljuju prvi IBM-ov 32-bitni sustav OS/2 v2.0, Microsoft Windows 3.11 i Amiga Workbench 3. 1993. Microsoft predstavlja Windows NT, prve 32-bitne Windowse. 1994. pojavljuje se Photon microGUI za Unix-based sustave.
1995. Izlazi Windows 95. 1997. Mac OS 8 izlazi i prodaje se u 1.25 milijuna primjeraka u manje od dva tjedna i postaje tada najprodavaniji software.
1998. Izlazi Windows 98 u kojem je Windows Internet Explorer, koji je sada integriran u sustav, preuzima ulogu shella, da bi za 5 mjeseci Shane Brooks napravio 98Lite, koji omoguava odvajanje IE od Windowsa, smanjuje vrijeme potrebno za boot i ima bolji shell. 1999. Mac predstavlja Mac OS X Server baziran na Unixu. 2000. Microsoft izbacuje Windows 2000 - novu verziju Windowsa NT koja ima u potpunosti integriran Internet Explorer. 2001. Pojavljuje se Windows XP, naprednija i uminkana verzija Windowsa 2000.
973/1275
Polovicom osamdesetih mala skupina programera smjetena u jednoj zgradi u maloj uliici grada Cupertina u Kaliforniji i predvoena Steveom Jobsom promijenila je svijet. Napravili su prvo grafiko suelje, proizvod koji je narodne mase upoznao s do tada opskurnim digitalnim pojavama kao to su mi, prozor, ikona, izbornik (menu) i "dijaloke" kuice, od kojih je u sjeanju mnogih ostala ona zastraujua "bomba" koja je upozoravala na poinjenu pogreku. Macintosh je tako obine smrtnike oslobodio dotad sveprisutne tzv. "komandne linije" i operativni sustav uinio "korisniku naklonjen". No, Bill Gates, ovjek koji je kao svoju ivotnu misiju odabrao reenicu koja kae "da e na svaki radni stol postaviti jedno osobno raunalo", nije dugo ekao. Obukao je svoj, na komandnoj liniji utemeljeni, DOS u ruho koje je nazvao Windows. Tako smo dobili konkurenciju Macintosh grafikom suelju. Nakon par godina vie nikom nije bilo jasno kako smo uope mogli koristiti kompjutore bez ikona, prozora, mia i dijalokih kuica. A onda je glavna fora postao internet. Tu je glavno suelje postao web preglednik, pretraitelj, ili na dobrom amerikom - "browser". Mac OS i Windows vie nisu bili dovoljni. Ne samo da su "odjednom" zastarjeli ve su se morali suoiti i s Linuxom, Unixom novoga digitalnog doba. Sva trojica, unato tome to je Linux dijete interneta, teko su se hrvali s poplavom informacija koje je pred znatieljne korisnike prosipala svijetom protegnuta mrea. Steve Jobs je opet odluio biti prvi. Okupio je tim vrsnih programera i godinama u potaji eksperimentirao te napokon svijetu objavio novi Macintosh operativni sustav - OS X, poznatiji kao Aqua, meu poznavateljima oznaen kao "Unix za Macove". Beta inaicom ve se "igraju" tisue korisnika, i to ne samo Mac "fanatika", ve i svi oni koji u informatikom svijetu dre da uvijek moraju biti "in". Mac OS X teko je jednostavno opisati jer pravi se dojam stjee tek
974/1275
kad ga vidite na djelu. areno je to suelje s mnogo boja, prozirnih dijalokih kuica i prozora, te mnotvom inovativnih funkcija.Gatesov novi borbeni pokli glasi ".NET" (itaj: dot-net). E sad, to nije samo grafiko suelje, niti operativni sustav, to je, jednom rijeju, filozofija. Microsoftovi programeri koncept svog novog suelja opisuju sintagmom "univerzalno platno". Prostor je to gdje se internet, "radni stol" (desktop) osobnog raunala i operativni sustav saimaju u jedan (i jedinstven) alat koji korisniku omoguuje da istim tehnikama pretrauje poruke e-pote, web stranice i sadraj tvrdog diska. No, kako e kompjuter znati kada mu treba procesor rijei, kada program za obradu slike, a kada neto sasvim tree, Bill Gates jo nije potpuno objasnio. Odgovor je, ini se, u "univerzalnoj liniji za tipkanje" - uvijek aktivnom praznom prostoru u koji korisnik moe upisati web adresu, upit za pretraivanje ili naslov poruke e-pote to kompjutoru odmah daje dovoljno podataka za "podizanje" upravo potrebne aplikacije. Naravno, sve opisano tek je prototip. Ipak, najblie tome to nas oekuje u vrlo bliskoj budunosti ve moemo vidjeti u najnovijoj inaici MSN Explorera (radno nazvanog "Mars") to je Microsoft javno obznanio kao test platformu za neke ideje koje e biti primijenjene u .NET paketu softverskih usluga. To je naporan i dugotrajan posao kojim se dobro organizirani timovi programera u Microsoftu i Appleu bave desetljeima. No, to nije sluaj s Linuxom. Taj internet "unixoid" bio je iskljuivo dvorite za egzibicije turbo softveraa i nije ba sklon svakome. Jo do juer Linuxai su se ponosili time to imaju komandnu liniju i to u njihov klub teko moe prodrijeti netko bez diplome iz informatikih znanosti ili bar matematike. Osim toga, to je operativni sustav graen po "open source" naelu - to znai da je svima dostupan nacrt temelja ("kernela"), ega se treba pridravati, a dalje svi grade iz donesenog materijala. Rezultat? Mnotvo "distribucija" (vrsta) Linuxa, kojima je danas, uz to to korisnika doista tjeraju na uenje, gotovo jedina prednost to to su uglavnom besplatne (ali ne i podrka). Linuxai su dugo vremena odbacivali i samu pomisao na grafiko suelje, no danas su se stvari promijenile. Nekoliko skupina programera poelo je raditi i na tome, a posebno se istaknula tvrtka Eazel - sastavljena od, a od koga bi drugog, par Macintosh veterana. Njihovo grafiko suelje zove se Nautilus, lako se "lijepi" na Linux, doputa instalaciju s vie stupnjeva sloenosti - od poetnika do "power usera", ima navigaciju slinu onoj kako se pretrauje internet. No, ono to je najzanimljivije nain je na koji se prezentiraju datoteke koje su prikazane tako da odmah upuuju na svoj sadraj. Mapa s glazbom izgleda kao CD album, a datoteke su prikazane na isti nain kao i na ovitku ploa. Drugi izum omoguava korisniku
975/1275
posebno oznaavanje datoteka pridajui im razne atribute - glavno, tajna, posao, u-radu i slino. To omoguuje preciznije pretraivanje tvrdog diska. No, kako e se mala tvrtka boriti protiv "pirata silicijske doline"? Kako bilo, ukljuili su se. Prvi im je uspjeh to to e Dell, drugi svjetski proizvoa osobnih raunala, svojim poslovnim korisnicima instalirati Linux s Eazel sueljem. Maraton za grafiko suelje i operativni sustav budunosti je poeo. Tko e pobijediti sad je teko procijeniti, a korisnici od ustre konkurencije mogu samo profitirati.
976/1275
STRUKTURA
Jo od vremena Windows 3.1 grafike nadogradnje za MS DOS operativni sustav i MacOS operativnog sustava koritenje raunala sve vie prelazi iz pisanja naredbi u naredbenoj liniji u point-and-click nain rada u grafikom suelju. Grafika suelja i pointand-click tehnologija pribliili su koritenje raunala irem krugu ljudi pojednostavljivanjem rada na i danas je moderan operativni sistem bez njih nezamisliv. Sustav koji omoguava grafiko okruenje za Linux zove se X Window. X Window je samo podloga za grafika suelja koja se mogu koristiti u Linux operativnom sustavu i kojih, za razliku od MS Windows operativnog sustava, ima nekoliko. X Windows sustav mora biti instaliran na raunalu na kojem se eli koristiti Linux grafiko suelje. Osim X Windows-a, na raunalu mora biti instalirano i samo grafiko suelje koje e se koristiti. Odabir grafikog suelja ovisi iskljuivo o afinitetima korisnika. Opisat u tri grafika suelja: GNOME KDE Ximian Izgledom i nainom koritenja vrlo su slina MS Windows operativnom sustavu (korisnici MS Windows-a vrlo se brzo mogu naviknuti na bilo koje od ova tri suelja), besplatna su i mogu se skinuti s Interneta. KDE grafiko suelje samo je dio KDE paketa u koji su ukljueni i programi za konfiguraciju raunala u grafikom okruenju kao i paket uredskih aplikacija (KOffice) slinih MS Office paketu. Kao i u sluaju KDE paketa, s GNOME paketom uz samo grafiko suelje takoer dolazi i mnogo korisnikih programa, programa za grafiku konfiguraciju raunala i set uredskih aplikacija pod imenom GNOME Office. Ximian GNOME je samo nadogradnja GNOME grafikog suelja. Za razliku od GNOME paketa u koji su ukljuene i aplikacije koje su jo uvijek u ranoj fazi razvoja (jo uvijek nisu dovoljno stabilne za normalan rad), s Ximian paketom dolaze samo testirane i stabilne aplikacije. Za razliku od vjeto upakiranih Windowsa ili MacOS-a, grafika suelja za Linux se sastoje od potpuno odvojena 3 sloja/komponente, ime se korisniku ostavlja mogunost izbora svakog od njih.
977/1275
1) Prvi sloj je X Server ija je svrha komunikacija izmeu grafikog suelja i operacijskog sustava, a moe povezati ak i grafiko suelje jednog raunala i programa koji se izvrava na drugom. X Server dolazi s instalacijom Linuxa. Najee distribucije su XFree 86, Metro-X i Accelerated-X. Postoji mogunost zabrane daljinskog spajanja na X server koristei nolisten tcp opcije na x serveru. Ovo e sprijeiti bilo kakva mrena spajanja na server preko tcp socket-a. SERVER obezbjeuje funkcije na niem nivou za interakciju sa vaim video hardverom. XFree86 XFree86 je zatieno ime proizvoda tvrtke XFree86 Project, INC. Prvobitni programeri koji su X Windowse prilagodili platformi 80386 odluili su projekt osnovati radi stjecanja lanstva u X Consortiumu. Postavi lanicom X Consortiuma, XFree86 Project dobio je pristup trenutno razvijenim poslovima i tako je u XFree86 mogao prebacivati nove mogunosti istovremeno s njihovom primjenom u X Windowsima, umjesto da eka njihov slubeni izlazak da bi ih mogao iskoristiti. X Consortium je od 1. sijenja 1997. X prepustio skupini Open Group. XFree86 ukljuuje i programske biblioteke i datoteke za programere koji ele razviti svoje vlastite aplikacije pod XFree86. XFree86 prua preklapajue prozore, trenutno iscrtavanje grafike, bitmapirane grafike i slike visoke razluivosti i visoko-kvalitetni prikaz teksta. Opis X servera koje moete instalirati: x3dl X server za kartice koje koriste 3DLabs chipovi (XF86_3DLabs) x8514 X server za kartice koje koriste IBM8514 chipovi (XF86_8514) xagx X server za kartice koje koriste AGX chipovi (XF86_AGX) xi128 X server za #9 Imagine 128 (XF86_I128) xma8 X server za kartice koje koriste Mach8 chipovi (XF86_Mach8) xma32 X server za kartice koje koriste Mach32 chipovi (XF86_Mach32) xma64 X server za kartice koje koriste Mach64 chipovi (XF86_Mach64) xmono A Monochrome X server (XF86_Mono) xp9k X server za kartice koje koriste P9000 chipove (XF86_P9000) xs3 X server za kartice koje koriste S3 chipove (XF86_S3) xs3v X server za S3 ViRGE chipove (XF86_S3V; obsolete, use SVGA) xsvga X server za veinu SVGA kartica (XF86_SVGA) xvg16 A 16color generic X server (XF86_VGA16) xw32 X server za kartice koje koriste ET4000/W32 chipset (XF86_W32) xxfb Generic framebuffer server za veinu VESA kartica (XF86_FBDev)
978/1275
2) Drugi sloj je Window Manager koji vodi rauna o samom prozoru i ponaanju prozora (otvaranje, zatvaranje, mijenjanje veliine, minimiziranje, maksimiziranje...). Najee dolazi u paketu s Desktop Environmentom, ali ne mora biti tako - recimo, Gnome je dolazio sa Enlightenement window managerom dok se uz novije verzije isporuuje Sawfish. Kao i UNIX, X-i su prilino fleksibilni. Izgled prozora, rad menija i ostale mogunosti su kontrolirane od strane WINDOW MANAGER-a. Najei WINDOW MANAGER-i su mwm, fvwm, i twm. Postoji gomila drugih window managera ukljuujui i fvwm95, koji simulira Windows-e na UNIX PLATFORMI . Neki od window managera raspoloivih za Linux: twm Tomov window manager fvwm virtualni window manager za X11 fvwm95 - virtualni window manager za X11 koji poprilino nalikuje Microsoftovim Windowsima 95 mwm Motif window manager olwm Openlookov window manager, temeljen na Sunovom Open Looku olvwm Openlookov virtualni window manager Enlightenment omiljen i elegantan prozorski manager CDE Common Desktop Environment, X GUI koji je prilagoen mnogim UNIX-ima KDE K Desktop Environment, besplatna varijacija CDE-a Twm program twm za upravljanje prozorima u sustavu X Windows prua naslovne trake, oblikovane prozore, nekoliko obrazaca upravljanja ikonama, korisniki definirane makro funkcije, klik za upisivanje i pokazivaem upravljano arite tipkovnice, korisniki odreene tipke i povezivanja tipkom mia. Fwm program za upravljanje prozorima fwm za X11 jest izvedenica twm-a. Program je preoblikovan za smanjenje potronje memorije, pruanje trodimenzionalnog izgleda okvirima i pruanje jednostavne virtualne radne povrine Fwm95 program za upravljanje prozorima fwm95 za X11 je hakerska preinaka temeljena na fvwm2.x. Cilj je razvijatelja bio oponaanje glavnih znaajki GUI-ja dobro poznatog operativnog sustava da bi se korisnici ugodnije osjeali u UNIX okruju i radi izbjegavanja napuhavanja jednostavnog i istog GUI koda fvwm-a. Olwm program za upravljanje prozorima olwm za X Windows sustav primjenjuje dijelove grafikog korisnikog suelja Openlook. To je standardni program za upravljanje
979/1275
prozorima za Sunov proizvod Open Windows, ali ispravno radi sa svakim X11 sustavom, ukljuujui Xfree86. Enlightenment Enlightenment je omiljen i sjajno napisan program za upravljanje prozorima. Stabilan je i brz. Premda je ispoetka temeljen na rvwm radu, njegove su novije inaice u potpunosti napisane od nule. CDE Common Desktop Environment (CDE) je komercijalni pokuaj prilagodbe uobiajene radne povrine na veinu inaica UNIX-a. Detaljnije sam ga opisala kasnije u seminaru. KDE K Desktop Environment (KDE) je veliki freeware projekt zamiljen za stvaranje integriranog radnog okruja slinog CDE-u, ali razvijen i izdan u potpunosti pod GNU Public License (GPL). Detaljnije sam ga opisala kasnije u seminaru.
3) Trei sloj je sam Desktop Environment koji brine o svemu ostalom. Poto se radi o viekorisnikom sustavu mogue je da svaki korisnik ima svoje okruenje potpuno prilagoeno njegovom ukusu i potrebama. Najpopularniji su KDU i Gnome.
980/1275
GRAFIKA SUELJA
GNOME
GNOME je grafiko okruenje za Linux i Unix operativne sustave koje korisnicima omoguava jednostavnu primjenu i konfiguraciju raunala. Izgledom i nainom koritenja vrlo je slino grafikom okruenju iz MS Windows operativnog sustava. S grafikim okruenjem dolaze i alati za konfiguraciju samog grafikog suelja, alati za konfiguraciju raunala i paket aplikacija koje se nalaze u rasponu od malih korisnikih programa pa sve do monih uredskih aplikacija. Zajednike znaajke tih aplikacija su besplatnost, jednostavnost koritenja, brzi razvoj i dostupnost su preko Interneta. Cijeli GNOME paket sadri: GNOME desktop - grafika radna okolina, GNOME razvojni alati - kolekcija alata i komponenti za razvoj aplikacija, GNOME Office - paket uredskih aplikacija. Uredske aplikacije koje su ukljuene u GNOME paket pod zajednikim imenom GNOME Office su: Gnumeric - spreadsheet aplikacija, AbiWord - program za obradu teksta, Gfax - program za slanje i primanje faksimila, Galeon - web preglednik, Gimp - moan program za obradu slika, Eye Of GNOME - preglednik slika, Evolution - program za elektroniku potu u koji je ukljuen i osobni organizer, MrProject - program za voenje projekata, GnuCash - program za praenje financijskog poslovanja, Achtung - program za izradu prezentacija, Dia - program za crtanje dijagrama, Sketch - program za vektorsko crtanje. GNOME je djelomino lokaliziran na Hrvatski jezik. Trenutna verzija GNOME paketa je 1.4 ali uskoro bi trebala izai i verzija 2.0. Cijeli GNOME paket je besplatan i podrava sve Linux i Unix operativne sustave.
981/1275
Opa svojstva
S GNOME paketom dolazi program pod imenom Kontrolni centar i namijenjen je za konfiguriranje grafikog suelja potrebama i ukusu pojedinih korisnika. Slika 2.1.prikazuje osnovni prozor GNOME Kontrolnog centra. S lijeve strane se nalaze grupe parametara dok se u desnom dijelu prozora nalaze opcije koje je mogue mijenjati.
U kontrolnom centru se mogu podeavati svi parametri grafikog suelja. Budui da tih parametara ima mnogo i veina njih prosjenom korisniku uope nije potrebna, ovdje se spominju samo osnovne postavke. Opcije vezane uz izgled ekrana nalaze se u sekciji Desktop. Ovdje se moe podesiti pozadina ekrana (Background), prilagoditi GNOME panel (Panel), odabrati eljeni screensaver (Screensaver), windows tema (Theme Selector) i window manager (Window Manager). Ove opcije odnose se uglavnom na vizualni dojam samog grafikog suelja i ne utjeu na rad raunala. U sekciji Document Handlers nalaze se opcije za rad s razliitim vrstama datoteka i dokumenata. Ovdje se moe podesiti tekstualni editor koji e se koristiti (Default Editor), u sekciji FILE Types and Programs mogue je povezati datoteke odreenih ekstenzija sa programima u kojima se te datoteke mogu pregledavati (npr. datoteke s ekstenzijom .mp3
982/1275
moe se povezati s programom Xmms koji je namijenjen za sluanje muzike u mp3 formatu. Nakon toga, svaki put kad se miem dvaput klikne na datoteku s ekstenzijom .mp3 ona e se automatski otvoriti u Xmms-u). HTML Viewer i URL Handlers se odnose na podeavanje parametara za pregledavanje Web stranica. Look and Feel sekcija sadri opcije za podeavanje izgleda aplikacija i menija u GNOME okruenju. U sekciji Multimedia nalaze se opcije za zvune efekte (npr. zvukovi koji se uju prilikom otvaranja ili zatvaranja prozora, pokretanja ili zatvaranja X Windows okruenja i sl.). U sekciji Peripherials nalaze se opcije za podeavanje rada mia i tastature. Ovdje se moe podesiti brzina strelice mia, dvostrukog klika mia, neke postavke vezane uz rad s tastaturom i slino. Sekcija Sawfish window manager sadri opcije koje se odnose na Sawfish, upravitelj prozorima (eng. window manager) koji dolazi standardno sa GNOME grafikim okruenjem. Slika 2.2 prikazuje opcije za podeavanje pozadine ekrana. U pozadinu se moe staviti slika s lokalnog tvrdog diska ili se moe odabrati boja za pozadinu (boja moe biti jednolika ili se moe podesiti pretapanje jedne boje u drugu). Na slabijim raunalima (sve konfiguracije slabije od PI na 166MHz sa 128MB RAM-a) nije poeljno stavljati sliku kao pozadinu zato jer to moe dosta usporiti rad raunala.
983/1275
GNOME grafiko okruenje dolazi sa mnogo gotovih tema za prozore. Tema za prozore odreuje izgled prozora u grafikom suelju. Slika 2.3 prikazuje prozor za izbor neke od dostupnih tema. U gornjem dijelu prozora moe se odabrati neka od ponuenih tema dok je u donjem dijelu prozora prikazano kako ta tema izgleda. Izbor teme za prozore ne utjee na brzinu rada raunala tako da je svejedno koja e tema biti odabrana.
984/1275
Vrlo korisna stvar u GNOME grafikom okruenju je virtualna radna povrina. Za razliku od MS Windows grafikog okruenja gdje se svi prozori programa nalaze na istoj radnoj povrini u GNOME-u je mogue istovremeno koristiti nekoliko radnih povrina. Tako se dobiva na preglednosti u sluajevima kada je istovremeno otvoreno vie prozora. Broj radnih povrina moe se podeavati u sekciji Sawfish window manager->Workspaces (Slika 2.4).
985/1275
Svaka virtualna radna povrina moe biti podijeljena u nekoliko virtualnih ekrana. Ovo moe biti korisno kod niskih rezolucija kada je prozor vei od ekrana. Tada se drugi dio prozora moe vidjeti na drugom virtualnom ekranu. Promjena radne povrine (ili virtualnog ekrana) obavlja se preko GNOME panela ili se moe podesiti da se radna povrina promijeni kada se miem izae izvan ruba ekrana (Slika 2.5).
986/1275
Izgled GNOME grafikog suelja vrlo je slian MS Windows operativnom sustavu (Slika 2.6).
Slika 2.6 GNOME grafiko okruenje GNOME panel se standardno nalazi u donjem dijelu ekrana. U njemu se nalazi Start meni iz kojeg se mogu pokretati aplikacije. Kako bi se ubrzao rad, pokraj Start menija nalaze se ikone za direktno pokretanje programa. Tu je i traka s trenutno otvorenim prozorima. U desnom dijelu panela nalazi se program za promjenu trenutne radne povrine pokraj kojeg je sat. Ovako GNOME panel izgleda nakon instalacije GNOME paketa. Odabirom opcije Panel u Start meniju moe se promijeniti izgled panela. Na traku za brzo pokretanje programa mogu se dodati novi programi ili maknuti stari (Start meni->Panel->Add to panel). Na panel se mogu dodati i GNOME applet-i (Start meni->Panel->Add to panel->Applet). GNOME applet-i su mali programi koji mogu raditi unutar panela tj. za svoj rad ne trebaju poseban prozor. Primjeri GNOME applet-a su sat u desnom dijelu panela i program za promjenu radne povrine. Standardno s GNOME paketom dolazi dvadesetak applet-a razliitih namjena (npr. sat, razliiti sistemski monitori, mikser za zvuk itd.). GNOME podrava koritenje i vie
987/1275
panela. Dodatne panele moe se dodati odabirom opcije Start meni->Panel->Create Panel. Izgled novog panela i programi i applet-i koji e se na njemu nalaziti mogu se podesiti desnim klikom mia na panel i odabirom opcije Panel->Add to panel. Desnim klikom mia na bilo koji od panela i odabirom opcije Panel->Properties moe se podeavati ponaanje panela prilikom rada (npr. hoe li panel uvijek biti iznad prozora ili nee i sl.). Na ostatku ekrana nalaze se ikone i trenutno otvoreni prozori. Nova ikona se moe dodati na desktop desnim klikom mia bilo gdje na desktop-u i odabirom opcije Novi->Launcher. Nakon toga se otvara prozor u kojem je potrebno upisati ime programa (i put do njega) koji e se pokretati tom ikonom. Rad u GNOME grafikom okruenju vrlo je slian radu u MS Windows operativnom sustavu. Programi se pokreu dvostrukim klikom mia na neku od ikona. Desni klik mia na ikonu daje meni s opcijama kao to su kopiranje, brisanje i sl. Desnim klikom mia na prazni dio radne povrine dobiva se meni u kojem se moe dodati nova ikona na radnu povrinu, promijeniti pozadina, poravnati ikone na ekranu i slino. Korisnicima koji su ve imaju iskustva u radu s MS Windows operativnim sustavom vrlo se lako prilagoditi GNOME grafikom suelju zato jer su razlike u nainu rada i koritenju male.
Zakljuak
GNOME je grafiko okruenje za Linux i Unix operativne sustave koje korisnicima omoguava jednostavnu primjenu i konfiguraciju raunala. Izgledom i nainom koritenja vrlo je slino grafikom okruenju iz MS Windows operativnog sustava tako da e ga korisnici koji imaju iskustva s MS Windows grafikim okruenjem vrlo brzo nauiti koristiti. U GNOME paket ukljueni su i programi za konfiguraciju raunala iz grafikog okruenja to uvelike olakava rad neiskusnim Linux korisnicima. GNOME Office set uredskih aplikacija koji dolazi s paketom sadri sve potrebne aplikacije za SOHO okruenje. Problem s GNOME Office aplikacijama je to to se nalaze u razliitim fazama razvoja. Neke od tih aplikacija su jo uvijek u ranoj fazi razvoja tako da su jo uvijek dosta nestabilne i malih mogunosti. S izlaskom verzije 2.0 GNOME paketa oekuju se doraenije verzije tih aplikacija kao i dodavanje novih aplikacija u GNOME Office paket.
988/1275
989/1275
Postavke za podeavanje podijeljene su u grupe: FileBrowsing, Information, LookNFeel, Network, Peripherials, Personalization, PowerControl, Sound, System, WebBrowsing, u kojima se nalaze brojni parametri kojima se podeava izgledi i funkcionalnost KDE grafikog okruenja. Pojedine grupe sadravaju sljedee postavke: Filebrowsing grupa sadri postavke za podeavanje Konqueror upravitelja datotekama (File Manager), a ovdje se takoer podeava koja aplikacija otvara koji tip datoteke (File Associations), Information - ovdje se nalaze korisne informacije o stanju sustava i ureaja, LookNFeel je najzanimljivija grupa za veinu korisnika. U ovoj grupi parametara mogue je u potpunosti podesiti izgled i neke funkcije KDE suelja. Izmeu ostalog, ovdje se podeavaju boje, podloga, izgled prozora, screensaver, zvukovi, teme itd., Network grupa sadri najosnovnije postavke vezane uz mreu. Veina mrenih KDE aplikacija koristi ovdje unesene parametre, Peripherials grupa slui za podeavanje mia, tipkovnice i podrke za digitalne kamere. Ovdje se odabire podrka za Hrvatsku tipkovnicu, koja je neophodna za pravilan prikaz naih () i nekih specifinih znakova kao npr. @, |, na ekranu. Na istom mjestu podeavaju se postavke tipkovnice i mia vezane uz osjetljivost i brzinu, Personalization grupa sadri postavke vezane uz jezik, set znakova (charachter set) provjeru pravopisa, kao i neke parametre vane za pojedine drave (valuta, format datuma i vremena itd.). Uz pravilno podeenu tipkovnicu u grupi Peripherials, za prikaz naih znakova potrebno je podesiti i set znakova na iso-8859-2,
990/1275
PowerControl sadri postavke za kontrolu tednje energije, kao npr. iskljuivanje monitora i standby mod. U ovoj grupi nalaze se i parametri za praenje statusa baterije, koji su vrlo korisni kod prijenosnih raunala, Sound grupa sadri parametre vezane uz reprodukciju zvuka u KDE grafikom okruenju. Sve KDE audio aplikacije uzimaju ove parametre kod reprodukcije zvuka, System grupa slui za konfiguraciju printera, login menadera, datuma, izgleda konzole i jo nekih parametara vezanih uz sustav. Za promjenu veine parametara u ovoj grupi korisnik mora imati root ovlasti, WebBrowsing grupa definira parametre vane za web preglednike.
Opa svojstva
KDE suelje je svojim izgledom i rasporedom elemenata vrlo slino MS Windows grafikom suelju. Ikone se na radnu povrinu postavljaju pritiskom na desni gumb mia, a sve aplikacije se pokreu iz Start izbornika koji se nalazi u donjem lijevom uglu i oznaen je velikim slovom K. Ikone za pokretanje aplikacija u Start izborniku razvrstane su (ovisno o njihovoj funkciji) u odgovarajue grupe: Amusement - igre i ostali programi namijenjeni za zabavu, Applications - vanije aplikacije za upravljanje datotekama, tekst editori, alati za kompresiju, komunikaciju itd., Configuration - sve aplikacije za konfiguraciju sustava, Documentation - pomo i upute za rad s programima, Multimedia - multimedijalne aplikacije (slika, zvuk i video), Networking - mreni klijenti (web, mail, news grupe), Office - uredski alati, Terminals - terminali. Prilikom instalacije aplikacija iz distribucije i ostalih aplikacija napisanih za KDE grafiko okruenje, ikone tih aplikacija automatski e se pojaviti u odgovarajuoj grupi u Start izborniku. Ukoliko se ikona nakon instalacije ne pojavi u Start izborniku potrebno je izdati naredbu update-menus koja e osvjeiti izbornike.
991/1275
Slika 3.2 KDE grafiko suelje Najvanije ikone koje se postavljaju automatski prilikom instalacije su linkovi na aplikacije Trash, Xkill, Control Center, Home i Internet. Aplikacije Trash i Internet vrlo su sline aplikacijama Recycle Bin i Internet iz MS Windows operativnog sustava, tj. slue za povratak obrisanih datoteka i spajanje na Internet. Ukoliko prije prvog pokretanja aplikacije Internet nije podeen nain spajanja na Internet, otvoriti e se arobnjak za konfiguraciju veze koji e nakon ispravnog podeavanja nekoliko opcija pokrenuti vezu. Aplikacija Xkill slui za uklanjanje programa koji su se "zamrznuli", a Control Center slui za podeavanje operativnog sistema. U samom dnu ekrana nalazi se traka s pokrenutim aplikacijama i ikonama za najvanije aplikacije (KDE Panel), a tu su takoer sat i ikone za odabir virtualnih radnih povrina. Ikone za pokretanje aplikacije mogu se dodavati u traku pomou Start ->Configure Panel->Add>Button, a u Configure Panel izborniku nalaze se i ostale opcije za podeavanje izgleda i funkcionalnosti KDE trake s aplikacijama. Detaljne upute za rad u KDE suelju i svim prateim aplikacijama nalaze se u Start -> Documentation -> Help.
992/1275
Zakljuak
KDE grafiko suelje je vrlo stabilan i dobar proizvod, s kojim dolazi mnotvo kvalitetnih aplikacija koje su veini korisnika dovoljne za svakodnevan rad na raunalu. Za razliku od nekadanjih grafikih suelja za Linux operativni sustav, KDE kao i Gnome suelje slijedi filozofiju MS Windowsa, pa je korisnicima naviknutima na rad u MS Windows-ima prijelaz na KDE prilino bezbolan. Testirana grafika suelja za Linux operativni sustav pokazala su se vrlo kvalitetnim. Po svojim mogunostima konfiguracije i prilagoavanja korisniku nadmauju MS Windows grafiko suelje. Jednostavna su za koritenje i pruaju sve prednosti point-and-click tehnologije. Gledano sa strane korisnika, razlike izmeu ta tri suelja vrlo su male (izmeu GNOME i Ximian GNOME paketa gotovo da ih i nema) i po mogunostima i po nainu koritenja. Razlike se uglavnom svode na set popratnih aplikacija koje s njima dolaze tako da se odabir uglavnom svodi na osobni ukus pojedinog korisnika. Hardverski zahtjevi su priblino jednaki za sva tri suelja. Minimalna preporuena konfiguracija za sva tri suelja je PI na 166MHz sa 128MB RAM memorije. Na slabijim konfiguracijama pokretanje grafikog suelja previe usporava rad za normalno koritenje raunala. Testiranja su pokazala da na slabijim konfiguracijama raunala GNOME i Ximian GNOME rade bre od KDE grafikog suelja. Na jaim konfiguracijama (PII na 400MHz sa 256MB RAM memorije) razlika u brzini rada je neprimjetna.
993/1275
XIMIAN
Ximian je grafiko okruenje za Linux i Unix operativne sustave koje korisnicima omoguava jednostavnu primjenu i konfiguraciju raunala. Izgledom i nainom koritenja vrlo je slino grafikom okruenju iz MS Windows operativnog sustava. Ximian okruenje samo je nadogradnja GNOME paketa tako da su ta dva okruenja izgledom i nainom koritenja jednaka. Razlikuju se samo u aplikacijama koje dolaze s tim paketima. Aplikacijski softver koji dolazi s Ximian paketom je malo doraen u odnosu na aplikacije koje dolaze s GNOME paketom. Za razliku od GNOME paketa, u Ximian su ukljuene samo provjerene i stabilne aplikacije. S grafikim okruenjem dolaze i alati za konfiguraciju samog grafikog suelja, alati za konfiguraciju raunala i paket aplikacija koje se nalaze u rasponu od malih korisnikih programa pa sve do monih uredskih aplikacija. Zajednike znaajke tih aplikacija su besplatnost, jednostavnost za koritenje, brzi razvoj i dostupnost su preko Interneta. Uredske aplikacije koje su ukljuene u Ximian Desktop paket pod zajednikim imenom su: Gnumeric - spreadsheet aplikacija, AbiWord - program za obradu teksta, Mozilla - Web preglednik, GIMP - program za obradu slike, GNUCash - program za praenje osobnih financija, Evolution - program za elektroniku potu u koji je ukljuen i osobni organizator, StarOffice - skup uredskih programa slian MS Office paketu iz MS Windows okruenja, Red Carpet - program za manipulaciju softverom (instaliranje novog softvera, nadogradnja ili uklanjanje starog).
Opa svojstva
Budui da je Ximian grafiko okruenje samo nadogradnja GNOME paketa s njim dolazi isti softver za konfiguraciju. Program Kontrolni Centar za podeavanje grafikog suelja je isti kao i u GNOME paketu. Slika 4.1 prikazuje tipian izgled Ximian grafikog okruenja.
994/1275
Grafiko suelje i rad s njim isti su kao u sluaju GNOME grafikog okruenja. Jedina razlika izmeu Ximian i GNOME paketa je u aplikacijskom softveru koji s njima dolazi. Ximian distribuira samo stabilne verzije softvera koje su u poodmakloj fazi razvoja za razliku od GNOME paketa s kojim dolazi i softver koji je jo uvijek u nestabilan i u ranoj fazi razvoja.
Zakljuak
Ximian je grafiko okruenje za Linux i Unix operativne sustave koje korisnicima omoguava jednostavnu primjenu i konfiguraciju raunala. Izgledom i nainom koritenja vrlo je slino grafikom okruenju iz MS Windows operativnog sustava tako da e ga korisnici koji imaju iskustva s MS Windows grafikim okruenjem vrlo brzo nauiti koristiti. Ximian je samo nadogradnja GNOME paketa tako da su ta dva grafika okruenja vrlo slina izgledom i nainom koritenja. Razlika izmeu GNOME i Ximian Desktop paketa je u popratnim aplikacijama koje s njima dolaze. Kao i u GNOME paketu, u Ximian Desktop paket ukljueni su i programi za konfiguraciju raunala iz grafikog okruenja to uvelike olakava rad neiskusnim Linux korisnicima.
995/1275
DNS I DHCP
996/1275
DNS
Server imena domena (Domain name server, krae DNS) je internetska direktorijska sluba. Pomou DNS se imena domene prevode u IP adrese, DNS takoer upravlja prijenosom e-mail-a. Ukoliko raunalo ne bi moglo pristupiti DNS-u, ne bi mogla pronai internet stranice, i slati i primati e-mail.
DNS sistem sastoji od tri komponente: DNS podaci (resource records) serveri (name servers) internet protokoli koji pribavljaju podatke od servera. Svih resource records u DNS-u su podjeljeni u milijune datoteke koje se nazivaju zone
(zones). Zone se uvaju u autoritativne (authoritative) serverima, koji su rasporeeni po cijelom internetu, koji odgovaraju na upite bazirane na resource records pohranjene u zonama od kojih imaju kopije. Cashing serveri trae podatke od drugih servera i cashiraju odgovore. Veina servera imena su autoritativne za neke zone i obavljaju funkciju cashiranja za sve ostale DNS podatke. Veliki serveri imena su esto autoritativni serveri za desetak tisua zona, ali veina servera imena su autoritativni serveri za samo nekoliko zona. Paul Mockapetris osmislio je DNS 1984. godine da rijei sve vee probleme sa starijim sustavom mapiranje ime-adresa. Stari sustav se sastojao od jedne datoteke pod nazivom tablica-domaina (host-table), koja je odravala Stanford Research Institute's Network Information Center (SRI-NIC). Kad bi se pojavile nove host names SRI-NIC bi ih dodavale tablici nekoliko puta tjedno. Sistemski administratori bi pribavljali najnoviju verziju (preko FTP) i prilagodili bi svoje serveri imena domena (Domain name servers). Ali kako se internet irio, tako je tablica-domaina postala sve nepraktinija. Iako je dobro funkcijonirala za mapiranje ime-adrese, nije bila praktina ni efikasna za prilagoavanje i distribuiranje podatake. Poto je stabilnost interneta u pitanju Mockapetris i jo par ljudi su odluili pronai bolji nain. Tako je nastao DNS. Dobra stvar je to to nijedna organizacija nije sama odgovorna za prilagoavanje. DNS je vrsta distribuirana baza podataka; podijeljena je preko puno servera u
997
cijelom svijetu. Nijedan server ne pohranjuje sve podatke. Zbog toga DNS praktiki dozvoljava neogranien rast. Da bi se shvatilo kako funkcionira DNS server treba biti upozat sa prostorom ime domene (domain name space). Ona se predstavlja sa obrnutim stablom.
(.root) .com .edu .org .net .gov .mil .arpa
.hr dvs
Svaki vor predstavlja jednu domenu. Sve sto je ispod vora pripada njezinoj domeni. Jedna domena moe biti dio jedne druge domene, npr. raunalo dvs pripada i .hr domeni i .com domeni. Popis 7 glavnih domena: .com .edu .gov .mil .net .org .int Komericijalne organizacije Obrazovne institucije Dravne institucije Vojne institucije Veliki mreni centri za podrku Organizacije koja ne spadaju meu prijanjih Meunarodne organizacije
.arpa je posebna domena koja se koristi za adresa-ime mapiranje. DNS server je raunalo koje koristi DNS software. Poto veina servera koriste Unix operativne sustave, najpopularniji DNS program je BIND (Berkeley Internet Name Domain), ali postoji i software za PC i Mac. DNS software uglavnom se sastoji od dva djela: server imena i resolver. Server odgovara na upite internet browsera dabavljanjem ime-adresa konverzije. Ukoliko server ne zna odgovor na upit, onda resolver tri podatke od drugog servera. Kad se upie URL u internet browser, ona alje upit najbliem serveru. Ako je taj server ve odgovorio na neki upit za isti host name (unutar nekog vremenskog roka, koji je postavio administrator da se izbjegne da se poalju stari podaci), onda e nai podatke u svom cashe-u i odgovoriti.
998
Ukoliko server ne zna za to ime domena, onda resolver pokuava ''rijeiti'' problem slanjem upita drugom serveru koji se nalazi vilje na stablu. Ukoliko to ne rijei problem, onda e taj drugi server isto poslati upit dalje sve dok se ne nae neki server koji zna (ukoliko server zna odgovor na upit bez da mora poslati upit drugam serveru, to zovemo autorativni server) odgovor na upit. Kad su podaci pronaeni, alju se natrag browser-u, i browsera se upuuje se na traenu internet stranicu. Obino se taj proces brzo odvija , ali moe se dogoditi da potraje i dulje (15ak sekundi). U najgorim sluajevima se moe dogoditi da se pojavi poruka da domena ne postoji, iako postoji. To se dogaa jer autoritativnom serveru treba dosta vremena da odgovori na upit, a raunalo istie vrijeme ekanja. Nakon isteka vremena raunalo odbaci spoj. Kasnijim pokuajem postoji velika mogunost da e proraditi, jer je autoritativnom serveru prolo dovoljno vremena da odgovori i prvi sever je pohranio podatke u svom cash-u.
DNS konfiguracija
DNS omoguava sustavima da pretrauju host name-ove u lokalnoj mrei i na internetu. Ovdje je koriten BIND 8.2 za primjer.
999
options { directory "/var/named"; forwarders { 299.18.99.151; 299.8.183.1; }; forward first; dialup yes; heartbeat-interval 1440; };
1000
Znaenje ovih linija su: directory Direktorij pod kojeg se mogu pronai datoteke. /var/named direktorij je tradicijonalan iako se konfiguracijske datoteke najee nalaze u direktoriju pathname/etc. forwarders Popis IP adresa kojima se alju upiti. forward Nain na kojem se alju upiti. Upiti se alju prvo adresama navedenima u forwarders. Samo ako nijedan posluitelj ne odgovori ovaj e posluitelj sam obaviti posao. Ako se ova postavka postavi na only, onda ovaj posluitelj nikada ne obavlja pretrage sam. dialup Oznaava da ovo raunalo koristi Dial-up. heartbeat-interval Interval u kojem se obavlja odravanje, izraeno u minutama. Ova postavka je inicijalno postavljna na 60min. zone Podaci o odreenoj domeni. Linija pod navodnicima daje ime domene. type Vrsta podataka domene. hint znai da podaci slue za pronalaenje glavnih posluitelja domena (root domain server). master znai da je ovaj posluitelj glavni za ovu domenu. file Datoteka iz koje se uitavaju podaci posluitelja imena.
/var/named/named.ca Datoteka:
Kad posluitelj obavlja svoj posao (ali ne kada alje upite), treba mu poetna toka za pretraivanje domena. Ova datoteka sadri IP adrese posluitelja za glavnu domenu. Prvi dio ove datoteke pokazuje da su posluitelji imena za glavne domene ovi koji su navedeni. Drugi dio pokazuje IP adresu svakog posluitelja imena. Brojevi (518400 i 3600000) odreuju time-out za ove unose. Ovi brojevi moraju biti dovaljno veliki da time-out ne bi bio problem.
1001
. . . . . . . . . ; ; ;
IN IN IN IN IN IN IN IN IN
NS NS NS NS NS NS NS NS NS
Addresses
IN IN IN IN IN IN IN IN IN
A A A A A A A A A
/var/named/private.hosts datoteka:
Ova datoteka sadri IP adrese privatne mree. Primjer private.hosts datoteke:
IN
SOA
solaris.dvs.net.hr.
1002
Sveuilite u Splitu Struni studij Raunarstva Zagreb 10800 3600 432000 86400) IN NS ; Refresh - 3 hours ; Retry - 1 hour ; Expire - 1 week ; Minimum - 1 day solaris.dvs.net.hr.
name
ttl
class IN IN IN IN
type A A A A
mail www
IN IN
CNAME CNAME
solaris solaris
dvs.net.hr. dvs.net.hr.
IN IN
MX A
10
solaris.dvs.net.hr.
10.5.3.1
Objanjenje koda: @ Domena. Ovo je skraenica za domenu koja je navedena u named.conf datoteci (dvs.net.hr u ovom sluaju). IN Internet. Upuuje da se radi o zapisu za internet. SOA Source of Authority. Ovaj unas sadri podatke o tome koje je raunalo glavni posluitelj imena za ovu domenu (solaris.dvs.net.hr u ovom sluaju) i komu se treba obratiti u sluaju problema (root.solaris.dvs.net.hr). Serijski broj se koristi da se oznai gdje su se dogodile promjene. Ostali brojevi daju vrijeme isteka za podatke koji ovaj posluitelj nudi. Serijski broj se treba poveavati sa svakom verzijom datoteke.
1003
NS Name Server. Ova linija upuuje na to da je solaris.dvs.net.hr posluitelj imena za ovu domenu. A Address. Ova linija daje IP adrese raznih host-a. CNAME Canonical Name. Ove linije daju alijasi za razna imena. Ovo nije nuno, ali upuuju upite za www.dvs.net.hr prema solaris.dvs.net.hr MX Mail Exchange. Ova linija upuuje sustavu gdje se mail za korisnik@dvs.net.hr treba poslati (solaris u ovom sluaju).
ttl
class
type
data
root.solaris.dvs.net.hr. ( 2000050201 10800 3600 432000 86400) IN ; ; ; ;name 1 21 22 ttl IN IN IN class PTR PTR PTR type data Machines names NS ; Serial
1004
/var/named/private.local datoteka:
Ova datoteka doputa obrnutu pretragu za localhost adresu. Ova datoteka nije nuna. Primjer private.local datoteke:
; ; ; ;name ; ; @ Source of authority IN SOA solaris.flibble.orac.net.au. ttl class type data Reverse address file for localhost
root.solaris.flibble.orac.net.au. ( 2000050201 10800 3600 432000 86400) IN ; ; ; ;name 1 ttl IN class PTR type localhost. data Machines names NS ; Serial
Pokretanje named Daemon Kad se imaju datoteke potrebne da se konfigurira named moe se pokrenuti /usr/local/sbin/named daemon. Ovaj daemon e uitati /usr/local/etc/named.conf datoteku za svoju konfiguraciju.
1005
DHCP
DHCP (Dynamic Host Configuration Protocol), je protokol za dodjeljivanje dinamine IP adrese ureajima na mrei. Sa dinaminim dodjeljivanjem adrese, ureaj moe imati razliitu adresu svaki put kad se spoji na mreu. U nekim sustavima moe se ak i promijeniti adresa dok je ureaj jo spojen na mreu. DHCP podrava i mjeanje dinamine i statine adrese. Dinamino adresiranje olakava posao administriranje mree, jer software sam prati IP adrese, tako da nema potebe za administratora da obavlja taj posao. Ovo znai da se moe dodati novo raunalo na mreu bez potrebe za runo postavljanje IP adrese. Puno ISP-a (Internet Service Providers) koriste dinamine adrese za dial-up korisnike. Raunala koja su namjetena da koriste DHCP nemaju potrebu da se runo postave mrene postavke, umjesto toga oni zatrae te postavke od DHCPD servera. Raunala se ne trebaju namjestiti da koriste odreeni DHCP server, jer routeri se namjeteni da prosljeuju DHCP zahtjeve tonim DHCPD serverima. Od dvije vrste IP adrese koje postoje, statine se dodjeljuju serverima, routerima i kabelskim modemima, a dinamine se dodjeljuju dial-up korisnicima. DHCP je nastavak BOOTP-a, koji je prijanji nain dodjeljivanje IP adrese. Postojei BOOTP ureaji mogu komunicirati sa DHCP serverima i mogu dopustiti DHCP zahtjevima da prou kroz BOOTP servere. Zbog toga to su kompatibilni u natrag, administratorima je jednostavno da nadograde ureaje sa BOOTP na DHCP po potrebi, bez da moraju zamjeniti sve client-e ili da moraju nadograsiti sve routere. Nekoliko velikih napredaka DHCP-a u odnosu na BOOTP su npr. DHCP koristi sustav posuivanja, sa kojim server moe dodjeliti adresu na odreeno vrijeme. Ukoliko ima vie ureaja nego adresa, onda se koriste adrese sa kraim vremenima trajanja da ne doe do manjka adrese. Ukoliko ima vie adresa nego ureaja onda se dodjeljuju stalne adrese sline onima u BOOTP sustavu. Kad se DHCP ureaj po prvi put spoji na mreu, ona poalje DHCPDISCOVER paket. DHCP server e na lokalnom segmentu vidjeti poruku i vratiti e DHCPOFFER paket, koji sadri IP adresu i drugih podataka. Server moe, ali ne mora prvo obaviti jedno testiranje prije nego to ponudi adresu, kao to je generiranje ARP ili ICMP jeka da vidi dali tu adresu koristi ve neki drugi vor.
1006
Client moe dobiti vie DHCPOFFER paketa od vie servera, pa mora birati jedan od njih. Tako poalje DHCPREQUEST paket, koji identificira odreeni server i ponudi posudbi koja najbolje odgovara. Odluka se moe zasnivati na tome koji server daje najdulju posudbu, ili koji nudi najvie podataka koji su odreenom clientu potrebni za najbolji rad. Serveri koji nisu izabrani e primiti DHCPREQUEST paket i nastaviti svoj rad. Ukoliko ponuda jos vrijedi, izabrani server e vratiti DHCPACK po kojemu client zna da je posudba obavljena. Ukoliko ponuda vie ne vrijedi (mogue zbog isteka vremena, ili zbog toga to je neki drugi client dobio tu ponudu), server treba odgovoriti sa DHCPNAK paketom. Zbog toga bi client morao ponovno poslati DHCPDISCOVER paket, i proces bi poeo iz poetka. Kad client dobije DHCPACK paket, vlasnitvo i odravanje posudbe postaju odgovornost clienta. Client-i bi trebali testirati adresu koja im je ponuena slanjem ARP upita, pa ako neki drugi vor odgovori na upit client e pretpostaviti da je ponuena adresa ve u uporabi. Tada bi client trebao odbaciti ponudu slanjem DHCPDECLINE poruke serveru koji je bio ponudio. Isto e poslati novi DHCPREQUEST paket, pokrenui ponovno cijeli proces. Jednom kad je client dobio posudbu, mora se obnavljati prije isteka trajanje posudbe slanjem nove DHCPREQUEST poruke. Ukoliko client prestaje koristiti posudbu prije isteka vrijeme trajanja, mora poslati DHCPRELEASE paket serveru, tako da se posudba moe osloboditi i ponuditi drugim korisnicima. Ukoliko server ne dobije potvrdu od clienta za nastavak koritenja, oznaava posudbu kao ne-obnovljenu i uini je dostupnom za druge client-e. Podatke koje DHCP server nudi: DHCP server normalno nudi slijedee podatke client-u: * Client IP number * Router/gateway adresa * Subnet maska * Broadcast adresa * DNS adrese * DNS domene
1007
DHCP server moe takoer nuditi slijedee podatke client-u: * BOOTP * TFTP server * Netbios name server * Novell server * Wins serveri * Hostname * vrijeme posudbe (za dinamino dodijeljene IP adrese)
DHCP jezik:
DHCP server i DHCP client se sporazumiju sljedeim porukama:
DHCPDISCOVER Ove molbe se alju kad client trai DHCP uslugu DHCPOFFER Ove odgovore alje server kao odgovor na DHCPDISCOVER poruku. Sadre ponudu IP adresa Ove molbe se alju kao odgovor serveru na DHCPREQUEST DHCPOFFER poruku, traei adresu koju je server ponudio; ili kad DHCP posudba doe do polovice trajanja, traei produenje roka adrese. Odgovor servera na DHCPREQUEST poruku. Sadre DHCPACK potvrdu da je posudba zatraena, da moe koristiti tu IP adresu. Ove odgovore alje server kao odgovor na DHCPREQUEST poruku. Sadre potvrdu da je DHCPNAK posudba zatraena, da NE moe koristiti tu IP adresu. Client-u se uglavno odbije zatrai posudbu IP adrese koju koristi ve drugi client. DHCPDECLINE Ove odgovore alje client kad se ponuena adresa ve koristi.
1008
Ovu molbu alje client kad je konfiguriran na neki DHCPINFORM drugi nain. Ove molbe se alju kao upit za postavke za mreu na koju su spojeni. BOOTREQUEST Molba koju client alje kad trai BOOTP adresu. BOOTREPLY Odgovor koji se alje client-u kao odgovor na BOOTREQUEST sa BOOTP adresu. Ovo su poruke koji DHCP server iz nekog razloga Discarded odbaci. Najee je to zbog loe konfiguriranog Windows NT raunala.
1009
Slijedea tablica nudi pregled najeih DHCP opcija. Postojih jo, ali veina njih se odnose na specifine protokole ili servere
Parametar default-lease-time domain-name domain-nameservers fixed-address group hardware Host host-name max-lease-time netbios-nameservers range routers shared-network subnet subnet-mask
Opis Standarna duina trajanje posudbe Ime domene za spcifian subnet Lista servera imena za specifian subnet. Statina adresa koja se dodjeljuje host-u (podrava vie mrea) Poinje skupnu deklaraciju Vrsta mrene opreme (trenutno su samo Ethernet i token ring podrani) Poinje deklaraciju host-a Ime koje se dodjeljuje host-u Maksimalni rok izraeno u sekundima koji server daje posudbe Ime WINS servera Doseg IP adresa koja se dodjeljuje specifinoj mrei Popis routera koje se mogu upotrijebiti Zapone shared-network deklaracije Zapone subnet deklaracije Subnet-maska od ove mree
Lista IP adresa
1010
Jedna od najspecifinijih definicija je hardware, koja opisuje specifian hardware. Trenutno su samo ethernet i token-ring podrani. Sintaksa koja se koristi za ovo je takva da se napie vrsta hardware, pa fizika adresa mrene kartice (npr. MAC adresa). Dobije neto kao to je ovo: host dvs hardware ethernet 00:50:04:53:F8:D2; fixed-address 192.168.42.3: Ovaj primjer pokazuje da raunalo dvs ima Ethernet mrenu karticu sa MAC adresom 00:50:04:53:F8:D2, i da mu se dodjeljuje fiksna adresa 192.168.42.3. Ponekad treba specificirati opcije za odreeni broj raunala na mrei bez da ih se odvoji u poseban subnet, npr.: mogao bi se definirati subnet za skupinu raunala i odrediti specifine opcije za samo taj subnet. Meutim, to znai da se trebaju odrediti sve potrebne opcije za konfiguraciju, a i znailo bi da specijalni vori ne mogu imati IP adresu u istom subnetu kao druge. Da se prevladaju ova ogranienja, mogu se spojiti raunala u jednu skupinu koristei kjunu rije group. Na ovaj nain sve opcije definirane za skupinu, odnose se na cijelu tu skupinu. Npr.: group default-lease-time 300000; option routers 192.168.42.1; host jupiter hardware ethernet 00:50:04:53:D5:57; default-lease-time 500000; host saturn hardware ethernet 00:50:04:53:F8:D2; host uran hardware ethernet 00:50:04:53:32:8F;
1011
U ovom primjeru, je postavljeno standardno vrijeme posudbe za skupinu da je 300000 sekundi (skoro etiri dana) i da je router ureaj sa adresom 192.168.42.1. ova definicija vrijedi za sva tri domaina koja su navedena (jupiter, saturn i uran). Meutim, kod jupitera je standardno vrijeme posudbe postavljeno na veu vrijdnost 500000 (skoro est dana), ali definicija routera (192.168.42.1.) i dalje vrijedi. Ponekad se moe pojaviti potreba za konfiguriranje nekoliko mrea na istom fizikom segmentu mree. Postoji vie razloga zato bi se to uinilo, kao to je ograniivanje odreenih ureaja na odreene segmente mree. DHCP doputa konfiguriranje sistema na taj nain odreivanjem shared-network. Shared-network je u biti spremite za skupinu raunala. Drugaije je od skupne deklaracije u tome to moe sadravati subnet-e i skupine. Ima sljiedeu sintaksu: shared-network network-name shared-network-specific parameters subnet subnet-specific parameters group group-specific parameters Treba primjetiti da se subnet deklaracije i deklaracije skupine mogu odrediti odreene parametre za odvojene host-e, kao da nisu dio shared network.
1012
konfiguracije za openitije jedinice (globalne parametre). Kad se rijeavaju problemi, uvijek se poinje na dnu pa se ide prema gore. Najosnovniji nain rjeavanja problema je promatranje posudbe koju je server dodijelio. To se gleda u datoteci za posudbe (/var/state/dhcp/dhcp.leases), koja odrava trenutna stanja svih aktivnih posudba. Ta datoteka se ponovno zapisuje da bi se izbjeglo da datoteka postaje prevelika. Prvo se napravi jedna privremena kopija i stara datoteka se primenuje u dhcp.leases~. Iako je rijetko, moe se dogoditi da server tad prestane raditi. Ako se to dogodi, dhcp.leases datoteka vie ne postoji vie postoji i server se ne moe ponovno pokrenuti. Poto ne moe jednostavno stvoriti novu dhcp.leases datoteku, treba staru dhcp.leases~ datoteku preimenovati u dhcp.leases. Sadraj dhcp.leases datoteke je jednostavan. Svaka deklaracija posudbe se identificira sa klunom rijei posudbe nakon koje slijedi IP adresa i blok konfiguracijske podatke, pa se dobije neto kao:
lease 192.168.42.1 starts 0 2000/01/30 08:02:54; ends 5 2000/02/04 08:02:54; hardware ethernet 00:50:04:53:D5:57; uid 01:00:50:04:53:D5:57; client-hostname "PC0097"; :
Start i end oznaavaju razdoblje u kojemu posudba vrijedi, svaki unos je oblika:
weekday yyyy/mm/dd hh:mm:ss;
Weekday je brojana vrijednost za dan (0 za nedjelju, kao to je ovdje sluaj), datum i vrijeme se raunaju po Greenwich Mean Time, a ne po lokalnom vremenu. Unos hardware-a je isti kao to je u dhcp.conf datoteci i daje adresu mrene kartice. Uid unos je jednoznaan identifikator za client, koristei ASCII-string identifikator koji daje client ili vrsta hardware-a sa adresom hardware-a (u ovom primjeru 01).
Konfiguracija client-a
1013
Kako se konfigurira client ovisi o distribuciji. Ako se izabere DHCP, /etc/rc.config datoteka e biti promjenjena postavljanjem konfiguracijske parametre za mrenu karticu na "dhcpclient". Npr. bez DHCP imalo bi se neto kao to je: IFCONFIG_0 = " 192.168.42.1 broadcast 192.168.42.255 netmask 255.255.255.0 up" Jednom kad je DHCP konfiguriran, unos bi bio ovakav: IFCONFIG_0 = " dhcpclient" Moe se konfigurirati tako da neki ureaji koriste DHCP, a drugi statine adrese. Kad se sustav pokrene, poziva se /etc/rc.d/network scripta. Ako je IPCONFIG linija jednaka Kasnije, za vrijeme boot procesa, scripta DHCP client-a, client e zatraiti konfiguraciju od DHCP servera. U veini sluajeva je standardna koniguracija client-a dovoljna. Ukoliko ne bi bila, client ima svoju konfiguracijsku datoteku: /etc/dhcclient.conf. Ukoliko postoji vie ureaja na mrei sa raziitim postavkama, onda se postavke trebaju staviti u skupinama po ureajima, pa se moe dobit ovako neto: interface eth0 send dhcp-lease-time 3600; request subnet-mask, broadcastaddress,time-offset, routers, domain-name, domain-name-servers, host-name; require subnet-mask, domain-name-servers; Naredba send kae client-u da alje pojedine postavke sa odreenim vrijednostima. To mogu biti bilo koje postavke koji server razumije. Request naredba je lista konfiguracijskih postavki (ne i vrijednosti) koje client zatrai od servera da mu poalje. Kluna rije "request," znai da server mora odreenu konfiguracijsku postavku poslati da bi client mogao prihvatiti serverov odgovor. " dhcpclient" za odgovarajuu mrenu karticu, onda se preskae konfiguracija za tu karticu.
1014
Sigurnost
Na prvi pogled moe se initi da nema puno potrebe za osiguravanjem DHCP sustava. Meutim, s obzirom koliko je DHCP vaan, valjalo bi postaviti neke sigurnosne mjere. Prva stvar je sam ureaj. Iako nestanak struje od nekoliko sati ne moe stvoriti puno problema , dui nestanak struje bi mogla znaiti da neka raunala ne bi imale valjane konfiguracije, ili ak valjanu IP adresu. Zbog toga treba uzeti u obzir koje usluge DHCP server jo nudi. Zbog toga to je potebno malo struje da bi DHCP mogao raditi, mogu se koristiti manji ureaji, na kojima DHCP radi pored jo drugih ureaja. Druga stvar koja se mora uzeti u obzir je denial-of-service napad. Ako bi DHCP server bio dostupan sa interneta, bilo bi mogue za nekoga da zauzme sve IP adrese, pa ne bi ostale adrese za druga raunala. Treba osigurati DHCP promet kroz firewall.
1015
Dario Benko
INTERNET HISTORY
1016/1275
UVOD
Internet je iz temelja promijenio raunalni i telekomunikacijski svijet kao nita prije. Postao je sastavni dio mnogih ivota i jedno od najrairenijih sredstava komunikacije meu ljudima koje svakim danom proiruje svoje mogunosti. Ovoj nezapamenoj integraciji sposobnosti, prvenstveno prikupljanju, pohranjivanju i dohvatu informacija, te razmjeni podataka i programa sa svih podruja ljudskog djelovanja, te nizu drugih sve naprednijih i nekad nezamislivih stvari prethodili su telegraf, telefon, radio, prva raunala Internet je odjednom postao rasprostranjen irom svijeta, pruajui svakome tko ima tehnike mogunosti da se koristi njime, bilo gdje na zemlji. Komunikacija meu ljudima postala je sve manji problem bez obzira na udaljenost. On je jedan od najboljih primjera uspjenog ulaganja u istraivanja i razvoj informatike infrastrukture. Ovo je prikaz samo malog dijela dogaaja koji su prethodili ovoj velikoj mrei bez koje bi na dananji svijet bio nezamisliv.
NAPOMENA: dogaaji koji su prethodili nastanku i razvoju Interneta poredani su kronoloki. Meutim neki dogaaji dogodili su se na prijelazima izmeu godina ili je jo uvijek upitno kad su se tono dogodili, tako da podatke o godinama ne treba uzimati 100% sigurnim.
1017/1275
1836.god. Cook i Wheatstone izumili Telegraf i time pokrenuli revoluciju (tele)komunikacija. kao sredstvo takve komunikacije koristilo se Morseovo pismo (abeceda), serija tokica i crtica. To je opet vrlo slino dananjem, naravno vrlo brem, komuniciranju raunala, pomou binarnog koda (0/1). preko oceana postavljen je Transatlantski kabel koji je po prvi put trebao omoguiti trenutanu komunikaciju izmeu SAD-a i Europe. Naalost, zbog kvara, u funkciji je bio tek nekoliko dana. 1866.god. pothvat je uspjeno ponovljen i originalni Atlantski kabel postavljen te godine ostao je u upotrebi skoro 100 godina. Danas kablovi spajaju sve kontinente i jo su glavno arite telekomunikacija. (Godinja stopa rasta prometa podataka podvodnim telefonskim kabelima 1997.g. bila je 90%, a ukupno je bilo postavljeno 186,000 milja tih kabela). 1876.god. izumljen Telefon (Alexander Graham Bell Exhibits). telefonske centrale danas su osnovni oslonac Internet veza. modemi omoguavaju konverziju signala iz digitalnog u audio i time spajanje raunala preko telefonske mree. 1957.god. (4. listopada) SSSR lansira prvi umjetni zemaljski satelit, Sputnik. ovo je poetak globalnih telekomunikacija. Sateliti danas igraju vrlo vanu ulogu u prijenosu podataka. 1958.god. (7. veljae) kao odgovor na lansiranje Sputnika i na openite Sovjetske istraivake napore, Ministarstvo Obrane SAD-a (Department of Defense - DoD) objavljuje direktivu 5105.15 kojom formira agenciju za napredna istraivanja (ARPA - Advanced Research Projects Agency) u nadi da e u vojnom dijelu preuzeti vodstvo u znanosti i tehnologiji. Agencija je ujedinila neke od amerikih najnadarenijih ljudi i napravila veliki uspjeh lansiravi prvi ameriki satelit unutar 18 mjeseci od osmiljavanja agencije. Nekoliko
1018/1275
godina kasnije agencija se fokusira na raunalno umreavanje i komunikacijsku tehnologiju te joj je povjeren zadatak razvijanja pouzdane komunikacijske mree, naroito za raunalnu upotrebu. Glavna motivacija za ovo je bila imati mreu decentraliziranih vojnih raunala spojenih na takav nain da u moguem ratu moe "preivjeti" unitenje jednog ili nekoliko vorita (nodes), oslanjajui se na komunikaciju izmeu preostalih vorita (nodes). 1961.god. Leonard Kleinrock, MIT: "Information Flow in Large Communication Nets". prvi put izloena packet-switching (PS) teorija. 1962.god. Dr. J.C.R. Licklider je dobio zadatak voenja glavnih ARPA-inih istraivakih zadataka u unapreivanju raunalne tehnologije za vojsku. Svojim utjecajem je takoer trebao maknuti ARPA-ina istraivanja od privatnih sektora prema sveuilitima diljem SAD-a. Time je poloio temelje za stvaranje ARPANET-a. razvijene su mree s prospajanjem paketa - Packet-switching (PS) networks. Paul Baran (RAND Corporation) objavljuje rad "On Distributed Communications Networks" u kojem predstavlja mree s prospajanjem paketa, Packet-switching (PS) networks. Ovo je bio presudan trenutak prema realizaciji raunalne mree iz niza razloga: Internet se oslanja na paketima za prijenos podataka. podaci su rastavljeni u sitne pakete koji mogu imati razliite puteve do odredita (i svaki u svom zaglavlju mora nositi globalnu adresu odredita). teko prislukivanje poruka. mogue vie od jednog puta, ako se jedan put "srui", slijedi drugi. ako kod bilo koje toke doe do gubitka paketa, poruka moe ponovno biti poslana (retransmisija). mree se mogu oduprijeti velikom stupnju unitenja (npr.nuklearnom napadu ovo je bilo razdoblje hladnog rata). 1965.god. ARPA financira studiju "cooperative network of time-sharing computers". 1966.god. Lawrence G. Roberts, MIT: "Towards a Cooperative Network of TimeShared Computers" (listopad). izloen prvi ARPANET plan.
1019/1275
1967.god. na ACM simpoziju operacijskih principa (ACM Symposium on Operating Systems Principles in Gatlinburg, Tennessee, u kolovozu) - predstavljen je plan za mreu s prospajanjem paketa (packet-switching network). simpozij je pridonio i prvom susretu triju neovisnih "packet network" ekipa: RAND, NPL, ARPA. 1968.god. PS-network predstavljen ARPA-i. na National Physical Laboratories u Engleskoj dokazano je da je prva mrea s prespajanjem paketa operativna. Paralelni napori u Francuskoj takoer su rezultirali ranom packet-switching mreom na Societe Internationale de Telecommunications Aeronautiques. ARPA je ugovorno dodijelila ARPANET BBN-u. BBN je izabraio Honeywell DDP 516 miniraunalo kao bazu na kojoj e izgraditi prekretnicu (switch). 1969.god. roenje Interneta. BBN (Bolt Beranek and Newman, Inc.) dostavlja Interface Message Processor (IMP) Sveuilitu Kalifornija (UCLA) i ubrzo je izgraena fizika mrea spajajui 4 vorita (nodes): (redom) University of California (Los Angeles), SRI ( Stanford), University of California (Santa Barbara) i University of Utah (Salt Lake City). Brzina prijenosa - 50 Kbps. (vidi -> Slika 1.)
Slika 1.
1020/1275
1970.god. Norman Abrahamson razvija ALOHAnet na University of Hawaii. ALOHAnet je pruao background za djelatnost koja kasnije postaje ethernet. 1972.god. - spojen s ARPANET-om. ARPANET "hostovi" poinju koristiti Network Control Protocol (NCP), prvi hostto-host protokol. Ovaj protokol je koriten do 1982, kada ga zamjenjuje TCP/IP. AT&T postavlja (instalira) prvu "cros-county" vezu izmeu UCLA i BBN (56kbps). Linija je kasnije zamjenjena drugom izmeu BBN-a i RAND-a. Druga linija je dodana izmeu MIT i Utah-a. 1971.god. Ray Tomlinson, BBN izumio prvi E-mail - program za slanje poruka preko mree. E-mail je jo uvijek glavni nain komunikacije ljudi preko Interneta. ARPANET narastao na 15 vorita (nodes) (23 hosts): UCLA, SRI, UCSB, University of Utah, BBN, MIT, RAND, SDC, Harvard, Lincoln Lab, Stanford, UIUC, CWRU, CMU, and NASA(Ames). (vidi -> Slika 2.)
Slika 2. 1972.god. sve je lake spajanje raunala (u mreu). prva javna demonstracija ARPANET-a (Bob Kahn, BBN) meu 40 maina (strojeva). (Demonstracija "packet switch"-a, i TIP-a (Terminal Interface Processor).
1021/1275
ARPA (Advanced Research Projects Agency) mijenja ime u DARPA (Defense Advanced Research Projects Agency). Ray Tomlinson (BBN) modificira email program za ARPANET i postaje veliki hit. Znak @ izabran je za "at" znaenje. 1973.god. globalna mrea postaje stvarnost (ARPANET postaje internacionalan). prva meunarodna veza prema ARPANET-u: University College of London (Engleska) i Royal Radar Establishment (Norveka). po prvi puta objavljen obris za ideju Ethernet-a: Bob Metcalfe's Harvard PhD Thesis. specificiran File Transfer Protocol (FTP). Cerf and Kahn prezentiraju osnovne Internet ideje. 1974.god. paketi postaju nain prijenosa. specificiran Transmission Control Program (TCP), (Vinton Cerf i Bob Kahn) BBN predstavlja Telnet (komercijalnu verziju ARPANET-a) - prvi "public packet data service". 1975.god. prva ARPANET mailing lista, MsgGroup. (stvorio je Steve Walker). 1976.god. umreavanje se sve vie iri svijetom te i kraljica Elizabeta alje e-mail. UUCP (Unix-to-Unix CoPy) razvijen u AT&T Bell Labs i distribuiran sa UNIXom sljedee godine. UNIX je bio i jo je uvijek glavni operativni sustav koriten od strane sveuilita i istraivakih struktura. Dr. Robert M. Metcalfe razvija Ethernet, presudni element prema razvoju LAN-a. - roen SATNET (Atlantic packet Satellite network) koji je povezivao Ameriku i Europu. Koriteni su INTELSAT sateliti koje je posjedovao konzorcij zemalja, a ne iskljuivo amerika vlada. Department of Defense poinje eksperimentirati sa TCP/IP protokolom i uskoro ga odluuje upotrijebiti za ARPANET. 1977.god. E-mail sve vie kree uzlaznom putanjom i Internet postaje stvarnost.
1022/1275
Larry Landweber sa Univ of Wisconsin stvara THEORYNET, UUCP temeljen email sistem, prua elektronsku potu prema preko 100 znanstvenika u raunarstvu (pomou lokalno razvijenog E-mail sistema i TELENET-a za pristup prema serveru). prva demonstracija ARPANET/Packet Radio. 1978.god. TCP podijeljen na TCP i IP (u oujku). 1979.god. roene News Grupe (News Groups). u SAD-u utemeljen Computer Science Department (research computer network). Tom Truscott i Steve Bellovin kreirali USENET. Bio je temeljen na UUCP-u. ARPA utemeljuje Internet Configuration Control board (ICCB). utemeljen Packet Radio Network (PRNET) prve MUD (Multiuser Dungeon)- interaktivne viekorisnike stranice. Interaktivne avanturistike igre, "board games", bogate i detaljne baze podataka. 1980.god. (27.10) ARPANET potpuno stao zbog nehotinog irenja "status-message " virusa. 1981.god. BITNET, "Because It's Time NETwork" je kao suraivaka mrea zapoela svoj rad kod gradskog Sveuilita New York, sa prvom vezom prema Yaleu. utemeljen je CSNET (Computer Science NETwork) kao pruatelj mrenih servisa, pogotovo E-maila. CSNET kasnije postaje poznat kao Computer and Science Network. 1982.god. TCP/IP definira budunost komunikacija. DCA i ARPA utemeljili Transmission control protokol (TCP) i Internet Protokol (IP), kao niz protokola za ARPANET, esto znan kao TCP/IP. TCP/IP odabran od DoD (Department of Defense) kao standard ovo dovodi do jedne od prvih definicija Interneta kao povezanog seta mrea, naroito onih koje koriste TCP/IP, i Internet kao spojene TCP/IP Internet. specificiran External Gateway Protocol (EGP). 1983.god. Internet se sve vie iri i dobiva na vanosti
1023/1275
na Sveuilitu u Wisconsinu razvijen je Domain Name System (DNS). Nestala je potreba za pamenjem IP brojeva jer su se paketi bili usmjeravani prema nazivu domene, a zatim bi baza podataka na serveru taj "domain name" prevela u IP broj. uspostavljen Gateway izmeu CSNET-a i ARPANET-a. ARPANET podijeljen na ARPANET i MILNET. UNIX "maine" s ugraenim TCP/IP-om postaju popularne. ICCB zamjenjen sa Internet Activities Board (IAB). Berkeley objavljuje novu verziju UNIX-a 4.2BSD ujedinjujui TCP/IP. utemeljena EARN (European Academic and Research Network). 1984.god. rast Interneta se nastavlja. Preko 1000 "hostova". predstavljen DNS Domain Name Server (umjesto 123.456.789.10 lake je upamtiti neto poput: www.myuniversity.mydept.mynetwork.mycountry) (npr. www.cs.cf.ac.uk) u Engleskoj utemeljena JANET (Joint Academic Network). u Japanu uspostavljen JUNET (Japan Unix Network). 1985.god. The National Science Foundation poeo s postavljanjem novih T1 linija(1.544Mbps), koje e biti zavreno do 1988. 1986.god. shvaena mo Interneta. 5, 000 Hosts. 241 News groups. osmiljen je NSFNET (osnovna brzina od 56 Kbps) originalno sastavljen od 5 super-raunalnih centara spojenih s 56Kbps lines. Druga sveuilita se ukljuuju. NSF osniva 5 super-raunalnih (super-computing) centara za pruanje visokoraunalne snage za sve (high-computing power for all). Ovo omoguuje eksploziju veza, osobito od izmeu sveuilita. stvoren Network News Transfer Protocol (NNTP). Craig Partridge razvio Mail Exchanger (MX) records. 1987.god. zapoela je komercijalizacija Interneta. preko 10,000 "hostova". UUNET temeljen s Usenix-om osigurava sredstva da prui komercijalni UUCR i Usenet pristup.
1024/1275
NSF i Merit Network, Inc pristaju na upravljanje NSFNET backbone. e-mail link uspostavljen izmeu Njemake i Kine. 1988.god. NSFNET backbone nadograen (poboljan) prema T1 (1.544 Mbs), promet vrlo brzo raste te odmah poinju planovi za nadogradnju novu mree. razvijen Internet Relay Chat (IRC). Kanada, Danska, Finska, Francuska, Island, Norveka, vedska si na NSFNET-u. DARPA formira CERT (Computer Emergency Response Team). razvijen Internet Relay Chat (IRC) (Jarkko Oikarinen). 1989.god. veliki rast Interneta. prvi prijenosi preko komercijalnog mail nosaa (commercial electronic mail carrier) i Interneta. stvoreni Internet Engineering Task Force (IETF) i Internet Research Task Force (IRTF). CSNET se spaja (stapa, pripaja) s BITNET-om i formira Corporation for Research and Education Networking (CREN). Australija, Njemaka, Izrael, Italija, Japan, Meksiko, Nizozemska, Novi Zeland, Puerto Rico, Engleska na NSFNET-u. 1990.god. irenje Interneta se nastavlja. ARPANET nestaje i zamjenjuje ga NSFNET. Archie released files can be searched and retrieved (FTP) by name. svijet postaje on-line (world.std.com), postaje prvi komercijalni pruatelj Internet dial-up pristupa. Argentina, Austrija, Belgija, Brazil, ile, Grka, Indija, Irska, juna Koreja, panjolska, vicarska na NSFNET-u. 1991.god. modernizacija poinje. Brewster Kahle izumio (osmislio) Wide Area Information Servers (WAIS). Prua mehanizam za indeksiranje i pristupanje informacijama na Internetu. Paul Lindner i Mark P. McCahill sa sveuilita u Minnesoti objavili Gopher. Worl-Wide Web (WWW) objavljen od strane CERN-a, razvio ga Tim BernersLee. NSFNET backbone nadograen na T3 (44.736Mbps).
1025/1275
NSFNET promet prelazi 1 trilijun bajtova/mjesec i 10 bilijuna paketa/mjesec. Hrvatska, Republika eka, Hong Kong, Maarska, Poljska, Portugal, Singapur, Juna Afrika, Tajvan, Tunis na NSFNET-u. 1992.god. Multimedija mijenja lice Interneta. broj hostova prelazi 1 milijun. News groups 4,000. osnovan Internet Society (ISOC). Jean Armour Polly smislio izraz "Surfing the Internet" (surfanje Internetom). Kameruna, Cipar, Ekvador, Estonija, Kuvajt, Latvija, Luksemburg, Malezija, Slovaka, Slovenija, Tajland, Venecuela na NSFNET-u. 1993.god. WWW revolucija stvarno zapoinje. broj hostova 2 milijuna, 600 WWW stranica. InterNIC stvoren od strane NSF-a, za pruanje specifinih Internet usluga. poslovni i medijski svijet zapaa Internet. Bijela Kua i Ujedinjeni Narodi postaju on-line. razvijeno grafiko korisniko suelje Mosaic. Kasnije prerasta u Netscape. WWW se iri sa godinjom stopom od 341,634 %, a Gopher-ov rast je 997%. Bugarska, Kostarika, Egipat, Fidi, Gana, Guam, Indonezija, Kazahstan, Kenija, Lihtentajn, Peru, Rumunjska, Ruska Federacija, Turska, Ukrayne, UAE, Djevianski Otoci na NSFNET-u. 1994.god. komercijalizacija zapoinje. broj hostova 3 milijuna. 10,000 WWW stranica. 10,000 News grupa. ARPANET/Internet slavi 25 obljetnicu. trgovaki centri i banke stiu na Internet. NSFNET promet premauje 10 trilijuna bajtova/mjesec. Alir, Armenija, Bermudi, Burkina Faso, Kina, Kolumbija, francuska Polinezija, Jamajka, Libanon, Litva, Macau, Maroko, Nova Kaledonija, Nikaragva, Niger, Panama, Filipini, Senegal, ri Lanka, Svazi, Urugvaj, Uzbekistan na NSFNET-u. 1995.god. komercijalizacija se nastavlja. 6.5 Million Hosts, 100,000 WWW Sites.
1026/1275
NSFNET se vraa nazad prema istraivakoj mrei. Glavni dio SAD backbone prometa sada usmjeren kroz meusobno povezane mrene dobavljae (network providers). WWW premauje ftp-data (u oujku) kao servis s najveim prometom na NSFNet temeljen na broju paketa, i u travnju temeljen na broju bajta. tradicionalni on-line dial-up sistemi (Compuserve, America Online, Prodigy) poinju pruati pristup Internetu. registracija naziva domene nije vie besplatna. pojavljuju se nove WWW tehnologije: Mobile code (JAVA, JAVAscript, ActiveX), "Virtual environments" (VRLM), "Collaborative tools" (CU-SeeMe). 1996.god. Microsoft ulazi u igru. 12.8 Million Hosts, 0.5 Million WWW Sites. Internet telefoni hvataju panju amerikih telekomunikacijskih poduzea koja trae od Kongresa SAD-a da zabrani tu tehnologiju (koja je ve nekoliko godina bila uokolo u upotrebi). zapoinje WWW rat, primarno borbe izmeu Netscape-a i Microsoft-a, i pouruje u novo doba softverskog razvoja, pomou ega su nova putanja raena tromesjeno uz pomo Internet korisnika eljnih testiranja predstojeih (beta) verzija. 1997.god. 19.5 Million Hosts, 1 Million WWW sites, 71,618 Newsgroups. pretraivai i Web preglednik tehnologije sve popularniji. 17. srpnja ljudskom grekom u Network Solutions-u .com i .net domene postaju nedostupne. American Registry for Internet Numbers (ARIN) osnovan sa zadatkom da upravlja administriranjem i prijavom IP brojeva prema geografskim podrujima s im je do sada rukovao Network Solutions (InterNIC). 1998.god pretraivaima i Web preglednik tehnologijama popularnost sve vie raste. Ameriko ministarstvo trgovine (US Depart of Commerce - DoC) u glavnim crtama iznijelo svoj plan privatiziranja DNS-a. uzlet elektronike trgovine i portala. Amazon.com pokazuje cijelom svijetu kako trgovati on-line.
1027/1275
e-Bay online aukcije takoer kreu uzlaznom putanjom. milijuna Web starnica. 1999.god. MCI nadograuje vBNS prema 2.5 Gbits/sec. razvijaju se Internet2. nove optike mrene tehnologije poinju preoblikovati Internet "backbone". prie o stapanju Interneta i javnog telefona ("public telephone system"). prvi "large-scale Cyberwar" istovremeno sa ratom u Srbiji (Kosovo). virusi godine: Melissa(oujak) i ExploreZip (lipanj). 2000.god. uzlet XML-a. maleni mobilni beini raunalni ureaji. kako se informacije o ljudima ire Internetom, privatnosti je sve manje. US timekeeper i nekoliko drugih "time servisa" 1. sijenja biljee godinu kao 19100. masivni napad na velike web sajtove, ukljuujui Yahoo, Amazon i eBay u oujku, onemoguio im pruanje usluga. virus godine: Love Letter (svibanj). tehnologije godine: ASP, Napster. sudski procesi godine: Napster, DeCSS. 2001.god. virusi godine: Code Red, Nimda, SirCam, BadTrans. novonastale tehnologije: Grid Computing, P2P. GANT, "the pan-European Gigabit Research and Education Network" stavljena u funkciju zamjenjujui tako "TEN-155 network". radio stanice poinju emitiranje preko Web-a. visoke kole u pet amerikih drava (Michigan, Missouri, Oregon, Virginia i Washington) meu prvima dobivaju Internet2 pristup. Napster prisiljen obustaviti svoje usluge, ali e se ponovno javiti kasnije kao "subscription service". Europsko vijee dovrilo je meunarodni "cybercrime" ugovor i usvojilo ga 9. studenog. Ovo je prvi ugovor koji obrauje kaznena djela poinjena preko Interneta.
1028/1275
2002.god. oformljena Global Terabit Research Network (GTRN), spaja Internet2 Abiline, CANARIE CA*net3 i GANT. blog-ovi postaju hit. ameriki zakon osmiljava i sprovodi kids-safe domenu, "dot-kids" (kids.us). 2003.god. crv SQL Slammer prouzroio jedan od nejveih i najbre ireih DDoS napada ikada. Za otprilke 10 minuta rairio se po cijelom svijetu, sruio je 5 od 13 DNS root servera kao i desetine tisua drugih servera, djelujui i na mnotvo drugih sistema. nakon ovog, u kolovozu su uslijedili drugi, Sobig.F virus, najbre rasprostirui virus i Blaster (MSBlast), jedan od najdestruktivnijih crva. Little GLORIAD (Global Ring Network for Advanced Application Development) poinje djelovati. Sastoji se od umreenog prstena preko sjeverne polutke sa vezama prema Chicagu, Amsterdamu, Moskvi, Novosibirsku, Zabajkal'sku, Manzhouliu, pekingu i Hong Kongu. Ovo je prva mrena povezanost preko Rusko-Kineske granice. 2004.god. 2005.god. - ???
1029/1275
PRILOG:
Rast Interneta: Datum 12/69 06/70 10/70 12/70 04/71 10/72 01/73 06/74 03/77 12/79 08/81 05/82 08/83 10/84 10/85 02/86 11/86 12/87 07/88 10/88 01/89 Hosts 4 9 11 13 23 31 35 62 111 188 213 235 562 1,024 1,961 2,308 5,089 28,174 33,000 56,000 80,000 Datum Hosts 07/89 10/89 10/90 01/91 07/91 10/91 01/92 04/92 07/92 10/92 01/93 04/93 07/93 10/93 01/94 07/94 10/94 01/95 07/95 01/96 07/96 01/97 07/97 01/98 07/98 01/99 130,000 159,000 313,000 376,000 535,000 617,000 727,000 890,000 992,000 1,136,000 1,313,000 1,486,000 1,776,000 2,056,000 2,217,000 3,212,000 3,864,000 5,846,000 8,200,000 14,352,000 16,729,000 21,819,000 26,053,000 29,670,000 36,739,000 43,230,000 Network Domains 650 837 2,063 2,338 3,086 3,556 4,526 5,291 6,569 7,505 8,258 9,772 13,767 16,533 20,539 25,210 37,022 39,410 61,538 93,671 134,365 20,000 16,300 18,100 21,000 22,000 26,000 28,000 30,000 46,000 56,000 71,000 120,000 240,000 488,000 828,000 1,301,000 16,000 18,000 9,300 3,900
1030/1275
Hosts - kompjutorski sistem s registriranom IP adresom Networks - registrirana klasa A/B/C adresa Domains - registriran naziv domene (sa "name server" zapisom)
1031/1275
ZAKLJUAK :
Put do ovog to danas zovemo Internetom nije bio nimalo lagan i nitko tko je sudjelovao u njegovom stvaranju nije imao konanu viziju o tome to e se iz svega toga izroditi. Tako je i danas. Internet svakim danom nezaustavljivo raste i nemogue je predvidjeti to e se dogoditi u budunosti. Koliko e opstati? Dali ga ita moe zamjeniti? Kako e izgledati i kojim e smijerom napredovati? Sve to su pitanja kojima nitko ne zna odgovor. Mi imamo priliku biti svjedoci tog napretka pa ak i svojim malim doprinosima sudjelovati u njegovom razvoju.
1032/1275
Amir Kos
Uvod u Perl
1033/1275
SKALARI
Skalari su najjednostavniji oblik podataka s kojim Perl manipulira,skalar je recimo broj(npr. 5 ili 3.27e20) ili string koji se sastoji od karaktera(npr. hello),iako se moda ini da su brojevi i stringovi razliite stvari,Perl ih tretira kao jednake. Skalarne vrijednosti se spremaju u skalarne varijable.
Brojevi
U Perlu moete koristiti i integere isto kao i floating-point brojeve,Perl u stvari sve brojeve interno interpretira kao double-precision floating point values(u C ekvivalent double varijablama),to znai da za perl ne postoje Integer vrijednost oni se jednostavno interno tretiraju kao double floatovi(ukoliko ne koristite integer mode ali to nije po defaultu)
Float karakteri
Karakter je nain na koji perl interpretira vrijednost u programu,perl prihvaa cjeli set floating point karaktera dostupnih u C: Npr.:
1.25 # 5/4 7.25e45 # 7.25 * 10 potencirano na 45 -6.5e24 # -6.5 * 10 na 24 -12e-24 # - 12 * 10 na -24 -1.2E-23 # isto kao i iznad
1034/1275
Integer karakteri
npr.:
12 15 -2004 3485
Nikada ne poinjite broj s 0 zato sto perl podrava i oktalne i hexadecimalne vrijednosti okatalne poinju s 0 a hexadecimalne sa 0x Npr.:
0377 # 377 octal, isto kao 255 decimalno -0xff # - FF hex, isto kao -255 decimalno
Stringovi
Stringovi su naprosto niz karaktera kao npr. hello svaki karakter je 8-bitna vrijednost sto e rei da perl raspolae sa 256 razliitih karaktera(nema nita posebno oko NUL karaktera '/0' kao npr. u C). Najkrai mogui string nema karaktera,najdui string moe ispuniti svu vau raspoloivu memoriju jer perl slijedi filozofiju tzv. no-built in limits,to daje perlu mogunost manipulacijom stringovima kao sirovim binarnim podacima zadatak koji bi nekim drugim alatima predstavljao veliku tekounpr. moete patc-ati svoj OS jednostavno itajui string u Perl string,napraviti izmjenu i ponovno zapisati rezultat na izlaz! Kao i brojevi stringovi se prezentiraju karakterima!
'don\'t' pet karaktera: d, o, n, jednostruki navodnik ' pa t 'silly\\me' # silly\me 'hello\n' # hello +backslash + n
1035/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb 'hello there' # hello, novi red, there (11 karaktera ukupno)
treba primijetit da \n unutar jednostrukih navodnika nije interpretiran kao novi red,nego jednostavno kao dva karaktera \n(jedino u sluajevima kada je na \ dodan jo jedan \ ili ' tek tada ima posebno znaenje.
"c:\\temp"
Backslash moe prethoditi mnogim razliitim karakterima a da znae razliite stvari U tablici se nalaze izrazi i njihova znaenja:
Znaenje Nova linija Return Tab Formfeed Mjesto unazad(Bckspace) vertikalni tab Bell Escape Bilo koja octal ASCII vrjed (ovdje, 007 = bell) Bilo koja hex ASCII vrjed (ovdje, 7f = delete) Bilo koji "control" character (ovdje, control C)
1036/1275
Jo jedna uloga dvostrukih navodnika je da interpoliranju varijable,tj ukoliko se unutar dvostrukih navodnika nae varijabla vrijednost varijable e biti zamijenjena njenom vrijednou,jo jedna napomena ukoliko koristite Pathnameove pod Unix-om ili Win32 perl prihvaa ili \ ili / sa razlikom da \ mora slijediti esape sekvenca
"c:\\temp" # koristi escaped backslash "c:/temp" # koristi a Unix-style forward slash "c:\temp" # GREKA string sadri c:, a TAB, and emp
Skalarni Operatori
Operatori na neki nain proizvode novu vrijednost iz jedne lili vie vrijednosti,operatori oekuju ili string ili broj,ukoliko proslijedite string gdje se oekuje broj,perl automatski pretvara po svojim intuitivnim pravilima. Ukoliko koristite string operand na numerikom operatoru npr. +,perl automatski pretvara string u ekvivalentan broj,kao da ste unijeli njegovu reprezentaciju u double floating point vrijednosti,razmaci i nenumerici se ignoriraju npr.: 1234.567car se pretvara u 1234.567 sa malim warningom(ukoliko ne stavite w iz komandne linije to bi svakako trebali zlu netrebalo). S druge strane ukoliko pokuate proslijediti string kada se oekuje broj,numerika vrijednost se proiruje u ekvivalentan string recimo:
"X" . (4 * 5) # isto kao "X" . 20, ili "X20"
1037/1275
Operator za brojeve
Perl podrava tipian set operatora kao i drugim jezicima:
2+3 3 * 12 10 / 3 2**3 # 2 plus 3, ili 5 # 3 puta 12 = 36 # uvijek floating point djeljenje, priblino 3.333333... #Fortran 2*2*2=8 5.1 - 2.4 # 5.1 minus 2.4, priblino 2.7 10.2 / 0.3 # 10.2 podijeljeno 0.3, priblino 34
Logiki operatori su
Usporedba jednako Ne jednako Manje od Vee od numeriki String == != < > eq ne lt gt le ge
1038/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb Jo jedan set operator su string komparacijiski operatori:
Comparison jednako Ne jednako Manje od Vee od Manje ili jednako Vee ili jednako
String eq Ne Lt gt le ge
Operatori usporedjuju stringove na uobiajen nain po ASCII vrijednostima karaktera.Vjerojatno se pitate zato postoje razliiti operatori za brojeve i stringove npr. usporedimo li 7 i 30 ako ih usporedimo kao brojeve 7<30 ali ako ih usporedimo kao strinove onda je 7>30 (ASCII vrijednost 3 je manja od 7 i rezultat je pogrean,stoga perl zahtijeva da explicitno odredite kakvu usporedbu radite. Jo jedan string operator je string repetition operator malo slovo x,ovaj operator uzima lijevi operand i radi onoliko konkateniranih kopija koliki je operand s desne strane
"fred" x 3
# zadnji primjer je posebno zanimljiv zagrade imaju prioritet pa se 3+2=5 ali operator x eli string kao lijevi operand pa se vrijednost 5 pretvara u string 5 pa je rezultat string 5555,da smo izraz okrenuli naopake dobili bi 44444 ovaj primjer pokazuje da x nije komutativan #
1039/1275
Ukoliko elimo explicitno odrediti redoslijed izvravanja koristimo zagrade,ukoliko ne koristimo zagrade perl rauna po svojoj (matematikoj) logici:
Operator "list" operatori (ljevo) -> (poziv metode, derefernciranje) ++ -- (autoincrement, autodecrement) ** (potenciranje) ! ~ \ + - (logiki not, bit not, operator reference, unarni plus, unarni minus)
Left Left Left Left Nonassociative Nonassociative Nonassociative Left Left Left Left Nonassociative
=~ !~ (matches, doesn't match) * / % x (mnoenje,djeljenje,mod,string repetition) + - . (plus,minus,konkateniranje) << >> (shift operatori) imenovani unarni operators (npr chomp) < > <= >= lt gt le ge (relacijski operatori) == != <=> eq ne cmp (operatori jednakosti) & (bitovni and) | ^ (bitovni or, bitovni xor) && (logiki and) || (logiki or) .. ... (noninclusive and inclusive range)
1040/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb Asocijativnost Right Right Left Nonassociative Right Left Left Operator ?: (if then else) = += -= *=, etc. (dodjeljivanje i binarno dodjeljivanje) , => (comma and comma arrow) List operatori (rightward) not (logiki not) and (logiki and) or xor (logiki or, logiki xor)
Skalarne Varijable
Varijabla je mjesto u memoriji koja sadri jednu ili vie vrijednosti,ime varijable je konstantno kroz cijeli program ali se vrijednost koju sadrava varijabla tipino mijenja. Skalarna varijabla dri jednu skalarnu vrijednost(bio to broj ,string ili referenca),ime varijable poinje s $ te sadri slova ,brojeve ili _,(max 255 znakova )imena varijabli su osjetljiva na velika i mala slova tako da $A nije isto to i $a.
1041/1275
Autoinkrement i Autodekrement
$a += 1; # s operatorom pridjeljivanja ++$a; $d = 17; $e = ++$d; # $e i $d su sad= 18 ovdje je operator ++ koriten kao prefix tj. operator je lijevo od operanda,operator se moe koristiti i sa desne strane izraza,u tom sluaju rezultat je ostao isti $c = 17; $d = $c++; .# $d = 17, ali $c = 18 # sa autoinkrementom
1042/1275
$a=amir;
chop($a) chop($a) # $a=ami; # $a=am
ukoliko niste sigurni da li string sadrava \n moete koristiti funkciju chomp() ona odsijeca samo newline karakter ukoliko postoji ,ukoliko ne postoji nikom nita
$a = "hello world\n"; chomp ($a); # $a je sada "hello world" chomp ($a); # aha! Nema promjene u $a=hello world
1043/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb $y = "hey $x"; # vrijednost je sad 'hey $fred': nema ponovne
zamijene
da bi sprijeili supstituciju ili varijablu stavite u jednostruke navodnike ili prije $ stavite \ koji ponitava specijalno znaenje $
$fred = 'hi'; $barney = "a test of " . '$fred';#$barney = 'a test of $fred' $barney2 = "a test of \$fred"; # ista stvar Ime varijable e biti najdue mogue ime varijable koje ima smisla kao dio stringa,to moe biti problem ukoliko elite poslije zamijenjene vrijednosti nastaviti sa nekim konstantnim tekstom,perl skenira imena varijabli,te bi mogao protumaiti te karaktere kao ime a to ne elite u tu svrhu vam prua delimiter za imena varijabli,jednostavno zatvorite ime varijable u {} ili koristite operator konkatenacije. $fred = "pay"; $fredday = "wrong!"; $barney = "It's $fredday"; $barney = "It's ${fred}day"; $barney2 = "It's $fred"."day"; # nije payday, nego "It's wrong!" # sad, $barney dobiva "It's payday" # jo jedan nain konkatenacijom
$barney3 = "It's " . $fred . "day"; # i jo jedan nain konkatenacijom takodjer vam je omogueno da manipulirate veliinom slova $bigfred = "\Ufred"; $capfred = "\u$fred"; $barney = "\LBARNEY"; $capbarney = "\u\LBARNEY"; # $bigfred je sada "FRED" # $capfred je sada "Fred" # $barney je sada "barney" # $capbarney je sada "Barney" $fred = "fred"; $bigfred = "\U$fred"; # ista stvar
Kao to se vidi case shifting string escape su zapameni unutar stringa,sve dok se ne iskoriste,tako da iako prvo slovo BARNEY ne slijedi \u,ve ostaje veliko slovo zbog \u.
1044/1275
Ispis
Ispis se vri jednostavno pozivajui print funkciju,funkcija kao argument uzima niz koji bez provjere ispisuje na standardni izlaz.
print("hello world\n"); # hello world, + novi red print "hello world\n"; # ista stvar bez zagrada
Nedefinirane vrijednosti
to se deava ako koristite skalarnu varijablu prije nego to ste ju definirali,nita posebno,i svakako nita fatalno,sve varijable imaju undef vrijednost prije nego to im je ita dodijeljeno,ta vrijednost je najslinija 0 kada se koristi kao broj ili kao prazan string kad se koristi kao string.<STDIN> naprimjer vraa undef vrijednost kada vie nema to proitati
Nizovi i Liste
Lista je ureeni skup skalarnih podataka,a niz je varijabla koja dri listu,svaki element niza je zaseban skalarna varijabla sa svojom skalarnom vrjednosti,te vrijednosti su ureene to znai da imaju ureen slijed od najmanje pa do najvee vrijednosti. Niz moe biti prazan ali isto tako moe biti velik da napuni svu raspoloivu memoriju sve u duhu perlove filozofije bez ogranienja
Literarna reprezentacija
Lista se sastoji od zarezom odvojenih vrijednosti zatvorenih u zagrade.
(1,2,3) # niz od 3 vrijednosti 1, 2, and 3
Sveuilite u Splitu Struni studij Raunarstva Zagreb ($a, 17) () #dvije vrijednosti: vrijednost $a, i 17 # prazna lista
($b+$c,$d+$e) # dvije vrijednosti Lista se takoer moe deklarirati koristei list konstruktor koji ukljuuje dvije skalarne vrijednosti izmeu kojih se nalaze dvije toke on tada konstruira listu Poevi od lijevog skalara te inkrementirajui za jedan sve do desnog skalara. (1..5) # isto kao i (1, 2, 3, 4, 5) (1.2..5.2) # isto kao i (1.2, 2.2, 3.2, 4.2, 5.2) (2..6,10,12) # isto kao i (2,3,4,5,6,10,12) ($a..$b) opsega (1.3..6.1) # isto kao i (1.3,2.3,3.3,4.3,5.3) # opseg definiraju dvije skalarne vrijednosti $a i $b ukoliko bi inkrementiranjem zadnje vrijednosti izaao iz opsega on staje na zadnjoj vrijednosti koja je manja od
bolje:
@a = qw(fred barney betty wilma); # bolje @a = qw( fred barney betty wilma
);
# ista stvar
qw= 'qoute word ' koji kreira listu stringova razmake tretirajui kao granicu gdje zavrava jedan a poinje drugi string Deklaracija liste se sastoji od @ pa imena varijable: @somelist;#dekalracija liste @amirko(); #deklaracija neinicijalizirane liste
1046/1275
Dodjeljivanje
Najvaniji je operator dodjeljivanja,koji daje vrijednost varijabli u nizu,= ,perl potom odluuje da li je skalarno dodjeljivanje ili nizovno dodjeljivanje:
@fred = (1,2,3); # niz fred se sada sastoji od 3 elementa @barney = @fred; # u nizu barney se sada nalaze elementi liste fre @huh = 1; # 1 je dodjeljen u listu (1) automatski @huh=(1); mogue je takodjer dodjeljivati iz liste u listu @fred = qw(one two); # @fred=(2); @barney = (4,5,@fred,6,7); # @barney = (4,5,"one","two",6,7) @barney = (8,@barney); # stavlja 8 ispred @barney @barney = (@barney,"last"); # dodaje "lastna kraj liste @barney=(8,4,5,"one","two",6,7,"last") Vano je napomenuti da lista ne moe sadravati drugu listu ve samo elemente koji se nalaze u drugoj listi.Ukoliko se lista sastoji od referenci na varijable(ne izraza),tada se element liste moe tretirati kao varijabla,svaka skalarna vrijednost se pridruuje odgovarajuoj skalarnoj vrijednosti druge liste
($d,@fred) = ($a,$b,$c); # dodaj $a na $d, @fred=($b,$c) ($e,@fred) = @fred; isto kao ($e,@fred)=($b,$c)
# @fred = ($c) a u varijabli se nalazi $e = $b Ukoliko broj elemenata koji dodijelimo ne odgovara broju varijabli koje uvaju vrijednost,desna strana se odbacuje a lijeva strana dobiva vrijednost undef. List varijabla ukoliko se pojavljuje unutar postojee liste mora biti zadnja,zbog toga to je pohlepna i pregazi sve ostale vrijednosti. Pri dodjeljivanju varijable niza skalarnoj varijabli dobivamo broj elementa u datom nizu
@fred = (4,5,6); # inicijalizirani @fred $a = @fred; # $a = 3, broj elementata u listi @fred
1047/1275
duljina se takoer vraa kada dodjeljujemo listu skalarnoj varijabli,to se zove skalarini kontekst ili list kontekst ovisno s koje strane jednakosti se nalazi koji operand. Npr.:
@fred = (4,5,6); # inicijaliziraj @fred ($a) = @fred; # $a=@fred[0]; u $a se nalazi prvi element liste @fred
u prvom primjeru fred je inicijaliziran na (1,2,3) u drugom primjeru se je napravljeno dodjeljivanje listi ($a) stoga se dodjeljuje prvi element @freda igoririajui sve ostalo sto slijedi.Dodojeljivanje listi je ve samo po sebi vrijednost liste te se moe kombinirati sa drugim dodjeljivanjima @fred = (@barney = (2,3,4)); # @fred= (2,3,4) @barney= (2,3,4) @fred = @barney = (2,3,4); # isto samo krae
($fred[0],$fred[1]) = ($fred[1],$fred[0]);# @fred=(9,11,9); Pristup elementima liste iz iste liste se naziva i slice,i pojavljuje se dovoljno esto Da i postoji posebna reprezentacija za te izraze:
@fred[0,1] # isto to i ($fred[0],$fred[1]) # zamijeni prva dva el @fred[0,1] = @fred[1,0]
@fred[1,2] = (9,10);
@fred je zbog toga to kreiramo list varijablu selektirajui dio liste a ne skalarnu vrijednost npr. $a za dohvaanje jednog elementa.
@who = (qw(fred barney betty wilma))[2,3]; # like @x = qw(fred barney betty wilma); @who = @x[2,3]; # @who=betty wilma; @fred = (7,8,9); $a = 2; $b = $fred[$a]; # $b=2
1048/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb $c = $fred[$a-1]; ili @fred = (7,8,9); @barney = (2,1,0); @backfred = @fred[@barney]; # $c = 8
# same as @fred[2,1,0] ili ($fred[2],$fred[1],$fred[0]), ili @backfred =(9,8,7) pokuamo li dohvatiti izvan granica @fred = (1,2,3); $barney = $fred[7]; # $barney = undef indeksirajui izvan dosega automatski proirujemo listu,dajui nerefrenciranim elementima undef vrijednosti @fred = (1,2,3); $fred[3] = "hi"; # @fred = (1,2,3,"hi") $fred[6] = "ho"; # @fred =(1,2,3,"hi",undef,undef,"ho") @fred = ("fred", "wilma", "barney", "dino"); print $fred[-1]; print $#fred; # prints "dino" # prints 3
$oldvalue = pop(@mylist); uklanja zadnji el iz @mylist Pop funkcija vraa undef ukoliko joj se proslijedi prazna lista i ne izaziva nikakav warning ili compile error. Push funkcija prihavaa i listu vrijednosti koje stavlja na vrh zadane liste
@mylist = (1,2,3);
1049/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb unshift(@fred,$a); $x = shift(@fred); @fred = (5,6,7); unshift(@fred,2,3,4); # @fred is now (2,3,4,5,6,7) $x = shift(@fred); # $x gets 2, @fred is now (3,4,5,6,7) # l @fred = ($a,@fred); # ($x,@fred) = @fred;
1050/1275
Reverse funkcija
Reverse funkcija obre listu argumenata koja joj je proslijeena,vraajui listu kao rezultat
@a = (7,8,9); @b = reverse(@a); #@b = (9,8,7) @b = reverse(7,8,9); # ista stvar
ili
@b = reverse(@b); # @b =(9,8,7)
1051/1275
Sort funkcija
Sort funkcija uzima argumente i sortira ih kao da su jednostruki stringovi u ASCII tablici,povratna vrijednost je sortirana lista ali bez mijenjanja originalne liste.
@x = sort("small","medium","large"); # @x = "large","medium","small" @y = (1,2,4,8,16,32,64); @y = sort(@y); # @y =(1,16,2,32,4,64,8)
primjeujemo da je lista brojeva sortirana pogreno,ukoliko elimo sortirati listu numerika moramo uiniti slijedee,moramo napisati proceduru koja definira kako se dva susjedna elementa sortiraju
sub by_number { if ($a < $b) { return -1; #vrati 1 ako je prvi manji od drugog } elsif ($a == $b) { return 0; # vrati 0 ako su jednaki } elsif ($a > $b) { return 1; # vrati 1 ako je prvi veci od drugog } }
@list=sort by_number @y # @list=(1,2,4,8,16,32,64); tono funkcija by_ moe biti napisana da radi sa bilo kojom vrstom podataka,ovaj nain sortiranja je u perlu est stoga perl je predvidio poseban operator spaceship operator space ship operator vraa identine vrijednosti kao i by_number procedura tako da sada moemo pisati.
sub by_number { $a <=> $b; }
ili jo krae @list = sort { $a <=> $b } @y Spaceship operator za brojeve ima takoer operator za stringove cmp pa ca u ovom sluaju izraz izgledati. @list=sort{$a cmp $b}@listopad
1052/1275
Vjerojatno se pitate kako napraviti kombinaciju ili to ako moram sortirati po brojevima i po karakterima evo jedan od naina,ili sve omogue kombinacije ova dva izraza.
sub by_mostly_numeric { ($a <=> $b) || ($a cmp $b); }
ukoliko je rezultat spaceshipa 1 ili 1 ostatak se preskae i povratna vrijednost je 1 ili 1 ali ukoliko prvi dio izraza vrati 0 drugi dio izraza se potom izraunava.
$x = "This is $fred[$y-1]'s place"; # ista stvar prvo se rauna indeks a interpolacija tek potom,ukoliko elite skalarnu vrijednost referencirati s lijevom { morat ete ju zatvoriti da se ne bi smatrala dijelom liste
@fred = ("hello","dolly"); # give value to @fred for testing $fred = "right"; # pokuavamo rei "this is right[1]" $x = "this is $fred[1]"; # OK, gives "this is dolly" $x = "this is ${fred}[1]"; # OK ({}) $x = "this is $fred"."[1]"; # OK (konkatenacijom)
1053/1275
Ukoliko osoba koja pokrene gornji program unese tri linije zavravajui CTRL+Z U listi se nalaze tri linije koje zavravaju s \n.
1054/1275
KONTROLNE STRUKTURE
Izraz koji prelazi jednu liniju moe se staviti u {} inei tako blok izraz
{ prvi_izraz; drugi_izraz; treci_izraz; last_statement; } Blok izraz se prihvaa i kada se u izrazu nalazi samo jedna naredba,ali ne vrijedi obrnuto.Zadnji ; u blok naredbi je opcionalan.
If / unless izraz
if (some_expression) {
false_statement_1; false_statement_2; false_statement_3; } Perl izraunava izraz u zagradi i ukoliko je to istina(kontroni izraz se pretvara u string i ukoliko je njegova vrijednost 0 ili prazan string onda je false bilo sto drugo je automatski istina) izvrava se prvi blok naredbi,ako je pak la slijedi dio koji se nalazi iza else,evo nekoliko primjera:
0 1-1 1 "" "1" # pretvara u "0", false # = 0, pretvara se u "0", = false # pretvara u "1", true # prazan string = false # = true
"00" # nije "" ili "0", = true (ova je udna stoga paziii) "0.000" # =true (isto ko i gore);
1055/1275
ili
print " koliko ima godina\n "; $a = <STDIN>; chomp($a); unless ($a < 18) { print " Dovoljno star idi glasati!\n "; }
if( $a<18) print jo si mali\n; elseif($a>18 && $a<20) print ti si ok\n; elseif($a>40) printpenzioner\n; elseif($a>60){ printpenzioner\n;
$a = <STDIN>; chomp($a); } else{ printko si bre ti?n}
While\untill izraz
while (some_expression) {
Sveuilite u Splitu Struni studij Raunarstva Zagreb } evo jednog primjera maltertiranja korisnika:
printkoja je tajna rijec; chomp($a=<STDIN>); while($a neq car){ printkoja je tajna rijec\n; chomp($a=<STDIN>); }
ili printkoja je tajna rije; chomp($a=<STDIN>); until($a eq ''car''){ printkoja je tajna rijec\n; chomp($a=<STDIN>); } Oba izraza su ekvivalentna s time da je nekada lake napisati until(izraz=false ili izraz=true).Ponekad kontrolni izraz ne doputa izlaz iz petlje,takve situacije su prilino este npr. elite izvravati petlju dokle god nemate pogreaka a kod iza petlje bi tada mogao biti neka error handling procedura!!
1057/1275
do {} while/until izraz
Razlika od prethodnih je da e se tijelo petlje uvijek izvriti barem jednom
do { statement_1; statement_2; statement_3;
for izraz
for ( initial_exp; test_exp; re-init_exp ) {
Ispisuje brojeve od 1-10 Inicijalizacija se izvodi samo na poetku,tada u svakoj slijedeoj iteraciji se provjerava uvijet,i ukoliko je istinit ide se na slijedeu iteraciju opcionalno poveavajui inicijalnu vrijednost za neki broj ili izraz.
foreach izraz
1058/1275
Ovaj izraz za argument prima listu vrijednosti,i dodjeljuje ih jednu po jednu skalarnoj vrijednosti,izvravajui tijelo za svako uspjeno dodjeljivanje. Npr.:
@a = (1,2,3,4,5); foreach $b (reverse @a) { print $b; }
rezultat je 54321,moete ak i izostaviti $b perl e to tada interpretirati kao da ste specificirali $_ tako da bi to skraeno mogli pisati.
@a = (1,2,3,4,5); foreach (reverse @a) { print; }
i jo jedan primjer
$x = 17; @a = (3,5,7,9); @b = (10,20,30); foreach $one (@a, @b, $x) { $one *= 3; } # @a=(9,15,21,27) ;@b=30,60,90);$x=51
Last,Next,Redo,Labele,&&,||,?:
Ovi izrazi se mogu kombinirati sa svim kontrolnim strukturama Last oznaava zadnji izraz u kontrolnoj strukturi te izlazi iz nje ekvivalent break u C
while (<STDIN>) { # read the input lines if (/^From: /) { # does it begin with From:? If yes... if (/eriko/) { # it's from Erik! print "Email from Erik! It's about time!\n"; } last; } if (/^$/) { last; } } # end while # no need to keep looking for From:, so exit # end "if from:" # blank line? # if so, don't check any more lines
1059/1275
Next oznaava da se ide na slijedeu iteraciju(izrazi iza next nee se izvriti) i izlazi iz unutarnjih {}
while (something) {
somepart; somepart;
next; }
otherpart; otherpart;
# next comes here }
ukoliko je somecondition=true izvrit e se somepart te potom krenuti na novu iteraciju,otherpart se nee izvriti. Redo izaziva novu iteraciju za dani uvijet.
while (somecondition) { # redo comes here
somestuff;
last; }
1060/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb INNER: for ($j = 1; $j <= 10; $j++) { if ($i * $j == 63) { print "$i times $j is 63!\n"; last OUTER; } if ($j >= $i) { next OUTER; } } }
Ako smo pronali to smo traili u ovom sluaju umnoak brojeva koji daju 63 nema smisla vie traiti i izlazi se iz OUTER: petlje. Deklaraciju labela radi lake itljivosti uvijek deklarirajte sa velikim slovima.
Expresion Modifiers. If this == then that, perl vam omoguava da radi vee itljivosti koda dodate if na izraz koji je ve Sam po sebi statement.
LINE: while (<STDIN>) { last LINE if /^From: /; }
druge paralelne forme su: exp2 unless exp1;# like: unless (exp1) { exp2; } exp2 while exp1; # like: while (exp1) { exp2; }
exp2 until exp1; # like: until (exp1) { exp2; }
vano je napomenuti da se te forme ne mogu ugnjeivati ne moete rei exp1 while exp2 if (some_cond); ova restrikcija je zato sto je exp1 while exp2 vie nije izraz ve izjava i ne moete ih vie appendati. && operator ili logiki AND u zavisnosti od oba izraza koja moraju bit true
if (this) { that; } # one way
that if this;
# another way
|| operatore ili logiki OR izraunava u true ukoliko je ikoji od uvjeta istinit. unless (this) { that; } this || that; ?: operator je samo pokrata za if
1061/1275
($a eq konjino)?printamire $a\n:printcare; ukoliko je uvjet najljeviji istinit izvrava se dio iza ? ukoliko ne dio iza : kao u C ternarni operator.
1062/1275
HASHEVI
Hash(Asocijativna lista) je slian listi sa jednom razlikom da elementi hasha su u stvari kolekcija skalarnih podataka,tj kljua i vrijednosti.Kljucevi se tada koriste kako bi se preko njih pristupalo vrijednostima na koje su pridrueni.Elementi hasha nemaju neki odreeni red,svaki put kada stavite neku vrijednost u hash on jednostavno preko kljua mapira vrijednost.
1063/1275
Values Funkcija
Values funkcija ispisuje vrijednosti u hashu,na isti nain kao i funkcija keys
%lastname = (); # force %lastname empty $lastname{"fred"} = "flintstone"; $lastname{"barney"} = "rubble"; @lastnames = values(%lastname); # @lastnames=(flinstone,rubble) ili (rubble,flinstone); foreach $val (values %fred) { # za svaki klju u %fred print "na $val imamo klju $fred{$val}\n"; # ispisi vrjednost i klju }
Each Funkcija
Ukoliko elite iterirati po hashu moete koristiti keys,ali je each puno efikasnija,ona vraa par koji se sastoji od kljua i vrijednosti
%a=('amir' => 'kos', 'petar'=>'pan' ,'ivan'=>'grozni'); while (($first,$last) = each(%a)) { print "Prezime od $first je $last\n";} Funkcija vraa parove dokle ih god ima kada dodje do kraja hasha vraa praznu listu,prilikom dodjeljivanja novih vrijednosti hashu,funkcija each se resetira i kree od poetka.
Delete Funkcija
Delete funkcija se poziva sa hash referencom. %a=('amir' => 'kos', 'petar'=>'pan' ,'ivan'=>'grozni'); delete $a{amir};# %a sada ima samo dva elementa
1064/1275
Hash slice
Kao i liste,u hashevima moemo pristupati vie elemenata istovremenotzv. slice. Promotrimo slijedei primjer: @score{"fred","barney","dino"} = (205,195,30); #hash scores (fred=>205 barney=>195 dino=>30) @players = qw(fred barney dino); #players=('fred' 'barney' 'dino'); print"rezultati su @score{@players}\n"; #prints 205 195 30 Slice se takodjer koristi kada elimo mergati male hasheve u vee.
@league{keys %score} = values %score; #mergamo kljueve s vrijednostima
1065/1275
$a=<STDIN> #skalrni kontekst @a=<STDIN> #list kontext elite li uitiavati liniju po liniju sa STDIN a ,jedan od naina je
while (defined($line_ = <STDIN>)) { # process $line here } Posto Perl omoguava tzv. podrazumijevanu vrijednost(_$) moete jednostavno pisati while (<STDIN>) { # == "while(defined($_ = <STDIN>_)" chomp; # =="chomp($_)" # other operations with $_ here }
<> Operator
Ovaj operator se ponaa na slian nain i kao <STDIN> uz jednu razliku to on prima argumente Iz komandne linije While(<>) Print _$; Recimo da skriptu nazovemo car.plx. Kada ju pokrenemo perl car.plx prvi.txt drugi.txt <> operator e prvo proitati sve linije u prvi.txt Potom sve linije u drugom.txt ispisivajui ih na ekran,te e vratiti undef tek poto je proitao sve linije,ukoliko mune proslijedimo argumente ita automatski sa STDIN.
1066/1275
Ispis na STDOUT
Perl koristi normalni i formatirani izlaz. Print car; # ispisuje car Ili $a=232434.224324 printf %10.2f $a; # ispisuje a u formatu 10 karaktera sa dva dec mjesta 23243400.22 prvi dio izraza je format specifikator koji sluzi pravilnom formatiranju argumenta s desne strane tablica format specifikatora
%% %c %s %d %u %o %x %e %f %g
Percent sign Character with the given number String Signed integer, in decimal Unsigned integer, in decimal Unsigned integer, in octal Unsigned integer, in hexadecimal Floating-point number, in scientific notation Floating-point number, in fixed decimal notation Floating-point number, in %e or %f notation
1067/1275
REGULARNI IZRAZI
Regularni izraz je nita drugo nego pattern ili uzorak koji e se testirati na odreeni string,to testiranje moe biti uspjeno ili neuspjeno,ponekad ete eljeti neto pronai ili neto zamijeniti. Regularni izrazi se koriste u mnogim programima,te svaki program ima svoj set template karaktera. U Perlu se ti izrazi esto koriste.,te on prua set karaktera za manipulaciju. Jednostavni regularni izrazi Ukoliko traimo linije u fileu koje sadre string abc na win 32 mogli bi napisati >findstr abc nekifajl.txt>rezultati.txt u ovom sluaju svaka linija se testira na abc koji je regularni izraz,linije koje zadovoljavaju redirekcijom preusmjeravano u rezultat.txt u perlu o stringu govorimo kao o regularnom izrazu zatvarjui ga u /abc/ perl takodjer ima tzv. wild karakter set
elimo li pronai linije u fileu koje poinju s a a zavrava s bc a izmedju moe biti bilo to mogli bi napisati u win 32 >findstr ab*c somefile >results
u perlu:
while (<>) { if (/ab*c/) { print $_; space + 0 Prefix positive number with a space Prefix positive number with a plus sign Left justify within the field Use zeros, not spaces, to right justify
number Minimum field width .number Precision: digits after decimal point for floating-point number, maximum length for string, minimum length for integer } } Jo jedan jednostavan regularni izraz je operator supstitucije
1068/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb s/ab*c/def/; # trai abc te zamijeni sa def Construct \d (a digit)
Equivalent Class Negated Construct Equivalent Negated Class [0-9] \D (digits, not!) \W (words, not!) \S (space, not!) [^0-9] [^a-zA-Z0-9_] [^ \r\t\n\f]
Sekvenca
ukoliko traimo sekvencu karaktera moemo pisati /[abcd]/ # trai sekvencu koja se sastoji od abcd; /[a.*bcd]/ #trai sekvencu koja poinje s a slijedi bilo to osim \n i zavrava sa bcd;
Multypliers
operator + elimo li nai sekvencu koja se sastoji od 1 ili vie znakova koristimo + operator operator ? koristimo kada elimo opcionalno pretraivanje general multiplier sastoji se od para {} sa jednim ili dva broja unutra /[ab+cde]/# a pa jedan ili vie b zavrava sa cde /[ab+c.*d?e]/ #a pa jedan ili vie b slijedi c pa bilo to osim \n potom opcionalno d i na kraju e /[ab{5,10}c.*d?e]/# a pa {5-10} b slijedi c pa bilo to osim \n potom opcionalno d i na kraju e ukoliko u jednom izrazu imamo vie multypliera primjenjuje se pravilo pohlepnosti tj. izvrit e se prvo najljeviji,moemo ga ulijeniti sa ? $_ = "a xxx c xxxxxxxx c xxx d"; /a.*c.*d/; # ide do zadnjeg c $_ = "a xxx c xxxxxxxx c xxx d"; /a.*?c.*d/; # ide do prvog pojavljivanja c
Jo jedna grupa operator su zagrade ,uz koju morate escapirati s \ i dodat mu odgovarajui int
/fred(.)barney\1/; # matches fred barney tj bilo koji znak u duljini 1 osim \n #no match fred barney
1069/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb /a(.*)b\1c/;# matches aXXbXXc #no match aXXXbXXc moemo grupirati izraze i sa alternacijom /[a|b|c]/# matches jedino ukoliko string ima ili a ili b ili c
ili tzv. usidravanje, oni vam omoguuju da od malih djelia uvjetno slaete vee dijelova stringa \b trai granicu u rijei na datoj toci da bi matchao,granica rijei ili word boundary je mjesto izmedju karaktera koji odredjuju string /fred\b/; # matches fred, but not Frederick /\bmo/; # matches moe and mole, but not Elmo /\bFred\b/; # matches Fred but not Frederick or alFred /\b\+\b/; # matches "x+y" but not "++" or " + " /abc\bdef/; # never matches (impossible for a boundary there)
prioriteti
Name Parentheses Multipliers Representation ( ) (?: ) ? + * {m,n} ?? +? *? {m,n}
PERL Practical Extraction and Report Language koristi regularne izraze kao svoje jako mono oruje Modifiers:
Modifier Meaning i Do case-insensitive pattern matching.
1070/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb Modifier Meaning m s x Treat string as multiple lines (^ and $ match internal \n). Treat string as single line (^ and $ ignore \n, but . matches \n). Extend your pattern's legibility with whitespace and comments.
Quatifiers Maximal Minimal Allowed Range {n,m} {n,} {n} * + ? Asertiranje Assertion Meaning ^ $ \b \B \A \Z \G Matches at the beginning of the string (or line, if /m used) Matches at the end of the string (or line, if /m used) Matches at word boundary (between \w and \W) Matches except at word boundary Matches at the beginning of the string Matches at the end of the string Matches where previous m//g left off {n,m}? {n,}? {n}? *? +? ?? Must occur at least n times but no more than m times Must occur at least n times Must match exactly n times 0 or more times (same as {0,}) 1 or more times (same as {1,}) 0 or 1 time (same as {0,1})
(?=...) Matches if engine would match ... next (?!...) Matches if engine wouldn't match ... next
=~ Operator
Target ovog operator moe biti bilo koji izraz koji se izraunava u skalarnu vrijednost.
$a = "hello world";
1071/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb $a =~ /^he/; $a =~ /(.)\l/; # true # also true (matches the double l) # some stuff }
ulaz sa <STDIN> se takoer izraunava u skalarnu vrijednost stoga elimo li testirati ulaz na neki
print "any last request? "; if (<STDIN> =~ /^[yY]/) { # does the input begin with a y? print "And just what might that request be? "; <STDIN>; # discard a line of standard input print "Sorry, I'm unable to do that.\n"; }
primijetite da se rezultat izraza ne sprema u varijablu /stringtocmp/i tzv ignoring case testira izraz na datu vrijednost ignorirajui case $a=AMIR; if($a=~/amir/i) # true sada bi prijanji primjer izgledao
print "any last request? "; if (<STDIN> =~ /^y/i) { # does the input begin with a y? # yes! deal with it ... }
takav nain pisanja koda moe kod malo sloenijih izraza nalikovati na smetnje u vezi stoga perl omoguava definiranje vlastitog delimitera uz opciju m
/^\/wwwroot\/docs/ # using standard slash delimiter m@^/wwwroot/docs@ # using @ for a delimiter
1072/1275
Interpolacija varijabli
Regularni izraz je samo varijabla interpolirana prije nego se testira na specijalne karaktere,kao rezultata moete slagati regularne izraze od izraunatih stringova umjesto konstanti $sentence = "Every good bird does fly."; print "What should I look for? "; $what = <STDIN>; chomp($what); if ($sentence =~ /$what/) { # found it! print "I saw $what in $sentence.\n"; } else { print "nope... didn't find it.\n"; }
# $first is now "this" and $second is now "is" druge read-only varijable su $&,$',$` na primjeru:
$_ = "this is a sample string"; /sa.*le/; # matches "sample" within the string # $` is now "this is a "
1073/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb # $& is now "sample" # $' is now " string"
Substitucija
Ve smo spomenuli substituciju,razmotrimo sada naine kako ju moemo malo modificirati. Ukolko elite da zamjena operira na sve mogue matcheve,a ne na samo prvi na koji naie dodajte g.
$_ = "foot fool buffoon"; s/foo/bar/g; # $_ is now "bart barl bufbarn"
string koji se mijenja je nita drugo nego interpolirana varijabla,doputajui vam da specificirate zamjenu u runtimeu,takoer moete specificirati vlastiti delimiter s#fred#barney#; # replace fred with barney, like s/fred/barney/
moete takoer koristiti =~,u ovom sluaju odabrana vrijednost mora biti neto emu moete dodijeliti skalarnu vrijednost,npr varijabla ili element liste.
$which = "this is a test"; $which =~ s/test/quiz/; # $which is now "this is a quiz" $someplace[$here] =~ s/left/right/; # change an array element
primijetite da je druga vrijednost prazan string,elite li to eliminirati koristite + @fields = split(/;+/, $line); # delimiter je ; ili ;;;;; u list kontekstu
1074/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb $line = "c:/;c:/windows;c:/windows/system;"; ($first, $second, $third, $fourth) =
split(/;/,$line); # split $line, using ; as delimiter # $fourth=undef; Join Funkcija uzima listu vrijednosti i lijepi ih zajedno sa naljepnicom za svaki element liste na kraj,elite li lijepiti na poetak jednostavan trik je dovoljan $result = join("+", "", @fields); # $fields[1]= neki_string+ analogno radi za ljepljenje na kraj
$output = join ("\n", @data, ""); #$dana[1]=\n neki_string
1075/1275
FUNKCIJE
Funkciju ili proceduru moete definirati bilo gdje u programu ali ju je preporuljivo staviti na kraj,definicije procedura su globalne,ne postoje lokalne procedure $what=Perl;
sub say_hello { print "hello, world!\n"; } ili sub say_hello { print "hello, $what!\n"; }
U ovom sluaju je say_heloo rutina ,primijetite da je mogu pristup globalnim varijablama izvan tijela funkcije.Funkciju pozivate jednostavno navodei njezino ime i specificirajui potrebne argumente ukoliko ih prima.
say_hello(); # a simple expression $a = 3 + say_hello() # part of a larger expression
Procedura je uvijek dio nekog izraza,vrijednost koju vraa se zove povratna vrijednost i nalazi se iza rijei return.
sub sum_of_a_and_b { return $a + $b; }
Argumenti
1076/1275
U Perlu poziv procedure slijedi lista,izazivajui uinak da se vrijednost liste automatski dodjeli specialonoj varijabli @_ u izvravanju.Procedura ima pristup tima varijablama. Pogledajmo slijedei primjer.
sub say { print "$_[0], $_[1]!\n"; } say("hello","world"); # hello world, once again say("goodbye","cruel world"); # silent movie lament
Ukoliko promaite vrijednost parametara ne brinite perl ih zanemaruje dodajui im undef vrijednosti.
sub add { $sum = 0; # initialize the sum foreach $_ (@_) { $sum += $_; # add each element} return $sum; } $a = add(4,5,6); # adds 4+5+6 = 15, and assigns to $a print add(1,2,3,4,5); # prints 15 # the sum of all elements
print add(1..5);
@_ je privatna danoj proceduri,ukoliko postoji globalni @_ on se sprema na stek i vraa se tek poto se procedura izvrila,to ujedno znai da procedura moe prosljeivati vrijednosti drugoj proceduri bez bojazni da e izgubiti svoj @_,jer nova procedura uvijek ima svoju kopiju @_ my ,local i use strict my operatorom deklariramo privatnu kopiju varijable ili instanciramo,prilikom izvravanja procedure stvara se uvijek nova kopija my.
sub bigger_than { my($n,@values); ($n,@values) = @_; # create some local variables # split args into limit and values
my(@result); # temporary for holding the return value foreach $_ (@values) { # step through the arg list if ($_ > $n) { } } @result; # return the final list # is it eligible? push(@result,$_); # add it
1077/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb } # some invocations: @new = bigger_than(100,@list); # @new gets all @list > 100
@this = bigger_than(5,1,5,15,30); # @this gets (15,30) Perl vam takoer omoguuje da kreirate privatne varijable koristei local,no bitnije je razumjeti razliku izmeu my i local
$value = "original"; tellme(); spoof(); tellme(); sub spoof { local ($value) = "temporary"; tellme(); } sub tellme { print "Current value is $value\n"; }
Da smo koristili my umjesto local ,privatno itanje $value bilo bi mogue jedino unutar spoof(),ali sa local privatna vrijednost i nije vie tako privatna.Pravilo:Local variables su vidljive procedurama koje se zovu unutar bloka u kojem su local varijable definirane.Vrijednost globalne varijable se sprema na stek i privremeno se zamjenjuje (unutar funkcije) sa novom vrijednou. Local varijable su u stvari preruene globalne vaijable,stoga koristite radije my nego local ne samo da je bre ve je i sigurnije. Use strict kompajlerska direktiva tjera vas da deklarirate varijable prije nego ih ponete koristiti.
use strict; my $a; ... push @b, qw(wilma); # cannot leave her out # starts as undef my @b = qw(fred barney betty); # give initial value
@c = sort @b;
Use strict je preporuljivo,jer radi bre(varijable deklarirane s my imaju neto bri pristup nego obine varijable,jer ete lake uoiti tipfelere.
1078/1275
1079/1275
FILE HANDLES
Filehandle je u perlu je ime I/O konekcije izmeu Perl procesa i svijeta,Perl omoguava tri filehandle STDIN,STDOUT,STDERR ukoliko elite otvoriti neki drugi file napisat ete neto ovako
open(FILEHANDLE,"somename"); open(OUT, ">outfile"); # otvara file za pisanje open(LOGFILE, ">>mylogfile");# otvara file za appedanje close(LOGFILE); # nije obavezna jer perl automatski zatvara filehandle kada ga se vie ne referncira. Ali to ako file nije mogao biti otvoren ili ne postoji. unless (open (DATAPLACE,">c:/temp/dataplace")) { print "Sorry, I couldn't create c:/temp/dataplace\n"; } ili krae unless (open DATAPLACE,">c:/temp/dataplace") { die "Sorry, I couldn't create c:/temp/dataplace\n"; } ili najkrae open(DATAPLACE,">c:/temp/dataplace") || die "Sorry, I couldn't create c:/temp/dataplace\n"; die se izvrava samo ukoliko open operacija nije uspjela OTVORI ILI UMRI die takodjer prima skalarnu vrijednost koju ispisuje ukoliko se izvri automatika ispisuje file i liniju,ukoliko to n elite appendajte \n na kraju. Die prima i tzv. predefiniranu varijablu $_ koja u sebi nosi sistemsku poruku o greci open(LOG, ">>logfile") || die "cannot append: $!"; $_ sadri Premission Denied warn radi isto to i die osim to ne umire i daje izlaz na STDERR
open(LOG,">>log") || warn "discarding logfile output\n"; primjer koritenja file handlova. $a=c:/\documents/\amir.txt
open(IN,$a) || die "cannot open $a for reading: $!"; open(OUT,">$b") || die "cannot create $b: $!"; while (<IN>) { # read a line from file $a into $_ print OUT $_; # print that line to file $b } close(IN) || die "can't close $a:$!";
1080/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb close(OUT) || die "can't close $b:$!";
Recimo da elite provijeriti da li neki file postoji u datom direktoriju koristite e amir.txt
if (-e "amir.txt" && -e "car.cgi") { print "You have both styles of index files here.\n"; } Tablica File testova i njena znaenja File Test Meaning -r -w -e -x -z -s -f -d -t -T -B -M -A -C File or directory is readable File or directory is writable File or directory exists File is executable File exists and has zero size (directories are never empty) File or directory exists and has nonzero size (the value is the size in bytes) Entry is a plain file Entry is a directory isatty on the filehandle is true (that is, the filehandle is a character device) File is text File is binary Modification age in days (C lang. time_t value) Access age in days (C lang. time_t value) Inode-modification age in days (C lang. time_t value)
Recimo da ste uitali u neku listu fileove u nekom direktoriju i elite ispisati koji su za itanje: Use strict; My(@files); @files=(chomp(<STDIN>);
foreach (@files) { print "$_ is readable\n" if -r; # same as -r $_ }
Stat funkcija vam daje sve atribute odabranog filea ili direktorija
file_owner = stat($filename)->uid;# $file_owner=amir;
1081/1275
blksize Disk block size (cluster size): zero for Win32 blocks Number of blocks for file: zero for Win32
1082/1275
1083/1275
FORMATI
PERL Practical Extraction and Report Language ==FORMATI
=============================== =============================== | Fred Flintstone | 3737 Hard Rock Lane | Bedrock , OZ 999bc | | |
===============================
1084/1275
Text polja
@<<<<< # pet karaktera poravnanih u lijevo @>>>>> # pet karaktera poravnanih u desno @||||| # pet karaktera poravnanih u centar
Brojevna polja
format MONEY = Assets: @#####.## Liabilities: @#####.## Net: @#####.## $assets, $liabilities, $assets-$liabilities .umijesto < koristimo # toka je opcionalna i oznaava na koliko e se decimala formatirati
Vielinijska Polja
Doputa formatiranje vrijednosti koje imaju vie od jedne linije informacija, taj fileholder se oznaava @*
format STDOUT = Text Before. @* $long_string Text After. . $long_string = "Fred\nBarney\nBetty\nWilma\n"; write;
# izlaz
Text Before. Fred Barney Betty Wilma Text After.
Ispunjena polja. elimo li tekst nekako formatirati da bude vizualno dopadljiv perl nam daje ^ kojeg stavljamo na mjesto @ uz jednu restrikciju odgovarajua vrijednost mora biti skalarna varijabla ,a ne izraz koji vraa skalarnu varijablu, razlog tome je to e Perl promijeniti varijablu dok puni polje. Prilkom punjenja polja Perl e otrgnuti onoliko rijei koliko stane u polje ,vrijednost te varijable ostaje sve ono to nije uspio strpati u polje.
1085/1275
format PEOPLE = Name: @<<<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $name, $comment ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $comment ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $comment ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $comment . Perl ugrabi onoliko rijei koliko stane u $comment,ostatak stavlja u drugi $comment do kraja. ta se deava ukoliko nema linija za popuniti sva polja,dobijete prazne linije,za popraviti to koristite ~ on forsira ne ispisivanje linije ukoliko ne postoji sada bi to izgledalo. format PEOPLE = Name: @<<<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $name, ~ ~ ~ . ukoliko comment pokrije samo prve dvije linije zadnje dvije se odbacuju $comment ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $comment ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $comment ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $comment
ali to ukoliko ne zanmo koliko linija moe zauzeti $comment, mogli bi napraviti 20 kopija zadnje linije ali perl pretpostavlja da ste lijeni. Koristei operator ~~,svaka linija koja sadri ~~ e biti ponavljana uzastopno sve dok ne vrati "" finalno primjer bi izgledao.
format PEOPLE = Name: @<<<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $name, ~~ . $comment ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $comment
Perl vam omoguava i definiranje tzv Top-of Page-Format koji sprjeava da vam se u toku ispisa desi prelom stranice
format PEOPLE_TOP = My people -- Page @< $% # broj pozivanja TOP-of page formata use za broj stranica
1086/1275
Default duina stranice je 60 linija ali je i to mogue promijeniti. Koritenje select za promjenu file handle. Povratna vrijednost selecta je string koji sadri ime prethodno odabranog handlea.
print "hello world\n"; select (LOGFILE); print "howdy, world\n"; select (STDOUT); # like print STDOUT "hello world\n"; # select a new filehandle # like print LOGFILE "howdy, world\n"; # re-select STDOUT
print "back to stdout\n"; # this goes to standard output primijetite da filehandle poslije selecta ostaje sve dok ga ne pregazimo novim selectom.
ovo nee imati uinka sve do prvog poziva top-of page formata,stoga je postavite prije ispisa texta u filehandle, radit e jer se top-of page format poziva kod prvog writea.
1087/1275
Zakljuak:
PERL je jezik namijenjen ljudima koji ele brzo obaviti neke stvari ,za koje bi u drugim jezicima morali rjeavati puno tee i due, PERL je ne samo lagan za upotrebu ve on ujedno koristi i postojee alate i solucije. PERL je takoer bogat jezik nudei mnoge funkcionalnosti koje su ugraene u sam Jezik ,ljudi ostanu iznenaeni kada vide da samo nekoliko linija PERL-a zamjenjuje nekoliko stotina linija koda napisanog u C,mnogim ovisnicima PERL nije samo jezik ve kultura, korisnicima UNIX-a i srodnih Operacijskih Sistema PERL je bio neizostavan alat, koji se polagano rasprostirao i na druge platforme, jer je visoko portabilan, PERL na Win32 je doao kada ga je Microsoft ukljuio(Active State Tool) na Windows NT Resource KIT. PERL na Win32 koristi neke od coll tehnologija kao to su OLE automation, ODBC database konekcije,Active X skripting i jo mnogo toga!! PERL je interpreterski jezik sto znai da se ne kompajlira ve se koristi PERL interpreter(slino kao JAVA VIRTUAL MACHINE),ali ima i neke razlike on je u stvari i kompajler i interpreter,kada pokrenete PERL interpreter na nekom PERL skript filu on se prvo compajlira i optimizira,tek potom efikasno izvrava ,ne samo to omoguava brzo runtime izvravanje ,nego i ubrzava razvojni ciklus ,jer promjene u kodu se mogu raditi bez da se ponovo kompajliraju i linkaju. PERL (Practical Extraction and Report Language). Usprkos njegovoj relativno jednostavnoj sintaksi ,moete jednostavno razvijati PERL programe, ne samo sto postoji debugger ,ve je samo kompajler dostatan da ukae na poruku o greci,. Interpreter ne izvrava program ako se program ne iskompajlira ,ovo vas spaava od interpreterskih nonih mora gdje se prva polovica programa izvrava a druga polovica ne! PERL se danas iroko koristi za WWW ,CGI Active X skripte i jo mnogo toga, izbor je mnogih sistemaca , ne samo to e vam dati da manipulirate registryem , Event Logom,i User -accountom ,nego je i najbolji alat za procesiranje fileova skoro bilo kojeg formata. Sa PERLOM moete: -moete pristupati vaoj bazi podataka(Win32::ODBC)ili da radi s vaim Word procesorom ili spreedshetom koristei OLE automation. -za filtriranje e-maila ,sa slanje e-maila, komunikaciju s FTP i HTTP serverima
1088/1275
-procesirati tekstualne i numerike podatke i jo mnogo, mnogo toga. Kao i mnogi drugo jezici PERL moe biti 'write-only' tj mogue je pisati programe koji su jako teko itljivi, ali uz malo brige i truda moete izbjei ovakve situacije.
1089/1275
1090/1275
UVOD to je Perl?
Perl je engleska skraenica za Practical Extraction and Report Language. To je interpretorski programski jezik ope namjene prenosiv za sve OS (UNIX, Linux, Windows, Mac,...). Perl je besplatan, "open-source" jezik. Proiriv je novim funkcijama i mogunostima koje korisnici sami proizvedu (modularan je). Podrava proceduralno i objektno programiranje. Perl se sastoji od programa, interpretera i compiler-a. Program je ono to korisnik pie, interpreter je prevodilac tog programa, a compiler je izvritelj programa. Perl je jednostavan za razumijevanje i ve se sa malo znanja moe raditi puno stvari.
Povijest Perl-a
Prvu inaicu Perl-a napisao je Larry Wall davne 1987. godine. Wall je tada radio sustav izvjeivanja pogreaka prilikom kompajliranja programa. Sustav izvjeivanja pogreaka trebao je biti po strukturi jednak Usenet-u. Kako je u to vrijeme awk bio neprimjeren za takve zadatke, a C jezik presloen, Larry Wall se odluio na stvaranje posebnog alata koji bi bio moan s obradom teksta i stvaranjem izvjea. S vremenom je taj alat prerastao u programski jezik koje je Wall podijelio s ostalima putem Usenet-a. Tako je zaivio Perl - interpretorski jezik pisan u C-u i namijenjen samo UNIX platformama. Jednostavnost, vea brzina izvoenja i fleksibilnost koju je Perl nudio naspram ostalih jezika u to vrijeme za tu primjenu, uinile su ga vrlo popularnim. Zahvaljujui tome Perl se brzo razvijao obuhvaajui sve vie novih mogunosti (koje su bile vezane i s razvojem UNIX kernela). Do danas, Perl je dogurao do stabilne verzije 5.8.6. i eksperimentalne verzije 5.9.1. te postao jedan od ope prihvaenih skriptnih programskih jezika ope namjene. Nije vie ogranien samo na UNIX platforme, ve postoji i podrka za druge OS (Windows, Mac,...). Posebnost Perl-a je u tome to u sebi objedinjuje mogunosti C, sed i awk programskih jezika, te UNIX-ovih ljuski.
1091/1275
U novije vrijeme Perl se zbog svoje opsenosti poinje sve vie izbjegavati kod mlaih webmastera, te polagano, unato mogunostima koje se preklapaju sa drugim serverskim jezicima, gubi utrku na webu.
Namjena Perl-a
Kako se s vremenom razvijao, Perl se nije zadrao samo na procesiranju teksta. Danas je Perl nairoko primjenjivan za zadatke kao to su: administracija sustava, razvoj interaktivnih web stranica, merno programiranje, grafiko programiranje, izrada sistemskih i obinih aplikacija. Perl se primjenjuje kada je potrebno brzo, jednostavno i efikasno razvijanje ispitnih okruenja programa ili njihovih prototipova te kada se zahtijeva iroka prenosivost. Perl podrava proceduralno i objektno programiranje. Poput C i C++, Perl nema striktnu granicu izmeu procedura ili objekata. Perl je izveden kao modulator, tj. interpreter (prevodi raunalu ono to korisnik napie na poznat jezik jedinica i nula) Perl-a moe se dopunjavati bibliotekama koje mu proiruju funkcionalnost (vrlo velika baza modula). Baza modula je okupljena oko CPAN mree (eng. Comprehensive Perl Archive Network). Perl interpreter nije ogranien samo na odreenu primjenu. U argonu se za Perl kae da je "otvoren prema svima, ali nije poseban prema nekome". Perl je od samog poetka besplatan i open-source projekt. Oko Perl projekta je okupljena iroka zajednica programera koji dobrovoljno sudjeluju u njegovu razvoju na elu sa njegovim tvorcem Larry Wall-om. U novije vrijeme Perl se zbog svoje opsenosti poinje sve vie izbjegavati kod mlaih webmastera, te polagano, unato mogunostima koje se preklapaju sa drugim serverskim jezicima, gubi utrku na webu.
1092/1275
INSTALACIJA PERL-A I PERL MODULA Instalacija Perl-a i Perl modula na Linuxu Instalacija izvornog koda Perl-a na Unix/Linux OS
Perl je od samog poetka razvijen kao jezik na UNIX operativnim sustavima jer koristi njegove osnovne pozive kernela. Kako je njegova rairenost rasla, tako je s vremenom postao sastavni dio distibucija UNIX i Linux operativnih sustava. Ipak, distribucije obino ne sadre najnovije verzije Perla pa ga je potrebno skinuti s Interneta. S Interneta se moe skinuti kompajlirana verzija Perla (eng. ports, binary distributions), no to nije preporuljivo zbog ve podeenih postavki prije kompajliranja koje ne moraju odgovarati onima koje elimo. Najbolje je skinuti izvorni kod s Interneta, te ga kompajlirati na vlastitiom raunalu. Najnoviji izvorni kod mogue je dohvatiti sa www.cpan.org/src/stable.tar.gz. Nakon to smo skinuli izvorni kod, koji dolazi u obliku .tar. archive komprimirane gzip alatom, kopiramo ga u direktorij po elji I otpakiramo arhivu. Otpakiravanje arhive izvodi se slijedeom naredbom u ljusci:
$ tar xvzf stable.tar.gz
Nakon toga slijedi proces kompajliranja koji se najee izvodi slijedeim naredbama u ljusci:
$ cd stable $ ./configure $ make
Gornjim naredbama postavlja se tekui direktorij stable (koji je nastao otpakiravanjem arhive stable.tar.gz), uitavaju se postavke za proces kompajliranja i na kraju se pokree samo kompajliranje. Preporuljivo je prije procesa kompajliranja proitati datoteku Readme koja dolazi sa izvornim kodom, a u kojoj je detaljno opisana procedura kompajliranja.
1093/1275
Traei po internetu potrebni materijal za pisanje naeg seminara o Perlu pronali smo komentare kako je pomou ActiveState Linux Package-a najlake instalirati Perl na Linux platformu, te smo napisali kako se instalira Perl na Linux pomou ActiveState Linux Package-a. ActiveState Linux Perl Package se moe skinuti na stranicama
http://www.php.co.ba/index.php?action=sw_details&main_id=12. File ima oko 9.2. MB. Za instalaciju je potrebno oko 35 MB slobodnog prostora diska. Nakon download-a .tar.gz file kopiramo u direktorij /tmp -> cp ActivePerl-5.6.0.623i686-linux-thread-multi.tar.gz/tmp, te ga otpakiramo. To moemo napraviti na dva naina.: 1.-tar xzf ActivePerl-5.6.0.623-i686-linux-thread-multi.tar.gz 2.-gunzip c ActivePerl-5.6.0.623-i686-linux-thread-multi.tar.gz | tar xfMi emo koristiti drugi nain. Uemo u direktorij komandom cd ActivePerl-5.6.0.623 i upiemo ./install.sh za instalaciju Perl-a. Postavimo Environment varijable tako da upiemo setenv PATH /usr/local/ActivePerl-5.6/bin:$PATH. Time je instalacija Perl-a na Linux-u zavrena
1094/1275
1095/1275
Instalacija Perl-a i Perl modula na Windows OS-u Instalacija Perl-a na Windows OS-u
Verziju Perl-a koju emo opisivati dolazi od firme ActiveState. Veliina file-a je oko 8.6 MB. Za instalaciju nam treba oko 35 MB slobodnog prostora diska. Opisati emo instalaciju Perl-a na Windows 2000 Service Pack 3. Prvo skinemo .msi file. Klikom na .msi file nudi nam se da Perl instaliramo u direktorij C:\Perl (to je standardni Perl direktorij). Perl instalira standardne komponente: perl program, PerlIS - ISAMI interpreter, PerlSE - Perl ActiveX Scripting Engine, Primjere i Dokumentaciju. Tijek instalacije je automatski osim par standardnih klikova. Perl e promjeniti, odnosno dodati svoje Environment Varijable koje nam olakavaju koritenje. Zatim resetiramo kompjuter. Environment varijable moemo nai klikom desne tipke mia na Computer -> Preferences -> Advanced -> Environment Variables I pod opcijom PATH pronalazimo traene Perl varijable. U sluaju da neka varijabla fail treba ih unijeti runo jer bi morali pisati puni PATH za Perl skripte. Sve Perl skripte poinju sa #!Perl Dir. Environment varijble nam skrauju pisanje Perl Dir-a. Umjesto Perl Dir-a piemo #!perl. Za provjeru da li je instalacija uspjeno prola napravimo kratku Perl skrupitu tako da napravimo novi file na npr. desktopu i imenujemo ga perl.pl. Otvorimo ga u editoru I napiemo sljedei kod u file perl.pl: #!perl print "Perl je instaliran"; <>; Prva linija ovog kratkog programa nam govori gdje je Perl direktorij, druga linija ispisuje recenicu Perl je instaliran, a trea linija mu govori da MS-DOS prozor dri otvorenim dok ne pritisnemo ENTER na kompjuteru. Ako se nakon duplog klika mia na file, prozor otvori i u njemu se pojavi ovaj tekst, Perl je uspjesno instaliran. U Perl-u se nalazi par najosnovnijih modula, ostale module koji e nam trebati moramo nai i instalirati.
1096/1275
Za instalaciju Windows XP-ea instaliranje se pokree aktiviranjem skinute .exe arhive i slijedom niza jednostavnih uputa. Nije potrebno prije instalacije Perl-a instalirati MSI Installer kao za Windows 2000/ NT/ Me/ 9x.
ActiveState je izmislio jednostavan nain instaliranja modula na Windows sistemima PPM. PPM (Programmer_Package Manager) je program koji pomae da se instalacija Perl modula odvija jako brzo. PPM funkcionira na nain: - Otvorimo MS-DOS prozor klikom na ikonu u Start menu-iju ili klikom na Start Run , upiemo cmd i kliknemo ENTER. - U MS-DOS prozoru upiemo ppm3 za pokretanje PPM. Ako se pojavi greka tipa Could not find..., upiemo C:\perl\bin\ppm3 za pokretaje PPM-a. - Upiemo search ime_modula (npr. search DBI) za pronalazak eljenog modula (DBI - moduli za rad sa bazama), i PPM e izlistati naene module zajedno sa kratkim opisom svakog od njih. Za rad sa search (i u ovom slucaju install) naredbom moramo biti online spojeni. - Nakon pretraivanja upiemo install ime_modula (npr. install DBIx-Easy) za instaliranje tog modula. Ukoliko je modul ve instaliran, pojiviti e se obavijest. MS-DOS prozor trebao bi ovako izgledati (ako je instaliran DBIx-Easy):
ppm> install DBIx-Easy ==================== Install 'DBIx-Easy' version 0.10 in ActivePerl 5.6.1.631. ==================== Downloaded 28947 bytes. Extracting package. This may take a few seconds. Extracting 33/33: blib/html/site/lib/DBIx/Easy.html Installing C:\perl\html\site\lib\DBIx\Easy.html Installing C:\perl\site\lib\DBIx\Easy.pm Installing C:\perl\bin\dbs_dumptabdata Installing C:\perl\bin\dbs_dumptabdata.bat
1097/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb Installing C:\perl\bin\dbs_dumptabstruct Installing C:\perl\bin\dbs_dumptabstruct.bat Installing C:\perl\bin\dbs_empty Installing C:\perl\bin\dbs_empty.bat Installing C:\perl\bin\dbs_printtab Installing C:\perl\bin\dbs_printtab.bat Installing C:\perl\bin\dbs_update Installing C:\perl\bin\dbs_update.bat
- PPM skida modul sa Interneta i instalira ga u odgovarajui direktorij (C:\Perl\lib). - Modul je instaliran i moemo poeti sa koritenjem. module u Perl-u koristimo naredbom use ime_modula. - Za sve daljnje PPM komande treba upisati help.
1098/1275
Struktura Perl-a
Prvi red Perl programa obino poinje posebnim komentarom koji poinje sa #!. On slui kao uputa UNIX ili Linux ljusci (npr. bash) da se radi o Perl skripti koju Perl interpreter treba izvesti. Jednostavan Perl program moe izgledati ovako:
#!/usr/bin/perl print "Ovo je seminar o temi Perl."; # ovo je komentar
Iz primjera vidimo da uputa ljusci u prvom redu govori kojim se programom izvodi skripta i gdje se njen interpreter nalazi. U naem sluaju, Perl interpreter se nalazi u direktoriju /usr/bin. Kod Windows OS prva linija ne mora biti komentar. Vano je samo da skripta ima sufiks .pl i da za takav tip datoteke OS poziva Perl interpreter. Drugi red primjera je izraz koji sadri poziv Perlove predefinirane funkcije operatora. To je print operator koji proslijeuje tekst unutar navodnika na standardni izlaz STDOUT, ispisuje ga na monitoru. Svaki Perl izraz mora zavravati sa ;.
1099/1275
U treem redu napisan je komentar. Obini komentari u Perlu poinju znakom # iza kojeg slijedi tekst koji interpreter preskae pri izvoenju. Ti komentari slue za umetanje teksta koji programeru slue za jednostavnije snalaenje u kodu. Nakon pokretanja programa, Perl interpreter u potpunosti provjerava kod pozvanog programa, te ga kompajlira. Poslije kompajliranja poinje njegovo izvravanje izraz po izraz. Nakon uspjenog izvoenja programa, Perl proces zavrava vraajui ljusci iz koje je pozvan vrijednost o uspjenom kraju programa. Iz takvog slijeda izvrenja Perl skripte, dolazi se do zakljuka da Perl nije efikasan za male skripte i njihova viestruka pokretanja. Razlog je taj to samo kompajliranje uzima neto vremena i resursa prije izvoenja, pa trajanje izvrenja samog programa moe biti manje od trajanja kompajliranja. U tom sluaju je korisnost (omjer izmeu korisnog i ukupno utroenog vremena) procesorskog vremena mala.
1100/1275
Imena varijabli razlikujemo po poetnom znaku koji definira tip varijable i imena varijable. Njihova veliina je jedino ograniena sistemskom memorijom. Za razliku od ostalih jezika, Perl ne zahtijeva prethodno deklariranje varijabli, ve se one automatski definiraju prilikom postavljanja vrijednosti varijable. Spomenuti emo i neke od najee koritenih operatora. Njihova namjena je promjena vrijednosti varijabli. Operatori se dijele s obzirom na tip verijable. Na perlop man stranicama moe se nai vie o samim operatorima.
Skalarne varijable
Skalarne varijable su najednostavnije vrste podatkovnih struktura. Slue za pohranu cijelih i realnih brojeva, za pohranu niza znakova (stringova) i reference. Oznaavaju se kao: $ime_varijable Pridjeljivanje vrijednosti skalarima prikazat emo u slijedeih nekoliko primjera: $broj = 7; $dec_broj = 6.5; $float_broj = 3.14e10; $pozdrav = "Pozdrav iz Zagreba!"; $vrijeme = 'vedro i vjetrovito'; Svi brojevi u Perlu interno se pohranjuju double deklaracijom u C-u. Tek se s verzijom 5 uvela mogunost interne pohrane brojeva kao cjelobrojnih (intdeklaracija u C-u) s ciljem optimizacije programa. Najei operatori nad brojevima su: + plus - minus * mnoenje / dijeljenje ** eksponent % modulo == jednako != razlicito < manji od
1101/1275
> veci od <= manji od ili jednako >= veci od ili jednako += # $i=$i+$a je isto kao $i+=$a -= # $i=$i-$a je isto kao $i-=$a *= # $i=$i*$a je isto kao $i*=$a Znakovni nizovi mogu biti definirani unutar dvostrukih i jednostrukih navodnika. Dvostruki navodnici oznaavaju da se unutar znakovnog niza prepoznaju nazivi varijabli, te da vrijednost toga niza ovisi o vrijednosti te varijable. Npr.: $ime = "Tamara" $obrazac = "$ime pohadja Sveuilite u Splitu." # $obrazac postaje " Tamara pohadja Sveuilite u Splitu." Jednostruki navodnici oznaavaju da znakovni niz ima fiksnu vrijednost. Najznaajniji operator znakovnih nizova je chop($ime_varijable) koji brie zadnji znak niza.
1102/1275
Polja skalara
Polja skalara su spremnici niza skalara ijim vrijednostima se pristupa putem index-a (prvi element $array [0], drugi $array [1], ). Oznaavaju se kao: @ime_polja Pridjeljivanje vrijednosti poljima prikazat emo kroz primjere: @trio = ("Ante", "Tamara", "Jana", "4401"); @trio_gusti = @trio; Pristup odreenom elementu polja izvodi se na slijedei nain: $trio[3] = "1044"; Time smo promijenili zadnji element polja "4401" u "1044". Indeksiranje elemenata polja poinje od 0. Najei operatori polja prikazani su kroz primjere: push (@trio, "Antonija"); # na kraj polja @trio dodaje se "Antonija" $ime = pop (@trio); # "Antonija" s kraja polja sprema se u $ime unshift (@trio, "Antonija"); # "Antonija" se dodaje na poetak polja $ime = shift (@trio); # uzima se prvi element polja @trio = reverse (@trio); # obrce se redoslijed elemenata @aList = sort (@aList); # abecedno sortiranje elemenata chop (@aList); # svakom elementu polja brie se zadnji znak @linija = ; # jedna linija sa standardnog ulaza pohranjuje se u @linija
1103/1275
Zdruena polja skalara, poznata jos kao hashes su spremnik koji predstavlja dvodimenzionalno polje skalara. Svakom elementu polja pristupa se putem jedinstvenih kljueva prema kojem se razlikuje od ostalih elemenata. Kljuevi su takoer skalari i njihova bitna karakteristika je u tome da Perl ne garantira njihov redoslijed pri njihvom isitavanju iz zdruenog polja skalara. Zdruena polja se oznaavaju kao: %ime_zdruzenog_polja Primjeri pridjeljivanja vrijednosti poljima prikazati emo kroz primjere: $a{"Ante"} = 23; $kljuc = Tamara; $a{$kljuc} = 25; %b = %a; Primjeri operatora za zdruena polja su: @kljucevi = keys(%a); # vraca polje s vrijednostima kljuceva @elementi = values (%a); # vraca polje vrijednosti elemenata delete $a{"Ante"}; # brie element s kljucem "Ante"
1104/1275
1105/1275
LABELA: while (uvjetni_izraz) { izraz_1; izraz_2; izraz_3; } for petlja izvodi blok izraza u vitiastim zagradama sve dok je uvjetni izraz koji ispituje toan (TRUE). for (pocetni_izraz; uvjetni_izraz; inkremetalni_izraz) { # npr. for ($i=1; $i<5; $i++) izraz_1; izraz_2; izraz_3; } foreach petlja izvodi blok izraza u vitiastim zagradama za svaki element polja @polje, pri emu je vrijednost tekueg elementa polja sadrana u varijabli $i. LABELA: foreach $i (@polje) { izraz_1; izraz_2; izraz_3; }
1106/1275
FUNKCIJE (PODRUTINE)
Kao i mnogi drugi programski jezici i Perl prua svojim korisnicima definirane funkcije koje se jo nazivaju i podrutine jer se pod pojmom funkcija misli na predefinirane funkcije operatore (eng. subroutines). Podrutine se mogu locirati bilo gdje u main-u programa, uitati iz nekih drugih file-ova, moemo pozvati funkciju indirektno koristei varijablu koja sadri ime funkcije ili CODE reference. Funkcije su osnovni element svakog programskog jezika. Najee se ponaaju poput obinih operatora inei promjenu vrijednosti neke varijable ili vraajui neku vrijednost koja se moe pridjeliti nekoj drugoj varijabli. Osim toga, u odreenom kontekstu funkcije izvode i kontrolu tijeka izvoenja programa (mijenjajui tijek programa od poziva fukcije, preko izraza kojima je definirana, pa nazad do toke od kuda je pozvana). U perlsub man stranicama se nalaze detalji vezani uz podrutine.
1107/1275
Poziv podrutine
Podrutine se pozivaju unutar nekog izraza ili zasebno. Njihov poziv se sastoji od znaka & iza kojeg slijedi ime podrutine: &ime_funkcije Ako u podrutinu prenosimo argumente, oni se unose unutar zagrada: &ime_funkcije("Ante", 23)
Vraanje vrijednosti
Podrutina uvijek vraa vrijednost zadnjeg izraza koji je izveden unutar podrutine. Npr.: sub aFunction { izraz_1; izraz_2; $a = $b + $c; } U primjeru podrutina vraa vrijednost varijable $a. Nakon povratka iz podrutine, vraena vrijednost nalazi se u posebnoj varijabli $_.
Argumenti podrutine
Argumenti podrutine prenose se u podrutinu putem posebne varijable @_ koja predstavlja polje argumenata. Npr. : sub zbroji { $_[0]+$_[1] } Podrutina vraa vrijednost zbroja dvaju brojeva koji se u nju prenose putem argumenata. Poziv te podrutine bi izgledao ovako: &zbroji(2, 5)
1108/1275
Sve varijable uvijek moraju biti definirane prije nego im se pristupa, a obrnuti redoslijed oznaava pogreku u logici, i u veini sluajeva zavrava prijavom greke kod pokretanja.
1109/1275
1110/1275
1111/1275
Oblici uzoraka
Regularni izrazi su uzorci koji openito opisuju niz ili nizove znakova. Primjeri jednoznakovnih uzoraka: /.oki/ # odgovara nizu "coki," "moki", ali ne i "oki" /[0123456789]/ # zamjenjuje bilo koji znak unutar uglatih zagrada /[0-9]/ # zamjenjuje bilo koji znak unutar uglatih zagrada /[^0-9] # bilo koji znak osim brojeva /[0-9a-zA-Z]/ # bilo koji alfanumeriki znak Predefinirane kategorije znakova su: \d # brojevi, [0-9] \w # slova, [a-zA-Z0-9_] \s # praznine, [ \r\t\n\f] \D # sve osim brojeva, [^0-9] \W # sve osim slova, [^a-zA-Z0-9_] \S # sve osim praznina, [^ \r\t\n\f] Vieznakovni uzorci mogu u sebi sadravati sekvencu znakova koji se ponavljaju odreen broj puta. Zato u Perlu postoje specijalni znakovi kojima se definira toan broj ponavljanja u uzorku. Primjeri vieznakovnih uzoraka koji u sebi sadre sekvencu znakova koji se ponavljaju odreen broj puta: /a*t/ # bilo koji broj znakova "a" iza kojeg slijedi "t" /a+t/ # jedan ili vie znaka "a" iza kojeg slijedi "t" /a?t/
1112/1275
# nula ili jedan znak "a" iza kojeg slijedi "t" /a{2,4}t/ # od 2 do 4 znaka "a" iza kojeg slijedi "t" /a{2,}t/ # 2 ili vie znaka "a" iza kojeg slijedi "t" /a{2}t/ # tocno 2 znaka "a" iza kojeg slijedi "t" Za uzorke se moe definirati i poloaj na kojem mora biti unutar znakovnog niza koji se pretrauje. Primjeri toga: /\bdr/ # \b == granica (prazninu, poetak ili kraj niza) # uzorak odgovara za "drvo" ali ne za "odrzavanje" /ti\b/ # uzorak odgovara za "cuti" ali ne za "tisak" /ti\B/ # \B == ne smije biti granica na tom mjestu # uzorak odgovara za "tisak" ali ne za "cuti" /^tr/ # ^ == pocetak niza # uzorak odgovara za "trag" ali ne za "otrovan" /ca$/ # $ == kraj niza # uzorak odgovara za "kuca" ali ne za "cavao"
1113/1275
Perl omoguuje osnovne ulazne/izlazne operacije koje obuhvaaju prihvat podataka sa standardnog ulaza (tipkovnica), proslijeivanje podataka na standardni izlaz (monitor), te pisanje i itanje datoteka.
1115/1275
Rad sa datotekama
Datotekama se pristupa putem posebnih pokazivaa (eng. filehandles). Pokazivai su zapravo spona izmeu datoteke i Perl procesa. Ti pokazivai se moraju povezati s datotekom koju e oni predstavljati u programu. Tome slui operator open(). Primjer pokazivaa INPUT-a koji je povezan s datotekom index.html na slijedei nain: open (INDEX, "index.html"); U primjeru je datoteka otvorena samo za itanje. Ukoliko se u nju eli pisati to se radi na slijedei nain: open (INDEX, ">index.html"); U ovom sluaju e se prebrisati stari sadraj datoteke. Ukoliko se eli sadraj datoteke nadopunjavati (eng. Update), tj. dodavati podatke na njen kraj, potrebno je datoteku otvoriti na slijedei nain: open (INDEX, ">>index.html"); Operator open() vraa vrijednost TRUE/FALSE s obzirom na to da li je operacija uspjeno izvrena (TRUE za uspjeno izvedenu operaciju). Provjera uspjeno izvedene operacije open() moe se ispitati na slijedei nain: open (INDEX, ">index.html") || die "Poruka za SDTERR"; Funkcija die() proslijeuje tekst unutar zagrada na STDERR i gasi Perl proces. U ovom primjeru ona e se izvoditi ukoliko je lijevi dio operatora || jednak FALSE (neuspjeno otvorena datoteka). Zatvaranje datoteke nije nuno izvriti jer se obavlja automatski prilikom zavrenja Perl procesa. No, ukoliko ga je potrebno uiniti prije, za to slui operator close(). Ako u gornjem primjeru elimo zatvoriti datoteku index.html s pokazivaem INDEX, uiniti emo to ovako: close(INDEX); itanje datotete je isto kao i kod SDTIN. Operatorom <> pristupamo datoteci u skalarnom kontekstu ili u kontekstu polja. $a = ; # vraa liniju @a = ; # vraa cijelu datoteku Pisanje u datoteku izvodi se operatorom print, samo to se mora prije definirati izlaz na koji se tekst proslijeuje. Na primjer:
1116/1275
print INDEX "neki tekst $odlomak \n"; Ispitavanje statusa i atributa datoteka je u mnogo sluajeva korisno i poeljno. Time se mogu na vrijeme utvrditi nepravilnosti koje bi mogle nastati u programu. Ispitivanje datoteka izvodi se operatorom - iza kojeg slijedi oznaka atributa koji se ospituje. Neki od ispitnih operatora su: -r # readable -w # datoteka za pisanje? -x # izvrna datoteka? -e # datoteka postoji? -z # prazna datoteka? -d # direktorij? -l # simboliki link? -T # tekstualna datoteka? -B # binarna datoteka? Svaki od operatora vraa TRUE/FALSE vrijednost. Primjer: if (-e INDEX) { print "Datoteka postoji!"; } else { die("Datoteka ne postoji!"); } U primjeru se ispituje postojanje datoteke. Ukoliko ona ne postoji, uvjetni izraz vratiti e vrijednost FALSE ime e se pokrenuti die() operator koji e ugasiti Perl program.
1117/1275
SISTEMSKI POZIVI
Sistemski pozivi u Perl-u usko su povezani s terminologijom UNIX operativnog sustava. Svi operatori omoguuju pozivanje odreenih procesa iz ljuske. Operatori se dijele na dvije glavne skupine: operatori datotenog sustava i operatori procesa. Mi smo operatore samo ukratko naveli operatore, a njihova objanjenja mogu se proitati na perlfaq8 i perlfunc man stranicama.
1118/1275
Operatori procesa
Operatori procesa su vrlo moni po svojim mogunostima. Oni omoguuju izvedbe poput jednostavnih poziva drugih programa, te izvedbe vrlo sloenih procesa kao to je klijent/server mreni model. Mi smo spomenuli neke od najeih operatora procesa. Najjednostavniji sistemski operator je system(). On pokree novi proces, dijete Perl procesa. Ime novog procesa je sadrano unutar zagrada: system("pwd") Vrijednost koju vraa proces dijete na STDOUT, mogue je dobiti ako se poziv procesa izvede pomou unazadnih navodnika: $a = `pwd`; Pokretanje novog procesa moe se uiniti operatorom exec samo to se u tom sluaju automatsk gasi Perl proces: exec "pwd"; Najznaajniji operator kod baratanja procesima je zasigurno fork. On stvara klon Perl procesa koji ga je pozvao. Tako dva duplicirana procesa dijele jednake varijable (memoriju) i otvorene datoteke. Procesi se jedino razlikuju po vrijednosti varijable koju vraa fork. Proces vraa 0 za dijete i 1 za roditelja.
1119/1275
ZAKLJUAK
Perl ( eng. Practical Extraction and Report Language ) je interpretorski programski jezik ope namjene prenosiv za sve OS (UNIX, Linux, Windows, Mac,...). Perl je besplatan, "open-source" jezik, proiriv sa novim funkcijama i mogunostima koje njegovi korisnici sami naprave (modularan je). Podrava proceduralno i objektno programiranje. Posebnost Perl-a je u tome to u sebi objedinjuje mogunosti C, sed i awk programskih jezika, te UNIX-ovih ljuski. Perl nudi aplikacije za programiranje i administraciju, datoteno programiranje, znanstvene programe, grafiko programiranje, GUI alate. U novije vrijeme Perl se zbog svoje opsenosti poinje sve vie izbjegavati kod mlaih webmastera, te polagano, unato mogunostima koje se preklapaju sa drugim serverskim jezicima, gubi utrku na webu. Perl je jezik bogat mnogim mogunostima. Mi smo obradili samo neke od tih njegovih mogunosti i samo neka njegova svojstva. Za dublje spoznaje i vea znanja o Perlu treba posvetiti puno vie vremena, kojeg mi u toj mjeri nismo imali. Sve o Perlu moe se nai u knjigama koje obrauju tu temu ili na WEB stranicama dostupnima na Internetu ( najlake je utipkati rije Perl u jedna od serach engine-a ) koje sadre mnoge primjere, ilustracije i literaturu. Moto Perl-a je "there's more than one way to do it" -"uvijek postoji vie naina" (ili skraeno TMTOWTDI popularno zvano "tim toady").
1120/1275
DODACI
U dodacima smo priloili izgled instalacije i primjere nekih od mnogobrojnih skripti.
1121/1275
1122/1275
1123/1275
1124/1275
1125/1275
1126/1275
1127/1275
$value =~ s/<//g; $value =~ s/>//g; $FORM{$name} = $value; } if ($ENV{'QUERY_STRING'} =~ /Add/) { &Add; } elsif ($ENV{'QUERY_STRING'} =~ /Display/) { &Display; } elsif ($ENV{'QUERY_STRING'} =~ /Main/) { &Main; } else { &Display; } # These are the Header and Footer subs # sub Header { open FILE, "$header" or print "[ERROR: Cannot open file]"; while (<FILE>) { print "$_"; } close(FILE); } sub Footer { &Sig; open FILE, "$footer" or print "[ERROR: Cannot open file]"; while (<FILE>) { print "$_"; } close(FILE); } # End of Header and Footer subs # # This is the main part of the program that lets the user enter a link # sub Main { &Header; print " Please feel free to add your own link. Just fill out the following form or <a href=\"$me\">click here</a> to view the links currently in the database.<br><br> <form action=\"$me?Add\" method=\"post\">
1129/1275
Site Name: <input type=\"text\" name=\"site_name\" size=\"25\"><br> URL: <input type=\"text\" name=\"site_url\" value=\"http://\" size=\"25\"><br> Description:<br><textarea wrap=\"physical\"></textarea><br> <input type=\"submit\" value=\"Send\"><br> </form>\n"; &Footer; } # End of Main Sub # # This is the part of the script that adds the link to the database # sub Add { &Header; if($FORM{'site_name'} eq "" || $FORM{'site_url'} eq "http://" || $FORM{'site_url'} eq "" || $FORM{'site_desc'} eq "") { print "The following were left blank:"; print "<ul>\n"; if($FORM{'site_name'} eq "") { print "<li>Site Name\n"; } if($FORM{'site_url'} eq "http://") { print "<li>URL\n"; } if($FORM{'site_url'} eq "") { print "<li>URL\n"; } if($FORM{'site_desc'} eq "") { print "<li>Description\n"; } print "</ul>\n"; print "Please use your browsers back button and fill out the rest of the forms.\n"; print "<br><br>\n"; name=\"site_desc\" rows=\"5\" cols=\"50\"
1130/1275
} else { open FILE, ">>$ab_html" or print "[ERROR: Cannot open file]"; print FILE "<center>\n"; print FILE "<table border=\"0\" width=\"450\" cellspacing=\"0\" cellpadding=\"0\">\n"; print FILE "<td width=\"450\" bgcolor=\"#CCCCCC\"><font face=\"Arial,Helvetica\" size=\"2\"><b><a href=\"$FORM{'site_url'}\">$FORM{'site_name'}</a></b></td><tr>\n"; print FILE "<td width=\"450\" bgcolor=\"#EEEEEE\"><font face=\"Arial,Helvetica\" size=\"2\"> $FORM{'site_desc'}</td>\n"; print FILE "</table>\n"; print FILE "</center><br>\n"; print FILE "<!-- $ENV{'REMOTE_HOST'} -->\n\n"; close(FILE); print "Your entry has been added to the database. <a href=\"$me\">Click here</a> to view the links page.\n"; } &Footer; } # End of Add Sub # # This is the sub that displays the links # sub Display { &Header; print "<a href=\"$me?Main\">Click here</a> to add your own link.<br><br>\n"; open FILE, "$ab_html" or print "[ERROR: Cannot open file]"; while (<FILE>) { print "$_"; } close(FILE); &Footer; } # End of Display sub #
1131/1275
# This is the sub that displays the signature trademark # sub Sig { print " <br> <center> <table border=\"0\" cellspacing=\"1\" cellpadding=\"3\"> <td bgcolor=\"E4E4E4\"><center><font face=\"Arial,Helvetica\" It</a> v1.3<br>Free size=\"1\"><a from <a href=\"http://www.free-scripts.net/scripts\">Link </table> </center>\n"; } # End of Sig sub #
href=\"http://www.free-scripts.net/scripts\">Free-Scripts.Net</a></font></center></td>
1132/1275
1133/1275
Dodatak G: Instalacije cgi skripte koja pamti svoje stanje kad je pozvana
Ova skripta kreira obrazac koji pamti svoje stanje svaki put kad je pozvana.
#!/usr/local/bin/perl use CGI qw(:standard); print header; print start_html('A Simple Example'), h1('A Simple Example'), start_form, "What's your name? ",textfield('name'), p, "What's the combination?", p, checkbox_group(-name=>'words', -values=>['eenie','meenie','minie','moe'], -defaults=>['eenie','minie']), p, "What's your favorite color? ", popup_menu(-name=>'color', -values=>['red','green','blue','chartreuse']), p, submit, end_form, hr; if (param()) { print "Your name is",em(param('name')), p, "The keywords are: ",em(join(", ",param('words'))), p, "Your favorite color is ",em(param('color')), hr; }
1134/1275
1135/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb print "<H1>Ask your Question</H1>\n"; print $query->startform(-target=>'_new'); print "What's your name? ",$query->textfield('name'); print "<P>What's the combination?<P>", $query->checkbox_group(-name=>'words', -values=>['eenie','meenie','minie','moe'], -defaults=>['eenie','moe']); print "<P>What's your favorite color? ", $query->popup_menu(-name=>'color', -values=>['red','green','blue','chartreuse']), "<P>"; print $query->submit; print $query->endform; } else { print "<H1>And the Answer is...</H1>\n"; print "Your name is <EM>",$query->param(name),"</EM>\n";
print "<P>The keywords are: <EM>",join(", ",$query->param(words)),"</EM>\n"; print "<P>Your favorite color is <EM>",$query->param(color),"</EM>\n"; } print qq{<P><A HREF="cgi_docs.html">Go to the documentation</A>}; print $query->end_html;
1136/1275
Sveuilite u Splitu Struni studij Raunarstva Zagreb $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,99,99,$black); # Draw a blue oval $im->arc(50,50,95,75,0,360,$blue); # And fill it with red $im->fill(50,50,$red); # make sure we are writing to a binary stream binmode STDOUT; # Convert the image to PNG and print it on standard output print $im->png;
1137/1275
Ana Babi
PYTHON
1138/1275
UVOD Povijest
Oko 1972. godine pojavio se jezik C, prvi jezk ope namjene. Sedamnaest godina kasnije Guido van Rossum, istraiva na CWI (Stichting Mathematisch Centrum) u Nizozemskoj, radi na projektima vezanima uz interpreterskim jezik ABC. Nezadovoljan nefleksibilnou tog i slinih programskih jezika i nedostatkom alata za automatiziranje dosadnih sistemskih problema, odluuje se razviti novi programski jezik. elio je programski jezik koji bi mu omoguio rjeavanje generalnih administratorskih zadaa brzo i fleksibilno, ali je istovremeno elio iskoristiti snagu sistemskih poziva Amoeba distribuiranog OS-a. I tako je, krajem 1989. godine, poeo razvijati programski jezik Python, koji je nazvao prema kultnoj BBC seriji Monty Python's letei cirkus. 1996. godine Van Rossum je napisao o nastanku Python-a: "Over six years ago, in December 1989, I was looking for a "hobby" programming project that would keep me occupied during the week around Christmas. My office ... would be closed, but I had a home computer, and not much else on my hands. I decided to write an interpreter for the new scripting language I had been thinking about lately: a descendant of ABC that would appeal to Unix/C hackers. I chose Python as a working title for the project, being in a slightly irreverent mood (and a big fan of Monty Python's Flying Circus)." (Introduction to Programming Python, by Mark Lutz, published by O'Reilly) Iako je u poetku zamislio jezik koji bi bio specifian samo za Amoeba OS, brzo je shvatio da mu je potreban jezik koji bi se mogao pokretati na svakoj platformi. 1991. godine u open source zajednicu je puten interpreter za novi programski jezik, Python, napisan u C-u. Zbog injenice da je Python open source aplikacija, danas se uspjeno moe vrtiti na gotovo svakoj platformi (Linux, Windows, Macintosh, Solaris, OS/2, Amiga, AROS, AS/400, BeOS, Palm OS, Acorn RISC OS, PlayStation, Sharp Zaurus, Pocket PC, ) Release Derived from Year Owner GPL compatible? 0.9.0 thru 1.2 n/a 1991-1995 CWI yes 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes 1.6 1.5.2 2000 CNRI no 2.0 1.6 2000 BeOpen.com no
1139/1275
Release 1.6.1 2.1 2.0.1 2.1.1 2.2 2.1.2 2.1.3 2.2.1 2.2.2 2.2.3 2.3 2.3.1 2.3.2 2.3.3 2.3.4
Derived from Year 1.6 2001 2.0+1.6.1 2001 2.0+1.6.1 2001 2.1+2.0.1 2001 2.1.1 2001 2.1.1 2002 2.1.2 2002 2.2 2002 2.2.1 2002 2.2.2 2002-2003 2.2.2 2002-2003 2.3 2002-2003 2.3.1 2003 2.3.2 2003 2.3.3 2004
Owner CNRI PSF PSF PSF PSF PSF PSF PSF PSF PSF PSF PSF PSF PSF PSF
GPL compatible? no no yes yes yes yes yes yes yes yes yes yes yes yes yes
1140/1275
objekte. Programer koji e koristiti taj objekt jednostavno od objekta zatrai odreenu uslugu i ne zamara se razmiljajui o nainu na koji objekt funkcionira. Modularnost. Python je mogue koristiti na vie naina. Najee se kod rastavlja na vie manjih modula koji meusobno mogu "komunicirati". Moe se vrlo jednostavno iz jednog modula pozivati procedure ili koji koristiti objekte drugog modula.. to je jo vanije, pristup modulima je uvijek isti, bez obzira da li se radi o ve ugraenim modulima iz Pythonove standardne biblioteke ili o modulu koji ste napravili trenutak prije. Python-ova standardna biblioteka podrava regularne izraze, generiranje dokumentacije, threadove, baze podataka, web pretraivae, CGI, ftp, elektroniku potu, XML, HTML, WAV datoteke, kriptografiju, GUI (grafiko suelje) upotrebom Tk i jo mnogo toga. Isto tako, moduli se mogu pisati i u drugim jezicima, pa se mogu napisati u C-u, kompajlirati i preko Python suelja, koje je potpuno isto kao i kod Python modula, jednostavno koristiti. To omoguuje da se dijelovi koda koji predstavljaju usko grlo (vremenski su zahtjevni) ubrzaju i time znatno poboljaju cjelokupno izvravanje programa. Takav nain programiranja se podrazumijeva u jezicima kao to su C i C++, ali je iznimka meu skriptnim jezicima. U python-u je vrlo jednostavno otkriti pogreku u izvravanju programa. U sluaju pogreke u izvoenju programa, mogue je pristupiti stogu programa, "stack trace" e tono odrediti vrstu i mjesto greke (exception) to omoguuje vrlo lagano lociranje i ispravljanje pogreke u programu. Automatsko skupljanje smea. Curenje memorije ili prerano unitenje objekata u tradicionalnim jezicima je vrlo est uzrok "blokiranja" rada programa ili cijelog raunala. Python interpreter sam se brine da se oslobodi memorija koja vie nije potrebna mehanizam za sakupljanje smea (garbage collection) je ugraen u sustav i automatski se pokree po potrebi. Programeri tako ne moraju imati pod kontrolom gdje su rezervirali prostor za neki objekt i gdje e se taj prostor osloboditi, ve se mogu fokusirati na samo rjeavanje problema. S druge strane, kod automatskog skupljanja smea, sustav sam procjenjuje kada treba to sakupljanje zapoeti i nerijetko se to dogaa upravo onda ka program obavlja neku zahtjevnu operaciju. Zato se i kod ugraenog automatskog sustava za skupljanje smea treba esto paziti da ne novi objekti ne stvaraju neracionalno.
1141/1275
1142/1275
Primjer (interaktivni interpreter iz komandne linije): $ python Python 2.4 (#4, Dec 10 2004, 19:19:57) [GCC 2.95.2 20000220 (Debian GNU/Linux)] on linux2 Type "copyright", "credits" or "license" for more information. IDLE 1.1 -- press F1 for help >>> print 'hello world' hello world >>> Drugi nain je pokretanje skripte napisane u Python-u. Interpreter se poziva zajedno sa skriptom. Veina skripta zavrava sa ekstenzijom .py. Vrlo je vano da se dobro izabere editor u kojem e se pisati program. Vie editora koji podravaju python sintaksu, meu njima su najpopularniji i najmoniji Vim i Emacs. Primjer (hello world skripta) #!/usr/bin/pyhon # Filename : hello_world.py print 'hello world' /usr/bin/pyhon oznaava puni put prema python interpreteru. Pokretanje interpretera sa skriptom: $ python hello_world.py
1143/1275
hello world U Unix-u je mogue automatski pokrenuti interpreter bez da ga pokrenemo iz komadne linije. Jednostavno postavimo modove tako da skripta postane executable. $ chmod a+x hello_world.py $ ./hello_world.py hello world Trei nain pokretanja Python programa je koritenje grafikom suelja iz IDE (integrated development environment) okoline. IDLE je prvi Unix IDE za Python. Razvio ga je Guido van Rossum, prvi put za Python 1.5.2. IDLE je baziran na Tk-u, to zahtijeva da ima Tcl/Tk instaliran na stroju. Veine IDE suelja sadri i editor i interpreter.
Ispis/unos
Unos korisnika je vrlo jednostavno dobiti pomou raw_input() funkcije Primjer Unoenje teksta >>> ime = raw_input('Unesi ime: ') Unesi ime: ana >>> print 'Tvoje ime je:', ime Tvoje ime je: ana Primjer je samo za unos teksta. Kada elimo raditi s cijelim brojevima, unoeni tekst se mora konvertirati u integer pomou funkcije int() Primjer Ispis broja >>> broj = raw_input('unesi broj: ') unesi broj: 45 >>> print 'kvadrat unesenog broja je: %d' %int(broj)**2 kvadrat unesenog broja je: 2025 Isto kao i C, Python u naredbi print ima format specifikatore, koji poinju sa %, ima %d za integere, %s za stringove i %f za realne brojeve.
Komentari
Komentar zapoinje direktno iza znaka # i nastavlja se do kraja linije.
1144/1275
TIPOVI PODATAKA
Postoje dva naina provjere tipa varijabli u programi. Za vrijeme kompajliranja programa (static typing) ili za vrijeme rada programa (dynamic typing). Python prodrava dynamic type to znai da nema deklaracija tipa varijabli ve da sam program za vrijeme rada odluuje koji e tip pridruiti kojoj varijabli. Takav nain koritenja varijabli je Dave Thomas (razvojna zajednica Ruby jezika) nazvao duck typing ("(referring to a value) if it walks like a duck, and quacks like a duck, then it is a duck."). U praksi, dinamiko deklariranje funkcionira tako da svaki program za vrijeme svog rada pridjeljuje varijablama tipove ovisno o tome koje su im vrijednosti pridruene (operator pridruivana u Python-u je =). Valjanost tih tipova se provjerava tek kada se te varijable koriste u operacijama u tom trenutku se i generiraju greke u sluaju upotrebe operatora koji nisu dozvoljeni nad tipovima varijabli koje su u izrazu. Meu jezicima koji podrava dinamiko deklariranje, Python je umjereno type-checked. Impilicitno pretvaranje je definirano za numerike tipove, npr. dozvoljeno je mnoiti complex broj i long integer bez eksplicitnog pretvaranja. Ali nema implicitnog pretvaranja izmeu numerikih tipova i stringova (za razliku od Perl-a, u Python se ne moe operaciji sa stringom pridruiti broj.) Ono to Python ima je ugraena funkcija eval() koja ita string kao moguu operaciju: >>> eval('5+6') 11 >>> eval('7*8') 56 Vrlo je vano je zapamtiti da je Python osjetljiv na velika i mala slova pa varijabla brojac nije jednaka varijabli Brojac.
1145/1275
Brojevi
Python podrava etiri tipa brojeva: integer, long integer (mogu biti prezentirani i oktalno i heksadecimalno), float (realni) i complex (kompleksni). Primjeri unosa: Int Long Float complex 0101 29979062458L 3.14159 6.23+1.5j 84 -84140l 4.2E-10 -1.23-875J -237 0x80 -0X92 0xDECADEDEADBEEFBADFEEDDEAL -90. 6.022e23 -1.609E-19 0+1j 9.80665-8.31441J -.0224+0j
Stringovi
String je u Python-u neprekidni niz karaktera izmeu navodnika (jednostrukih ili duplih). Evo nekoliko primjera koritenja operacija sa stringovima. >>> pystr = 'Python' >>> iscool = 'is cool!' >>> pystr[0] 'P' >>> pystr[2:5] 'tho' >>> iscool[:2] 'is' >>> iscool[3:] 'cool!' >>> iscool[-1] '!' >>> pystr + iscool 'Pythonis cool!' >>> pystr + ' ' + iscool 'Python is cool!' >>> pystr * 2 'PythonPython' U Python-u se uvijek moe doi do brze pomoi za koritenje neke funkcije ili naredbe. Jednostavno se u interpreter prompt-u napie help(naredba). Npr. za pomo u radu sa stringom: >>> help(str)
1146/1275
Operatori
Standardni operatori funkcioniraju u Python-u kao i u bilo kojem drugom programskom jeziku. + * / % ** Uz standardno zbrajanje, oduzimanje, mnoenje, cjelobrojno dijeljenje/ostatak cjelobrojnog dijeljenja Python nudi i operator za potenciranje **. Python podrava operatore poput *=, +=, -=, /=, ali ne podrava C-ovsko predinkrementiranje i postinkrementiranje. Isto tako, Python ima i standardne operator za usporeivanje. < <= > >= == != <> Za razliito postoje dva operatora != i <>. Preporua se koritenje operatora !=. Isto tako podrani su logiki operatori and, or i not. Upotrebljavajui logike operatore moemo stvarati izraze poput: >>> (2 False >>> (2 > 4) or (2 < 4) True >>> not (6.2 <= 6) True >>> 3 < 4 < 5 True < 4) and (2 == 4)
Zadnji izraz je u Python-u legalan, i zapravo je krai zapis ovoga. >>> (3 < 4) and (4 < 5) True
1147/1275
Blokovi naredba
Blokovi naredba grupe naredbi koje se uvjetno izvode ili ije se izvoenje ponavlja (a ponaaju se poput jedne naredbe) grupiraju se pomou uvlaka, za razliku od C-a i C++ gdje se blokovi grupiraju pomou vitiastih zagrada. Vrlo je vano paziti na sva prazna mjesta jer Python-u je svako prazno mjesto ispred naredbe uvlaka. Prazni blok naredbi definira se kljunom rijeju pass.
If-elif-else
If naredba omoguuje grananje toka programa ovisno o tome da li je logiki izraz istinit ili laan. Ako je vrijednost izraza iza rijei if logika istina, izvodi se if_blok_naredbi, u protivnom se ispituje izraz iza elif, ako ni on nije toan izvodi se else_blok_naredbi. if logiki_izraz1: if_blok_naredbi elif logiki_izraz2: elif_blok_naredbi else: else_blok_naredbi Python nema switch-case naredbu. Svi mnogostruki izbori se rade pomou if-elif-else naredbe. Za razliku od C/C++-a to u Python-u nije mukutrpno upravo zbog njegove iste sintakse. Primjer Upotreba if-elif-else naredbe #!usr/bin/python # if_iga_pogadanja.py
1148/1275
broj = 23 pogodi = int(raw_input('Unesi cijeli broj: ')) if pogodi == broj: #pocetak bloka print 'Pogodak!!!!' #kraj bloka elif pogodi < broj: print 'broj je veci.' else: print 'broj je manji.' print 'Kraj.'
While petlja
Prva od petlja kojom raspolae Python je while petlja. Ona se koristi za ponavljanje bloka naredbi. While_blok_naredbi e se izvravati dok god je logiki uvjet iza while naredbe istinit. Blok naredbi iza else e se izvriti na kraju petlje. while logiki_izraz: while_blok_naredbi else: else_blok_naredbi else u while petlji redundantan jer zapravo se bilo koja naredba koja dolazi iza while petlje izvrava nakon to while petlja zavri. Primjer . Upotreba while petlje #!usr/bin/python # while_igra_pogadanja.py broj = 23 stop = False while not stop: pogodi = int(raw_input('Unesi cijeli broj: ')) if pogodi == broj: #pocetak bloka print 'Pogodak!!!!' stop = True #kraj bloka elif pogodi < broj: print 'broj je veci.' else: print 'broj je manji.'
1149/1275
For petlja
Druga petlja kojom raspolae Python, for petlja je vie slina foreach petlji u shell skriptama nego tradicionalnoj for petlji u veini programskih jezika koja funkcionira kao broja. Petlja uzima kao ulaz niz elemenata i obraduje svaki element u bloku naredbi. Niz elemenata moe biti lista, tuple ili string, isto tako to moe biti i niz stringova ili brojeva. Primjer Upotreba for petlje s nizom brojeva
#!usr/bin/python #for.py for i in range(1,5): print i
1 2 3 4 Primjer Upotreba for petlje s nizom stringova #!usr/bin/python #for_string.py print 'moji predmeti pasa su:' for predmet in ['pin','unix','nwp','mat 2'] print predmet, print $ python for_string.py moji predmeti su: pin unix nwp mat 2 Predmeti su ispisani svi u istom redu zbor zareza u printu koji oznaava da se sljedei ispis nastavlja u istom redu.
break i continue
1150/1275
Break naredbom se prekida izvoenje petlje, bez obzira na logiki izraz u petlji koji jo uvijek moe biti istinit. Continue naredba uzrokuje skok programa na kraj petlje, ali se petlja nastavlja na sljedeu iteraciju. Primjer Upotreba break i continue naredbe #!/usr/bin/python #break_continue.py while True: s = raw_input('Unesi neto(izlaz): ') if s == 'izlaz': break if len(s) < 3: continue print 'dovoljna duzina' print 'Kraj' $ python break_continue.py Unesi neto(izlaz): a Unesi neto(izlaz): 45 Unesi neto(izlaz): 123 dovoljna duzina Unesi neto(izlaz): izaz dovoljna duzina Unesi neto(izlaz): izlaz Kraj
1151/1275
1152/1275
1153/1275
Podrazumijevani argumenti
U sluaju da se neke funkcije pozivaju vrlo esto sa istim vrijednostima mogu se definirati podrazumijevane vrijednosti argumenata funkcije. Argumenti s podrazumjevanom vrijednou moraju se nalaziti na kraju liste argumenata. Isto tako umjesto pozicije u pozivu funkcije vrijednosti se mogu vezati uz neku odreenu varijablu. #!usr/bin/python #default_argumenti.py def funkcija(a,b=5,c=10): print 'a je',a,',b je',b,', c je',c #dozvoljeni pozivi funkcija(3,7) funkcija(25,c=24) funkcija(c=50,a=100) $ python default_argumenti.py a je 3 ,b je 7 , c je 10 a je 25 ,b je 5 , c je 24 a je 100 ,b je 5 , c je 50
1154/1275
PYTHON MODULI
Osnovna namjera modula je omoguiti efikasnije programiranje. Moduli su dokumenti koji sadre definicije i implementacije funkcija. Tako se onda mogu grupirati funkcije u module i koristiti iz svakog python programa. Te funkcije se mogu pozivati iz bilo koje programa tako da se moduli "importaju". Modul je zapravo python program koji sadri funkcije i varijable koje je pisac modula definirao. Python nudi svoju standardnu biblioteku, koja dolazi sa svakom instalacijom interpretera, u obliku modula. Sadri vrlo veliku koliinu korisnih modula za rad sa gotovo svime to se moe zamisliti. Veina funkcija za rad sa sistemom dolazi u dva modula: sys (koji podrava rad sa Python interpreterom) i os (koji podrava rad sa operacijskim sustavom na kojem se Python interpreter vrti).
sys
Primjer Upotreba sys.argv liste (sadri argumente komandne linije) #!/usr/bin/python # argv.py import sys # Funkcija koja ispisuje fajl na standardni izlaz def readfile(filename): f = file(filename) while True: line = f.readline() if len(line) == 0: break print line, f.close() #glavni program if len(sys.argv) < 2: print 'nema argumenta' sys.exit() if sys.argv[1].startswith('--'): option = sys.argv[1][2:] #dohvaca prvi argument i kopira string osim prva dva znaka if option == 'verzija': print 'Verzija 1.00' elif option == 'help': print 'Ovo je help. Ovaj program ispisuje dokument na standardni izlaz' print 'opcije programa ukljucuju' print '--verzija - ispisuje verziju' print '--help - ispisuje pomoc i izlazi'
1155/1275
else: for filename in sys.argv[1:]: readfile(filename) Model se ukljuuje koristei import naredbu. U ovom primjeru importali smo sys modul. U trenutku kad Python interpreter doe do linije u kojoj pie import sys trai dokument sys.py u nekom od direktorija koji su u path-u. Ako nae dokument, naredbe u glavnom bloku tog modula se izvravaju i funkcije modula se nakon toga mogu pozivati iz programa.
os
Primjer Izlistavanje sadraja direktorija
>>> for line in os.popen('ls /B').readlines( print line[:-1] ):
Primjer (backup dokumenata i direktorija) #!/usr/bin/python # backup_version.py import os, time # dokumenti i direktoriji za koje se radi backup izvor = ['/home/g2swaroop/all', '/home/g2swaroop/bin'] # odredisni direktorij odr_dir = '/mnt/d/backup/' # datum stvara poddirektorij u glavnom odredisnom direktorju danas = odr_dir + time.strftime('%Y%m%d') # The time - the name of the zip archive sad = time.strftime('%H%M%S') # komenat korisnika komentar = raw_input('Enter a comment --> ') if len(komentar) == 0: # da li je komentar unesen # ime zip dokumenta odr = danas + os.sep + sad + '.zip' else: odr = danas + os.sep + sad + '_' + \ komentar.replace(' ', '_') + '.zip' # ako nema poddirektorija, kreiraj ga if not os.path.exists(danas): os.mkdir(danas) print 'Uspjesno je kreiran direktorij ', danas # zip koji se pokrece zip_naredba = 'zip -qr %s %s' % (odr, ' '.join(izvor)) # pokreni backup if os.system(zip_naredba) == 0:
1156/1275
print 'Uspjesni backup u', odr else: print 'Stvaranje backupa je propalo.'
socket
Da se stvori veza izmeu maina, Python programi importaju socket modul, kreiraju socket objekt, i pozivaju metode tog objekta da otvore vezu i alju i primaju podatke. Metode socketa se direktno mapiraju na socket pozive u C biblioteci. Sljedeci primjer eka vezu na socketu, i kroz socket vraa ono to je primio, dodajui 'Echo=>' ispred stringa. Primjer Socket na server from socket import * myHost = '' myPort = 50007 # ukljuci modul socket # server, '' znaci localni host # slusaj na slobodnom portu
sockobj = socket(AF_INET, SOCK_STREAM) # napravi TCP socket objekt sockobj.bind((myHost, myPort)) # postavi ga na port sockobj.listen(5) # slusaj, dozvoli 5 konekcija # cekanju while 1: # slusaj dok traje proces connection, address = sockobj.accept() # cekaj na sljedecu konekciju print 'Server connected by', address # konekcija je novi socket while 1: data = connection.recv(1024) # citaj sljedecu liniju na klijentu if not data: break connection.send('Echo=>' + data) # posalji odgovor klijentu connection.close() Na klijentskoj strani, upotrebljavaju se socketi pomou kojih se alju podaci na server, i ispisuje odgovor servera; 'localhost' znai da se klijent i server vrte na istoj maini to nam omoguava da testiramo skriptu. Za testiranje preko interneta: pokreni server na drugoj maini, i postavi serverHost ili argv[1] na IP adresu te maine. Primjer socket na klijentu import sys from socket import * serverHost = 'localhost' serverPort = 50007
# server ime # slobodni port koji koristi server # tekst koji se salje na server
1157/1275
# ili server iz prvog argumenta # ili iz drugog argumenta komandne linije # poruka za svaki argument
sockobj = socket(AF_INET, SOCK_STREAM) # napravi TCP/IP socket objekt # spoji se na server i port servera sockobj.connect((serverHost, serverPort)) for line in message: sockobj.send(line) # posalji preko socketa liniju data = sockobj.recv(1024) # primi liniju od servera preko socketa print 'Client received:', `data` sockobj.close() # zatvori socket, server prima eof
Poto je importanje modula vremenski zahtjevno Python optimizira modul i stvara Python binarni kod sa ekstenzijom pyc. Taj optimizirani Python-ov binarni kod ne ovisi o platformi na kojoj se vrti i moe se koristiti i iz drugih programa. Svaki modul ima ime koje se moe dobiti sa naredbom __name__ , koje je postavljen na __main__ kada se modul poziva samostalno, to se moe iskoristit ako se eli izbjegnuti pokretanje nekog dijela glavnog programa u sluaju da je pozvan kao modul. if __name__=='__main__': print 'samo ako se sam pokrecem' print 'a ne kao modul iz drugog programa'
math i random
>>> import math >>> math.cos(math.pi / 4.0) 0.70710678118654757 >>> math.log(1024, 2) 10.0 >>> import random >>> random.choice(['apple', 'pear', 'banana']) 'apple' >>> random.sample(xrange(100), 10) # sampling without replacement [30, 83, 16, 4, 8, 81, 41, 50, 18, 33] >>> random.random() # random float 0.17970987693706186 >>> random.randrange(6) # random integer chosen from range(6) 4
1158/1275
Korisniki moduli
Svaki Python program je ujedno i modul. Tako da su svi primjeri u seminaru do sada moduli. Primjer Moj prvi modul #name.py if __name__=='__main__': print 'samo ako se sam pokrecem' verzija='1.01' def funkcija(a,b): return (a*b) #moj_modul_primjer.py import name print name.verzija print name.funkcija(4,7) $ python moj_modul_primjer.py 1.01 28 ili se moe eksplicitno navesti koje se funkcije importaju. Primjer Moj drugi modul #moj_modul_primjer1.py from name import funkcija print funkcija(4,7) $ python moj_modul_primjer1.py 28 Funkcija dir() lista sve funkcije i varijable ukljuene u modul. >>> import name >>> dir(name) ['__builtins__', '__doc__', '__file__', '__name__', 'funkcija', 'verzija']
1159/1275
Python
Kada u programu postoje dijelovi koda koji predugo traju i usporavaju rad programa python omoguava koritenje modula napisani i kompajliranih u C-u, to uvelike moe ubrzati kritine dijelove koda. Primjer Hello.c /* Jednostavan C modul za Python, "hello" */ #include <Python.h> #include <string.h> /* module funkcija */ static PyObject * /* vraa objekt */ message(PyObject *self, PyObject *args) /* self neiskoriten u modulu */ { /* args poziva iz Pythona */ char *fromPython, result[64]; /* pretvori Python -> C */ if (! PyArg_Parse(args, "(s)", &fromPython)) /* null=exception */ return NULL; else { strcpy(result, "Hello, "); /* dodaje string poslan iz Python-a */ strcat(result, fromPython); /* pretvaranje Python -> c */ return Py_BuildValue("s", result); } } /* registracijska tablica */ static struct PyMethodDef hello_methods[] = { /* ime metode, pointer na funkciju, uvijek-tuple */ {"message", message, 1}, {NULL, NULL} }; , /* inicijalizacija modula */ /* poziva se na prvi import */ void inithello( ) { /* ime je vano jedino ako se dinamino uitava u Python */ (void) Py_InitModule("hello", hello_methods); }
1160/1275
Napravite makefile #makefile.hello PY = $(DIR_PYTHON_HEADER) hello.so: hello.c gcc hello.c -g -I$(PY)/Include -I$(PY) -fpic -shared -o hello.so clean: rm -f hello.so core $ make f makefile.hello $ Python >>> import hello >>> hello.message('svijet') 'Hello, svijet' >>> hello.message('Ana') 'Hello, Ana'
C funkcije izgledaju i koriste se iz Python-a kao da su napisane u njemu. Vrlo je malo razlika izmeu C modula hello i Python modula osim po imenu (ne zavrava na .py ili .pyc). C moduli ak i odgovaraju na dir() funkciju.
>>> dir(hello) ['__doc__', '__file__', '__name__', 'message'] >>> hello.__name__, hello.__file__ ('hello', './hello.so') >>> hello.message # C funkcijski objekt # C modul atributi
1161/1275
STRUKTURE PODATAKA
Strukture podataka slue spremanju povezanih podataka u kolekciju. Tri su ugraene strukture podataka u Python-u lista, tuple i rjenik.
Lista
Lista je struktura podataka koja sadri ureenu kolekciju, tj. u listu moe dodavati niz objekata koji su meusobno povezani. U listu moe dodavati, iz nje brisati ili ju pretraivati. #!usr/bin/python # lista.py #Ovo je moja lista imena imena=['tomas','marko','mario','gorancic','tanja'] print 'U list je',len(imena),'imena' print 'imena:', for ime in imena: print ime, print '\ndodavanje amelie' imena.append('amelia') print 'moja imena su sada',imena imena.sort() print 'sortirana imena su,',imena print 'prvo ime je',imena[0] brisano=imena[0] del imena[0] print 'obrisano je',brisano print 'moja imena su sada',imena $ python lista.py U list je 5 imena imena: tomas marko mario gorancic tanja dodavanje amelie moja imena su sada ['tomas', 'marko', 'mario', 'gorancic', 'tanja', 'amelia'] sortirana imena su, ['amelia', 'gorancic', 'mario', 'marko', 'tanja', 'tomas'] prvo ime je amelia obrisano je amelia moja imena su sada ['gorancic', 'mario', 'marko', 'tanja', 'tomas'] Jo nekoliko metoda liste: append(x) dodaje na kraj liste insert(i,x) dodaje element x na poziciju i
1162/1275
remove(x) brie prvi element iz liste pop(i) - brie element na poziciji i, i vraa ga index(x) vraa indeks prvog elementa u listi s vrijednou x count(x) brojac pojavljivanja elementa x u listi sort() sortira elemente u listi reverse() okrece redosljed elemenata u listi
Tuple
Tuple ima istu strukturu kao i lista, s tom razlikom da se elementi u tuple ne mogu mijenjati. Koriste se kada je sigurno da se lista objekata u programu nee mijenjati. #!/usr/bin/python # tuple.py zoo = ('vuk','slon','lisica') print 'Broj zivotinja je',len(zoo) novi_zoo = ('zebra','zeba',zoo) print novi_zoo print novi_zoo[2] print novi_zoo[2][2] $ python tuple.py Broj zivotinja je 3 ('zebra', 'zeba', ('vuk', 'slon', 'lisica')) ('vuk', 'slon', 'lisica') lisica
Rjenik
Rjenik je kao telefonski imenik gdje se moe nai broj osoba znajui njihovo ime. Svakom objektu u rjeniku pridruuje se klju sa vrijednostima. Klju mora biti jedinstven ne moe se nai prava osoba ako ih ima vie sa istim kljuem. Za kljueve se moe koristiti samo nepromjenjive objekte poput stringova, dok se za vrijednosti moe koristiti sve. #!/usr/bin/python # dict.py tel={'mario':'3245-543', 'Tomas':'4324-323', 'Zoki':'4324-432' } print 'telefon Tomas-a je %s' % tel['Tomas'] tel['Hrvoje']='4323-112'
1163/1275
del tel['Tomas'] print '%d je ljudi u imeniku.' % len(tel) for ime,telefon in tel.items(): print 'ime %s - tel %s' %(ime,telefon) if tel.has_key('Hrvoje'): print 'Hrvojev telefon je %s' %tel['Hrvoje'] $ python dict.py telefon Tomas-a je 4324-323 3 je ljudi u imeniku. ime mario - tel 3245-543 ime Zoki - tel 4324-432 ime Hrvoje - tel 4323-112 Hrvojev telefon je 4323-112
1164/1275
Unutar objekata postoje dva tipa varijabli varijable klase i varijable objekta. Razlika izmeu tih dviju vrsta je u vlasnitvu pitanje je tko je vlasnik tih varijabli objekt ili klasa? Varijable klase se dijele izmeu svih objekata (instanci) klase. Varijable objekta su specifine za pojedinani objekt i ne dijele se izmeu objekata. #!/usr/bin/python # objvar.py class Osoba: populacija=0 def __init__(self,ime): 'Inicijalizacija osobe.' self.ime = ime print('inicijalizacija %s') %self.ime
1165/1275
'kada je osoba kreirana populacija se poveca' Osoba.populacija += 1 def ispisImena(self): print 'moje ime je %s' %self.ime def kolikoIma(self): #uvijek je barem jedna if Osoba.populacija ==1: print 'jedina sam osoba ovdje' else: print 'ima %s ljudi.' %Osoba.populacija zagor = Osoba('Zagor') zagor.ispisImena() zagor.kolikoIma() petro = Osoba('Petro') petro.ispisImena() petro.kolikoIma() marija = Osoba('Marija') marija.ispisImena() marija.kolikoIma() $ python objvar.py inicijalizacija Zagor moje ime je Zagor jedina sam osoba ovdje inicijalizacija Petro moje ime je Petro ima 2 ljudi. inicijalizacija Marija moje ime je Marija ima 3 ljudi. U python objektnom programiranju svi lanovi klase (ukljuujui i podatke) su public, i sve metode su virtualne. Postoji iznimka: ako se na poetku imena varijabla koristi __privatevar Python takvu varijablu pretvara u privatnu.
1166/1275
self.godine = godine print 'inicijalizirani clan je %s' %self.ime def ispis(self): print 'Ime: %s, Godine:%s' %(self.ime,self.godine) class Ucitelj(ClanSkole): 'Svi ucitelji' def __init__(self,ime,godine,placa): ClanSkole.__init__(self,ime,godine) self.placa = placa print 'inicijaliziran ucitelj %s' %self.ime def ispis(self): ClanSkole.ispis(self) print 'Placa je %s' %self.placa class Ucenik(ClanSkole): 'svi studenti' def __init__(self,ime,godine,ocjene): ClanSkole.__init__(self,ime,godine) self.ocjene = ocjene print 'inicijaliziran ucenik %s' %self.ime def ispis(self): ClanSkole.ispis(self) print 'Ocjene su %s' %self.ocjene u = Ucitelj('Gosp. Grahorac',56,232321) uc = Ucenik('Mario',19,84) print clanovi=[u,uc] for clan in clanovi: clan.ispis() #radi i za ucenike i za ucitelje $ python nasljedivanje.py inicijalizirani clan je Gosp. Grahorac inicijaliziran ucitelj Gosp. Grahorac inicijalizirani clan je Mario inicijaliziran ucenik Mario Ime: Gosp. Grahorac, Godine:56 Placa je 232321 Ime: Mario, Godine:19 Ocjene su 84
1167/1275
Datoteke
Datoteke se mogu otvarati za itanje ili pisanje tako da se prvo kreira objekt tipa file. Tada se koriste read, readline, ili write metode file objekta da se ita ili pie u datoteku ovisno o tome u kojem je modu otvorena datoteka. Nakon zavretka rada s datotekom metodom close se ona zatvara. Primjer Tekstualna datoteka #!/usr/bin/python # fileobj.py tekst='''\ Ovo je prva linija tekst. ovo je druga linija teksta. Ovo je treca linija teksta. ''' f = file('tekst.txt','w') f.write(tekst) f.close f=file('tekst.txt') #datoteka se otvara u read modu while True: linija=f.readline() if len(linija) == 0: #duzina 0 indicira kraj fajla break print linija f.close() $ python fileobj.py Ovo je prva linija tekst. ovo je druga linija teksta. Ovo je treca linija teksta.
1168/1275
Pickle
Standardni modul koji omoguava da se bilo koji Python objekt sprema u dokument i dobavlja kasnije (trajno spremanje objekata). Postoji jo jedan modul cPikle koji se ponaa kao i pickle modul osim to je napisan u C-u pa time puno bri. Koritenje i jednog i drugog modula je potpuno identino. Primjer Pickling i unpickling #!/usr/bin/python # pickle.py import cPickle listaDok = 'podaci.data' #ime dokumenta koji koristimo za spremanje lista=['hrast','bukva','lipa'] #pisanje, spremanje podataka f = file(listaDok,'w') cPickle.dump(lista,f) f.close() del lista #citanje podataka f = file(listaDok) spremljena = cPickle.load(f) print spremljena $ python pickle.py ['hrast', 'bukva', 'lipa']
1169/1275
RUKOVANJE IZNIMKAMA
>>> 10 * (1/0) Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: integer division or modulo by zero >>> 4 + spam*3 Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'spam' is not defined >>> '2' + 2 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects Iznimke su pogreke tj. odstupanja u radu programa. Mogu biti uzrokovane raznim dogaajima (pad sistema, nedozvoljeno pisanje po memoriji, dijeljenje s nulom,...) Kada se detektira takva situacija u python programu podie se iznimka. Iznimka se zatim prosljeuje pozivatelju funkcije koji ju obrauje. U sluaju da nema koda za obradu iznimke program se rui. try: # blok naredbi koji se pokusa izvrsiti except greska: # blok naredbi koji obraduje iznimku greska else: # blok naredbi koji se izvrsava ako nije podignuta niti jedna iznimka Primjer try-except #!/usr/bin/python # exception.py import sys class maliExcept(Exception): 'korisnicki definirana exception klasa' def __init__(self,duzina,barem): self.duzina = duzina self.barem = barem try: s = raw_input('Unesi nesto > ') if len(s)<3: raise maliExcept(len(s),3) except EOFError:
1170/1275
print 'Zasto EOF?' except maliExcept,x: print 'Unos je bio duzine %d, najmanje je trebao biti %d' %(x.duzina,x.barem) else: print 'nije dignuta nije jedna exception' EOFError kada korisnik pritisne ctrl+d Ako elimo izvriti neki dio koda bez obzira je li dolo do greke ili nije koristimo TryFinally
Primjer Try-Finally #!/usr/bin/python # try_finally.py try: f = file('tekst.txt') while True: linija = f.readline() if len(linija) == 0: break print linija, finally: print 'Ciscenje...' f.close() $ python try_finally.py Ovo je prva linija tekst. ovo je druga linija teksta. Ovo je treca linija teksta. Ciscenje...
1171/1275
ZAKLJUAK
Python je jednostavan programski jezik koji istovremeno ima snagu i sloenost tradicionalnih programskih jezika (C, C++, ) i jednostavnost skriptnih i interpreterskih jezika (Java, Perl, ) . Iako je ponekad identificiran kao isto skriptni jezik, upotrebljavan je u mnogim velikim projektima kao to je Zope aplikacijski server, Google i Mnet. itanje dobrog Python programa izgleda gotovo kao itanje engleskog. Vrlo je lako zapoeti u njemu programirati, a dovoljno je kompleksan da se u njemu mogu programirati i najtei problemi. Za razliku od veine drugih programskih jezika, ne prisiljava programera da prihvaa jednu programsku paradigmu i razmilja o samoj metodi programiranja, ve da razmilja o rjeavanju problema i onog to zapravo eli uiniti s programom. Programiranje u Python-u treba biti zabava...
1172/1275
Marijan Poljak
INTERPRETERI TCL/TK
1173/1275
1174/1275
Uvod u Tcl/Tk
Tcl/Tk dizajnirao je prof. John Osterhont sa Berkley sveuilita. Tcl, kratica od Tool Command Language, predstavlja dvije stvari: skriptni jezik i interpreter tj. prevodilac za taj jezik koji je dizajniran da se lako uklopi u neku aplikaciju. Za izvoenje Tcl programa (skripte), script file prenosi se Tcl interpreteru wish (npr. wish hello.tcl). Wish se moe koristiti i interaktivno na nain da se naredbe unose u command line. Postoji i drugi standardni Tcl interpreter, tclsh, koji razumije iskljuivo Tcl jezik. On ne sadri nikakve naredbe za Tk korisniko suelje. Tcl-u je pridruen Tk koji predstavlja Windows toolkit, jednostavan i efikasan nain razvijanja windows aplikacija. Tcl C biblioteka ima jasno i jednostavno suelje, sadri osnovni interpreter i set naredbi koje definiraju varijable, tijek programa tj. control flow, I/O fileove i procedure. eljena aplikacija moe definirati i nove Tcl naredbe. Ove naredbe su povezane sa C ili C++ procedurama. Skriptni dio ima pristup shell-u, npr. sposobnost da pokree druge programe i pristupa file sistemu. Takoer se moe pozivati direktno u aplikaciju, koritenjem specifinih Tcl naredbi, koje se definiraju. Sa razine C programiranja, mogue je pozivati ovakve Tcl skripte. Postoji mnogo besplatnih Tcl proirenja tj. ekstenzija. Veina ekstenzija ukljuuje C biblioteku, koja prua neke nove funkcionalnosti i Tcl suelje prema samoj biblioteci. Ipak, proirenje od najveeg znaaja predstavlja Tk. Tk definira Tcl naredbe kako bi kreirali i manipulirali widget korisnikim sueljem. Skriptno orijentirani pristup programiranju korisnikog suelja ima tri prednosti. Prvo, razvijanje je brzo jer nema ekanja na duga povezivanja. Drugo, Tcl naredbe pruaju suelje vieg nivoa od veine standardnih alata C biblioteke. Jednostavnija suelja zahtjevaju manje naredbi kako bi se definirala. Trea prednost je u injenici da se korisniko suelje moe jasno izdvojiti od ostatka aplikacije. Na taj nain moe se razvijati jezgra aplikacije da bi se naposljetku izgradilo suelje. Osnovni set Tk widgeta esto je dovoljan za veinu UI potreba, no mogue ih je razvijati pomou jezika C, a postoji i mnogo ve razvijenih Tk widgeta dostupnih na webu.
1175/1275
TCL OSNOVE
Tcl ima jednostavnu strukturu. Svaka linija zapoinje naredbom, svaka naredba je implementirana kao C funkcija. Jezik ima nekoliko osnovnih konstrukcija i relativno malo sintakse, to ga ini lakim za uenje. Osnovni mehanizmi vezani su uz stringove i supstitucije stringova, pa je lako vizualizirati to se zapravo dogaa u interpreteru. Svakim instaliranjem Tcl-a obino dolaze dva Tcl shell programa koji nam stoje na raspolaganju: tclsh i wish. Prvi je osnovni Tcl shell koji se koristi poput C shella ili Bourne shella. Wish predstavlja Tcl interpreter koji je proiren Tk naredbama koje se koriste pri kreiranju i manipuliranju Tk widgeta. Mogue su varijacije ovih programa ovisno o ekstenziji koja je dodana shellu.
Tcl naredbe
Zadaci aplikacije podjeljeni su u module. Specifini zadaci svake nove aplikacije su pisani i kompajlirani kao C ili C++ program i zatim predstavljeni kao nova Tcl naredba. Potom nastaje Tcl skripta od postojeih i novih naredbi inei tzv. overall aplikaciju. Tcl se sastoji od nekoliko sintaksnih pravila i skupa naredbi, inei jezgru. Tcl naredbe sastoje se od jedne ili vie rijei, od kojih je prva ime C funkcije koja e biti pozvana od strane interpretera. Ostale rijei u naredbi prenose se kao argumenti C procedure. Osnovna sintaksa Tcl naredbe :
Razmakom se odvaja ime naredbe od argumenata, a prelaskom u novi red ili znakom tokazarez , ; , naredba zavrava. Argumenti naredbe imaju vrijednost stringa. Tcl interpreter ne prevodi vrijednosti argumenata u naredbi, osim u sluaju supstitucije. Kod Tcl-a sve se predstavlja stringom, i mora se jasno traiti evaluacija varijabli i naredbi koje su ugnjeene. Osnovni model naredbe moe biti proiren sintaksom za grupiranje, ime se omoguava upotreba vie rijei u jednom argumentu, te supstitucijom koja se koristi pri programskim varijablama i pozivanju ugnjeenih varijabli. Grupiranje i supstitucija su jedini mehanizmi ukljueni u Tcl interpreter prije nego to on izvri naredbu.
1176/1275
Primjer Hello, world! : puts stdout {Hello, World!} => Hello, World! U ovom primjeru naredba puts uzima dva argumenta: I/O stream i string. Argumenti se prevode ovisno o naredbi. Vitiaste zagrade, {}, grupiraju rijei u jedinstveni argument. Interpreter ih odbacuje prilikom prevoenja pa tako puts naredba prima Hello, world! kao drugi argument. Tablica Ugraene Tcl naredbe
array break catch cd close concat continue error eof eval exec exit expr file for foreach format gets glob global history if incr
ispituje stanje polja, pretraivanje po elementima izlaz iz petlje hvatanje greki promjena radnog direktorija zatvara i otvara I/O stream spaja argumente zajedno s razmacima nastavlja sa sljedeom iteracijom prijavljuje greku provjerava end-of-file. spaja argumente te ih evaluira kao naredbu Fork i execute UNIX program. terminira proces evaluira matematiki izraz query file system stvaranje petlje stvaranje petlje preko niza vrijednosti formira string, slino kao C sprintf ita input line s I/O proiruje pattern prema odgovarajuim file imenima deklariranje global varijabli command-line history control naredba uvjeta inkrementira varijablu za integer vrijednost
1177/1275
info join lappend lindex linsert list llength lrange lreplace lsearch lsort open pid proc puts pwd read regexp regsub rename return scan set source split string switch time trace unknown unset uplevel upvar
query o stanju Tcl interpretera spajanje niza elemenata sa zadanim string separatorom dodaje elemente na kraj niza dohvaanje elementa niza umetanje elemenata u niz stvaranje niza van argumenata vraa broj elemenata u nizu vraa udaljenost izmeu elemenata niza zamjena elemenata u nizu trai element u nizu koji odgovara uzorku sortiranje niza otvara file ili process pipeline za I/O vraa process ID definira Tcl proceduru alje string na I/O stream. vraa trenutni radni direktorij ita blokove znakova sa I/O sreama Regular expression matching supstitucija bazirana na regularnim izrazima promjena imena Tcl naredbe povratna vrijednost procedure slino kao C sscanf funkcija dodjela vrijednosti varijablama evaluira Tcl naredbe u file-u dijeli string kao niz elemenata operira nad stringovima grananje u programu mjeri vrijeme izvravanja naredbe nadzire varijable rad sa nepoznatim naredbama brisanje varijabli izvrava naredbu u razliitom opsegu vidljivosti (scope) referenca na varijablu iz drugog opsega vidljivosti
1178/1275
while
konstrukcija petlje
Tcl Varijable
Naredba set koristi se za pridjeljivanje vrijednosti varijablama. Naredba uzima dva argumenta: prvi je ime varijable a drugi je vrijednost varijable. Varijable mogu biti bilo koje duine, razlikuju se velika i mala slova. Nije potrebno deklarirati Tcl varijable prije njihove upotrebe. Interpreter kreira varijablu kada joj se prvi puta dodijeli vrijednost. Vrijednost varijable dohvaa se kasnije sintaksnim znakom $ . Primjer:
set var 5 => 5 set b $var => 5
Druga set naredba u primjeru pridjeljuje varijabli b, vrijednost varijable var. Upotreba znaka $ ujedno je i prvi primjer supstitucije. Varijabla se moe obrisati koritenjem naredbe unset: unset imevar imevar2... Bilo koji broj imena varijabli moe se prenesti unset naredbi. Unset e prijaviti greku ako varijabla nije definirana. Varijable se dijele u tri kategorije: local, global, visible. Postojanje varijable moe se testirati naredbom info exists.
3. Znak kose crte tj. backslash, \ , koristi se za definiranje posebnih znakova. Ovo se moe smatrati supstitucijom jer se kombinacija kose crte i znaka koji sljedi, zamjenjuje novim znakom. 4. Supstitucije se mogu pojaviti bilo gdje, osim ako to nije dozvoljeno grupiranjem vitiastim zagradama. Supstitucija se moe pojaviti usred rijei, tj. dio rijei moe biti string dok ostatak mogu biti neke od supstitucija. Supstitucije mogu djelovati ak i na ime naredbe. 5. Grupiranje vitiastim zagradama, {}, spreava supstituciju. Interpreter ukljuuje sve znakove izmeu odgovarajue lijeve i desne zagrade u grupi. Krajnje vitiaste zagrade nisu ukljuene u grupu. 6. Grupiranjem dvostrukim navodnicima, , doputa se supstitucija. Interpreter grupira sve dok ne naie na drugi znak dvostrukog navodnika. Sam znak navodnika moe biti ukljuen u grupu u kombinaciji sa znakom kose crte. 7. Grupiranje se mora izvriti prije izvrenja supstitucije. Ovo znai da vrijednost varijabli i rezultati naredbi ne utjeu na grupiranje. 8. Supstitucija koja se izvede jednom, izvrava se prije poziva naredbe. Rezultat supstitucije ne prevodi se drugi put. Ovo pravilo je vano ako vrijednosti varijabli ili rezultati naredbe sadre specijalne znakove poput: $, {}, [ ]...
1180/1275
Matematiki izrazi
Naredba expr koristi se za evaluaciju matematikih izraza. Tcl interpreter tretira naredbu expr kao svaku drugu naredbu. Sintaksa koju podrava naredba expr slina je sintaksi u C jeziku. Expr primarno barata vrijednostima: integer, floating point i boolean. Vrijednost integer se po potrebi moe pretvoriti u floating point zapis. Logike operacije vraaju 0 (la) ili 1(istina). Naredba expr podrava komparaciju stringova, ali pouzdanijom metodom za usporeivanje stringova smatra se upoteba naredbe stringcompare.
Naredba expr uzima sve argumente, spaja ih u jedan string, zatim predstavlja string kao matematiki izraz. Nakon to izrauna rjeenje, ono se formatira u string i vraa. U matematike izraze mogue je ukljuiti i varijable kao i ugnjeene naredbe. Expr, naravno, podrava i velik broj ugraenih matematikih funkcija.
Tablica acos(x) asin(x) atan(x) cos(x) exp(x) floor(x) log(x) log10(x) pow(x,y) sin(x)
Neke od ugraenih matematikih funkcija arc-cosinus od x arc-sinus od x arc-tangent od x cosinus od x exponential, e x najvea vrijednost integrala manja ili jednaka x fmod(x,y) prirodni logaritam od x log od x uz bazu 10 x na y potenciju sinus od x
1181/1275
drugi korijen od x tangens od x apsolutna vrijednost od x stavlja x kao floating point pretvara x u integer vrijednost
Tablica
-~! */ +<< >> < > <= >= == != & ^ | && || x?y:z
unarni minus, bitovno NOT, logiko NOT mnoenje, djeljenje zbrajanje, oduzimanje left shift, right shift operatori usporeivanja jednako, razliito od bitovno AND bitovno NOT bitovno OR logiko AND logiko OR If x then y else z
1182/1275
Tcl Procedure
Tcl koristi naredbu proc za definiranje procedura. Osnovna sintaksa kojom se definira procedura je:
Prvi argument predstavlja ime procedure koja se definira. Ime procedure moe sadravati bilo koje znakove, bitno je razlikovati velika i mala slova. Imena varijabli i imena procedura nisu u meusobnom konfliktu. Sljedei argument u sintaksi predstavlja listu parametara procedure. Trei argument je naredba ili obino grupa naredbi koje formiraju tijelo (body) procedure. Jednom definirana, Tcl procedura koristi se kao bilo koja ugraena naredba. Rezultat procedure je rezultat kojeg vraa zadnja naredba u tijelu procedure. Primjer definiranja procedure:
Procedura imena diag izraunava duljinu dijagonale pravokutnog trokuta ako su zadane ostale stranice. sqrt funkcija je jedna od mnogobrojnih matematikih funkcija i podrana je naredbom expr. Vitiaste zagrade grupiraju argumente a i b u jedinstveni argument, koji sada predstavlja drugi argument naredbe proc. Otvorenom vitiastom zagradom na kraju drugog argumenta zapoinje trei argument a ujedno i grupiranje, sve dok se zagrada ne zatvori. Kao rezultat grupiranja dobiva se sljed naredbi, u obliku treeg argumenta. Sljedei vaan uinak vitiastih zagrada oko tijela procedure je da odgaa bilo koji oblik supstitucije u tijelu procedure, sve do vremena kada se procedura poziva. U navedenom primjeru varijable a, b, c nisu definirane sve dok se procedura ne pozove, dakle nepoeljna je supstitucija varijabli tijekom samog definiranja procedure diag. Naredba proc podrava i dodatne oblike poput definiranja broja varijabli argumenata defniranjem
1183/1275
defaultne vrijednosti za
U Tcl-u postoji jedinstveni, globalni opseg (scope) za imena procedura. (za razliku od jezika C koji doputa privatne static procedure). Mogue je definirati proceduru unutar druge procedure, ali e ona biti vidljiva svugdje. Svaka procedura ima lokalni scope za varijable. Varijable definirane unutar procedure imaju ivotni vijek za vrijeme trajanja poziva procedure, nakon toga su nedefinirane. Varijable definirane izvan procedure nee biti vidljive unutar te procedure osim ako se ne upotrijebe naredbe upvar ili global. global naredbom definira se tzv. global scope, koji se nalazi izvan svake procedure. Vano je ipak naglasiti da je varijable definirane na ovom podruju potrebno uiniti dostupnim naredbama unutar procedure. Ista imena varijabli izvan opsega i unutar procedure ne dovode do konflikta.
Komentari
Tcl koristi znak # za komentiranje. Za razliku od mnogih jezika, znak # sa
pripadajuim komentarom u veini sluajeva pojavljuje se prije same naredbe. Dobar nain kako prikljuiti komentar na kraju naredbe je dodavanje znaka #, neposredno iza znaka koji oznaava kraj naredbe tj. znaka ;.
# ovo su primjeri komentara set rata 7.0;# Komentar na kraju naredbe set mjeseci 60;# Komentar na kraju naredbe
Znakom kose crte, \ , nastavljamo s komentarom u sljedei red skripte. Znak ; unutar komentara nema znaaja, komentar se prekida samo prelaskom u novi red.
1184/1275
STRINGOVI
String predstavlja osnovni tip Tcl podataka, pa ne iznenauje injenica da postoji velik broj naredbi za manipulaciju stringovima. Uz podruje stringova je usko vezan pojam usporedbe prema uzorku tj. pattern matching. Tcl podrava dvije vrste ovakvog usporeivanja prema uzorku. Tzv. Glob matching predstavlja jednostavno usporeivanje kakvo se koristi u mnogim shell jezicima. Regular expresion matching je vie sloeno ali zato i monije. Osnovna sintaksa Tcl string naredbe:
string
operacija
vrijednost_stringa
drugi_argumenti
Prvi argument naredbe string definira to string radi tj. operaciju. Drugi argument je nekakav string, a mogu postojati i drugi argumenti ovisno o operaciji. Veina string naredbi obino je vezana uz string funkcije u standardnoj C biblioteci. Tablica Oblici string naredbe usporeuje stringove leksikom analizom pokazuje na mjesto u stringu gdje se prvi puta pojavljuje neki zadani string ili vraa 1 u suprotnom string index string index string last str1 str2 string length string string match pattern str string range str i j string tolower string string toupper string string trim string ?chars? string trimleft string ?chars? ureuje znakove na poetku stringa vraa znak na specificiranom indexu obrnuta logika od first vraa duljinu stringa vraa vrijednost 1ako string odgovara patternu vraa razmak izmeu zadanih znakova vraa string malim slovima vraa string velikim slovima ureuje znakove na poetku i kraju stringa
1185/1275
string trimright string ?chars? string wordend str ix string wordstart str ix
ureuje znakove na kraju stringa vraa index znaka u stringu nakon rijei koja sadri taj znak na ix indexu vraa index u stringu prvog znaka u rijei koja sadri znak na ix indexu
Osim naredbe string postoji itavi niz drugih naredbi kojima je mogue manipulirati stringovima. Naredba append je dobar nain da se neto doda na kraj nekog stringa. Radi na principu pretraivanja sheme alocirane memorije. Tcl alocira dodatni prostor kako bi omoguio irenje stringa. Naredba append uzima ime varijable kao prvi argument, zatim spaja preostale argumente na trenutnu vrijednost imenovane varijable. Varijabla e biti kreirana ukoliko ve ne postoji. Format naredba je slina C printf funkciji. Naredba formira string prema sljedeoj specifikaciji: format spec vrijednost1 vrijednost2.
Argumenti specifikacije mogu sadravati i kljune rijei ali u tom sluaju ispred kljune rijei mora stajati znak postotak, %. Oznakom zastavice, flag, definiraju se u naredbi format razna umetanja znakova i slino. Scan naredba je neto poput C sscanf procedure. Scan analizira string prema format specifikaciji i dodjeljuje vrijednosti varijablama te vraa broj pretvorbi koje su uspjeno obavljene. Naredba ima sljedeu formu:
Specifikacija za naredbu scan je gotovo jednaka kao za naredbu format. Uz naredbu scan moe biti ukljuena set notacija. Uporabom uglatih zagrada odreuje se set znakova. Set odgovara jednom ili vie znakova koji su upisani u varijablu. String match naredba je primjer tzv. glob-style usporeivanja. Postoje tri osnovne konstrukcije koritene u ovakvom glob uzorku: 1. usporeivanje bilo kojeg broja, bilo kojih znakova (*) 2. usporeivanje pojedinog znaka (?) 3. usporeivanje jednog u setu znakova ([abc])
1186/1275
Ako se eli ukljuiti znakove *, ?, [ ], potrebno ih je koristiti u kombinaciji sa backslashom, \ . Regularni izraz predstavlja najefikasniji nain kako uobliiti uzorak (pattern). Postoji osnovna sintaksa koja ukljuuje sposobnost izdvajanja podstringova iz stringa koji se usporeuje i predstavlja uzorak. Ono moe biti korisno kod prikupljanja razdvojenih podataka. Uzorak predstavlja slijed literalnih znakova, znak usporeivanja (matching character) s dodacima poput ponavljanja, alternacije te poduzoraka koji su grupirani u zagrade. Znak toke, . , predstavlja wild-card znak koji odgovara bilo kojem pojedinanom znaku. Sintaksom [xyz] bilo kojem znaku unutar zagrada je dozvoljeno usporeivanje. Tako npr. izraz [Hh]ello odgovara izrazu Hello i izrazu hello. Ponavljanje se oznaava znakom * za 0 ili vie ponavljanja, znakom + za 1 ili vie ponavljanja i znakom ? za 0 ili jedno ponavljanje. Sljedei izraz npr. usporeuje string koji sadri znak b iza kojeg slijedi 0 ili vie znakova a : ba* . Alternacija je specificirana znakom | . U pricipu, uzorak ne mora u potpunosti odgovarati itavom stringu. Ako je uzorak pronaen u vie dijelova stringa, uzima se onaj dio koji se najranije pojavljuje u zadanom stringu. Ukoliko ima vie pronaenih uzima se onaj najdui. Regexp naredba omoguava direktan pristup regularnom izrazu koji se uporeuje. Povratna vrijednost je 1 ako neki dijelovi stringa odgovaraju uzorku ili 0 obrnuto. Oznake zastavica (flags) su opcionalne. Ako string odgovara uzorku rezultati se spremaju u varijable imenovane u naredbi. Regsub naredba se upotrebljava za string supstituciju koja se temelji na usporedbi prema uzorku. Naredba vraa broj pogaanja i zamjena ili 0 ako ne postoji odgovarajua usporedba. Regsub kopira string u ime varijable zamjenjujui dogaaje uzorka supstitucijom definiranom izrazom subspec. Opcionalno se moe dodati izraz all, ime se zamjenjuju svi dogaaji uzorka, inae se zamjenjuje samo prvi. Sintaksa naredbe regsub je sljedea:
1187/1275
STRUKTURE PODATAKA
Osnovnu strukturu podataka u Tcl-u ine stringovi. Dodatno, postoje dva tipa struktura podataka vieg nivoa, nizovi i polja. Nizovi su implementirani kao stringovi. Njihova struktura je definirana sintaksom stringova. Sintaksa pravila su ista kao iza naredbe. Polja su varijable koje posjeduju index (string vrijednost). Polja se mogu zamiljati kao put od jednog stringa (indexa) do nekog drugog stringa (odreene vrijednosti elementa polja). Pravilo je sljedee: nizovi su funkcionalni ako su kratki ili ako se izgrauje naredba koja e se kasnije evaluirati. Polja su efikasnija i primjerenija za vee koliine podataka.
Nizovi
Nizovi u Tcl-u su , za razliku od drugih jezika, stringovi sa posebnim znaenjem. Po definiciji, Tcl nizovi imaju istu strukturu kao i Tcl naredbe. To znai da je niz jednostavno string sa nizovima elemenata odvojenih razmakom. Zagrade ili navodnici mogu biti koriteni za grupiranje rijei sa razmacima u jedinstveni element niza. Naredbe vezane uz nizove esto se koriste pri konstruiranju Tcl naredbi. Ovo su neke od naredbi vezane uz stringove:
1.
Naredbom list konstruira se niz iz argumenata, tako da postoji jedan element niza za svaki argument. To je vana naredba budui osigurava da rezultirajui niz ima odgovarajuu sintaksu. Ukoliko neki od argumenata sadri specijalne znakove, list naredba dodaje navodnike kako bi bili sigurni da se radi o jedinstvenom elementu. Naredbom lappend dodaju se elementi na kraj niza. Koristi se ekstra alocirani prostor na kraju niza. Naredba se moe pozvati sa imenom nedefinirane varijable, koja e u tom sluaju biti definirana. Naredba concat spaja viestruke nizove u jedinstveni niz. 2. Naredbe kojima se pristupa elementima niza: llenght, lindex i lrange.
Naredba llenght vraa broj elemenata niza, lindex vraa pojedini element iz niza, lrange vraa razmak izmeu elemenata niza. 3. Naredbe za modifikaciju nizova: linsert, lreplace
1188/1275
Naredba linsert umee elemente na mjesto u nizu koje je oznaeno indexom, lreplace zamjenjuje elemente u nizu novim elementima. 4. Ostale neredbe su lsearch, lsort, split, join.
Naredba lsearch vraa index traene vrijednosti u nizu ili vrijednost 1 ako vrijednost nije pronaena. Naredbom lsort nizovi se sortiraju. Tri osnovne vrste sortiranja definirane su opcijama: ascii, integer ili real. Redosljed je odreen opcijama increasing i decreasing. Naredba split uzima string i pretvara ga u niz djelei ga na oznaenim mjestima. Naredba join je inverzna split naredbi, ona spaja elemente nizova. Poeljno je izbjegavati velike nizove i nizove kojima se freventno pristupa. U tom sluaju bolje je primjeniti prednosti polja.
Polja
Druga primarna struktura podataka kojom se barata u Tcl-u su polja. Polje je varijabla koja kao index uzima vrijednost stringa. Index polja nalazi se unutar zagrada, moe imati bilo koju vrijednost stringa i moe biti rezultat supstitucije neke varijable ili naredbe. Elementi polja definiraju se naredbom set: set arr (index) value Vrijednost (value) elementa polja dohvaa se $ supstitucijom. Uporaba varijable definirane i kao polje i kao obina varijabla izaziva greku. Index, ako je kompleksan, moe biti rastavljen upotrebom zareza; pri tome ju nuno izbjegavati razmak poslije zareza. Iako je dozvoljen, razmak u indexu moe izazvati probleme budui se zagrade u ovom sluaju ne koriste kao mehanizam grupiranja. Razmak se koristi u kombinaciji s backslashom. Ako je index polja pohranjen u varijabli, onda nema problema sa razmacima u vrijednosti varijable. Ime polja moe biti rezultat supstitucije. Naredba array vraa informacije o varijablama polja i moe se koristiti za iteraciju kroz elemente polja. Naredba array names omoguava iteraciju kroz polje upotrebom foreach petlje. Redosljed imena vraenih ovom naredbom je neodreen. Mogue je ograniiti vraanje imena specificiranjem uzorka argumenta. Uzorak se definira string match naredbom. Mogua je iteracija kroz elemente polja pojedinano, koritenjem search naredbi. Redosljed je opet neodreen. Ako polje ima ogroman broj
1189/1275
elemenata ili ako se vri iteracija kroz dulji period vremena tada su search operacije praktinije od array names naredbe. Operacije array get i array set koriste se za pretvaranja izmeu polja i niza. Naredba trace doputa registriranje naredbe koja e biti pozvana svaki put kada se pristupa varijabli, kad se modificira ili brie. Druga esta uporaba trace naredbe je osvjeavanje korisnikog widget suelja kao odgovor na promjenu varijable. Ako postoji vie trace naredbi koje su pridruene odreenoj varijabli, one e se pozivati u obrnutom redosljedu; prvo e se izvriti naredba koja je zadnja pridruena. Ako postoji trace naredba pridruena polju i elementu tog polja, prvo se izvrava ona pridruena polju. Informacije o trace naredbama nad varijablama vraaju se opcijom vinfo. Naredba trace moe biti obrisana opcijom delete.
1190/1275
Naredbe ponavljanja u Tcl-u su naredbe: while, foreach i for. Uvjetna grananja vre se naredbama if i switch. Dodatne naredbe za kontrolu tijeka programa su break, continue, return i error. Naredba za manipuliranje grekama je catch. Naredba tijeka programa esto ima tijelo naredbe koje se izvrava kasnije, uvjetno ili u petlji. U tom sluaju vano je grupirati tijelo naredbe vitiastim zagradama kako bi se izbjegle supstitucije u vrijeme poziva naredbe. Drugu ugodno svojstvo vitiastih zagrada je da grupiraju stvari ukljuujui i prelaske u novi red, irei naredbe kroz vie redova. Naredba tijeka programa vraa vrijednost zadnje naredbe koju je odluila izvriti. Naredbe poput if, for i while mogu sadravati boolean izraze. If Then Else naredba je naredba grananja. Naredba if je osnovna i bazirana je na uvjetu. Ako je uvjet istinit izvrava se jedno tijelo naredbe, u suprotnom se izvrava drugo tijelo naredbe. Kljune rijei then i else su opcionalne. Switch naredbom mogue je grananje vie tijela naredbi ovisno o vrijednosti izraza. Kao dodatak, izbor je mogu na temelju uporeivanja prema uzorku, isto kao i jednostavnom usporedbom. Ukoliko odgovaraju viestruki uzorci, evaluira se samo jedan odgovarajui uzorak. Foreach naredba vri loop nad tijelom naredbe dodjeljujui varijable svakoj vrijednosti u nizu. Tijelo naredbe se izvrava jednom za svaki element u petlji. While naredba uzastopce testira boolean izraze, a zatim izvrava tijelo naredbe ako je rezultat razliit od 0. Iz razloga to se testni izraz evaluira ponovno, prije svake iteracije petlje vana je zatita izraza od bilo kakve supstitucije prije pozivanja while naredbe. For naredba slina je izrazu for iz jezika C. Naredba uzima etiri argumenta. Prvim se inicijalizira petlja, drugi definira da li e se tijelo petlje izvriti, trei argument je naredba koja e se izvriti poslije tijela petlje i etvrti argument predstavlja tijelo petlje. Break i continue naredbe kontroliraju izvravanje petlje. Break naredbom odmah se izlazi iz petlje, continue naredbom petlja nastavlja sa sljedeom iteracijom. Tcl ne podrava goto izraz.
1191/1275
Catch naredba slui za hvatanje greaka. U praksi, bilo koja naredba e prijaviti greku ako je pozvana sa pogrenim brojem argumenata ili ako detektira neke posebne greke vezane uz njezinu implementaciju. Ako se greka ne uhvati ona prekida izvravanje itave skripte; zato je potrebno sluiti se catch naredbom. Catch uzima dva argumenta: prvi je tijelo naredbe, drugi je ime varijable koja e sadravati rezultat ili poruku greke ako naredba prijavi greku. Error naredba prijavljuje stanje greke koje terminira skriptu ukoliko greka nije uhvaena catch naredbom. Return naredbom vraamo se iz procedure. Potrebna je ako je povratak nuan prije kraja tijela procedure ili ako je potrebno vratiti konstantnu vrijednost. Return naredba na kraju procedure je pitanje stila. Naredba return moe biti specificirana opcionalnim argumentima tipa code, code error, error info... Ove opcije su rijetko u upotrebi, iako omoguuju izgradnju novih naredbi tijeka programa u Tcl-u.
1192/1275
RAD S UNIXOM
Tcl naredbe exec, open, close, read, write, seek, tell, glob,
pwd i cd koriste se u Unix okruenju. Iako su ove naredbe dizajnirane za Unix, one su takoer ukljuene (s nekim modifikacijama) u Tcl portove prema ostalim sustavima poput DOS-a. Ovakve sposobnosti omoguavaju da se Tcl skriptom spajaju razliiti programi u jedinstveni alat prilagoen razliitim potrebama.
Naredba exec
Naredba exec koristi se za pokretanje drugih Unix programa iz nae Tcl skripte. primjer: set d [exec date] Standardni output programa vraen vraa se kao vrijednost exec naredbe. Za razliku od C-shell exec naredbe, tcl exec naredba ne zamjenjuje trenutni proces sa novim. Exec naredba podrava potpuni set I/O redirekcije te pipeline sintaksu. Svaki Unix proces ima tri I/O streama: standard input, standard output, standard error. Sa I/O redirekcijom mogue je uputiti I/O streamove u fileove ili u I/O streamove koji su otvoreni open naredbom. Pipeline (cjevovod) predstavlja lanac Unix procesa koji ima standardni output jedne naredbe prikljuen na standardni input sljedee naredbe u cjevovodu. Bilo koji broj programa moe biti linkan zajedno u cjevovod. Uz naredbu exec dolazi podrazumjevana sintaksa za I/O redirekciju.
Pregled osnovne exec sintakse za I/O redirekciju pipeline uzima input uzima input sa I/O streama identificiranog sa field uzima input sa zadane vrijednosti uzima output
1193/1275
2> fileName >> fileName 2>> fileName >>& fileName >@ fileId 2>@ fileId >&@ fileId &
uzima standard error output dodaje standard output imenovanoj datoteci dodaje standard error imenovanoj datoteci dodaje zajedno standard error i s. output datoteci direct standard output na I/O stream identificiran sa fileId direct standard output na I/O stream identificiran sa fileId direct standard error i standard output na I/O stream. izvravanje cjevovoda u pozadini
Promatrajui sintaksu redirekcije vano je uoiti da se ona izgrauje na temelju nekoliko osnovnih graevnih blokova. Osnovna ideja je da znak | predstavlja cjevovod, znak > predstavlja output, znak < predstavlja input, znakom & pridruuje se standardni error standardnom outputu, znakom @ mogue je koristiti vlastite I/O streamove.
Naredba file
Naredba file prua nekoliko naina za provjeru statusa datoteke u Unix datotenom sustavu. Npr. moemo saznati dali datoteka uope postoji i kojoj vrsti datoteka pripada. Naredba file moe biti u razliitim formama. Tablica file atime name file dirname name file executable name file exists name file isdirectory name file owned name file readable name file rootname name file size name file tail name file type name Pregled osnovnih formi Tcl file naredbe vraa vrijeme pristupa datoteci vraa glavni direktorij imena datoteke vraa 1 ako ime ima execute dozvolu, inae 0 vraa 1 ako ime postoji, inae 0 vraa 1 ako je ime direktorij, inae 0 vraa 1 ako je trenutni korisnik vlasnik imena datoteke, inae 0 vraa 1 ako ime ima dozvolu itanja, inae 0 vraa sve osim ekstenzije imena vraa broj byteova u imenu vraa sve znakove nakon zadnjeg '/ ' u imenu vraa type identifier (moe biti: file, directory, characterSpecial, blockSpecial, fifo, link, ili socket)
1194/1275
file writable name file lstat name var file stat name var
vraa 1 ako ime ima dozvolu pisanja, inae 0 stavlja stat rezultate linka name u var stavlja stat rezultate od imena u polje var
Nake od formi operiraju nad imenom staze datoteke (pathname); one ne vraaju informacije o samoj datoteci. Takve naredbe mogu biti primjenjene nad bilo kojim stringom, nema zahtjeva da se pathname mora odnositi na postojeu datoteku. Najopenitije opcije koje dolaze uz naredbu file su stat i lstat. One uzimaju trei argument koji je ime varijable polja a zatim inicijaliziraju to polje sa elementima i vrijednostima ovisno o rezultatima koje daje stat system call. Elementi polja koji su definirani: atime, ctime, dev, gid, ino, mode, mtime, nlink, size, type i uid. Primjer Kreiranje direktorija rekurzivno
proc makedir { pathname } { if {[file isdirectory $pathname]} { return $pathname } elseif {[file exists $pathname]} { error Non-directory $pathname already exists. } else { # Recurse to create intermediate directories makedir [file dirname $pathname] exec mkdir $pathname return $pathname } } Primjer koristi file naredbu kako bi odredio ima li potrebe kreirati dodatne direktorije u pathname-u. Poziva se rekurzivno koristei file dirname rekurzivno kako bi kreirao glavni direktorij.. Taj posao obavlja mkdir program. Greke mogu biti prijavljene na dva mjesta: ako procedura makedir pronae tzv. non-directory u pathname-u ili u programu makedir ako korisnik nema npr. dozvolu za kreiranje direktorija.
1195/1275
Argument what predstavlja ime datoteke ili pipeline specifikaciju slinu onoj koja se koristi kod naredbe exec. Argument access moe biti u dvije forme; kratkoj sekvenci znakova ili nizu tzv. POSSIX pristupnih zastavica (POSSIX acess flags). Ako argument access nije specificiran, po defaultu je read. permisions argument je vrijednost koja se koristi za tzv. permission bitove nad novo kreiranom datotekom. Defaultne vrijednosti ovih bitova su 0666. Dodatna pojanjenja mogue je pronai na man stranici vezano uz chmod naredbu. Povratna vrijednost naredbe open je identifikator za I/O stream; vrijednost je potrebno pohraniti u varijablu. Tablica r r+ w w+ a a+ Tablica RDONLY WRONLY RDWR APPEND CREAT NONBLOCK TRUNC Primjer: Pregled open acess argumenata otvoren za itanje, file mora postojati otvoren za itanje i pisanje, file mora postojati otvoren za pisanje otvoren za itanje i pisanje otvoren za pisanje, dodavanje podataka u file otvoren za itanje i pisanje, dodavanje podataka u file Pregled osnovnih POSSIX zastavica za access argumente otvoren za itanje otvoren za pisanje otvoren za itanje i pisanje otvoren za dodavanje kreira file ako ne postoji spreava blokiranje prilikom otvaranja skrauje file ako postoji Otvaranje dokumenta koritenjem POSSIX access zastavica
1196/1275
File se u ovom sluaju otvara za itanje i pisanje ili stvara ako je potrebno.
itanje i pisanje
Standardni I/O streamovi identificirani sa stdin, stdout i stderror ve su otvoreni. Drugi su identificirani povratnom vrjednou naredbe open. Postoji nekoliko naredbi koritenih sa identifikatorima datoteka. puts - pie string i newline na output. Naki detalji u vezi puts naredbe ipak su drugaiji. Naredba puts uzima argument nonewline koji spreava newline znak koji bi se inae normalno prenio na izlaz. Stream identifikator je opcionalan; ako nije specificiran po defaultu je postavljen na stdout. gets -ita sa ulaza. Ako je dosegnut EOF (end of file), vraa se prazan string. Naredba eof mora se koristiti kako bi se razlikovala prazna linija od kraja file-a. eof naredba vraa 1 ako je dosegnut kraj. Naredba gets moe pohraniti liniju u imenovanu varijablu i vratiti broj proitanih byteova. read -ita blokove podataka, to je esto efikasno. Sa naredbom read mogu se specificirati argumenti nonewline ili argument numBytes, ali ne oba zajedno. Bez argumenta numBytes cijeli file (ili ono to se nalazi u I/O streamu) je proitan i vraen kao koliina byteova koju zauzima. -naredbe koje se koriste za pristup I/O streamu sluajnim odabirom
seek, tell
(random access to I/O stream) -naredba koja je vana kao i ostale jer oslobaa operativni sustav resursa
close
vezanih uz I/O stream. Ako se zaboravi zatvoriti stream, on e biti zatvoren pri izlasku iz
1197/1275
procesa. Meutim, ako se radi o dugakom programu poput Tk skripte to moe dovesti do problema. Naredba close moe prijaviti i greke.
Refleksija
Refleksija (reflection) omoguava feedback skripte u vezi s unutarnjim stanjem interpretera. To moe biti korisno u mnogo sluajeva, od testiranja kako bi se uvjerili da neka varijabla postoji do odbacivanja stanja interpretera. Naredba info prua mnogo razliitih informacija u vezi interpretera.
Pregled osnovnih formi info naredbe lista argumenata procedure naredbe u tijelu procedure broj naredbi koje su dosad izvrene lista svih naredbi ili onih koje odgovaraju pattern-u istina ako je definirana varijabla lista svih glob varijabli ili onih koje odgovaraju patternu stack level trenutne procedure, ili 0 za global scope pathname direktorija Tcl biblioteke lista svih local varijabli ili one koje odgovaraju patternu lista svih procedura ili one koje odgovaraju patternu ime datoteke koja se procesira ili NULL broj Tcl verzije lista svih vidljivih varijabli ili onih koje odgovaraju p.
info commands ?pattern? info exists variable info globals ?pattern? info level info library info locals ?pattern? info procs ?pattern? info script info tclversion info vars ?pattern?
Operacija koja se najee koristi je info exist. Ako se skripta eli pokretati na razliitim Tcl verzijama potrebno je testirati broj verzije i poduzeti razliite akcije u vezi nekompatibilnosti izmeu verzija. Tcl shell programi sadre dnevnik naredbi koje su koritene. Dnevniku se pristupa i on se kontrolira naredbom history. Uz naredbu history dolazi termin event ID, to predstavlja index u dnevniku. Mogue je specificirati dogaaj sa negativnim indexom koji e
1198/1275
se izraunavati od kraja dnevnika. Npr. event 1 predstavlja proli dogaaj. Mnoge forme imaju event specifikator postavljen na 1 po defaultu. Tablica history history add command ?exec? history change new ?event? history event ?event? history nextid history redo ?event? Pregled osnovnih formi history naredbe skraeno za history info dodaj naredbu u history list, ako je exec specificirano izvri naredbu mijenja naredbu specificiranu sa event sa novom u naredbi history vraa naredbu specificiranu sa event vraa broj sljedeeg eventa ponavlja specificiranu naredbu
U praksi poeljno je iskoristiti mogunost skraivanja opcija koje dolaze uz naredbu history, pa ak i samu naredbu history. Za sve opcije postoje definirane jednoznane skraenice, a za naredbu je potrebno koristiti jedinstveni prefix. Neke od history operacija mogu mijenjati history listu. One zamjenjuju trenutnu history naredbu sa naredbom koja je vraena kao rezultat history operacije. Na ovakav nain ponaaju se operacije event, redo, substitute i words. Ovo ima smisla jer je poeljnije imati aktualnu naredbu u history, umjesto koritenja naredbe history da bi se dobila eljena naredba. Radi to efikasnijeg koritenja mogunosti koju prua history, ona je podrana dodatnom posebnom sintaksom (nisu sve history operacije podrane ovakvom sintaksom): !! !n !prefix !pattern ^old^new ponavljanje prole naredbe ponavljanje naredbe s brojem n ponavljanje zadnje naredbe koja poinje zadanim prefixom ponavlja zadnju naredbu koja odgovara pattern-u zamjenjuje old sa new u zadnjoj naredbi
Primjer
6.2.
1199/1275
% set a 5 5 % set a [expr $a+7] 12 % history 1 set a 5 2 set a [expr $a+7] 3 history % !2 19 % !! 26 % ^7^13 39 % !h 1 set a 5 2 set a [expr $a+7] 3 history 4 set a [expr $a+7] 5 set a [expr $a+7] 6 set a [expr $a+13] 7 history
1200/1275
Debugger
Koritenjem debug procedure u skripti mogua je kontrola output-a. Don Libes je izgradio Tcl debugger koji doputa definiranje tzv. breakpoints i prolaz kroz skripte interaktivno. Ovaj debugger zahtjeva modificirani Tcl shell jer koristi neto vie ugraenih naredbi koje ga podravaju, pa se podrazumjeva da su one ugraene ako se eli koristiti. Breakpoint se postavlja definiranjem patterna koji odgovaraju naredbama (pattern matching). Debugger definira nekoliko imena naredbi koje se sastoje od samo jednog znaka. Naredbe se definiraju samo kada je debugger aktivan, nije poeljno koristiti vlastite jednoznane naredbe zbog mogueg konflikta. Nain na koji se ukljuuje debugger odluuje aplikacija. Expect shell uvodi debugger kada se generira prekid s tipkovnice. Kada se nalazimo u promtu debuggera, komuniciramo s Tcl interpreterom i moemo iskoristiti bilo koju Tcl naredbu. Nema potrebe za definiranjem novih naredbi, upotrebljavamo kljunu rije set. Tablica s ?n? , n ?n? Naredbe debuggera naredbe koje se koriste za prolaz kroz skriptu, uzimaju opcionalni parametar koji odreuje koliko koraka se prolazi prije ponovnog zaustavljanja r w u ?level?, d ?level? b h izvrava trenutnu proceduru i zaustavlja se nakon to procedura vrati rezultat ispisuje call stack mijenjaju trenutni scope, uzimaju opcionalni parametar manipulacija nad breakpointom (set, clear, show) help
b ?-re regexp? ?if condition? ?then action? b ?-glob pattern? ?if condition? ?then action?
1201/1275
Breakpoint e se pojaviti ako je postavljen uvjet. Breakpoint moe sadravati neku akciju, nezavisno o uvjetu. Sam pattern je takoer opcionalan, pa je mogue defimirati breakpoint koji sadri samo uvjet ili samo akciju. Ako sadri samo akciju on e se okidati na svaku naredbu. Breakpoint se poziva prije nego se naredba izvri. Naredba bez ikakvih argumenata vraa listu definiranih breakpointa. Svaki breakpoint ima svoj ID. Brisanje se vri naredbom b N , gdje je N broj breakpointa. Tkinspect program je Tk aplikacija koja prua uvid u stanje ostalih Tk aplikacija. Prikazuje hijerarhiju procedura, varijabli, Tk widgeta. Program se koristi za debugiranje Tk aplikacija.
1202/1275
BIBLIOTEKE SKRIPTI
Biblioteke skripti sadre zajedniku kolekciju korisnih Tcl procedura kako bi bile koritene u vie od jedne aplikacije. Jedan od naina kako izgraditi veliku aplikaciju je koritenjem jedne kratke glavne skripte i biblioteke dodatnih skripti. Prednost ovakvog pristupa je u injenici da se nee uitavati itavi Tcl kod. Tcl kod dizajniran za upotrebu u biblioteci iziskuje odreena pravila kodiranja. Pravila se moraju potivati radi izbjegavanja konflikta izmeu imena u razliitim bibliotekama i u glavnoj aplikaciji, osim toga na taj nain je biblioteka laka za koritenje drugim korisnicima. Dva su osnovna pravila: 1. odrediti identificirajui prefiks za procedure u vlastitom pakiranju biblioteke. Ako se npr. definira prefiks Pref, tada e sve procedure koje sadri naa biblioteka poinjati sa Pref. Pravilo je dalje proireno na razlikovanje privatnih i izlaznih (exported) procedura. Izlazna procedura ima znak underscore nakon zadanog prefiksa (npr. Pref_init). Ovakve procedure je mogue pozivati iz glavne aplikacije ili drugih pakiranja biblioteka. Privatne procedure ne sadre underscore znak, a namjenjene su koritenju drugim procedurama u istom pakiranju. 2. Koritenje istog prefiksa nad globalnim varijablama koje se koriste u vlastitom pakiranju. Istim prefiksom odreujemo koje varijable pripadaju pakiranju i time izbjegavamo konflikt s drugim pakiranjima. Ako postoji potreba za exportom nekih kljunih varijabli iz vlastitog modula, za njihovo razlikovanje je takoer potrebno koristiti znak underscore. Ako postoji potreba za vie od jedne glob varijable, potrebno je i dalje potivati pravilo prefiksa. Vana naredba vezana uz Tcl biblioteku je naredba unknown. Svaki put kad interpreter naie na naredbu koju ne prepoznaje, poziva naredbu unknown zajedno sa naredbom koja nedostaje. Naredba unknown ve je implementirana u Tcl, programer ima slobodu da osmisli vlastiti mehanizam koji e rukovati unknown naredbama. Defaultna implementacija naredbe unknown moe se pronai u init.tcl datoteci Tcl biblioteke. Kako bi se ubrzalo pretraivanje naredbi koje nedostaju , unknown naredba koristi se indeksom. Prilikom stvaranja biblioteke skripte mora se generirati index koji e biljeiti koje su procedure definirane u biblioteci. Procedura auto_mkindex kreira index koji se pohranjuje u datoteci tclIndex koja se nalazi
1203/1275
u istom direktoriju kao i datoteke koje ine biblioteku skripte. Dodavanjem procedura ili mijenjanjem njihovih imena mora se izvriti i update nad datotekom tclIndex. Jedan od naina je ponovno stvaranje indexa ako se bilo to u biblioteci promijenilo od zadnjeg generiranja datoteke tclIndex. Za koritenje biblioteke skripte potrebno je informirati naredbu unknown gdje da trai. Ona koristi varijablu auto_path kako bi biljeila listu direktorija za pronalaenje nepoznate naredbe. Naknadno dodavanje u biblioteku zahtijeva update indexa (naredba Library_UpdateIndex). Ova metoda ne funkcionira ako ne postoji tclIndex datoteka zato to tada nepoznata procedura nije u mogunosti pronai implementaciju naredbe Library_UpdataIndex. Jednom kad se tclIndex kreira po prvi put to osigurava da svaka nova procedura koja se doda biblioteci bude ukljuena i u tclIndex datoteku. U praksi, ako se eli automatska promjena, korisno je ukljuiti datoteku Library_UpdateIndex direktno u aplikaciju kako bi izbjegli uitavanje iz biblioteke. Naredba unknown prua neke dodatne pogodnosti (automatsko izvravanje programa, naredba history, koritenje skraenih naredbi) koje se koriste u sluaju kada se naredbe unose direktno; one su onemoguene ako se Tcl shell ne koristi interaktivno.
1204/1275
TK OSNOVE
Tk predstavlja alat za windows programiranje. Prvotno je bio dizajniran za Xwindow sustav. Tk dijeli neke zajednike koncepte s ostalim windows alatima. Tk omoguuje da setom Tcl naredbi kreiramo widget-e, tj. njima manipuliramo. Widget predstavlja prozor u posebno oblikovanom grafikom suelju (GUI). Termin widget i window esto se meusobno isprepliu. Tip widget podrava naredbene gumbe, scrollbars, menu i okvire za tekst. U Tk je ugraen i widget za ope namjene ucrtanja drawing widget. Takav widget naziva se canvas i podrava lake oblike crtanja poput linije, okvira i bitmapa. X window sustav podrava hijerarhiju prozora i to se takoer odraava na Tk naredbe. Hijerarhija prozora za aplikaciju znai da postoji primarni prozor, a unutar tog prozora moe postojati odreeni broj djece prozora. (children windows). Prozori djeca mogu sadravati nove prozore itd. Widgeti se nalaze pod kontrolom geometry manager-a, koji kontrolira njihovu veliinu i poloaj na ekranu. Njih postoji nekoliko vrsta. Zajedniko svima njima je da koriste frame widget okvirni widget kao spremnik za sve ostale. Dakle, kreira se jedan ili vie widgeta, a zatim se smjetaju unutar okvira pomou geometry managera. Aplikacija koja se bazira na Tk ima tijek programa kojeg pokreu dogaaji (event). Tcl naredbe se pridruuju dogaajima koritenjem naredbe bind. Tk widgeti se meusobno povezuju po defaultu (default binding), pa nije potrebno dodatno programiranje. Veze izmeu dogaaja dijele se na: global bindings, class bindings i instance bindings. Hijerarhija u povezivanju kontrolira se naredbom bindtags. Naredbom after mogue je urediti da se dogaaji pojavljuju nakon definiranog perioda vremena. Koncept koji se vee uz povezivanje je focus. U bilo koje vrijeme, jedan od widgeta ima input focus i dogaaji tipkovnice se upuuju na njega. Postoje dva openita pristupa fokusiranju: fokusiranje widgeta na kojeg pokazuje mi ili eksplicitno postavljanje fokusa na odreeni widget. Tk omoguuje naredbama da mijenjaju fokus. Osnovna struktura Tk skripte zapoinje stvaranjem widgeta i njihovim rasporeivanjem pomou geometry managera, zatim vezivanjem akcija uz widgete. Nakon to interpreter procesira naredbe koje inicijaliziraju korisniko suelje, event loop se ubacuje i aplikacija moe zapoeti.
1205/1275
Ako se wish koristi interaktivno to e rezultirati kreiranjem i prikazom praznog glavnog prozora koji predstavlja prompt komandnu liniju. Iz ovakvog suelja mogue je postupno izgraditi Tk suelje.
Hello world u Tk
Primjer 8.1. Hello world u Tk
#!/usr/local/bin/wish -f button .hello -text Hello \ -command {puts stdout Hello, World!} pack .hello -padx 20 -pady 10
Ovaj kod od nekoliko linija kreira naredbeni gumb koji ispisuje poruku, nakon to se klikne na njega. Iznad widgeta naredbenog gumba nalazi se naslovna traka koju kreira window manager. Prva linija koda identificira interpreter za skriptu. Ova specijalna linija je neophodna ako se skripta nalazi u datoteci koja e se koristiti kao ostale datoteke unix naredbi. Zastavica f je zahtijevana u verzijama Tk prije 4.0. U mnogim Unix sustavima itava prva linija je ograniena na 32 znaka. Naredba button kreira naredbeni gumb ije ime je .hello. Natpis na gumbu je Hello a naredba vezana za gumb je puts. Naredba pack definira gdje e se gumb nalaziti na ekranu. Uz nju su navedeni dodatni parametri padx i pady koji odreuju veliinu slobodnog prostora oko gumba. Posljedica je prikaz glavnog prozora koji je smanjen do te mjere da sadri samo gumb i definirano mu proirenje.
1206/1275
Imenovanje Tk widgeta
Tk koristi sustav imenovanja za widgete, koji reflektira njihovu poziciju u hijerarhiji widgeta. Root hijerarhije je glavni prozor aplikacije i njegovo ime je jednostavno .. Slino pravilima imenovanja za direktorije u Unixu gdje je root direktorij nazvan / a zatim se taj znak koristi za daljnja razdvajanja. Tk koristi . na isti nain. Svaki widget koji je dijete glavnom prozoru je imenovan na nain slian ovom: .foo. Dijete widgwet od .foo bio bi recimo .foo.bar itd. Postoji i jedan dodatak uz sustav imenovanja. Naime, ako se suelje mijenja to moe rezultirati promjenom pozicije u widget hijerarhiji pojedinih widgeta kojima se tada mora mijenjati ime. Ovo se moe izbjei koritenjem varijabli u koje se spremaju imena vanih widgeta.
Konfiguriranje Tk widgeta
Za specifikaciju atributa widgeta koriste se parovi argumenata. Imena atributa zapoinju crticom -, npr. text (sljedei argument je vrijednost tog atributa). ak i najjednostavniji Tk widget moe imati desetak ili vie atributa, dok oni sloeniji mogu imati i vie od dvadeset atributa. Prednost kod Tk-a je potreba za specificiranjem samo onih atributa koji ne zadovoljavaju defaultne vrijednosti. Svaki primjerak widgeta podrava operaciju configure (skraeno config) koja je u stanju mijenjati atribute ili vriti query nad njima. Sintaksa operacije config koristi iste parove argumenata koritene prilikom kreiranja widgeta. Tako je npr. mogue promijeniti boju pozadine naredbenog gumba nakon to je on ve kreiran i postavljen na ekran:
Ako se eli izvriti query nad trenutnom vrijednou atributa, izostavlja se vrijednost na kraju:
Atributi widgeta mogu se redefinirati bilo kada, ak i tekst i naredba koji su postavljeni u vrijeme kada je gumb kreiran:
1207/1275
Tk naredbe
Naredbe koje se koriste u Tk mogu se podijeliti u dvije grupe: 1. Naredbe koje kreiraraju widgete 2. Naredbe koje manipuliraju widgetima i pruaju odgovarajue funkcije (input focus, event binding, geometry managment) Tablica button checkbutton radiobutton menu canvas label entry message listbox text scrollbar frame toplevel Pregled osnovnihTk naredbi za kreiranje wdgeta kreira naredbeni gumb kreira toggle gumb koji je linkan na Tcl varijablu kreira radio gumb kreira menu kreira canvas (podrava linije , bitmape...) kreira jednolinijski tekst label (read only) kreira widget za jednolinijski unos teksta kreira vielinijsku tekstualnu poruku kreira scrolling text widget kreira text widget openite namjene kreira scrollbar koji je linkan u drugi widget kreira widget koji je spremnik za widgete kreira okvir koji predstavlja novi top level X window
Pregled osnovnihTk naredbi za manipulaciju widgeta izvrava naredbu nakon odreenog perioda vremena zvuni signal vezanje Tcl naredbe na X event kreiranje binding klasa, kontrola manipulira sa X clipboard brie widget povezuje Tcl naredbe sa file deskriptorima
1208/1275
kontrolira input focus uzima input focus od drugih widgeta pristup Xresources bazi packer geometry manager placer geometry manager alje Tcl naredbu u drugu Tk aplikaciju query internal Tk state background errors query window state poziva window manager
1209/1275
Ovo suelje sastoji se od dva gumba, Run It i Quit, entry widgeta u koji se unosi naredba i text widgeta za prikaz rezultata izvravanja unix programa. Skripta izvrava program kroz pipeline.
Primjer
# Set window title wm title . ExecLog # Create a frame for buttons and entry.
button .top.quit -text Quit -command exit set but [button .top.run -text "Run it" -command Run] pack .top.quit .top.run -side right
# Create a labeled entry for the command label .top.l -text Command: -padx 0 entry .top.cmd -width 20 -relief sunken \ -textvariable command pack .top.l -side left pack .top.cmd -side left -fill x -expand true
# Set up key binding equivalents to the buttons bind .top.cmd <Return> Run bind .top.cmd <Control-c> Stop focus .top.cmd
# Create a text widget to log the output frame .t set log [text .t.log -width 80 -height 10 \ -borderwidth 2 -relief raised -setgrid true \ -yscrollcommand {.t.scroll set}] scrollbar .t.scroll -command {.t.log yview} pack .t.scroll -side right -fill y pack .t.log -side left -fill both -expand true pack .t -side top -fill both -expand true
# Run the program and arrange to read its input proc Run {} { global command input log but if [catch {open "|$command"} input] { $log insert end $input\n } else { fileevent $input readable Log $log insert end $command\n
1211/1275
$but config -text Stop -command Stop } } # Read and log output from the program proc Log {} { global input log if [eof $input] { Stop } else { gets $input line $log insert end $line\n $log see end } } # Stop the program and fix up the button proc Stop {} { global input but catch {close $input} $but config -text "Run it" -command Run }
1212/1275
ZAKLJUAK
Tcl ima ulogu jezika kojim se konfiguriraju i izgrauju aplikacije. Tcl je kao skriptni jezik pogodan za automatiziranje rutinskih poslova. Koritenjem Tcl interpretera mogue je izgraivanje aplikacija kao niz jednostavnih operacija sastavljenih skriptom na nain kako to najvie odgovara odreenim potrebama. Doputena je kontrola nad aplikacijom od strane drugih programa, inei aplikacije jo funkcionalnijim. Ono ime se Tcl interpreter razlikuje od drugih shell-ova je sposobnost njegovog ugraivanja u aplikacije. Tcl se pokree na vie platformi pa tako postoje verzije za UNIX, Windows i Macintosh. Povrh svega Tcl je besplatan.
1213/1275
DISTRIBUCIJA LINUXA/UNIXA
(Verzije linuxa/ unixa danas u upotrebi)
1214/1275
UVOD
Distribucije su zapravo gotovi paketi programa koji ine cjeloviti operativni sustav. Dakle, kada govorimo o distribucijama, mislimo na odreeni skup programa i koncepata koji ine operativni sustav. Ovaj dio teksta namijenjen je poetnicima Linuxa, tj. savjet kako odabrati Linux distribuciju. Za poetak najbolje je odabrati distribuciju po openitoj potrebi korisnika. Svaka distribucija je kompletni operacijski sistem, ukljuujui Linux kernel i sve utilitie te razne programe koji su potrebni te spremni za instalaciju i upotrebu. Veina distribucija ukljuuje na tisue programskih paketa, jednostavnih grafikih suelja, office programa i igrica. Postoje razliite Linux distribucije, od jednostavnih do punerukeposla distribucija. Sa aspekta novopeenih korisnika, najsigurnije je krenuti od jednostavnih koje emo nekoliko naknadno obraditi, a dodatne informacije o instalaciji, vidjeti na stranici Linux Documentation Project te listu ostalih distribucija koja se tjedno osvjeava na http://lwn.net. Prije samog odabira distribucije, dobro je paljivo proitati opis same distribucije te je usporediti s vlastitim potrebama. Svaka distribucija je namijenjena posebnom tipu korisnika. Znai, neke su optimalne za funkciju kao serveri, neke optimalne za igrice te neke su optimalne za desktop i office upotrebu.
1215/1275
MALO O LINUXU
Linux je slobodan i besplatan operativni sustav slian Unixu. Linux je stvoren i razvijan ujedinjenim snagama tisua hakera entuzijasta irom svijeta povezanih putem Interneta. Linux je objavljen pod GNU GPL licencom, to znai da je njegov izvorni kod dostupan svima. Svi GNU programi koji su takoer potrebni da bi cijeli sustav radio su takoer pod slobodnom licencom, a tako i mnogi drugi programi. Zahvaljujui ovome, razliiti programeri razvijaju puno razliitih "distribucija" Linuxa, od kojih svaka ima neke posebnosti, iako su sve jednako funkcionalne. Najpoznatije su Red Hat, Debian, Slackware, SuSE i Mandrake. Linux se moe instalirati i koristiti na mnogim platformama, raunalima baziranim na Intelovim i slinim ( x386 ) procesorima, na Alphama, Motorola 68K procesorima, PowerPCu, Macu, Atariu, Amigi i ostalima. Prvi sustav koji bi se, u retrospektivi, s pravom mogao nazvati Unixom, nastao je 1969. u Laboratorijima AT&T-a, to je i bilo razlogom zato je AT&T drao licencu na samo ime Unix dugo vremena, pa su drugi proizvoai iz razloga copyrighta "izmiljali" svakakva imena, ili bi se Unix pisalo kao Un*x... AT&T danas za pria nije osobito bitan, ali zbog sveg ovog se Unix, pisan u jednini, vie smatra kao neka "opa imenica", dok govorei o konkretnim operativnim sustavima treba govoriti o Unixima, u mnoini. Linux je jedan od Unixa, besplatan i zadnjih godina jedan od najpopularnijih. Komercijalne Unixe proizvode mnoge informatike tvrtke - HP (HP-UX), IBM (AIX), Sun (Solaris), Novell (UnixWare), SCO, Digital... Linux nije jedini besplatan Unix - prije njega to je bio takozvani FreeBSD - koji se nastavio razvijati i usporedo s Linuxom, ali nikad nije zadobio niti djeli njegove popularnosti, a u zadnje vrijeme i neki proizvoai komercijalnih Unixa poinju nuditi besplatne licence odreenim skupinama korisnika, oito potaknuti Linuxovim uspjesima. Linux je nastao 1991. - u slobodno vrijeme, iz hobija, rad na Linuxu zapoeo je Linus Torvalds, tada student na sveuilitu u Helsinkiju. Linus je u meuvremenu postao guru i
1216/1275
boanstvo za prilian broj sljedbenika Linuxa koji u njemu vide protuteu ulozi kakvu ima Bill Gates. Linus se pravda kako je po njegovom izvorno ime daleke 1991. trebalo biti "Freax" (Free kao besplatno + X, po grafikom suelju Unixa), ali je administrator FTP sitea sveuilita u Helsinkiju, preko kojega su se prve beta verzije distribuirale zakljuio da je to nakazno ime - to i jest - i vratio ga u Linux, to je bila radna verzija imena za osobnu uporabu (dotad, a otad i javnu). Torvalds je 1991. na Internet, preko maloprije spomenutog FTP sitea, izbacio prvu javnu verziju (0.02 - malo kada smo uli za nii broj verzije), i rad se, uz regrutiranje sve veeg broja pristalica, ali stalno pod Torvaldsovim vodstvom i nadzorom, nastavio do 1994., kad je konano izbaena verzija 1.0 Linuxova kernela. Danas je Linuxov kernel ve "zagazio" u 2.x verziju, no neka vas nizak broj ne zavara da je Linux komercijalan sustav, poput Windowsa NT ili NetWarea, brojana oznaka verzije bez problema bi bila "napuhana" na 4.0, 5.0, 8.0 ili koliko bi ve bilo potrebno.
1217/1275
GNU POKRET
GNU projekt je jedan projekt koji je poeo jo 1984. Pokreta mu je Richard M. Stallman, poznatiji kao autor popularnog editora Emacs. Cilj projekta je stvoriti potpuno slobodan, kvalitetan Unix-like operativni sustav. Ovdje rije slobodan znai da je sustav otvoren i dostupan svima, zajedno s izvornim kodom. GNU projekt je do sada dosta napredovao jer u njemu sudjeluje nekoliko tisua programera koji bez novane naknade ( volonterski ) rade programe koji su potrebni njihovom operativnom sustavu. Jedina komponenta koja nedostaje je kernel (postoji GNU kernel koji se zove Hurd, ali njegov razvoj je dosta usporen, posebno u zadnje vrijeme) i tu uskae Linux. Kada je student Linus Torvalds na Sveuilitu u Helsinkiju 1992. napravio vlastiti kernel, to je radio iz istog hobija. Prikljuili su mu se mnogi programeri i ve 1993. izala je nova, radna verzija Linux kernela. Tada su ljudi iz GNU projekta uvidjeli kako bi bilo dobro uzeti Linux kernel i uklopiti ga s GNU programima jer njihov se kernel Hurd razvijao sporo. Nakon nekoliko godina rada i razvoja nastao je sustav kakvog danas poznajemo pod (pogrenim) imenom Linux.
1218/1275
1219/1275
1220/1275
Debian GNU/Linux
Debian GNU/Linux, zapoeo je Ian Murdock 1993., te je ishod napora developera da stvore nekomercijalnu distribuciju visoke kvalitete, moda ak i najiu formu od idealista koji su zapoeli free software movement. Debian Linux je lako nadogradiva distribucija, uglavnom sastavljena od softvera slobodne distribucije iz vie razliitih izvora i sustava. Jedina distribucija koju zajedno razvijaju na stotine developera iz itavog svijeta, u istom duhu kao i Linux i druge operacijske sustave otvorenog izvornog koda. Vie od 400 odravatelja radi na vie od 1500 paketa i poboljava Debian Linux. Prednosti Debian Linuxa su njegova nadogradivost, dobro definirane meuzavisnosti paketa i otvoren razvoj. Profinjeni sustav za pronalaenje greaka omoguava korisnicima lako prijavljivanje greaka i sigurnosnih propusta s kojim se zatim Debian zajednica brzo obraunava. U bilo koje vrijeme procesa razvitka, tri su osnovna djela u glavnom direktoriju stabilno, testiranje i nestabilno (takoer poznat kao sid). Kada se pojavi nova verzija paketa, smjetena je u djelu nestabilnoi eka prvo testiranje. Ako proe dalje, paket se pomie u sljedei dio testiranja, gdje opet prolazi rigorozno testiranje koje moe potrajati mjesecima, nakon toga se proglaava stabilno stanje. Kao rezultat gore navedenog, ova distribucija je moda ak i najstabilnija i najpouzdanija, a sigurno dinamina, jer izdanja se zamrzavaju svaka tri mjeseca, a FTP arhive dnevno osvjeuju.
Gentoo Linux
Gentoo Linux je stvoren od Daniela Robbinsa, prijanjeg Stampede Linux i FreeBSD developera. Gentoo Linux je izvorno-bazirana distribucija. Za razliku od uobiajenih distribucija, Gentoo ne isporuuje ve kompajlirane pakete, nego samo izvorne kodove aplikacija, koje se onda izravno na korisnikom sustavu prilagoavaju i kompiliraju. Gentoo je prvi put u stabilnoj verziji puten u oujku 2002.
1221/1275
Prednost ove distribucije je naime to to raspolae vlastitim upraviteljem programskih paketa, koji nadilazi osnovno upravljanje s RPM i DEB-paketima. Pod nazivom "Portage" objavljen je sustav za upravljanje paketima, osmiljen kao port-sustav u najboljoj tradiciji BSD-ovih portova. Sama distribucija pretpostavlja tono odreeno suelje, te zahtijeva i stanoviti stupanj predznanja i iskustva u radu s GNU/Linuxom. Isto tako, updating nove verzije se svode na jednostavne komande, te programski paketi se dre u centralnom spremitu koji su obino najnovije verzije. S druge strane, instalacija Gentoo-a itave distribucije sa posljednjim grafikim desktopima, multimedijom i razvijakim alatima je dosadan i dug proces (nekoliko dana i na najbrim raunalima).
SuSE
SuSE je jo jedna kompanija fokusirana na desktop, korisnicima svih razina, od poetnika do strunjaka, nudi brz i lagan ulaz u svijet Linuxa i Unixa. Mogunosti kao to je instalacija s CD-ROM-a pomou izbornika, modularna disketa za dizanje sustava, prirunik od 400 stranica i S.u.S.E-ov alat za administraciju sustava, YaST (alat za instaliranje i administriranje koji konfigurira mreu), omoguavaju brzo instaliranje i poetak rada u Linuxu, te nastavak rada bez problema. S.u.S.E. takoer nudi niz podranih X servera koji podravaju najnovije grafike kartice. Dokumentacija koja dolazi sa produktima, je ubrzo oznaena kao najkompletnija, najtemeljitija i najupotrebljiva na daleko. Distribucija je postigla vano trite u Europi i Srednjoj Americi, no ne i u Aziji i u drugim dijelovima svijeta. Razvoj SUSE-a je nastavio Novell krajem 2003. SUSE svoju distribuciju razvija iza zatvorenih vrata, tako da javne bete nisu osigurane. Za testiranje imaju policu (pravilo) da software nije slobodan za skidanje jo dugo poslije verzija u prodaji. tovie, SUSE ne osigurava ni jednostavnu instalaciju ISO images, no profesionalno izdanje je dostupno za instalaciju putem FTP-a, inae oko 1-2 mjeseca poslije slubene verzije.
1222/1275
Slackware Linux
Slackware Linux, stvoren od Patricka Volkerdinga 1992., jest najstarija ivua Linux distribucija. Ova distribucija ne nudi grafike konfigurirane alate, nego vie mogunosti sa tekst-baziranim instajlerom. Gdje ostale distribucije se trude razviti easy-to-use suelje za mnoge uobiajene utilitie-e, Slackware ne nudi odravanje i sve se jo radi kroz konfiguracijske fajlove. Ba zbog toga, Slackware je jedina preporuljiva distribucija za one koji ele nauiti vie o Linuxima. Nita manje zbog toga, Slackware ipak ima magini utjecaj na mnoge. Ova distribucija je uvelike stabilna i sigurna vrlo povoljna za razvijanje posluitelja. Iskusni Linux administratori smatraju da ova distribucija ima manje bagova, jer koristi pakete prijanjih formi, bez previe in-house unapreivanja, to uzrokuje vee anse za nove bagove. Putanje novih verzija je dosta rijetko (jedanput na godinu), iako noviji paketi su uvijek dostupni za skidanje poslije slubenog putanja. Slackware distribucija je idealna za one koji su zainteresirani za unutarnje osobine Linuxa. Moda najbolja karakteristika ove distribucije je ako se naie na bilo kakav problem, treba pronai Slackware korisnika. Slackware korisnik e sigurno puno prije pomoi neko korisnici drugih distribucija.
Lycoris Desktop/LX
Lycoris je mala, vrlo komercijalna i poprilino ambiciozna distribucija. Osnovana je od Josepha Cheeka, koji je navodno uz jo etvoricu pokrenuo Redmond Linux, 2000., Redmond, savezna drava Washington, SAD. Dananji Lycoris si je uzeo za cilj sastavljanje jedne distribucije, koja e na kunim raunalima slijediti aktualne koncepcijske XP-trendove, te prema tome stvoriti easy-to-use distribuciju, koja bi olakala prelazak sa Windowsa u Linux i to omoguavala na to bezbolniji nain. Lycoris distribuciju prema tome korisnik moe koristiti slino kao i neko Windows-raunalu, koja nunost dodira korisnika sa samim operacijskim sustavom svodi na najmanju moguu mjeru, klonirajui tako My Computer i Network Neighborhood, kao i atraktivno grafiko suelje (boje koje korespondiraju s XP-predlokom), koje jako lii na Windows XP. Isto tako s druge strane ono to nedostaje su brojni alati i
1223/1275
programski paketi za razvoj programa na koje su korisnici naviknuti kod gotovo svih drugih Linux distribucija. Ova distribucija koja djelomice sadri elemente zasnovane na Calderinom OpenLinuxu, podrava Red Hat Packet Manager, tako da do stanovite mjere nema problema s integracijom ostalih paketa kojih Lycoris nema u svojoj ponudi. Treba jo napomenuti da samo godinudvije unazad trite jo nije bilo dovoljno zrelo za jedan Desktop-Linux, no ipak jednostavna funkcionalnost ne mogu prikriti injenicu, da distribucija zahtjeva jo podosta rada na njenom konanom oblikovanju. Tako da Lycorisov Desktop/LX je ocijenjen za poetnike vrlo dobar, pogotovo za prijelaze s MS Windowsa, no za naprednije korisnike ne zadovoljava.
Xandros Desktop
Xandros je kreiran od ostataka Corel Linuxa, sasvim uspjenog pokuaja pribliavanja Linuxa mnotvu 1999., ali naputen od kompanije kada je naila na financijske probleme. Xandros je kupio distribuciju u kolovozu 2001., te pustio prvu i jedinu verziju u listopadu 2002. Xandros Desktop je bez sumnje najpristupanija distribucija na tritu, te najbolja preporuka za one first-time Linux korisnike. Dok je broj aplikacija ukljuenih u distribuciju ogranien, developeri su ipak osigurali da taj broj radi savreno. Xandros se takoer pobrinuo za samo njihov fajl manager i ostale odgovarajue komponente. Dostupna su dva izdanja: Deluxe ($99) i Standard ($40), jedine razlike izmeu ova dva izdanja su nedostajanje CrossOver Offica i Plugin-a (kompaktni sloj koji omoguava pokretanje Microsoft Offica i ostalih Windows produkata na Linux) i NFTS particijskog alata (za Windows XP korisnike) kod jeftinijeg izdanja.
1224/1275
LindowsOS
Lindows.com je zapoeo Michael Robertson, u listopadu 2001., inae osniva i prijanji CEO od MP3.com - sitea koji je omoguavao (legalnu) kupovinu glazbe u MP3 formatu, te promovirao neovisne bandove, koji su preko njegovih stranica traili svoju publiku bez posredovanja izdavakih kua.. LindowsOS predstavlja najnoviji pokuaj dovoenja Linuxa na desktop scenu i njegovog pretvaranja u "pravu" alternativu Microsoftovim operativnim sustavima, emu bi trebala pomoi i njegova mogunost da pokree aplikacije pisane za Windowse. Prvo javno putanje LindowsOS je objavljeno u studenom 2002. pod imenom LindowsOS 3.0. Ova distribucija je zasnovana na distribuciji Linuxa pod imenom Xandros koja je, opet, zasnovana na uvenom Debianu. Osim osnovne distribucije, druga glavna komponenta sustava je WINE (Wine Is Not an Emulator) - emulator Windowsa ve koriten u slinim projektima, koji LindowsOS-u omoguuje pokretanje aplikacija pisanih za Windowse. Dodana je takoer i nova osobina nazvana Click'n'Run - mogunost instalacije softvera izravno s Lindows.com web-stranica, kao i pretraivanje, usporeivanje i kupovinu softverskih naslova koje nas zanimaju, poboljana instalacijska procedura - brzina i jednostavnost instalacije. Testne verzije (sneak previews, u terminologiji tvrtke) dostupne su, naime, tek odabranim lanovima Lindows Insider zajednice, formirane za pruanje podrke ovom projektu, iji lanovi za "upad" moraju platiti 99 USD. Ta svota im, meutim, ne osigurava i dobivanje testnih verzija LindowsOS-a, koje se nude tek nekolicini testera iz Insider programa, koje u tvrtki odabiru prema neobjavljenim kriterijima Malobrojni testeri koju su imali priliku vidjeti LindowsOS na djelu potvruju ono to se i do sada znalo o Wineu: Windows aplikacije i pod ovim sustavom rade sporo, loe i esto se rue. Kompanijina ogromna marketinka propaganda (glavni razlog tome jest Microsoftova tuba protiv tvrtke, zbog navodne "krae" registriranog naziva Windows), no to je rezultiralo da LindowsOS (i Linux) ubace meu glavne medije instalirane na novim raunalima prodanim diljem US-a i UK-a.
1225/1275
Caldera OpenLinux
Caldera isporuuje OpenLinux 1.2 kao tri proizvoda: OpenLinux Lite, OpenLinux Base i OpenLinux Standard. OpenLinux Lite besplatan je proizvod za iskuavanje (Calderin integrirani Desktop radi samo 90 dana -- potpuno licencirana verzija desktopa ukljuena je u proizvode Base i Standard). OpenLinux Lite moe se skinuti s Calderinog FTP servera ili za cijenu isporuke dobiti na CD-u. Napravljena je i za izdavae knjiga ili softvera koji tako mogu ponuditi stabilnu komercijalnu distribuciju uz svoje knjige ili programe. OpenLinux Base sadri sve to i Lite i potpun je Linux operacijski sustav, s jednostavnom instalacijom, integriranim Desktopom, Internet klijent i server komponentama i povezivou na Internet. OpenLinux Base ukljuuje i Netscape Navigator te potpunu dokumentaciju. OpenLinux Standard ukljuuje ono to je u Base, kao i vie vrhunskih, poznatih, komercijalnih programa (kao to je Netscape FastTrack Web Server, Netscape Navigator Gold Web browser i autorski alati, baza podataka ADABAS D, StarOffice za uredske poslove, Caldera OpenDOS te NetWare klijent i administracijski alati). Sada su dostupne sve tri verzije OpenLinuxa 1.2. Pomou Caldere OpenLinux vidjet ete cijeli novi svijet monog raunalstva, ak i mo Unix radne stanice na svom PC-u. Koritenjem Linux kernela, OpenLinux vam prua brzinu i stabilnost usporedivu sa sustavima koji kotaju tisue dolara. OpenLinux takoer nudi: Prava viezadanost zbog koje mnogo tekstualnih ili grafikih aplikacija radi istovremeno; nijedna aplikacija ne moe uzrokovati ruenje druge, kao kod manje robusnih sustava. Linux 2.0 kernel prua iznimno brz TCP/IP pristup Internetu, uz montane drivere za ureaje za najdjelotvornije koritenje mogunosti vaeg sustava. Jednostavna, brza instalacija s izbornicima i automatskim pronalaenjem vaeg hardvera ini instaliranje lakim na veini raunala. Ukljueni Vodi u zapoinjanju rada postupke opisuje korak po korak, uz upute ako naiete na probleme. Nijedan drugi Linux sustav nema tako potpuno, integrirano grafiko suelje s konfiguracijskim alatima i grafikim editorom. Njegove mone drag & drop sposobnosti dolaze podeene s tisuama ikona i opcija aplikacija. Desktop vam nudi prikladno mjesto za pohranu omiljenih programa i podataka kojima odmah moete pristupiti. Desktop vam prua:
1226/1275
Drag & drop pokretanje programa s podacima. Integrirani grafiki editor teksta. Lak pristup nizu monih alata za konfiguriranje sustava. Prilagodljivu plou s ikonama, promjenjiv izgled i mijenjanje drugih opcija. Moan pristup datotekama pomou drag & dropa ili grafikih dijaloga. Caldera je jedan od rijetkih distributera Linuxa koji nude podrku e-mailom i telefonom. Podrka korisnicima OpenLinux Base (samo e-mail) i Standard (telefon i e-mail) potpuna je (Standard korisnici imaju pravo na 5 poziva tokom prvih 30 dana). Za Lite nema tehnike podrke. OpenLinux Base i Standard isporuuju se s potpuno licenciranim verzijama Caldera Desktopa bez roka uporabe. OpenLinux Lite isporuuje se s verzijom Desktopa iji rok uporabe istie nakon 90 dana.
Faq
Potreban prostor na disku
Openito je za Linuxe potrebno oko 10Mb za minimalnu instalaciju, koja odgovara samo za isprobavanje Linuxa, te nita drugo. Tipina server instalacija, koja ukljuuje X Window System GUI, otprilike zauzima 80Mb. Za instaliranje manje Debian GNU/Linux platforme potrebno je od 500Mb do 1GB, koja ukljuuje kernel izvor koda, neto prostora za korisnike mape i swap particije. Za instaliranje komercijalne distribucije koja sadri desktop GUI okruenje, komercijalni word procesor i front-office, priblino potrebuje 15.1 GB prostora na disku, dok za full instalaciju Debian GNU/Linux distribuciju potrebno je i do nekoliko gigabajta prostora na disku.
1227/1275
Adresiranje vie od 64MB memorije, koja je kod veine standardnih kernela postavljena kao gornja granica. Vie o tome na: http://FAQ/Linux-FAQ/linux
Najbolja distribucija
Najbolje od bilo ega zavisi o potrebama korisnika. No meutim, diskusija na ovu temu esto se odvija na Usenet-u. esto ova tema je vatreni mamac, no govoriti openito gubitak je vremena. Licenca za besplatni software nije dovoljno ograniavajua, pa uz malo vie iskustva, mogu se obavljati vlastita testiranja.
BSD Unix
Poetak BSD-a
Pria o BSD-u, kao i danas najpoznatijim, besplatnim, verzijama istog, FreeBSD, NetBSD i OpenBSD-u poinje jo u studenom davne 1973-te godine, kada su Ken Thompson i Dennis Ritchie na 'Symposium on Operating Systems Principles' odranom na Purdue sveuilitu predstavili svoj rad o UNIX operativnom sistemu. Profesor Bob Fabry, sa
1228/1275
Berkeley sveuilita, jedan od prisutnih na konferenciji, bio je izrazito zainteresiran za kopiju UNIX operacijskog sistema radi eksperimenata na Berkeley sveuilitu. Dolaskom UNIX-a na Berkeley poeo je i rad na INGRES bazi podataka, koja je bila pretea jedne od najboljih baza podataka dananjice, Postgres-a. Prvu zvaninu distribuciju UNIX-a napravio je Bill Joy, autor vi-a (to je impliciralo i termcap), ovjek koji je znaajno unaprijedio tadanji Pascal interpreter, jedan od osnivaa Sun Microsystems-a i jedan od najveih UNIX hakera svih vremena. Od tog trenutka postoji ime BSD-Berkeley System Distribution. Ubrzo je slijedio i razvoj DARPA mree sa osnovom na Berkeley sveuilitu, ime je uslijedio i release 3BSD i 4BSD distribucija. Poslije izlaska BSD4.1 (koji se u prvom trenutku trebao zvati 5BSD, ali zbog problema vezanih sa imenom komercijalnog izdanja SystemV UNIX-a, Berkeley je opet morao uiniti odreene ustupke) uslijedila je pojava revolucionarnog BSD4.2 operacijskog sistema sa implementacijom TCP/IP protokola. Uskoro je, logino, poslije mnogih komplikacija, uslijedila BSD4.3 distribucija kao i MACH derivat, nakon ega je 1991. uslijedila i pojava 386/BSD operativnog sistema iji je razvoj predvodio Bill Jolitz, ali on nije bio u stanju sam ispratiti sve popravke bug-ova kao i sve promjene koje su vrene u originalnom BSD-u. Njegov rad bio je oivljen sa pojavom NetBSD-a, koji je u svojoj osnovi derivat 4.4BSD i 386/BSD-a. Ubrzo (1992. godine) su uslijedili i pravni problemi sa AT&T-om sa pojavom BSDi-a, prvog komercijalnog BSD operacijskog sistema, kao i gubitak prava na koritenje imena UNIX. Od tada su BSD i UNIX, kontradikcijsko, postali dvije razliite stvari. Tokom 90-tih godina polako je poela kristalizacija situacije vezana za BSD operacijske sisteme i na ovom mjestu bi spomenuli i razdvojili 3 glavne BSD distribucije koje su poele odvajati od glavnog stabla i koje su aktualne danas.
Distribucije BSD-a
NetBSD BSD operativni sistem baziran na BSD4.4 i 386/BSD operacijskom sistemu. Ime je dobio zato to je do 1998. godine rad na njemu bio vezan iskljuivo za Net, a komunikacija meu developerima je bila bazirana na chatu i mailu. Njegova glavna odlika je izuzetna portabilnost (pogledati www.netbsd.org), kompaktan sistem sa odlinim packaging sistemom, kao i velika pouzdanost. Njegova velika mana je nedostatak SMP podrke (ako ne raunamo nezvanine patcheve kao to je podrka za dvoprocesorske VAX maine), ali je to u neku ruku i logino, poto
1229/1275
je glavni cilj ove distribucije portabilnost, a ne striktna orijentacija ka malom broju hardverskih platformi (za razliku od FreeBSD-a). FreeBSD Drugi potomak 386/BSD-a, nastao 1993.godine razdvajanjem na dva projekta NetBSD i FreeBSD. Za razliku od NetBSD-a, FreeBSD se razvija za samo 2 arhitekture: i386 i alpha arhitekture. Pored dobrog security-a, odlikuje se i fantastinim performansama, kao i najboljom implementacijom TCP/IP stack-a to ga ini jednim od omiljenih izbora za web servere. U principu, FreeBSD je najpopularnija BSD distribucija i to, osim gore spomenutog razloga, i zbog toga to ima sjajno odraen ports sistem za update i odravanje sistema, kao i jako logino organiziran sistem u cijelosti (to je generalno odlika svih BSD baziranih operacijskih sistema). OpenBSD Najmlai BSD izdanak, nastao 1996. godine zahvaljujui loem karakteru Theo De Raadt-a jednog od originalnih developera NetBSD, koji je uslijed neslaganja sa ostatkom NetBSD developera odluio napustiti NetBSD projekt i zapoeti svoj, koji je nazvao OpenBSD. Zahvaljujui tome to ivi u Kanadi, bio je u prilici zaobii demokratsku 'USA crypto policies' i napraviti operacijski sistem sa izrazito jakim security-em, kao i sa kriptografijom integriranom u sam sistem, kao i neim to se zove proactive auditing, koji se bazira na konstantom 'eljanju' koda samog kernela i traenjem moguih exploit-a, pa se esto dogaa da mogui sigurnosni problem je ve otklonjen, prije nego to se on uope i otkrije. Svakako najimpresivniji operacijski sistem dananjice sa aspekta security-a.
1230/1275
Live CD distribucije
4.5.1 Knoppix
Razvijen od Klausa Knoppera, slobodno se moe rei da je Knoppix baziran na Debian distribuciji podigao standarde na novu razinu, pogotovo s automatskim hardware detekcijom tako da je mnoge komercijalne Linux distribucije posramljeno ostavio iza sebe.To je u cijelosti funkcionalna distribucija ve samim pokretanjem izravno s kompaktnog diska, ogromnog izbora software-a, dekompresija on-the-fly (900 paketa s nekih 2000 programa), mogunost koritenja i za spaavanje ve instaliranih sustava ili provjeru omreja, moe posluiti za demonstraciju Linuxa za one, koji ih jo nisu vidjeli kao test prije nabave. S druge strane, moe se u potpunosti koristiti kao Linux distribucija. Kojim se dobiva potpuno kompatibilan Debianov sustav s vrlo aktualnim paketima, bez zahtjevnosti i sloenosti uobiajeno originalne Debianove instalacije. Sustav je opremljen vrlo dobrim automatskim prepoznavanjem hardwarea i solidnom podrkom za mnoge grafike, zvune i mrene kartice, SCSI ureaje i ostalu periferiju, no i bez grafikih suelja ima to za ponuditi. Uinci i brzina sustava dakako mjerodavno ovise o koliini raspoloive radne memorije, brzini CD-pogona i radnim sposobnostima glavnog procesora.
1231/1275
Mandrake move
Nakon uspjeha Knoppixa danas najomiljenije ive distribucije Linuxa slijedio je niz drugih proizvoda koji su se zasnivali na istoj filozofiji: dati korisnicima potpunu distribuciju na samo jednom CD-u koju nije potrebno instalirati na disk, nego se moe pokrenuti izravno iz CD-ROM-a. U takav projekt upustio se nedavno i francuski Mandrake, s vrlo dobrim rezultatima... Mandrake Move je nastao jo prole godine i zasnovan je na prethodnoj generaciji Mandrakeove stolne distribucije Mandrake Linuxu 9.2 te mu stoga nedostaju neke od mogunosti i neki od programskih paketa koje e donijeti desetka - na prvi pogled najoitiji je nedostatak novog kernela (generacije 2.6). No ovo e malo kome zasmetati Move se ne koristi za serverske namjene ili kao distribuciju za radna mjesta zahtjevnih korisnika. Ono to je za korisnike daleko bitnije od najnovijeg kernela jesu jednostavnost upotrebe i pouzdana detekcija hardvera za to se Mandrake pobrinuo vie nego dobro. Usmjerenost krajnjem korisniku vidljiva je iz injenice da je Mandrake u ovu distribuciju uvrstio samo jedan program za svaku namjenu: jedno grafiko suelje (KDE 3.2), jedan uredski paket (OpenOffice.org 1.1), jedan web-browser (Konqueror) i tako dalje. Iz raznih testiranja (lanaka) saznali smo da detekcija osnovnih hardverskih komponenti (mi, tipkovnica, grafika kartica, zvuna kartica) je bila gotovo stopostotna. Problemi koje smo uoili veinom su se svodili na postavljanje previsoke ili preniske rezolucije grafikog suelja, to se moe izmijeniti davanjem odgovarajueg parametra pri pokretanju. Pokretanje traje nekoliko minuta i odvija se u dvije faze: prva je tekstualna koja podsjea na pokretanje nekog instalacijskog programa i koja traje vrlo kratko. Druga faza odvija se u grafikom suelju i traje due, prije svega zato to je interaktivna.
1232/1275
TABLICA KARAKTERISTIKA DISTRIBUCIJA DISTRIBUCIJA PREDNOSTI User-friendly, Prednosti graf. Mandrake konfiguracije, Velika tehnika podrka, NTFS particija Ogranieni produkti Na iroko se koristi, RedHat Fedora Core Odlina teh. potpora, Puno inovacija obuhvaaju free izdanje, Siromana multimedijska podrka 100% besplatan, lako nadogradiva distribucija, otvoren Debian razvoj, lako Nema puno inovacija kod instalacije, novih verzija Bezbolna instalacija Gentoo individualnih prog. paketa, esto putanje novih verzija Nudi brz i lagan ulazak u svijet Linuxa, izuzetna SuSE posveenost detaljima (dokumentacija), Dostupan samo u prodaji ili putem FTP instalacije, ukljuujui komponente s pravom RPM Nije besplatan, samo putem FTPa Duga i gnjavatorska sistem instalacija, povremena nestabilnost SRC Besplatan je DEB Besplatan je RPM Besplatan je MANE Nove verzije imaju greaka te su inicijalno dostupne samo za lanove MandrakeClub-a RPM Besplatno, sa zakanjenjem SPM DOWNLOAD
1233/1275
YaSTkonfiguracijski alati Stabilna distribucija, malo greaka, Slackware privren Unix principima (iriti i prilagoavati)
vlasnitva
Sva konfiguracija se podeava Text File editorom, limitirana hardverska detekcija TGZ Besplatan je
Dizajniran za poetnike, dobar File Xandros Manager i drugi korisni utiliti-i Brza i jednostavna instalacija, oneLindowsOS click instalacija programa Jednostavna Caldera OpenLinux instalacija, nijedna aplikacija ne moe uzrokovati ruenje druge Izuzetna portabilnost, kompaktan sistem, NetBSD velika pouzdanost Dobar security,
Skup, nedostupne testne verzije, osim ako se plaa pruanje podrke Za Lite nema tehnike podrke, jer rok upotrebe istjee za 90 dana RPM Nije besplatan DEB Nije besplatan
Nije besplatan
1234/1275
fantastini FreeBSD performansi, najbolja implementacija TCP/IP stack-a Najimpresivniji OS OpenBSD dananjice sa aspekta security-a Hardverska autodetekcija, pokree se Knoppix direktno s CD-a, bez potrebe za hard disk instalacijom Pokree se direktno s CD-a, jednostavna upotreba, pouzdana Mandrake Move detekcija hardvera
TGZ
Zasnovan na prethodnoj generaciji te mu stoga nedostaju neke od mogunosti i prog. paketa RPM Besplatan je
1235/1275
lanovi HULK-a zasluni su i za pokretanje te (ne uvijek redovno) odravanje domaeg linuksakog portala smjetenog na adresi http: //www.linux.hr/ te za nekoliko zanimljivih projekata predstavljenih u zadnje vrijeme. Od tih projekata izdvojili bismo HRID, prvu "pravu" hrvatsku distribuciju Linuxa (jo prije nekoliko godina postojao je MicroLinux - minidistribucija koju je takoer napisao domai autor). Distribucija je zasnovana na Mandrakeu, a sadri lokaliziranu verziju instalacijskog programa te dijela softvera. Na osnovi HRID-a nastale su jo dvije distribucije: HRID.school, predstavljen prije neto manje od godinu dana i namijenjen edukacijskim ustanovama, te HRID.office - uredska distribucija predstavljena u proljee ove godine, nastala u suradnji s tvrtkom Operacijski sustavi.
HRID
HRID je prva hrvatska distribucija. Distribucija je bazirana na Mandrake-u (8.1, cooker), te je gotovo cijeli rad koji je bio uloen u nju poslan upstream developerima. Za razliku od Mandrakea u HRIDu su izbaene razne kineske podrke i nehrvatski prijevodi, te dodani hrvatski korisni sadraj (howto-i, prijevodi, ...). Takoer je bilo u cilju da to sve stane na jedan CD. Dakle, office (u obliku Koffice-a), prevodnici (gcc, prolog, free pascal, ...), alat za net (browseri, icq, ftp, mail...), baze (PostgreSQL, MySQL), web razvoj (apache, php/perl sa podrkom za Psql/mysql...) i sve ostale aplikacije koje se nalaze samo na jednom CD-u. Iako trenutno postoji 1.0 verzija HRID-a, na FTP serveru se nalazi verzija 0.9. Razlike izmeu 0.9 i 1.0 nisu velike (samo malo noviji paketi + kozmetike promjene). Distribucija je namijenjena za one kojima je potreban office, te za one koji imaju programiranje u svom obrazovanju (c/c++, pascal, prolog, ...) - ukljuene su i razne imitacije poznatih Borlandovih suelja (xwpe) kao i druga inovativna suelja (motor) i za one koji ele raditi web programiranje (php/perl/python... sa posgtresql/mysql-om).... Ustvari, iskoristiti ju
1236/1275
moe svatko kome to odgovara. U distribuciju su takoer ukljuene mnoge nepravedno zapostavljene aplikacije. Kako autor naglaava u budunosti je planiran i dodatni CD od distribucije koja bi trebala sadravati dodatne killer aplikacije (OpenOffice, XINE (DivX/DVD player), Real Player, Kylix OE, Opera, Quake). Na umu treba imati ipak da je distribucija produkt gotovo samo jednog ovjeka, ali i to je poetak
1237/1275
Jednostavno... Linux
26./27.10.2004. na zagrebakom se Fakultetu elektrotehnike i raunarstva odrala strukovna konferencija Jednostavno... Linux. Taj dvodnevni dogaaj okupio je poprilian broj sudionika te pobudio veliko zanimanje u domaim IT krugovima. Prvi dan konferencije bio je rezerviran za predavanja, podijeljena u dvije grupe, jednu namijenjenu sadanjim, ali i buduim Linux korisnicima, a drugu administratorima Linux raunala. Svoja predavanja na konferenciji odrali su neki od najeminentnijih domaih, ali i stranih Linux strunjaka poput Davida McIntosha iz IBM-a, Marcella Marsa iz Multimedijalnog instituta, Matije Nalisa iz tvrtke Opus, Dobrice Pavlinuia iz Plive i drugih. Sudionici su mogli nazoiti praktinim radionicama poput seminara Roberta Sedaka s naslovom Abeceda otvorenog koda, kao i radionicu Ivana Gutina o administraciji Linux raunala. U isto vrijeme Linux administratori imali su prilike upoznati se s mogunostima povezivanja Sambe i LDAP baze u jedinstveni AAI te nauiti poneto o VLAN tehnologijama i L3 routingu u radionici koju su zajedniki odrali Dorian Ivani i Denis Lackovi.
1238/1275
1239/1275
Danas je situacija drugaija - zahvaljujui ubrzanom razvoju Linuxa i pripadajuih aplikacija unatrag nekoliko godina, veina strunjaka se danas slae da je Linux tehnoloki i te kako konkurentan, pogotovo na serverskom segmentu. Izvrsna interoperabilnost s desktop verzijama Windowsa o je jedna prednost koja serverskim verzijama ovog OS-a omoguuje zauzimanje to veeg trinog udjela. Na desktop sceni situacija je neto nepovoljnija, mada je napredak koji je na njoj postignut iznenadio mnoge. Aktualna verzija KDE-a je po mnogoemu funkcionalno ekvivalentna Windowsima, a izdanak StarOfficea, OpenOffice.org, je skup aplikacija koji oduevljava i recenzente navikle na daleko moniji Microsoftov uredski paket. Novije verzije distribucija sve se jednostavnije instaliraju i koriste - moda i dalje ne dovoljno jednostavno za kune korisnike, no dovoljno jednostavno za informatike odjele u tvrtkama. Osim nabrojanih faktora, sve veem profiliranju Linuxa pridonosi i polako odumiranje klasinih Unixa i sve vea dominacija Intelovog i Intelu kompatibilnog hardvera u serverskom segmentu.
1240/1275
KRONOLOGIJA LINUXA
1991. Linus Torvalds izdaje prvu javnu verziju (0.02) Linux kernela nastalog kao "projekt iz hobija", bez ikakvih pretenzija za imalo ozbiljnije koritenje. 1992. U razvoj Linuxa ukljuuju se neovisni programeri, a godinu dana kasnije pojavljuju se prve distribucije. 1994. Izlazi Linux 1.0, prva "finalna" verzija, koja donosi napredni TCP/IP stack i stvara podlogu uspjenom serverskom OS-u. 1996. Izlazi Linux 2.0. Pojavljuju se prva grafika okruenja i prve naprednije aplikacije za Linux. 1998. Pojavljuju se KDE i GNOME. Linux igra ulogu u internetskom boomu kao jedan od najkoritenijih serverskih OS-ova i kao mamac za neovisne investitore. Kanadski Corel, tada jo uvijek jako ime u softverskom svijetu, objavljuje kako e prenijeti sve svoje aplikacije na Linux i izdati vlastitu distribuciju. Svatko tko je netko (osim Microsofta...) najavljuje svoju podrku Linuxu u nekom obliku. 1999. Red Hat Linux i VA Linux izlaze na burzu, uetverostruujui, odnosno uosmerostruujui svoju trinu vrijednost u prvom danu trgovanja. Na burzu izlaze i drugi, a investitori se otimaju za tvrtke koje imaju bilo kakve veze s Linuxom, troei novac na sve strane. Pojavljuje se OpenOffice.org, a kernel 2.4 blii se svojoj finalizaciji. Oracle ulae znaajna sredstva u razvoj svojih aplikacija za Linux. 2000. VA Linux za 800 milijuna dolara kupuje mreu siteova posveenih Linuxu. Caldera za 91 milijun USD kupuje starosjedioca na Unix sceni - posrnuli SCO. Pojavljuju se prvi znakovi recesije i sloma dot-com ekonomije, a do kraja godine sa scene iezavaju mnoge tvrtke koje su se bavile Linuxom. 2001. Recesija je u punom zamahu. Propadaju mnoge tvrtke koje se bave Linuxom, preivjeli smanjuju obim poslovanja i otputaju radnike. Corel prodaje svoj odjel za razvoj
1241/1275
Linuxa Xandrosu. Unato svemu tome, Linux biljei uspjehe - sredinom godine se kratko vrijeme isporuuje na gotovo treini novih servera. Michael Robertson pokree Lindows.com - tvrtku iji je cilj dovesti Linux na raunala kunih korisnika. Pojavljuje se OpenOffice.org besplatni uredski paket zasnovan na Linuxu. 2002. Red Hat Linux biljei prvi profit. Caldera, SuSE, Connectiva i TurboLinux pokreu inicijativu UnitedLinux, iji je cilj stvoriti unificiranu distribuciju za serverske primjene. Krajem godine Caldera mijenja ime u The SC0 Group. AMD demonstrira snagu svojih 64-bitnih procesora koristei Linux. Europska komisija naruuje studiju o isplativosti prelaska IT infrastrukture dravne uprave na Linux. Hewlett-Packard ostvaruje 2 milijarde dolara prometa na proizvodima i uslugama vezanim uz Linux, IBM 1,5 milijardu (od toga oko pola milijarde ini isti profit). Microsoft mijenja licencne uvjete i cijene za svoj serverski i uredski softver, to mnoge potie da razmisle o prelasku na Linux. 2003. The SCO Group podie tubu protiv IBM-a, optuujui ga za neovlateno koritenje SCO-ovog intelektualnog vlasnitva i njegovo prenoenje u Linux kernel, traei milijarde dolara odtete. Red Hat Linux nastavlja s profitabilnim kvartalima. Gartner predvia da e Linux do kraja godine biti instaliran na desetak posto novoisporuenih servera, to ini najvei udio u ovom trinom segmentu na godinjoj razini do sad. Gradske uprave nekoliko njemakih gradova, ukljuujui Munchen, objavljuju kako e u potpunosti migrirati na Linux. Nekoliko velikih korporativnih korisnika, ukljuujui australsku Telstru, razmilja o prelasku na Linux i StarOffice na desktopu zbog visokih cijena Microsoftovih proizvoda. Ford i Audi poinju s koritenjem Linuxa. Reuters se prebacuje na Linux u poslu vrijednom navodno 200 milijuna USD kroz pet godina. Linux nalazi svoju primjenu u clusterima, superraunalima i radnim stanicama. Izlaze nove verzije KDE-a, OpenOffice.orga i Sambe. lzlazi kernel 2.6. Izlaze HRID.office, uredska distribucija Linuxa za hrvatsko trite, s prevedenim programima i spellcheckerom na hrvatskom, te Knoppix - inovativna distribucija koja korisnicima omoguuje isprobavanje Linuxa bez instaliranja na raunalo.
1242/1275
Vani linkovi:
www.distrowatch.com www.bsd.org www.openbsd.org www.netbsd.org www.debian.org www.slackware.com www.linux-mandrake.com www.redhat.com www.fedora.redhat.com www.gentoo.org www.suse.com www.lycoris.com www.xandros.com www.linspire.com www.knoppix.org www.mandrakesoft.com/products/mandrakemove www.linux.hr www.openlinux.org
1243/1275
Saa Protulipac
Kompajliranje kernela
1244/1275
UVOD
Linux
Linux je operativni sustav nastao kao inicijativa g. Linusa Torvaldsa zapoeta 1991. godine. On je prvobitno zamislio projekat kao skroman izdanak Minixa, operativnog sistema kojeg je napisao Andrew S. Tanebaum. Budui da Linux duguje mnogo svom prethodniku UNIX-u, moglo bi se rei da je Linux zapoet davno prije, nekoliko desetljea ranje, tonije 1969. godine kada je UNIX kao istraivaki projekt zapoet u labaratorijima Bell kompanije AT&T. Linus Torvalds je napravio revolucionaran korak kada je izvorni kod svog projekta stavio na Internet i omoguio svakome tko eli da se pridrui razvoju. Danas Linux predstavlja jezgra, tj. kernel operativnog sustava koja korespondira sa mnogobrojnim uslunim programima bez kojih bi rad bio nemogu. Svi ti programi su veinom kompatibilni sa svim inaicama UNIX-a, pa iz svega navedenog gotovo bi se moglo rei da je Linux jedna od inaica UNIX-a.
Kernel
Kao to sam ve napomenuo, temeljn dio Linuxa je kernel tj. jezgra operativnog sustava koja je uitana u memoriju raunala i predstavlja kariku koja povezuje hardverske komponente (procesor, diskove itd.) sa mnogobrojnim uslunim programima na ijoj strani se nalaze korisnici. Iako nije jedini, vrlo je vaan dio Linuxa operativnog sustava (OS) i zato mora biti ispravno podeen i prilagoen, jer o njemu ovisi ispravnost i stabilnost rada svih hardverskih i softverskih komponenti raunala. Danas je izvorni kod Linux-ovog kernela dostupan svakome preko interneta to nam omoguava da ga preuzmemo, maksimalno prilagodimo i ugradimo u na Linux operativni sustav.
1245/1275
1246/1275
1247/1275
Kad verzija kernela 2.5.x postane dovoljno stabilna za upotrebu, ona se preimenuje u prvu slijedeu stabilnu verziju, u ovom sluaju to bi bila 2.6.0 koja nastavlja dalje sa razvojem. Nestabilne verzija kernela je experimentalna i slui za testiranje nekih novih programskih rjeenja, podrka za hardver, posjeduju vie noviteta, no nije preporuljiva za koritenje jer moe uzrokovati nenadana ruenja operativnog sustava, gubitke podataka ili neoekivana ponaanja raunala. Nasuprot tome stabilne verzije kernela dobro su testirane, posjeduju minimalan broj bug-ova i kao takve preporuljive su za upotrebu. Mada bi sve stabilne verzije kernela trebale biti jednako kvalitetne, praksa pokae da su neke od njih "stabilnije" od drugih. Upravo takve verzije kernela esto koriste poznatije distribucije Linuxa unato tome to je u vrijeme njihovog izlaska posojala novija verzija.
1248/1275
Ili na stranicam namjenjenim za pretraivanje programskih paketa, npr: http://www.rpmfind.org U veini sluajeva neemo biti zadovoljni ponudom (obino nema novijih inaica kernela), pa je onda najbolje otii na stranicu http://www.kernel.org gdje emo pronai sve do sada izdane verzije kernela. Tu emo pronai izvorni kod arhiviran i komprimiran u obliku *.tar.gz ili *.tar.bz2 datoteka. Navedena stranica sadri i dosta linkova vezanih uz razvoj i koritenje kernela.
1249/1275
1250/1275
1251/1275
izmjene direktno na datotekama izvornog koda. Za nadogranju izvornog koda kernela verzije 2.4.25 na verziju 2.4.28 trebamo imati sve patcheve koji su u meuvremenu izali, konkretno: patch-2.4.26.bz2 patch-2.4.27.bz2 patch-2.4.28.bz2 Naravno umjesto ovih moemo koristiti i patcheve sa .gz ekstezijom. Prilikom patchiranja uvijek patchiramo redom na prvu slijedeu verziju kernela (verzije se ne smiju preskakati). Postupak patchiranja izvornog koda kernela sa verzije 2.4.27 na verziju 2.4.28 bi izgledao ovako: 1. U direktorij iznad direktorija u kojem je izvorni kod kernela (tj. u direktorij /usr/src ako se kernel nalazi u direktoriju /usr/src/linux-2.4.27) treba kopirati patch datoteku, patch se nalazi u direktoriju npr. /root/source: # cp /root/source patch-2.4.27.bz2 /usr/src Naravno, umjesto /root/source treba staviti putanju do mjesta gdje nam je datoteka za patchiranje. 2. Pozicioniramo se u direktorij u kojem je izvorni kod kernela: # cd /usr/source/kernel-2.4.27 3. Ako je patch datoteka sa .bz2 ekstenzijom u konzoli izvravamo slijedeu naredbu: # bzip2 dc ../patch-2.4.28.bz2 | patch p1 ili # gzip cd ../patch-2.4.28.gz | patch p1 ako se radi o patch datoteci sa .gz ekstenzijom. Osim ovakvih standardnih patcheva za nadogradnju postojee verzije kernela, esto puta moemo nai patcheve u nekom drugom obliku. Takvi patchevi gotovo su uvijek potrebni za podrku nekog ureaja iju specifikaciju proizvoa dri u tajnosti. Uz takve patcheve uvijek dolazi detaljno uputstvo kako ih primjeniti, esto puta su to skripte koje emo trebati izvriti slijedei upute proizvoaa, a ponekad emo trebati sve napraviti runo. Uglavnom su postupci specifini za svaki sluaj i ovdje nee biti obraeni.
1252/1275
KONFIGURIRANJE KERNELA
Konfiguriranje kernela je jedan od najbitnijih koraka u procesu izrade novog kernela. Zbog mnogobrojnih mogunosti dananji kerneli imju mnogo opcija za podeavanje to zahtjeva dobro poznavanje hardvera i softvera. Prije poetka konfiguriranja kernela trebamo dobro prouiti koji hardver ima raunalo za kojeg radimo kernel, u kakvom okruju radi, koje protokole i datotene sustave treba podravati itd. Neke od vanijih stavki su: tip platforme ( Intel 3086, Intel 4086, Intel Pentium III, AMD Athlon ...) broj procesora (radi li se o jednoprocesorskoj ili vieprocesorsko platformi) tipovi ipseta na matinoj ploi, grafikoj kartici, mrenoj kartici, zvunoj kartici ... tipovi sabirnica koje imamo na sistemu (ISA, PCI, AGP ...) koje datotene sustave koristimo (ext2, ext3, reiserfs, FAT32, NTFS ...) koje tipove diskova, odnosno koje kontrolere diskova imamo (IDE, ATA, RAID, SATA, SCSI, DAT ...) koje protokole koristimo (TCP/IP, PPP, SLIP ...) ... # /sbin/lspci detalje o tipu procesora kojeg koristimo moemo dobiti naredbom # cat /proc/cpuinfo Svi podaci o konfiguraciji izvorog koda kernela trebaju se nalaziti datoteci .config u osnovnom direktoriju naeg kernela. Navedena datoteka je najobinija tekstualna datoteka koja u sebi sadri podatke o ukljuivanju ili iskljuivanju pojedinih opcija kernela, a generierana je od strane programa config, menuconfig ili xconfig. Ti programi su okruja koja nam pomau u snalaenju meu mnogobrojnim opcijama. Datoteku .config nakon to je generirana moemo pogledati sa nekim textualnim editorom, no nije preporuljivo na taj nain raditi izmjene u njoj. Pojedini koraci u konfiguriranju kerenela su: 1. Provjerimo da li simboliki link /usr/src/linux pokazuje na pravu verziju kernela koju elimo konfigurirati
1253/1275
2. Pozicioniramo se u direktorij /usr/src/linux # cd /usr/src/linux 3. Slijedea naredba e obristati sve nepotrebne datoteke prijanjeg kernela koje su nastale prilikom kompajliranja # make mrproper 4. Sada pokreemo neko od okruja u kojem emo konfigurirati kernel # make xconfig ili # make menuconfig ili # make menucofig - radi u konzoli, koristiti samo u nudi ako niti jedan od prethodnih naina ne radi - radi u konzoli, koristiti ako nemamo X-e - radi pod X-ima, preferirani nain
1254/1275
Odabirom bilo koje sekcije otvara se novi izbornik, slian onome na slici .
navedena opcija e biti modularna, to znai da e biti uitana u kernel samo onda kad se za to pojavi potreba. Gotovo sve moe biti modularno, osim podrke za datoteni sustav,
1255/1275
upravljaki ureaj (kontroler) na kojem se nalazi osnovni sistem datoteka i PS/2 mia. Ako nismo sigurni to pojedina opcija znai, moemo si pomoi odabirom dugemta Help. Neke od opcija su posivljene i one su nedostupne, da bi smo ju omoguili moramo promjeniti neku od prethodnih opcija o kojoj ona ovisi. Najbolje je krenuti od prve opcije i odabirom dugmeta Next prelaziti na slijedee opcije sve do kraja, tako emo biti sigurni da nismo nita preskoili. U nastavku redom e biti opisana veina vanijih sekcija i vanije opcije u njima: Code maturity level options U ovoj sekciji odreujemo elimo li da nam prilikom odabira opcija budu prikazane i one koje su u razvoju. Sve opcije koje su u razvoju dodatno su oznaene sa EXPERIMENTAL, mada ih nije poeljno odabirati jer nam mogu uzrokovati nestabilnost sistema, ponekad je nuno jer je ba u njima veinom podran najnoviji hardver. Loadable module support Enable loadable module support - Ovdje moemo izabrati elimo li monolitan ili modularan kernel. Monolitan kernel zani da e kernel u potpunosti biti u jednom komadu i prilikom podizanja OS-a itav se uitava u memoriju, naknadna izmjena kernela ili dodavanje bilo kakvih modula nije mogue bez ponovnog pokretanja raunala. Veinom se koristi za strogo namjenska raunala kad je potrebna velika sigurnost i stabilnost sustava bez estih izmjena funkcionalnosti. Najee emo ipak trabati modularan kernel gdje se samo jedan osnovni dio uitava prilikom podizanja OS-a, a ostali dijelovi kernela su u obliku modula koje jednostavno moemo uitavati (pripajati) tijekom rada OS-a sa naredbama: # insmod ime_modula # rmmod ime_modula - ubacuje modul - brie modul
Time tedimo na memorijskom prostoru jer koristimo samo one dijelove kernela (module) koji su nam neophodni, ostali (svi) moduli se nalaze na hard disku u obliku datoteka sa ekstenzijom .o u direktoriju /lib/modules/verzija_kernela/.... Priliko dinamikog uitavanja modula koji prethodno nisu testirani moe doi do ruenja OS-a. Set version inforation on all module symbols selektiranjem ove opcije odabiremo mogunost uitavanja modula iz starije verzije kernela, poeljno je odabrati N Kernel module loader omoguava kernelu da prilikom uitavanja nekog modula koji ovisi o drugom modulu automatski uita potreban modul, poeljno je staviti Y
1256/1275
Procesor type and features U ovoj sekciji se nalaze sve opcije vezane za prilagodbu kernela procesoru (CPUcentral processor unit) s kojim e raditi, neke vanije su: Procesor family izabir vrste procesora, ostim standardnih Intel-ovih i AMD-ovih procesora podrana je i AMD-ova 64-bitna arhitektura (u vrijeme pisanja ovog seminara to je najnovija generacija procesora) kao i neki manje poznati kao Elan, Crusoe i Winchip. Pravilnim izborom procesora (ako izaberemo podrku za Intelove 386 procesore kernel e raditi i na Pentium MMX procesorima no sporije jer nee koristiti naprednije mogunosti set instrukcija novijih procesora) ubrzat emo rad OS-a. /dev/cpu/*/msr Model-specific register support - poeljno ukljuiti za Intel-ove procesore Pentium Pro, Pentium II i novije. MTTR (Memory Type Range Register) support generacije poevi od Pentium Pro i Pentium II. Symetric multi-processing support - Podrka za vieprocesorske sustave (2 32 procesora, na kernelu 2.6.8 generacije do 255 procesora), veinom serverske platforme, snanije grafike radne stanice i sl. Prilikom odabira ove opcije dodatno treba podesiti opciju Maximum number of CPU(2-32) - gdje odreujemo za koliko procesora trebamo podrku, podrkom za svaki dodatni procesor kernel zauzima okvirno dodatnih oko 8 K RAM-a. High Memory Support ukljuiti 4 GB ako raunalo ima 1 4 GB RAM memorije, za vie ukljuiti opcjiu 64 GB General setup Zbog iskljuivanja nekih opcija iz ove sekcije neke naredne sekcje mogu postati nedostupne. Networking support bez obzira da li je nae raunalo spojeno na mreu ili ne, ovu opciju je dobro ukljuiti zbog pravilnog rada nekih aplikacija koje to zahtjevaju. PCI support podrka za PCI sabirnicu, ukljuiti ako imamo PCI sabirnicu (veina raunala 386 i 486 generacije i starija nisu imala PCI sabirnicu) MCA support ukljuiti za za MicroChannel arhitekturu PCMCIA/CardBus support - sekcija iza koje se krije obavezno ukljuiti ako imamo slotove za prikljuenje PCMCIA kartica, gotovo na svakom prijenosnom raunalo. IBM PS/2 raunala i laptope koji podravaju - ukljuiti za procesore novije
1257/1275
System V IPC - obavezno ukljuiti Kernel core (/proc/kcore) format - podrka za ELF programe, obavezno ukljuiti Kernel support for MISC binaries ukljuiti ako namjeravamo koristiti interpretere poput Jave, Python-a ili Lisp-a Power managment support korisno ukluiti ako elimo kosrititi mogunosti Power managmetn-a (Stand by, Sleep), tj. da raunalo samo prelazi u mod smanjene potronje elektrine energije ako ga dok je ukljueno dulje vrijeme ne koristimo. Vrlo korisna opcija za prijenosna raunala. Advanced Power Mangment BIOS support - ukljuiti ako imamo u BIOS-u podran Advanced Power Managment (APM) i podesiti dostupne opcije. Memory Technology Devices(MTD) Podrka za memorijske ureaje, treba ukljuiti ako koristitimo razne vanjske jedinice za pohranu koje koriste FLASH, ROM, RAM ili sl. memoriju, konkretno Compact Flash kartice. Parallel port support Ukljuivanje podrke za paralelni port, danas gotovo sva PC i IBM kompatibilna raunala imalju paralerlni port (osim nekih novijih prijenosnih raunala), slui za povezivanje raznih periferija kao to je printer ili umreavanje dvaju raunala. Parralel port support obavezno ukljuiti PC-style hardware podravaju sva PC i IBM kompatibilna raunala i poneka raunala tipa Alpha, takoer treba ukljuiti. Plug and Play configuration Podrka za Plug and Play (PNP) ureaje. Plug and Play support ukljuiti ako elimo podrku za PNP ISA Plug and Play support podrka za ISA PNP ureaje Block devices Tu se nalaze opcije vezane uz IDE, Floppy disk, RAID, CD-ROM ureaje i sl. Normal floppy disk support ukljuiti ako imamo floppy disk na raunalo (danas ga imaju gotovo sva raunala osim nekih novijih laptopa)
1258/1275
Parallel port IDE device support podrka za IDE ureaje koji se prikljuuju preko paralelnog porta (hard diskovi, CD-ROM-ovi itd.). Prilikom odabira ove opcije od nekoliko nanovo ponuenih treba specificirati tip ureaja. Lopback device support ova opcija omoguava montiranje datoteke (disk image-a) kao file sitema koju na taj nain moemo pregledati prije nego to ju snimimo na CD RAM disk support omoguava nam da jedan dio RAM memorije odvojimo i proglasimo kao file sistem (jasnije reeno od dijela memorije napravimo brzi hard disk), nije preporuljivo ukljuitvati jer usporuje rad raunala osim ako nam je nuno Initial RAM disk support - Podrka za Inital RAM, tj. za RAM disk uitan od strane boot loader-a i montiran kao osnovni file sistem prjie normalne boot procedure. Tipino se koristi za uitavanje modula koji su nuni za montiranje stvarnog osnovnog (root) file sistema, inae je praksa da se takva podrka ne ugrauje u obliku modula nego u osnovni dio kernela. Multi-device support (RAID and LVM) Ovjde se nalaze vane opcije za serverske sustave, pogotovo ako nemamo hadverski RAID kontroler, jer omoguava organizaciju postojeih diskova u RAID polja. Logical volume manager (LVM) je takoer vana opcija koja izmeu ostalog omoguava dinamku promjenu veliine file sistema. Networking options Ovo je jedna od najveih sekcija kernela i slobodno bih mogao rei "ponos" Linux OS-a, upravo zbog mogunosti koje su dostupne u ovoj sekciji Linux je postao jako rairen i prihvaen u mrenom okruju. Packet socket Ukljuivanjem ove opcije omoguavamo nekim aplikacijama direktnu komunikaciju sa mrenim ureajima (mrenim karticama itd.) Unix domain sockets Omoguava podrku za Unix domain sockets, koji su standardni mehanizmi za mrene konekcije. Mnogi progami koriste ove mogunosti iako moda nismo spojeni na mreu, stoga ovu opciju obavezno ukljuiti. TCP/IP networking podrka za TCP/IP protokol, ako namjeravamo koristiti Internet ili mree temeljene na TCP/IP protokolu (veina LAN-ova) ovu opciju obavezno ukljuiti.
1259/1275
Ovo su neke vanije od mnogobrojnih postojeih opcija za ije je podeavanja potrebno temeljito poznavanje mrenog okruja te veina njih nee biti opisano, samo u spomenuti jo neke: Network packet filtering filtriranje mrenih paketa, ukljuivanje ove opcije e omoguiti pristupu nizu drugih opcija za podeavanje firewall-a (iptables firewall 2.4 tipa kernela, ipchains firewall 2.2 tipa kernela, ipfwadm - firewall 2.0 tipa kernela), podrku za ARP itd. Socket filtering filtriranje socket-a, tj. zabrana pristupa servisima IP: TCP synoockie support ako je ukljuen onemoguava SYN napade, poeljno ukljuiti na serverskim raunalima ako imaju bilo kakvih doticaja sa Internet-om IP: advanced router omoguava konfigurianje sistema kao router-a ATA/IDE/MFM/RLL support Podrka za ATA/IDE ureaje (tj. za kontrolere na matinoj ploi koji su zadueni za upravljanje hard diskovima, CD-ROM ovima itd.) Enhanced IDE/MFM/RLL disk/cdrom/tape/flopy support ovo obavezno ukljuiti osim ako imamo sistem baziran na SCSI diskovima ili ako imamo sistem koji nema hard diskova. Boot off-board chipsets first support neke matine ploe dodatni kontroler uz ve postojei na matinoj ploi, ova opcija omoguava da se sistem najprije pokuava podignuti sa dodatng kontrolera na matinoj ploi, a tek onda sa osnovnog kontrolera. Ova opcija ponekad rjeava problem koji se desi kada kernel prilikom boot-anja ne uspije pronai root particiju (npr. ako nam je root particija na disku koji je spojen na dodatni kontroler na matinoj ploi). Include IDE/ATAPI CDROM support podrka za CD ROM-ove SCSI emulation support omoguava SCSI emulaciju za IDE ATAPI ureaje, a time koritenje SCSI drajvere za ATAPI ureaje umjeto orginalnih ATAPI drajvera. Korisno ukljuiti ako imamo CD snimalicu, USB FLASH stick i sl. Osim navedenog tu se jo nalazi podrka za mnoge tipove kontrolera, odabrati onaj tip koji odgovara tipu na naem sistemu, ova opcija znaajno ubrzava rad diskovlja. SCSI support
1260/1275
Podrka za SCSI ureaje. Danas veina servera ima SCSI kontrolere za rad sa diskovima. SCSI support obavezno ukljuiti ako nam treba podrka za SCSI SCSI generic support korisno ukljuiti ako imamo CD sinmalicu ili CD-ROM jer time omoguavamo pristup u "raw" modu (nuno za ripanje audio CD-ova i sl.) SCSI low-level drivers podrka za SCSI kontrolere, treba tono znati koji tip kontrolera posjedujemo i izabrati jedan od ponuenih.
IEEE 1394 (FireWire) support (EXPERIMENTAL) Tipian primjer podrke za novije ureaje koja je jo u testnoj fazi razvoja. IEEE 1394 standard se jo naziva i FireWire ili i.Link, omoguava prijeos podataka do 400 Mb/s, esto se koristi za povezivanje DV kamera i externih diskova. Uz odabir ove opcije treba jo odabrati i odgovarajui tip kontrolera koji se nalazi u sistemu.
Network device support Podrka za mrene ureaje (mrene kartice i sl.) i za neke protokole. Neke vanije opcije su: Network device support ukljuuje podrku, ako nam je sistem umreen ili se spajama na Internet, obavezno ukljuiti. Ethernet (10 pr 100Mbit) iza ovog se krije sekcija sa opcijama za podrku raznih 10 i 100 Mbit-nih mrenih kartica, ako imamo mrenu karticu ovdje trebamo ukljuiti podrku za nju. Ethernet (1000 Mbit) podrka za 1Gbit (1000 Mbit) mrene kartice. PLIP (parallel port) support omoguava umreavanje dvaju (rijetko vie) raunala preko paralelnog porta (RS 232, 25 pinski prikljuak). Maksimalna duljina prikljunog kabla je 15 m. Koristiti ju samo u nudi zbog male brzine prijenosa podataka. PPP (point-to-point protocol) support ako se spajamo na internet preko telefonskog prikljuka obavezno ukljuiti ovu opciju PPP support for async serial ports - ukljuiti ako je veza sa modemomo (V.90 ili V.92) preko asinhronog serijskog porta, tj. preko ttyS0 (COM 1) ili ttyS1 (COM2), ako koristimo ISDN ili ADSL, ovo ne treba ukljuivati.
1261/1275
PPP support for sync tty ports treba ukljuiti ako koristimo PPP preko sinhronizirane linije (ADSL, visoko propusne iznajmljene linije T1/E1 i sl.). SLIP (serial line) support podrka za Serial Line Internet Protokol, slino kao i PPP, no PPP se danas vie koristi. Wireless LAN (non-hamradio) iza ovoga se krije podrka ureaja za Wireless LAN. Token Ring devices sekcija za podrku Token Ring-a PCMCIA network device support sekcija sa podrkom za PCMCIA mrene kartice (veina externih mrenih kartica za prijenosna raunala) Amateur Radio support Podrka za vezu putem amaterskih radio ureaja preko prilagoenog X25 protokola. Kod nas postoji jedna ovakava mrea brzine 2400 bps mada su ostvarive brzine preko 56 Kbps, ne podrava TCP/IP to joj je veliko ogranienje. IrDA (infrared) support Podrka za Infrared Data Associations (IrDA) protokol. Koristi se za komunikaciju preko IC porta, esto se koristi za uvezivanje raunala sa PDA ureajem ili mobilnim telefonom. ISDN subsystem support Podrka za ISDN, ako trebate pristup Internetu preko ISDN usluge onda obavezno ukljuitit ISDN support. Support synchronus PPP - podrka za PPP protokol preko sinhrone ISDN linije, obavezno ukljuiti. Support generic MP (RFC 1717) - omoguava poveanje propusnosti veze grupiranjem nekoliko ISDN konekcija, preporuljivo je ukljuiti. Passive ISDN cards u ovoj sekciji treba odabrati tip ISDN kartice koju koristimo za ISDN uslugu: HiSax Siemens ChipSet driver support podrka za Simensov ipset (nalazi se na veini ISDN kartica), obavezno ukljuiti HiSax Support for EURO/DSS1 podrka za pozivni protokol E-DSS1, kao i u Hrvatskoj podran je u veini Europskih zemalja, obavezno ukljuiti.
1262/1275
HiSax supported cards u ovom popisu treba pronai tip kartice koju posjedujemo i selektirati (ukljuiti) ju.
Old CD-ROM drivers (not SCSI, not IDE) Ovdje se nalzi podrka za stare CD-ROM pogone koji su se prikljuivali preko zvune kartice (ISA slot). Na takve CD-ROM-ove moe se naii na raunalima 486 generacije, u veini sluajeva ova podrka nam nee trebati. Input core support Podrka za neke periferije koje se prikljuuju preko USB porta kao npr. pordka za tastaturu, mia, joystick, grafike tablete i sl. Ako nemamo neto od navedenog nije potrebno ukljuivati navedenu podrku. Character devices Virtual terminal podrka za virtualne terminale, ona nam omoguava da imamo nekoliko virtualnih terminala u konzoli (prebacujemo se tipkama Alt + F1 ...F6) ili u X Windows sistemu (Ctrl + Alt + F1 ... F6, izlaz Ctrl + Alt + F7) koji mogu sluiti za razliite funkcije, obavezno ukljuiti. Support for console on virtual terminal omoguava praenje poruka kernela na nekom od virtualnih terminala. Support for sharing serial interrupts omoguava dijeljenje IRQ-a, korisno ako imamo puno raznih ureaja (kartica) prikljueno u naem sistemu, preporuljivo ukljuiti (da bi ova opcjia bila dostupna treba ukljuiti Extended dumb serial driver options) Unix98 PTY support podrka za pseudo terminale, novi nain kreiranja virtualnih terminala na Linuxu, obavezno ukljuiti. Mice sekcija u kojoj su dostupne podrke za razne vrste mieva. Mouse support podrka za mieve, ali ne serijske (DB-9 ili DB-25 konektor) i ne USB mieve, ukljuiti da bi nam bila dostupna opcja PS/2 mouse. PS/2 mouse podrka za PS/2 tipove mia (imaju mali okrugli konektor sa 9 pinova, veina novijih mieva je tog tipa). Joystick sekcija sa podrkom za igrae dodatke, podrano je puno toga pa treba samo odabrati model, ako imamo neto to nije podrano postoje i generike opcije. Moe se
1263/1275
desiti da je ova sekcija nedostupna (posivljena), to je vjerovatno zbog toga to u sekciji Input core support nije napravljen pravilni izbor. Multimedia devices Podrka za razne video i audio multimedijalne dodatke kao to su video kartice, TV kartice, radio kartice itd. File systems Podrka za razliite file sisteme (nain na koji su podaci zapisani na medij za pohranu hard disk, CD-ROM, floppy disk itd.). Veina OS je vezana za jedan ili nekoliko za njega specifinih file sistema, za razliku od toga Linux ima podrku za gotovo sve file sisteme (neki su jo u razvojnoj fazi). Quota support omoguava ogranienje diskovnog prostora na kojem pojedini korisnik moe raditi, za sada radi samo sa ext2 datotenim sustavom. Kernel automonter support uobiajeno je da se svi ureaji ("device" - diskovi, particije, mreni diskovi) moniraju prilikom podizanja OS preko datoteke fstab ili naknadno runo sa naredbom mount, ukljuivanje ove opcije prua nam mogunost da se to montiranje vri atuomatski kad pokuamo pristupiti direktoriju na kojem bi se trebao nalaziti pripadni ureaj. esto se primjenjuje za pristup CD-ROM pogonima i dijeljenim diskovima na mrei. Resiserfs support napredni datoteni sustav novije generacije, jedan od najbrih datotenih sustava na Linux-u koji podrava journalling, zbog tih svojstava koriste ga neke Linux distribucjie namjenjene za servere. Ext3 journaling file system support journaling verzija ext2 datotenog sustava (koji je standardni datoteni sustav za Linux), zbog navedene je mogunosti sporiji ali zato puno sigurniji od ext2. DOS FAT fs support podrka za FAT (MS DOS) i VFAT (Windows 95), ukljuivanje ove opcije omoguit e jonekoliko opcija. MSDOS fs support Podrka za MS DOS datoteni sustav, omoguava montiranje i prisutp MS DOS particijama. VFAT (Windows-95) fs support Podrka za VFAT datoteni sustav, omoguava montiranje i pristup particijama koje koste Windows 95, 98 i NT operativni sistemi. ISO 9660 CDROM file system support standardni datoteni sustav za CD-ROM medije.
1264/1275
Microsoft Joliet CDROM extensions verzija ISO 9660 datotenog sustava koja omoguava koritenje 16-bitnog unicode formata. NTFS file system support (read only) podrka za MS NTFS datoteni sustava (Windows NT, 2K i XP), no samo za itanje, podrka za pisanje je jo uvjek u fazi testiranja. Second extended support - Podrka za ext2 datoteni sustav, koji je standard na Linux-u. UDF file system support (read only) - datoteni sustav novije generacije koriten na CD-ROM i DVD medijima. Omoguava paketni nain zapisivanja (korisnik moe sa njime upisivati i brisati podatke kao na hard disku). Za sada je podrka za upisivanje jo uvjek u razvojnoj fazi. Network File Systems Iza ovoga se krije sekcija sa podrkom za mrene datotene sustave: NFS file system support omoguava pristup klijentima preko mree dijeljenim resursima (particije, direktoriji, diskovi) koji se nalaze na NFS serveru. Provide NFSv3 client support novija verzija NFS-a, puno otpornija na greke nastale uslijed pada mree, prestanka rada NFS servera itd. NFS server support omoguava pruanje NFS usluge, tj. dijeljenje resursa (particija, direktorija, diskova) na mrei, koristi se na serverskoj strani. Provide NFSv3 server suport novija verzija NFS-a, puno otpornija na greke nastale uslijed pada mree, prestanka rada NFS servera itd., koristi se na serverskoj strani. SMB file system support (to mount Windows shares etc.) podrka za SMB (Server Message Block), protokol koji omoguava platformama baziranim na Windows operativnim sustavima dijeljenje datoteka i printera. Da bi se mogla koristiti navedena mogunost na Linux-u, osim podrke od strane kernela moramo imati instaliranu aplikaciju koja e to realizirati (programski paket SAMBA). Nije podran Microsof-ov NetBEUI mreni protokol tako da je dijeljenje mogue samo u mreama zasnovanim na TCP/IP protokolu. Partiton Types U ovoj sekciji se nalazi podrka za pristup diskovima i particijama koje su formatirane na arhitekturama razliitim od one na kojoj se nalazi na OS. Native language support to je sekcija u kojoj moemo podesiti regionalne postavke, nabrojit u samo one koje bi trebalo ukljuiti jer su interesantne za nae podruje.
1265/1275
Codepage 437 (United States, Canada) Codepage 852 (Central/Eastern Europe) Windows CP1250 (Slavic/Central European Languages) NLS ISO 8859-1 (Latin 1, Westeren European Languages) NLS ISO 8859-2 (Latin 2, Slavic/Central European Languages) NLS UTF8 podrka za unicode Console drivers VGA text console omoguava naprednije prikaze u terminalu (standardni je 25 redova X 80 zankova), tj. vie znakova i redova, text u boji itd., obavezno ukljuiti. Video mode selection support omoguava da se prilikom podizanja raunala prije nego to boot loader uita kernel inicijalizacijom vga parametra kernela prebacimo u neki drugi text mod razliit od standardnog. Navedeni parametar moemo inicijalizirati u konfiguracijskim datotekama grub-a, lilo-a ili u konzoli. Frame-buffer support podrka za naprednije mogunosti nekih grafikih kartica, veina ih je u razvojnoj fazi. Sound U ovoj sekciji se nalazi podrka za zvune kartice. Veina kartica je podrana, trebamo pronai tip ipseta na temelju kojeg je graena naa zvuna kartica i ukljuiti ga. Sound card support - obavezno ukljuiti ako nam treba podrka za zvunu karticu. USB support Podrka za Universal Serial Bus (USB), navedeno je samo nekoliko znaajnijih opcija. U odjeljku USB Host Contrloller Drivers treba odabrati treba odabrati driver koji podrava na USB kontroler na sistemu. Suport for USB ako elimo na sistemu podrku za USB, ovo obavezno ukljuiti. USB Mass Storage support ukljuiti ako nam treba podrka za masovnu pohranu podataka preko USB-a (npr. vrlo popularan FLASH stick) USB Printer support podrka za printere koji su na sistem spojeni preko USB-a. Cryptographic options
1266/1275
U ovoj sekciji se nalazi podrka za razne kriptografske algoritme, da bi bili dostupni treba ukljuiti opciju Crypthographic API, sve algoritme osim HMAC je najbolje ukljuiti kao module, pa e tako biti automaski uitani kad se za to ukae potreba. Save and Exit Kad smo gotovi sa konfiguriranjem izvornog koda kernela sa ovom opcijom snimamo odabrane postavke u .config datoteku i izlazimo iz suelja za konfiguraciju. Quit Without Saving Izlazak iz suelja za konfiguraciju bez snimanja postavki u .config datoteku. Load Configuration from File Pomou ove opcije moemo uitati postavke koje smo prethodno spremili sa Store Configuration to File. Store Configuraton to File Sa ovom opcijom moemo spremiti trenutnu konfiguraciju izvornog koda kernela u datoteku proizvoljnog naziva.
1267/1275
1268/1275
Na postavljena pitanja odgovaram sa y opcija e biti integrirana u kernel, m opcija e biti u obliku modula ili N-opcija nee biti ukljuena. Zbog neprilagoenosti suelja ovaj nain koristite samo u nudi kad su prethoda dva nedostupna.
1269/1275
sistemske diskete (1.44' floppy diskete) i pokretanje sa sistemskog diska (tj. diska na kojem se nalazi na OS) Za izradu kernela koji emo koristiti za podizanje OS-a sa sistemskog diska (hard diska) trebamo se pozicionirati u direktorij /usr/src/linux i zadati naredbu # make bzImage Kad kompajliranje zavri kernel bi se trebao nalaziti u direktoriju /usr/src/linux/arch/i386 u obliku datoteke bzImage veliine nekoliko stotina kilobajta do nekoliko megabajta, to zavisi o tome da li je kernel modularan ili monolitan, te koliko je opcija bilo ukljueno prilikm konfiguracije. Ako elimo da nam se OS podie sa sistemske diskete, to je preporuljivo prilikom iskuavanja novih kernela trebamo umetnuti disketu u floppy pogon na naem sistemu i umjesto naredbe iz prethodnog koraka (# make bzImage) trebamo zadati naredbu # make bzdisk
1270/1275
ili # make zdisk Kernel e automatski biti snimljen na disketu koja e nam sluiti za podizanje OS-a (obavezno u BIOS-u podesiti boot-anje sistema sa diskete). Moe se desiti da nam kompajler javi da je kernel prevelik za floppy disk, u tom sluaju trebamo rekonfigurirati .config datoteku i pokuati opcije koje su integrirane u kernel staviti kao module. Ve u ovoj fazi trebalo bi biti mogue podignuti OS sa novim kernelom (jo nismo napravili module pa e neke funkcionalnosti biti nedostupne), kako se to radi pogledajte u poglavlju 6.
1271/1275
Drugi nain rjeava ovaj problem. Ovdje emo se posluiti malim trikom, uvijek trebamo na raunalu imati drugaiju verziju kernela od postojee sa kojom emo podignuti OS (naravno i za taj kernel moraju postojati pripadajui moduli u direktoriju /lib/etc/modules/y.y.yy, y su oznake drugaije verzije). Ostatak postupka je isti, tj. prije izdavanja naredbe # make modules_install treba preimenovati direktorij /lib/modules/x.x.xx u /lib/modules/x.x.xx-old, kojeg takoer moemo obrisati kad se uvjerimo da je sa novim kernelom sve u redu. Instalacija jezgre kernela se svodi na kopiranje jezgre, tj. datoteke bzImage iz direktorija /usr/src/linux/arch/i386/boot u direkotrij /boot (inae u ovom direktoriju su uvijek smjeteni kerneli). Datoteku bzImage pri tom treba preimenovati u vmlinuz-x.x.xx, gdje je sa x oznaena pripadajua verzija kernela. U naem sluaju datoteka kernela treba imati oblik vmlinuz-2.4.27. Na tu datoteku trebamo napraviti simboliki link vmlinuz iz korijenskog direktorija ln s /vmlinuz /boot/vmlinuz-x.x.xx Prethodni link vmlinuz koji je bio vezan na stariju verziju kernela najbolje je preimenovati u npr. vmlinuz.old. Osim navedene datoteke kernela trebamo kopirati jo dvije datoteke iz direktorija /usr/src/linx u direktorij /boot, a to su System.map i .config. Kad ih kopiramo takoer ih treba preimenovati u oblik System.map-x.x.xx i config-x.x.xx, u naem sluaju u System.map-2.4.27 i config-2.4.27. Ako u diretkoriju /boot imamo simboliki link config trebamo ga preusmjeriti na nau config-... datoteku, kao i System.map koji trebamo preusmjeriti na nau System.map-... datoteku.
1272/1275
1273/1275
da bi promjene bile aurirane. Ako smo napravili neku greku prilikm izmjena lilo.conf datoeke bit e nam prijavljeno prilikom izvenja ove naredbe. Svaki put kad izvrimo # lilo v parametri se nanovo upisuju u MBR, to ba nije poeljno. Grub to rjeava na elegantniji nain.
kernel /vmlinuz ro root=/dev/hda2 # Mjesto odakle se uitava jezgra title Linux-old root(hd0,2) kernel /vmlinux.old ro root=/dev/hda2 Grub oznaava particije i diskove na drugaiji nain od Linux-a, prvi parametar u zagradama je redni broj diska, a drugi parametar je redni broj particjie na pripadjuem disku, tako bi npr, disk hda1 na grub-u imao oznaku (hd0, 1). Ovu datoteku grub ita prilikom podizanaja OS-a i nije potrebna nikakva radnja za njeno auriranje.
1274/1275
ZAKLJUAK
Kao to se vidi, proces kompajliranja kernela je dosta sloen, mada je ovdje obuhvaen samo mali broj mogunosti suvremenih kernela na Linux-u. Vjerovatno e prvi pokuaji biti bezuspjeni i zadati e mnogo glavobolje, no nemojte odustati. Kada uspijete nekoliko puta uspjeno proi navedeni proces i malo bolje istraite podruje, vidjet ete koliko prednosti i mogunosti prua free software. injenica da u rukama imate oko 250 MB source-a i da ga moete prilagoditi svojim potrebama povlai za sobom pitanje gdje je svemu tome kraj. Upravo se zbog te injenice Linux danas vrti na ureajima kao to su mobilni telefoni, priruna raunala, komunikacijski sateliti, NASA-ina raunala. Ako se malo potrudite ve danas moete stavit novi kernel na raunalo koje ima jedan, dva ili moda ak 255 procesora.
1275/1275