You are on page 1of 1275

SVEUČILIŠTE U SPLITU

STRUČNI STUDIJ RAČUNARSTVA – ZAGREB

prof. Pavle Špoljarić

Programski alati na Unix računalima

ZBORNIK SEMINARSKIH RADOVA


2003/2004

Dražen Hudoletnjak • Marijela Napast • Andrija Martinović • Siniša Julijan


Marijana Ladan-Pelivanović • Predrag Jovanović • Marko Vuković • Manuel Vidonis
Zoran Zoričić • Mario Strinić • Matko Pejčić • Maja Mehinagić • Nina Žugaj • Frane Gjeldum
Davorin Šajnović • Branimir Živković • Tomislav Grgec • Krešimir Hećimović • Janko Rade
Marko Ferk • Damir Jajerić • Tomislav Domanovac • Ivan Podhraški • Maja Žugaj
Željko Šafar • Damir Šćuric • Goran Jurišić • Krasnodar Krajnik • Vedran Deduš
Vanja Harambuša • Krunoslav Zeman • Igor Čopec • Matija Čupen • Saša Dragić • Ivan Brčić
Neven Kmetić • Majk Jednaković • Boris Ivanišević • Jurica Božiković • Goran Vlahović
Dario Dugić • Zvonimir Janković • Marija Bilić • Jakov Mihaljević • Adriana Mihalinec
Domagoj Švegelj • Marina Petrovska • Daniel Van Schepdael • Dario Benko • Amir Kos
Tamara Krutman • Ante Penava • Ana Babić • Marijan Poljak • Elizabeta Velkavrh
Alja Pavlić-Ravšer • Eliot Karlo Pavletić • Saša Protulipac

Zagreb, 2004.
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

"...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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sadržaj

OVAJ ZBORNIK JE POD OPĆOM


GNU LICENCOM OPISANOM U
1. POGLAVLJU
(GNU FILOZOFIJA I GNU LICENCA)

3/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sadržaj

Sadržaj

1. GNU FILOZOFIJA I GNU LICENCA (Dražen Hudoletnjak)


6
2. STRUKTURA UNIXA (Marijela Napast)
30
3. SHELL (Andrija Martinović)
42
4. SH I BASH (Siniša Julijan)
72
5. C SHELL, T C-SHELL (Marijana Ladan-Pelivanović)
111
6. SHELL PROGRAMIRANJE (SHELL I BASH) (Predrag Jovanović)
138
7. BASH – ADVANCED SHELL PROGRAMIRANJE (Marko Vuković)
160
8. REGEX (Manuel Vidonis, Zoran Zoričić)
179
9. VI EDITOR (Mario Strinić)
213
10. EMACS (Matko Pejčić)
230
11. LOGIN I ID (Maja Mehinagić)
263
12. TELNET I SSH (Nina Žugaj)
273
13. ARHIVIRANJE NA UNIX RAČUNALIMA (Frane Gjeldum)
305
14. UNIX DEVICES, MOUNTING DEVICES (Davorin Šajnović)
322
15. AWK I SED (Branimir Živković)
343
16. SED (Tomislav Grgec)
370
17. GCC COMPILER (Krešimir Hećimović)
396
18. GDB, THE GNU SOURCE LEVEL DEBUGGER (Janko Rade)
419
19. GNU MAKE (Marko Ferk)
435
20. CVS – SUSTAV ZA VERZIONIRANJE (Damir Jajetić, Tomislav Domanovac)
469
21. IDE (Ivan Podhraški)
509
22. ECLIPSE (Maja Žugaj, Željko Šafar, Damir Šćuric)
527
23. PIPE I FIFO (Goran Jurišić)
556

4/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sadržaj

24. FORK (Krasnodar Krajnik)


578
25. PROCESI I UPRAVLJANJE PROCESIMA (Vedran Deduš, Vanja Harambuša)
610
26. SIGNALI (Krunoslav Zeman)
638
27. FORK PROCESI (Igor Čopec)
662
28. SOCKETS, UNIX DOMAIN, NETWORK (Matija Čupen)
672
29. TCP/IP (Saša Dragić)
691
30. TCP/IP API (Ivan Brčić, Neven Kmetić)
718
31. UDP-USER DATAGRAM PROTOKOL (Majk Jednaković)
776
32. FILE, DIRECTORY AND INODE PROGRAMMING (Boris Ivanišević)
796
33. INETD I TCPD (Jurica Božiković)
815
34. INTERNET SERVICES (Goran Vlahović)
827
35. RPC – REMOTE PROCEDURE CALL (Dario Dugić)
858
36. RLOGIN RSH (Zvonimir Janković)
876
37. SAMBA I NFS (Marija Bilić)
886
38. X WINDOW SYSTEM (Jakov Mihaljević)
917
39. KDE (Adriana Mihalinec, Domagoj Švegelj)
926
40. UNIX DESKTOP SYSTEM (Marina Petrovska)
970
41. DNS I DHCP (Daniel Van Schepdael)
996
42. INTERNET HISTORY (Dario Benko)
1016
43. UVOD U PERL (Amir Kos)
1033
44. PERL – Practical Extraction and Report Language (Tamara Krutman,Ante Penava)
1090
45. PYTHON (Ana Babić)
1138
46. INTERPRETERI – TCL/TK (Marijan Poljak)
1173
DISTRIBUCIJE LINUXA/UNIX
47. (Elizabeta Velkavrh, Alja Pavlić-Ravšer, Eliot Karlo Pavletić)
1214
48. KOMPAJLIRANJE KERNELA (Saša Protulipac)
1244

5/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dražen Hudoletnjak

GNU FILOZOFIJA I
GNU LICENCA

6/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GNU filozofija i GNU licenca

UVOD

Priča o GNU-u počinje otprilike 1971. sa Richardom Stallmanom koji je tada počeo
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 nešto što je staro kao i sama računala i u to doba je to bila normalna
stvar, pomoć kolegi. No oni su otišli 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
poboljšavanje 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 sveučilišta 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
možeš tražiti 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 drastično
promijenila početkom 80-tih kad je Digital prestao proizvoditi PDP-10 seriju. Njegova
arhitektura, koja je bila elegantna i moćna u 60-tima se nije mogla "prirodno" proširiti da
koristi veći adresni prostor koji je bio primjenjiv u 80-tima. To je značilo da je gotovo sav
softver koji radi pod ITS-om postao neupotrebljiv. Nešto 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 računala toga doba (VAX, 68020) su imali svoje operacijske sustave ali nijedan od
njih nije bio slobodan softver. Za svaki, makar dobili samo izvršnu datoteku, morao se je
potpisati obvezujući ugovor. To je značilo da je prvi korak u korištenju računala obećanje da
nećeš pomoči svom susjedu. Pravilo koje su uveli tvorci "vlasničkog" softvera bilo je, "Ako
dijeliš softver sa susjedom, pirat si. Ako želiš bilo što promijeniti, moli nas da ti to
napravimo". To je nešto što se Stallmanu nikako nije sviđalo i našao se je pred moralnom
dvojbom. Priključiti se svijetu "vlasničkog" softvera i potpisati obvezujući ugovor kojim
obećaje da neće pomagati kolegama ili potpuno napustiti računalni svijet i raditi nešto drugo.
Umjesto toga, kao pravi programer tražio je neko treće riješenje. Razmišljao je da li postoji
neki program ili programi koje bi on mogao napisati da zajednica ponovno oživi. Zaključio je
da mu za početak treba operacijski sustav jer je to ključni program za korištenje nekog

7/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GNU filozofija i GNU licenca

računala. Sa slobodnim operacijskim sustavom ponovno se je mogla osnovati zajednica


hakera koji bi slobodno surađivali i izmjenjivali svoje ideje. Zajednica kojoj bi se svatko
mogao pridružiti. Obzirom da je on do tada radio na razvoju operacijskih sustava, imao je
znanja i iskustva da to napravi a osjećao se i izabranim za taj posao. Odlučio je napraviti OS
kompatibilan sa Unixom kako bi bio prenosiv i kako bi dotadašnji korisnici Unixa mogli lako
prijeći na njega. Sljedeći hakersku filozofiju odabrao je ime GNU, kao rekurzivno za "GNU
Nije Unix" (GNU's Not Unix). Shvatio je da naziv "operacijski sustav" ne znači samo kernel
več da to ime uključuje i dodatne stvari kao što su komandne linije, assembleri, kompajleri,
interpreteri, debuggeri, tekst editori i još mnogo toga. Budući da su tadašnji operacijski
sustavi (ITS, Multics, VMS, Unix) imali sve to, on je odlučio da i GNU mora imati sve to.
Znajući točno što hoće, u siječnju 1984. dao je otkaz na MIT-u i počeo pisati GNU softver.
Odlazak iz MIT-a je je bio nužan 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 oživljavanje hakerske zajednice. Srećom, profesor Winston, tadašnji š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 može se reći da je to
stvarni početak svega vezanog uz GNU.

* Riječ haker (hacker) u značenju "onaj koji probija zasštite" je pogreška koju su stvorili
mediji i koji taj pojam pogrešno koriste. Pravi hakeri ne priznaju to značenje. Po njima je
haker onaj koji voli programirati i uživa u tome. Zato ja u tekstu dalje koristim i koristiti ću
taj pojam za to, pozitivno značenje.

8/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

GNU OS

Početci

Kratko prije nego je započeo GNU projekt, Stallman je čuo za "Free University
Compiler Kit" poznat također i pod nazivom "VUCK". Taj kompajler je podržavao više
programskih jezika, uključujući C i Pascal te je imao podršku za razne platforme. Stallman je
kontaktirao autora VUCK-a i pitao ga može li dodati taj kompajler u GNU projekt. Odgovor
je bio negativan. Stoga je Stallman odlučio da prvi program kojeg će napraviti bude
višejezični (multi-language), višeplatformni (multi-platform) kompajler. Nadajući se da neće
sam morati napisati cijeli kompajler, nabavio je source kod Pastel kompajlera. To je bio
višeplatformski kompajler napisan na Lawrence Livermore Lab-u. Podržavao je i bio napisan
u proširenoj verziji Pascala te bio zamišljen kao sistem-programski jezik. Stallman mu je
dodao C frontend i počeo ga prebacivati na Motorolino 68000 računalo. 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 odlučio iz početka 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 dovršio kasnije. Prije toga je
radio na GNU Emacsu.

9/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

GNU Emacs

Stallman je rad na GNU Emacsu počeo u rujnu 1984. i već početkom 1985. GNU Emacs
je postao upotrebljiv program. To mu je omogućilo da koristi Unix sustave za editiranje bez
potrebe da nauči 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 razmišljao kako svima omogućiti da dođu do kopije
Emacsa. Obzirom da nije radio tražio je naćin 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 započeo distribuciju slobodnog softvera, preteću današnjih kompanija koje
distribuiraju cjelokupne Linux-bazirane GNU sustave.

Razvoj GNU OS-a

Kako je interes za korištenjem Emacsa rastao, sve više ljudi se uključivalo u GNU
projekt i ponovno se je javilo pitanje oko financiranja projekta. Zbog toga je 1985. osnovan
Free Software Foundation (FSF). FSF je preuzela distribuciju Emacsa a kasnije je dodan i
drugi slobodni softver. Također su počeli sa prodajom slobodnih uputstava (manuala). FSF je
primala donacije, ali najveća dobit im je bila od prodaje kopija slobodnog softvera i ostalih
usluga vezanih uz to. Danas FSF prodaje CD-e i DVD-e sa source kodom, izvršnim
datotekama, lijepo štampanim uputstvima i sve to sa slobodom da se dalje distribuira i mijenja
po želji. Zaposlenici FSF-a su napisali poveču količinu GNU softver paketa. Dva
najznačajnija su C library i shell. GNU C library je napisao Roland McGrath i to je nešto što
svaki program koji radi na GNU/Linuxu koristi za komunikaciju sa Linuxom (više o Linuxu u
sljedećem poglavlju). Shell korišten na GNU/Linux sistemima je BASH, (Bourne Again
Shell) kojeg je napisao Brian Fox. FSF je sve to financirala jer im je najvažniji cilj bio razvoj
cijelog operacijskog sustava. Temeljni cilj GNU-a je bio da bude slobodan softver. Iako GNU
nije imao tehničkih prednosti pred Unixom, imao je društvenu prednost jer je omogučavao

10/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

ljudima da surađuju i imao je etičku prednost jer je poštivao 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 korištenja malo memorije
time što nisu podržali 16 bitno adresiranje (znali su da će 32 bitni strojevi postati norma kad
GNU bude dovršen). Nisu se trudili smanjiti potrošnju memorije dokle god ne bi prelazila
megabajt.

Kako je GNU projekt napredovao i sve veći broj sistemskih komponenti je nađen 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.
Također 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 ključne stvari.
Važno je napomenuti da, budući 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
značilo 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 moćnija i pouzdanija.
To je privuklo dodatne pokrovitelje i negdje oko 1990. GNU OS je bio gotovo dovršen. Falila
je još samo jedna, ključna stvar - kernel.

11/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Linux

Stallmanova prvotna ideja je bila da sami razviju svoj kernel (GNU HURD). Odlučili 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 najteži
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 početak razvoja HURD-a
je kasnio jer su čekali da Mach bude izdan kao slobodan softver, kao što su im obećali a i
pokazalo se da je debugiranje HURD servera koji se pokreću kao tredovi i koji međusobno
komuniciraju porukama prilično težak 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 nedovršeni GNU čime je stvoren komplenti slobodni operacijski sustav. Nazvali su ga
GNU/Linux što predstavlja složenicu od "kombinacija GNU sustava sa Linux kernelom". Ta
verzija GNU OS-a je stekla golemu popularnost i danas ju većina ljudi poznaje samo pod
imenom Linux iako je Linux samo dio tog OS-a (njegov kernel).

12/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

GNU FILOZOFIJA

Slobodan (free) softver

Kao što smo do sada vidjeli cijeli smisao GNU pokreta je ideja o slobodi. Ljudi koji
stoje iza GNU pokreta smatraju da je slobodan softver stvar slobode - ljudi trebaju imati
slobodu koristiti softver na bilo koji naćin za koji smatraju da im je koristan. Softver se
razlikuje od materijalnih objekata. Glavno je pitanje što je to slobodan softver i zašto bi
softver uopće trebao biti slobodan?

Prema FSF-u (Free Software Foundation) slobodan softver je stvar slobode a ne cijene.
(Pojam slobodan softver dolazi od engleskog "free software" a budući da u engleskom jeziku
riječ free ima više značenja, ideja je da se o riječi "free" razmišlja kao u pojmu "free speech"
a ne kao "free beer". U hrvatskom jeziku najbliže prijevodu odgovara riječ "slobodan" a ne
"besplatan".)

Dakle, slobodan softver je onaj koji korisnici imaju pravo pokretati, kopirati,
distribuirati, proučavati, mijenjati i poboljšavati. Točnija definicija se sastoji od četiri vrste
slobode koji imaju korisnici softvera:
• Slobodu da za bilo koju svrhu pokreću program (sloboda 0).
• Slobodu da prouče kako program radi i prilagode ga za svoje potrebe (sloboda 1).
Uvjet za to je da im je dostupan source kod programa.
• Slobodu da dalje distribuiraju kopiju programa kako bi pomogli susjedu (sloboda 2).
• Slobodu da poboljšavaju program i objave svoja poboljšanja javno kako bi cijela
zajednica imala koristi od toga (sloboda 3). Uvjet za to je da im je dostupan source
kod programa.
To su četiri ključne slobode i program je "slobodan" ako i samo ako zadovoljava sve ove
četiri točke. Prema tome, trebali bi biti slobodni dalje dijeliti kopije programa bilo kome i bilo
gdje, besplatno ili uz naknadu, bez obzira jesmo li mijenjali program ili ne. Biti slobodan
raditi te stvari znači (pored ostalog), da ne moramo tražiti ili platiti dozvolu za to. Također
trebamo imati slobodu promijeniti program i koristiti ga privatno za svoj posao ili igru, bez da
ikome uopće spomenemo da te modifikacije postoje. Ako objavimo svoje promjene ne bi
trebali obavijestiti nikoga zbog toga. Sloboda da se koristi neki program znači slobodu bilo

13/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

pojedincu ili organizaciji, da koristi taj program na bilo kojoj vrsti računala, 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 izvršne (executable) verzije, priložiti i
izvorni kod. To je zbog slobode da svatko ima pravo modificirati i poboljšavati program.
Dakle pristup izvornom kodu je kjučna osobina slobodnog softvera.

Da bi sve ove slobode vrijedile uvijek, one moraju biti neopozive tako dugo dok ne
napravite nešto pogrešno. Ako onaj koji razvije neki softver ima pravo ukinuti licencu bez da
ste vi napravili nešto što bi mu dalo razlog, onda taj softver nije slobodan softver. Međutim,
određena pravila u vezi distribucije slobodnog softvera su prihvatljiva, ako nisu u suprotnosti
sa osnovnim slobodama. Na primjer, copyleft (pojednostavljeno rečeno) je pravilo da kad
redistribuirate program, ne možete dodati ograničenja kojima biste zabranili ostalim ljudima
njihove centralne slobode. To pravilo nije u sukobu sa centralnim slobodama nego ih zapravo
štiti. Prema tome, vi možete platiti da dobijete kopiju slobodnog softvera ili možete nabaviti
kopiju besplatno. No nevezano na to kako ste došli do svoje kopije, uvijek imate slobodu
kopirati i mijenjati taj program, imate čak i slobodu prodavati kopije.

Slobodan softver ne znači ne-komercijalan softver. Slobodan softver mora biti dostupan
za komercijalnu upotrebu, komercijalni razvoj i komercijalnu distribuciju. Komercijalni
razvoj slobodnog softvera više nije neuobičajen, takav slobodan softver je postao vrlo važan.
Pravila kako pakirati modificiranu verziju su prihvatljiva ako ne sprečavaju vašu slobodu da
izdate modificiranu verziju. Pravila koja kažu "ako vaš program napravite dostupnim na ovaj
način, morate ga napraviti dostupnim i na neki drugi način" također mogu biti prihvatljiva uz
prethodni uvjet. Ovakvo pravilo vam ipak ostavlja izbor da uopće ne distribuirate program.
Također je prihvatljivo da se u licenci traži da ako distribuirate modificiranu verziju
programa, da autor traži da mu pošaljete kopiju. U tom slučaju dužni ste mu je poslati.

Kad se govori o slobodnom softveru, najbolje je izbjegavati termine tipa "besplatan


softver" jer ti termini označavaju cijenu a ne slobodu (ponovno zbog višeznačnosti engleske
rijeći "free"). Na kraju, kriteriji poput ovih do sad nabrojanih u ovoj definiciji slobodnog
softvera zahtijevaju pažljivo razmišljanje 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 točne riječi. Ako ta licenca sadrži bilo
kakve zabrane (nesvjesne), odbacuje se čak i ako se ne očekuje problem s tim kriterijem.

14/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Ponekad licenca zahtjeva puno premišljanja, uključujući razgovore s odvjetnikom, prije nego
se odluči da li licenca zadovoljava kriterije. Sve ovo se radi da slobodan softver ostane doista
slobodan.

Zašto slobodan softver

Digitalna informatička tehnologija nam je omogučila lakše kopiranje i modificiranje


informacija. Računala su to olakšala svima nama. No vlasnička prava (copyright) na neki
program su nešto što nam to onemogučava. Vlasnici takvog softvera su jedini koji imaju
pravo kopirati i mijenjati softver koji mi koristimo. Copyright sustav je nastao sa tiskanjem -
tehnologijom za masovno kopiranje. Copyright se dobro uklapa u tu tehnologiju jer
ograničava samo velike izdavače i ne oduzima slobodu čitateljima knjiga. Običan čitač koji ne
posjeduje tiskaru, može kopirati knjige samo tako da ih prepiše i rijetki imaju volju to raditi.
Digitalna tehnologija je mnogo fleksibilnija, kad su podaci u digitalnoj formi, lako se mogu
kopirati i dijeliti drugima. No ta fleksibilnost je u sukobu sa idejom copyrighta. Zbog toga su
uvedene prilično prljave mjere da se nametne copyright na softver. No, što je doista potrebno
društvu da napreduje? Potrebno je da su sve informacije slobodne, nap. program koji se može
čitati, popravljati, prilagođavati i poboljšavati a ne samo pokretati. Nažalost ono što vlasnici
softvera tipično isporučuju je crna kutija koju ne možemo proučiti ili mijenjati. Društvo
također treba slobodu. Kada program ima vlasnika, korisnici gube slobodu da kontroliraju dio
svog života.

Ekonomski razlozi koje navode vlasnici softvera su pogrešni no ekoneomski problem je


stvaran. Neki ljudi pišu koristan softver čisto iz hobija ili zato što uživaju programirajući
nešto korisno no ako želimo više nego ti ljudi naprave, moramo povečati fond. Već deset
godina ljudi koji razvijaju slobodan softver iskušavaju razne metode kako namaknuti novac.
Dosad je postignut nekakav uspjeh. Neki rade potrebne preinake svog programa zatražene od
klijenata koji im za to plaćaju. Iako bi oni i sami mogli napraviti te preinake ponekad je lakše
platiti autoru da to napravi budući da on već poznaje svoj program. Neki zarađuju tako što
prodaju usluge održavanja. Velik dio se financira iz donacija. Čini se da je to sve sitno, pokret
slobodnog softvera je još uvijek mali i relativno mlad.

15/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Kao korisnici računala danas, dosta nas koristi vlasnički softver. Ako nas prijatelj
zamoli da mu snimimo kopiju tog programa, pogrešno bi bilo odbiti ga. Suradnja je važnija
od copyrighta. No takve "underground" aktivnosti ne čine dobro društvo. Pojedinac bi trebao
živjeti otvoreno i ponosno te reći "ne" vlasničkom softveru. Svatko bi trebao moći surađivati
otvoreno s drugim ljudima koji koriste softver. Svatko bi trebao imati pravo naučiti kako neki
program radi i ako je potrebno popraviti njegov rad. To je razlog zašto nam treba slobodan
softver.

16/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Kategorije slobodnog i ne-slobodnog softvera

Ovaj dijagram (napravio Chao-Kuei) objašnjava različite kategorije softvera.

Slobodan softver (free software)


Što je slobodan softver je objašnjeno 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 znači da takav softver
mora dolaziti sa izvornim kodom.
Ako je program slobodan onda ga se potencijalno može uključiti 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" znaći
slobodan ali i besplatan). Zbog toga treba proućiti licencu s kojom takav softver dolazi da se
vidi točno na što se taj pojam odnosi.
Slobodan softver je obično pouzdaniji od ne-slobodnog.

Open source softver


Pojam "open source" više-manje znaći isto što i slobodan softver. Međutim kriterij koji neki
softver mora zadovoljavati da bi bio open source je nešto blaži, dozvoljene su neke restrikcije
koje u FSF-u smatraju previše ogrničavajućim.

17/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Public domain softver


Public domain softver je softver za kojeg ne postoje vlasnička prava. Ako je izvorni kod u
public domain onda je to poseban slučaj non-copylefted slobodnog softvera, što znaći da neke
verzije ili modifikacije možda uopće nisu slobodne.
Ako je samo izvršna datoteka u public domain a source kod nije onda to nije slobodan softver
jer on podrazumijeva da mora biti dostupan izvorni kod. Većina slobodnog softvera nije
public domain, nego na njemu postoje vlasnička 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 ograničenja prilikom distribucije ili modifikacije
softvera. To znaći da svaka kopija tog softvera, makar i modificirana, mora biti slobodna.
Copylefted je generalni koncept, da bi ga ostvarili morate koristiti specifičan skup
distribucijskih pravila. Iako se može postići raznim licencama preporuka je koristiti "GNU
General Public License" jer dvije razlićite licence mogu biti nekompatibilne što znaći 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
također mogu dodavati i nove restrikcije. Softver koji dolazi na takav način može imati
verzije koje uopće nisu slobodne. Softverske kompanije mogu kompajlirati takav softver sa ili
bez modifikacija i prodavati ga kao vlasnički softver.

GPL-covered software
GPL-covered software je softver koji je pokriven sa "GNU General Public License". GNU
projekt većinu svog softvera distribuira kao takav softver.

The GNU system


GNU sustav je potpun unixoidni operacijski sustav. Sastoji se od hrpe programa i uključuje
sav GNU softver kao i mnogo drugih paketa kao što su X Window System i TeX koji nisu
GNU softver. Budući da je svrha GNU-a da bude slobodan, svaki njegov dio mora biti
slobodan.
GNU programi

18/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Termin "GNU program" je ekvivalent terminu "GNU softver". Neki program je GNU
program ako je GNU softver. Također se koristi i termin "GNU paket".

GNU softver
GNU softver je softver izdan pod nadležnosti GNU projekta. Većina 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 većinu su napisali volonteri.

Ne-slobodan (non-free) softver


Non-free softver je softver koji nije slobodan. To uključuje "semi-free" softver i vlasnički
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. Etićki je semi-free sofver bolji
od vlasničkog softvera no svejedno stvara probleme jer se ne može upotrijebiti kao dio
slobodnog operacijskog sustava.

Vlasnički (proprietary) softver


Vlasnički softver je softver koji nije niti slobodan (free) niti semi-free. Njegovo korištenje,
redistribuiranje ili modifikacija su zabranjeni ili zahtijevaju posebnu dozvolu.

Freeware
Termin "freeware" nema jasnu prihvačenu definiciju. Obično 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 različita 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, znaći ne može 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Privatni softver
Privatni ili "prilagođeni" softver je softver razvijen za jednog korisnika (tipično 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 gledajući, nema smisla razmišljati o privatnom softveru na naćin je
li on slobodan ili nije.

Komercijalni softver
Komercijalni softver je softver razvijen sa ciljem da se na njemu zaradi novac. Komercijalni
softver i vlasnički (proprietary) softver nisu ista stvar. Večina komercijalnog softvera je
vlasnički softver ali postoji i komercijalni softver koji je slobodan isto kao što postoji ne-
slobodni (non-free) ne-komercijalni softver.
Važna stvar je naglasiti da je moguć slobodan komercijalni softver. Zato ne bi smo trebali
govoriti komercijalni softver kad mislimo na vlasnički sofver.

20/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

GNU LICENCA

GNU Opća javna licenca - prijevod

GNU OPĆA JAVNA LICENCA

verzija 2, lipanj 1991.

This is an unofficial translation of the GNU General Public License into Croatian. It was not
published by the Free Software Foundation, and does not legally state the distribution terms
for software that uses the GNU GPL--only the original English text of the GNU GPL does
that. However, we hope that this translation will help Croatian speakers understand the GNU
GPL better.
Ovo je neslužbeni prijevod GNU Opće javne licence na hrvatski jezik. Nije ga objavio Free
Software Foundation i zakonito ne izriče uvjete distribucije programa koji koriste GNU GPL -
- to čini samo izvorni, engleski tekst GNU GPL-a. Međutim, nadamo se da će ovaj prijevod
pomoći hrvatskim čitateljima u boljem razumijevanju GPL-a.
Copyright (C) 1989., 1991. Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Umnažanje i distribuiranje primjeraka ove licence jednakih izvorniku dopušteno je svakomu,
no njeno je mijenjanje zabranjeno.

Predgovor
Licence većine programa nastoje vam oduzeti slobodu da ih dijelite i mijenjate. Tomu
nasuprot, GNU Opća javna licenca jamči vam slobodu dijeljenja i mijenjanja slobodnih
programa -- kako bi program bio slobodan za sve svoje korisnike. Ova Opća javna licenca
vrijedi za veći dio programa Free Software Foundationa i bilo koji drugi program čiji se autor
obveže na njeno korištenje. (Neke druge programe Free Software Foundationa pokriva GNU
Opća javna licenca za knjižnice.) I vi je možete primjeniti na svoje programe.
Kada govorimo o slobodnim programima, govorimo o slobodi, a ne cijeni. Naša Opća javna
licenca je stvorena kako bi vam zajamčila slobodu distribuiranja primjeraka slobodnih
programa (i, ako želite, naplaćivanje toga), primanje izvornog koda ili mogućnost da ga
dobijete, mogućnost mijenjanja programa ili korištenja njegovih dijelova u novim slobodnim
programima; te saznanje da to možete učiniti.
Kako bi zaštitili vaša prava, moramo postaviti ograničenja koja zabranjuju bilo kome
poricanje ovih prava ili zahtjev da ih se odreknete. Ova ograničenja predstavljaju određene
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. Također, oni moraju dobiti izvorni kod ili mogućnost
njegova dobivanja. A vi ih morate obavijestiti o ovim uvjetima kako bi znali svoja prava.
Vaša prava štitimo u dva koraka: 1. stavljajući autorska prava na program, te 2. nudeći vam
ovu licencu koja vam omogućava zakonito umnažanje, distribuiranje i/ili mijenjanje
programa.

21/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Također, zbog zaštite svakog autora i nas, želimo biti sigurni da svi razumiju da za ovakve
slobodne programe nema jamstva. Ako program netko promijeni i pošalje 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 izbjeći opasnost
individualnog licenciranja od strane redistributora slobodnog programa, što bi program
učinilo vlasništvom. Da to spriječimo, razjasnili smo kako svaki patent mora biti licenciran za
svačiju slobodnu uporabu ili uopće ne biti licenciran.
Slijede točne obveze i uvjeti za umnažanje, distribuiranje i mijenjanje.

GNU OPĆA JAVNA LICENCA


OBVEZE I UVJETI ZA UMNAŽANJE, DISTRIBUIRANJE I MIJENJANJE
0. Ova Licenca vrijedi za svaki program ili drugo djelo koje sadrži obavijest vlasnika
autorskog prava prema kojoj se ono može distribuirati pod uvjetima ove Opće javne licence.
Pojam "Program" nadalje se odnosi na svaki takav program ili djelo, a "djelo zasnovano na
Programu" odnosi se na Program ili bilo koji rad izveden iz njega po zakonu o autorskim
pravima: dakle, djelo koje sadrži program ili njegov dio, točan ili s promjenama i/ili preveden
na drugi jezik. (Nadalje, prijevod je bez ograničenja uključen u pojam "promjena".) Svakom
korisniku licence obraćamo se kao "vama".
O aktivnostima osim umnažanja, distribucije i mijenjanja ova Licenca ne govori; one su izvan
njenog dosega. Čin pokretanja Programa nije ograničen, a o njegovom rezultatu govorimo
samo ako je sadržaj rezultata također djelo zasnovano na Programu (bez obzira što ga je
stvorio Program). Je li to istina ovisi o funkciji Programa.
1. Smijete umnažati i distribuirati točne kopije izvornog koda Programa kakvog ga dobijete,
na bilo kakvom mediju, ako očigledno i prikladno na svakoj kopiji istaknete odgovarajuću
poruku o autorskim pravima i odricanje jamstava; ostavite nepromijenjenim sve obavijesti
koje se odnose na ovu Licencu i na nepostojanje jamstava; i dajte svakom primatelju
Programa primjerak ove Licence zajedno s Programom.
Smijete naplatiti fizički čin prenošenja kopije i možete po svom izboru ponuditi jamstvo za
naplatu.
2. Smijete mijenjati svoj primjerak ili primjerke Programa ili bilo kojeg njegovog dijela, tako
oblikovajući djelo zasnovano na Programu, i umnažati i distribuirati takve promjene ili djelo
pod uvjetima prethodnog Dijela 1., ako zadovoljavate ove uvjete:
a) Promijenjene datoteke moraju nositi istaknute obavijesti da ste promijenili datoteke i datum
svake promjene.
b) Svako djelo koje distribuirate ili objavite, a koje u cjelosti ili djelomično sadrži ili je
izvedeno iz Programa ili njegovog dijela, mora biti licencirano u cjelosti bez naplate svima
pod uvjetima ove Licence.
c) Ako promijenjeni program, kada je normalno pokrenut, čita naredbe interaktivno, on mora,
pokrenut za takvu interaktivnu uporabu u najuobičajenijem načinu, ispisati ili prikazati
obavijest koja uključuje odgovarajuću poruku o autorskim pravima i obavijest da nema
jamstva (ili drugačiju, koja kaže da vi jamčite) i da korisnici mogu ponovno distribuirati
program pod ovim uvjetima, i objasniti korisniku kako da pročita primjerak ove Licence.
(Iznimka: ako je sam Program interaktivan, ali obično ne ispisuje takvu obavijest, vaše djelo
zasnovano na Programu ne mora ispisati obavijest.)

22/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

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 vaša prava na djelo koje ste vi
napisali u cjelini; namjera mu je poboljšati pravo nadzora distribucije izvedenih ili skupljenih
djela zasnovanih na Programu.
Također, 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 umnažati i distribuirati Program (ili djelo na njemu zasnovano, po Dijelu 2.) u
objektnom kodu ili izvršnom obliku pod uvjetima Dijela 1. i 2. ako učinite jedno od sljedećeg:
a) Popratite ga potpunim odgovarajućim strojno čitljivim izvornim kodom, koji mora biti
distribuiran pod uvjetima Dijela 1. i 2. na mediju po izboru korištenom za razmjenu
programa; ili
b) Popratite ga pisanom ponudom, koja vrijedi barem tri godine, da ćete svakoj trećoj stranci
dati, za cijenu ne veću od vašeg troška fizičkog vršenja distribucije izvornog koda, potpunu
strojno čitljivu kopiju odgovarajućeg izvornog koda, koju će se distribuirati pod uvjetima
Dijela 1. i 2. na mediju po izboru korištenom za razmjenu programa; ili
c) Popratite ga informacijama koje ste vi primili o ponudi za distribuciju odgovarajućeg
izvornog koda. (Ova mogućnost vrijedi samo za nekomercijalnu distribuciju i samo ako ste
primili program u objektnom kodu ili izvršnom obliku s takvom ponudom, prema prethodnom
Odlomku b.)
Pod izvornim kodom za djelo mislimo na željeni oblik djela za njegovo mijenjanje. Za
izvršno djelo, potpuni izvorni kod odnosi se na izvorni kod svih modula koje ono sadrži, uz
datoteke koje definiraju svako uključeno sučelje, uz skripte za nadzor prevođenja i instalacije
izvršne datoteke. Međutim, kao posebna iznimka, distribuirani izvorni kod ne mora uključiti
bilo što što se obično distribuira (bilo u izvornom kodu, bilo u izvršnom obliku) s glavnim
dijelovima (prevodioc, jezgra, itd.) operacijskog sustava na kojem izvršna datoteka radi, osim
ako sam taj dio prati izvršnu datoteku.
Ako se izvršna datoteka ili objektni kod distribuira omogućavanjem pristupa kopiji na
određenom mjestu, onda se omogućavanje jednakog pristupa izvornom kodu smatra
distribucijom izvornog koda, iako se drugi ne prisiljavaju na umnažanje izvornog koda
zajedno s objektnim.
4. Ne smijete umnažati, mijenjati, podlicencirati ili distribuirati Program osim kako je
izraženo u ovoj Licenci. Bilo kakav pokušaj umnažanja, mijenjanja, podlicenciranja ili
distribuiranja Programa je nezakonit, i odmah poništava vaša prava prema ovoj Licenci.
Međutim, strankama koje su od vas dobile kopije ili prava pod ovom Licencom neće biti
poništene licence, dok zadovoljavaju sve uvjete.
5. Ne morate prihvatiti ovu Licencu, pošto ju niste potpisali. Međutim, ništa vam drugo ne
jamči 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 umnažanje, distribuiranje i mijenjanje Programa ili
djela na njemu zasnovanih.

23/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

6. Svaki put kada ponovo distribuirate Program (ili bilo koje djelo zasnovano na Programu),
primatelj automatski prima licencu od izvornog vlasnika za umnažanje, distribuiranje ili
mijenjanje Programa prema ovim obvezama i uvjetima. Ne smijete nametnuti bilo kakva
daljnja ograničenja na primateljevo korištenje ovdje zajamčenih prava. Niste odgovorni za
traženje zadovoljavanja ove Licence od drugih stranaka.
7. Ako vam se, kao posljedicu sudske presude ili tužbe za kršenje patenta ili iz bilo kojeg
drugog razloga (ne samo što se tiče patenata), nameću obveze (bilo sudskim nalogom,
nagodbom, ili drukčije) u kontradikciji s uvjetima ove Licence, to ne znači da smijete kršiti
uvjete ove Licence. Ako ne možete distribuirati tako da zadovoljavate istodobno i svoje
obveze pod ovom Licencom i sve ostale odgovarajuće obveze, onda kao posljedicu uopće ne
smijete distribuirati Program. Na primjer, ako patentna licenca ne dopušta slobodnu
redistribuciju Programa svima koji njegove kopije dobiju izravno ili neizravno od vas, onda je
jedini način na koji možete zadovoljiti i nju i ovu Licencu prestanak distribuiranja Programa.
Ako se bilo koji dio ovog Dijela drži nevažećim 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 kršenje patenata ili drugih prava na vlasništvo ili na
njihovo pobijanje; jedina mu je svrha zaštita integriteta distribucijskog sustava slobodnih
programa, kojeg implementira javna praksa. Mnogi ljudi su velikodušno pridonijeli velikom
broju programa distribuiranim kroz taj sustav pouzdajući se u dosljednu primjenu tog sustava;
na autoru/donatoru je odluka da li će programe distribuirati nekim drugim sustavom i korisnik
licence ne može mu nametati svoj izbor.
Namjera ovog Dijela je razjašnjavanje onoga za što se vjeruje da su posljedice ostatka
Licence.
8. Ako je distribucija i/ili korištenje Programa u nekim državama ograničeno bilo patentima
bilo sučeljima na koje se polažu autorska prava, izvorni vlasnik autorskih prava koji je
Program stavio pod ovu Licencu može dodati eksplicitno zemljopisno ograničenje distribucije
izuzimajući takve države, i čineći distribuciju dozvoljenom samo u ili među državama koje
nisu izuzete. U tom slučaju, ova Licenca uključuje ograničenje kao da je napisano u tijelu ove
Licence.
9. Free Software Foundation s vremena na vrijeme može objaviti promijenjene i/ili nove
verzije Opće javne licence. Takve nove verzije bit će duhom slične sadašnjoj, no mogu se
razlikovati u detaljima kako bi se riješili novi problemi ili brige.
Svakoj verziji se daje različit broj verzije. Ako Program navodi broj verzije ove Licence koja
za njega vrijedi i "bilo koja kasnija verzija", smijete poštovati obveze i uvjete te verzije ili bilo
koje kasnije verzije koju je objavio Free Software Foundation. Ako Program ne određuje broj
verzije ove Licence, smijete odabrati bilo koju verziju ikad izdanu od strane Free Software
Foundationa.
10. Ako želite uključiti dijelove Programa u druge besplatne programe čiji se uvjeti
distribucije razlikuju, pišite autoru i tražite njegovu dozvolu. Za programe čija autorska prava
ima Free Software Foundation, pišite Free Software Foundationu; ponekad radi toga radimo
iznimke. U odlučivanju će nas voditi dva cilja čuvanja slobode svih izvedenica iz našeg
programa i promicanje dijeljenja i ponovnog korištenja programa općenito.
NEMA JAMSTVA
11. POŠTO JE PROGRAM LICENCIRAN BESPLATNO, ZA PROGRAM NEMA
JAMSTVA, U MJERI DOPUŠTENOJ PRIMJENJIVIM ZAKONOM. OSIM AKO JE
DRUKČIJE IZRAŽENO NAPISMENO, VLASNICI AUTORSKIH PRAVA I/ILI DRUGE

24/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

STRANKE PROGRAM DAJU "KAKAV JEST" BEZ JAMSTVA BILO KOJE VRSTE,
IZRAŽENOG ILI PODRAZUMIJEVANOG, UKLJUČUJUĆI, ALI NE SAMO NJIH,
PODRAZUMIJEVANA JAMSTVA TRGOVINSKE PRIKLADNOSTI I ODGOVARANJA
ODREĐENOJ SVRSI. SVI RIZICI VEZANI ZA KVALITETU I BRZINU PROGRAMA
OSTAJU NA VAMA. AKO SE PROGRAM POKAŽE NEVALJANIM, VI SNOSITE SVE
TROŠKOVE POTREBNOG ODRŽAVANJA, POPRAVLJANJA I ISPRAVLJANJA.
12. NI U KOJEM SLUČAJU, OSIM NUŽNO 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, NEĆE BITI VAMA ODGOVORAN ZA
ŠTETE, UKLJUČUJUĆI OPĆE, POSEBNE, SLUČAJNE ILI POSLJEDIČNE ŠTETE
PROIZAŠLE IZ KORIŠTENJA ILI NEMOGUĆNOSTI KORIŠTENJA PROGRAMA
(UKLJUČUJUĆI, ALI NE SAMO NJIH, GUBITAK PODATAKA ILI ČINJENJE
PODATAKA NETOČNIM 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 MOGUĆNOST TAKVIH
ŠTETA. KRAJ OBVEZA I UVJETA

25/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Vrste GNU licenci

Postoje tri vrste GNU licenci:


• GNU General Public Licence (GNU GPL)
• GNU Lesser General Public License (GNU LGPL)
• GNU Free Documentation Licence (GNU FDL)

GNU GPL
Koristi se sa većinom GNU programa i sa više od polovice svih slobodnih softverskih paketa.
Osnovna ideja je da pruži potpunu slobodu korisnicima softvera i onemogući dodavanje
ikakvih dodatnih restrikcija na program.

GNU LGPL
Koristi se za neke (ne sve) GNU biblioteke (library). Ova licenca se je nekad zvala "Library
GPL" ali joj je ime promjenjeno jer je navodila ljude da je koriste češče no što je to potrebno.
Glavna razlika je u tome što se biblioteka izdana pod LGPL može upotrijebiti i u vlasničkom
softveru dok se biblioteka izdana pod običnom GPL smije upotrijebiti samo u slobodnom
softveru. Što je od toga bolje, stvar je strategije i ovisi za svaku biblioteku posebno.

GNU FDL
Koristi se za dokumentaciju koja se izdaje uz slobodan softver (no ne nužno samo za to). Daje
slobodu svima da koriste, kopiraju, mijenjaju, distribuiraju tu dokumentaciju, besplatno ili uz
naknadu.

26/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

ZAKLJUČAK

GNU pokret je pokrenut iz jednostavog razloga - želje za slobodom, želje da se napravi


nešto pozitivno, nešto od čega će svi imati koristi. Ljudi koji su to gurali imali su težak
zadatak ispred sebe, napraviti slobodan operacijski sustav. Nisu imali neograničena
materijalna sredstva za to, nisu imali ni obečanje da ih novac čeka na kraju tog dugog puta.
Imali su samo znanje i veliku volju. Malo po malo, kako se je sve više ljudi uključivalo u
pokret, uspjeli su doći do svog cilja (iako ne baš onako kako su imali u planu na početku).
Nastao je GNU/Linux. Svijet je dobio slobodni operacijski sustav (u nekim verzijama). Je li
on bolji ili lošiji od drugih? O tome postoje podjeljena mišljenja no to nije važno. Važno je da
je on slobodan što znaći da ako netko smatra da nešto ne valja i da može bolje, ima slobodu to
sam napraviti. To mu je omogućeno 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 vlasničkog (proprietary) softvera. Razlog je
ponovno taj što slobodan softver dolazi sa izvornim kodom. Dostupnost izvornog koda
omogućuje bilo kome da prouči taj softver i samim time se bugovi brže pronalaze. Također,
sloboda da se mijenja kod omogućuje bilo kome da prilagodi program upravo svojim
potrebama. Time se dobija velika baza gotovog softvera u kojoj svatko može naći nešto
korisno za sebe, pogotovo ako sam nije vičan programiranju.

Kakva je budučnost GNU pokreta i slobodnog softvera? To je teško pitanje. S jedne


strane imamo velike kompanije sa mnogo novca koje na razne naćine žele zaustaviti slobodan
softver koji je zbog svoje kvalitete postao ozbiljan konkurent njihovim lošim
poluproizvodima, a potpuno je besplatan. Ide se čak tako daleko da se pokušava uvesti patent
na softverske algoritme što je po mom mišljenju totalno apsurdno i glupo, da ne kažem
opasno. Apsurdna je sama ta ideja da se nešto tako apstraktno kao što je znanje, može 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 može obogatiti budući
da svatko tko jednom dodje do programa tako izdanog, može ga dalje distribuirati bez ikakve
naknade autoru. Iako postoje naćini da se i takav softver unovći (donacije, posebne prilagodbe

27/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

softvera i sl.) zarada nikada nije i ne može biti ni blizu onoj koja se okreće u vlasničkom
softveru.

Kod nekih država (uključujući i Hrvatsku) veliki problem u prihvaćanju slobodnog


softvera je i vrlo razvijena kultura piratsva. U zemljama gdje piratsvo nije tako rašireno
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 većini korisnika nije bitna jer samo rijetki imaju znanje to iskoristiti.

Na kraju, nebitno kakva budućnost čeka slobodan softver, on je sada tu. Počeo je kao
ideja jednog čovjeka, teškom mukom i uz puno odricanja napravio je početak, pridružili su
mu se i drugi i stvar je krenula. Danas za gotovo sve što postoji kao vlasnički softver postoji i
verzija slobodnog softvera, koji budući da je nastao iz ljubavi prema programiranju a ne zbog
novca, je obično bolji i kvalitetniji. Zbog toga svi mi imamo mogučnost izbora (još kad bi se i
igre izdavale pod GNU licencom kao slobodan softver, gdje bi nam bio kraj). :)

28/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

NAPOMENE

Materijal i ideje za ovaj seminar sam našao 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 razmišljanje jednog čovjeka,
Richarda Stallmana (osim zaključka koji je iskljućivo moje mišljenje o svemu tome). Najveći
problem mi je bio prevođenje nekih rijeći koje u hrvatskom jeziku nemaju zamjenu ili ako i
imaju, ružno zvuče. Zbog toga sam neke rijeći ostavio u izvornom, engleskom obliku.
Prijevod GNU licence (pod 4.1) sam kopirao također sa http://www.gnu.org jer ja i tako to ne
mogu bolje prevesti a i bilo bi suvišno prevoditi kad prijevod već postoji.

29/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Marijela Napast

STRUKTURA UNIXA

30/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

OPERACIJSKI SUSTAV

Svako računalo ima operacijski sustav. Operacijski sustav je program koji kontrolira rad
svih ostalih dijelova računala, kako hardvera, tako i softvera. Najvažnije je što nam dopušta
da koristimo sve mogućnosti koje nam pružaju razni programi.
Detaljno govoreći Unix nije samo jedan operacijski sustav, on je obitelj operacijskih
sustava. Različiti proizvođači proizvode svoje verzije Unixa. Iako su sve verzije jako slične,
postoje male razlike koje mogu uzrokovati probleme. Najočitiji primjer je raspored sustava
datoteka i točno određeni format nekih naredbi. Jedna od velikih prednosti Unixa za
programere je to da su svi najbolje napisani korisnički programi neovisni od hardvera što ih
čini lako čitljivim novim sistemima.
Unix je višekorisnički i višezadaćni operacijski sustav. Tako može istovremeno
postojati više korisnika povezanih na sistem i svaki od njih može imati pokrenuto više
programa. Korisnici velikom prednošću Unixa smatraju mogućnost istovremenog korištenja
više programa jer tako ne gube vrijeme na čekanje da se jedan posao završi kako bi mogao
započeti novi. Unix se koristi na radnim stanicama i višekorisničkim serverima. Na X
terminalima i radnim stanicama X Windows predstavlja grafičko sučelje između korisnika i
Unixa. Ali ipak poznavanje Unixa je potrebno za operacije koje nisu pokrivene grafičkim
programom, ili kad ne postoji X Windows sistem npr. u telnet sessionu.

OSNOVNA STRUKTURA UNIX OPERACIJSKOG SUSTAVA

Unix je operacijski sustav koji se sastoji od 3 najvažnija dijela: kernela, shella(ljuske) i


datotečnog sustava tj. programa. Strukturu Unixa može opisati slika1.

Slika 1.

31/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

KERNEL

Kernel kao što govori i njegovo ime je jezgra svakog Unix sistema i očitava se prilikom
svakog pokretanja sistema i vezan je uz sam pokretački dio programa.
Rukuje sa cijelim izvornim sistemom i prezentira nam ga zajedno sa svakim spojenim
korisničkim sustavom. Zadaća kernela je da drži procese i korisnike odvojenima i regulira
pristup hardveru sistema, uključujući i procesor, memoriju, disk i druge ulazno izlazne
uređaje. Kernel direktno komunicira sa hardverom i omogućava korištenje korisničkih
programa. Ti korisnički programi ne trebaju znati ništa o hardveru. Oni samo trebaju znati na
koji način komunicirati s kernelom i tražiti od njega da izvrši željenu operaciju. Oni
komuniciraju s kernelom kroz skup standardnih sistemskih poziva. Ti sistem pozivi traže od
kernela da izvrši operacije kao što su: otvaranje, zatvaranje, čitanje, pisanje, povezivanje,
izvršavanje, startanje ili promjenu zapisa zbrojeva, mijenjanje vlasništva nad datotekom ili
direktorijem, promjene u novi direktorij, stvaranje procesa, determiniranje procesa,
omogućavanje pristupa hardver uređajima i postavljanje granica izvornom sistemu.
Najjednostavnije rečeno kernel na naredbu korisnika uključuje i isključuje dio sistema. Npr.
ako tražimo da nam računalo ispiše sve datoteke unutar direktorija naredbom ls, onda kernel
“naređuje” računalu da s diska učita sve datoteke u traženom direktoriju i ispiše ih na ekran.
Neke od osnovnih funkcije kernela su:
rukovanje s memorijom sustava i alociranje memorije za svaki proces
raspoređivanje rada procesora kako bi rezultati rada svakog korisnika bili što
uspješniji
organiziranje prenašanja podataka iz jednog djela računala u drugi dio
prihvaćanje instrukcija od strane shella i njihovo predstavljanje
iznuđivanje dozvola pristupa koje su na snazi u datotečnom sustavu
Da bi se prikazao primjer na koji shell i kernel rade zajedno pretpostavimo da korisnik
utipka naredbu rm moja_datoteka (koja ima učinak brisanja datoteke moja_datoteka). Shell
traži datoteku koja sadrži program rm i zatim postavlja zahtjev kernelu kroz sistemske pozive
da izvrši program rm na mojoj_datoteci. Kad proces rm moja_datoteka završi, shell tad vraća
korisniku znak unixa % što ukazuje na to da čeka na nove naredbe.
Da bismo locirali kernel potrebno je znati da root direktorij sadrži oboje, pokretački
(boot) program i kernel za sistem. Ime kernel datoteke varira od proizvođača do proizvođača,

32/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

ali obično uključuje skup slova: nix da bi ga se moglo pronaći 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 zajedničko ime za kernel file.

33/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

SISTEMSKI POZIVI

Sistemski pozivi su sučelje između kernela i korisničkih programa koji se pokreću 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 najvažnije za Unix programere. Sistemski pozivi su jedini način na koji se može
pristupiti opcijama kernela, kao što je sustav datoteka, mehanizam višezadaćnosti i
međuprocesno 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 između sistemskog poziva i bilo kojeg drugog poziva funkcije.
Npr. sistemski poziv read može se postaviti ovako:

amt = read (fd, buf, numbytes) ;

Implementacija subrutine read varira u raznim oblicima Unixa. Obično je to


asemblerski jezik koji koristi instrukciju stroja dizajniranu točno za sistemski poziv, a nije
direktno izvršiva 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 više vremena
nego za običnu sistemsku subrutinu za koju proces posjeduje svoj adresni prostor. Većina
sistemskih poziva vraća neku vrijednost. U navedenom primjeru poziv read vraća broj bita.
Da bi ukazao na grešku sistemski poziv vraća vrijednost koja se ne može zamijeniti s točnim
podatkom i obično je to –1. Zbog toga bi navedeni primjer trebao biti kodiran na sljedeći
način:

If ((amt= read(fd, buf, numbytes)) == -1)


{ printf(“Read failed\n”) ;
exit (1) ; }

Primjećujemo da je exit također sistemski poziv, ali on ne može vratiti grešku. Postoji
više razloga zbog kojih sistemski pozivi koji vraćaju –1 nisu uspjeli obaviti traženi posao.
Globalna varijabla errno sadrži kod koji ukazuje na razlog. Errno sadrži točne podatke samo

34/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

ako sistemski poziv doista vrati –1. Ne možemo koristiti errno da bi smo ustanovili da li je do
greške uopće došlo. Sistemska rutina perror uzima za svoj argument string i daje string,
kolonu i opis razloga greške pohranjenog u errnu. Način na koji koristimo opisane funkcije
prikazuje primjer:

If ((amt= read(fd, buf, numbytes)) == -1)


{
perror (“read”) ;
exit (1) ;
}

Kao izlaz možemo dobiti sljedeći tekst: file does not exist on an error.
Na stranicama za pomoć možemo pronaći deklaraciju za svaki poziv. Tu je prikazano
koji tip vrijednosti poziv vraća, koji tip argumenata uzima i koje datoteke moramo uključiti za
korištenje određenog 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() pokušava pročitati nbytes podataka iz objekta referenciranog deskriptorom


datoteke d u spremnik buf. Ako je poziv uspješan, vraća točan broj pročitanih bita inače vraća
–1 i postavlja globalnu varijablu errno koja pokazuje na grešku. Prvi dio koda pokazuje koje
datoteke moraju biti uključene, 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() vraća int kao rezultat. Imena argumenata određujemo sami.
Još jedan jednostavan primjer sistemskog poziva je vremenski sistemski poziv:

35/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

long time(timep) /* Vraća vrijeme u sistemu */


long *timep; /* Pointer na vrijeme */

Time vraća vrijeme u sekundama od 01.01.1970. Ako je argument timep različit od nule
točno vrijeme se pohranjuje u integer na koji pokazuje.
Neki od sistemskih poziva najniže razine su:
kreiraj
otvori
zatvori
isključi
čitaj
piši
traži
Neki od sistemskih poziva za kontroliranje procesa su:
razdvoji
čekaj
izvrši
izađi
signal
Sistemski pozivi za IPC su:
pipe
dup

36/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

SHELL

Svaki put kad se uključujemo u Unix sistem, program za uključivanje provjerava našu
šifru i korisničko ime i smješta nas u program koji se zove shell (ljuska). Shell djeluje kao
sučelje između korisnika i kernela. Shell je dio korisničkog programa, a ne dio kernela. Shell
omogućuje izvršavanje nekih procesa u pozadini. Shell je prevoditelj naredbi (command line
interpreter(CLI)). Možemo vidjeti njegov pokazivač na ekranu obično u obliku imena
računala na kojem radimo kojeg slijedi znak %. Po želji korisnik sam može promijeniti taj
pokazni znak. Da bismo napravili naš željeni posao unašamo naredbe na mjesto tog
pokazivača odnosno komandne linije koja se nalazi odmah iza pokazivača. Shell funkcionira
kao prevoditelj naredbi, uzima svaku naredbu i da bi bila obrađena prosljeđuje ju kernelu. On
tada prikazuje rezultat operacija na ekranu. Da bismo saznali koji shell koristimo treba nam
informacija koja se nalazi u shell okružnoj varijabli. Naredba echo $SHELL ispisuje
vrijednost te varijable. Da bismo otkrili koji shell upravo koristimo potrebno je znati
posljednji dio imena, pa tako postoje sljedeće mogućnosti:
Ime: Shell:
/.../sh Bourne shell
/.../csh C shell
/.../tcsh TC shell
/.../ksh Korn shell
/.../bash Bourne Again SHell

Najčešće se koriste dva shella; Bourne shell (sh) i C shell (csh). Možemo koristiti
različite shellove upisivanjem imena shella na mjesto pokazivača, 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 uključuje možemo promijeniti korištenjem naredbe
chsh. Da bismo napustili određeni shell koristimo naredbu imeshella% exit. Različiti shellovi
izvršavaju različit broj funkcija.
Shell provodi sljedeće funkcije:
a) stvara okružje susretljivo našim potrebama
Naše radno okružje je definirano svaki puta kad se spojimo ili započinjemo rad s novim
shellom. Okružje je definirano vrijednostima koje shell nalazi u inicijalizacijskim datotekama
koje se uvijek čitaju prilikom pokretanja. Okružje možemo promijeniti promjenom tih

37/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

datoteka i postavljanjem novih vrijednosti u varijable. Svaki shell rukuje na drugačiji način sa
svojim inicijalizacijskim datotekama.
Često korištene varijable za radno okružje su:

IME OPIS
EDITOR Postavlja editor koji će biti korišten od strane drugih programa,
npr. mail programa
PAGER Postavlja pager koji će biti korišten od drugih programa, npr.
mana za ispisivanje man stranica
PATH Određuje direktorije kroz koje će shell tražiti da bi pronašao
određenu naredbu. Direktoriji se pretražuju redom kojim se pojavljuju
PRINTER Određuje printer koji će služiti za ispis svih dokumenata koji će
mu biti poslani lpr naredbom
SHELL Postavlja glavni shell
TERM Određuje tip terminala za programe kao što su editor i pager
TZ Postavlja vremensku zonu u kojoj se nalazimo

b) manipulira poviješću naredbi


Shell čuva listu naredbi koje smo upisivali. Ako trebamo ponoviti naredbu, koristimo
strelice da bismo se pomicali gore i dolje po listi.
c) automatski završava linije naredbi
Utipkavanjem djela imena naredbe, naziva datoteke ili direktorija i pritiskom na Tab,
tcsh shell će završiti ostatak imena automatski. Ako shell pronađe više od jednog imena koje
počinje tim slovima čut će se beep što ukazuje na to da je potrebno utipkati još nekoliko slova
prije ponovnog pritiskanja Taba.
d) piše shell skripte
e) definira naredbene aliase
f) editira zajedničke linije

38/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

PROGRAMI

Sve u Unixu je ili datoteka ili proces. Proces je program za izvršavanje identificiran
jedinstvenim PID-om(Process identifier). Datoteka je kolekcija podataka stvorenih od
korisnika korištenjem tekst editora, compilera,itd. Primjeri datoteka su:
dokument ( izvještaj, esej…)
tekst programa napisan u nekom višem jeziku
instrukcije razumljive direktno stroju i nerazumljive prosječnom korisniku, npr.
kolekcija binarnih brojeva (executable ili izvršni file)
direktorij koji sadrži informacije o svojem sadržaju koje mogu biti skup drugih
direktorija ili poddirektorija i običnih datoteka
Okružje 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 izvršile funkcije koje je


pokrenuo korisnik. Programi su obično grupirani po kategorijama, pa tako npr. imamo
programe koje koristimo za pisanje, programe koje koristimo za programiranje ili programe
koji služe kao poslovne aplikacije. Sistemski programi su najčešće binarni i kompajliraju se
od C izvornog koda. Smješteni 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 uređen prema
hijerarhijskoj strukturi, kao izokrenuto drvo. Vrh hijerarhije se tradicionalno naziva root i
obilježava se s kosom crtom -/.

39/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

Slika 2 prikazuje strukturu direktorija.

Slika2:

Svaki čvor predstavlja ili datoteku ili direktorij datoteka, a svaki sljedeći sadrži druge
datoteke i direktorije. Datoteku ili direktorij određujemo po njegovu imenu, ili punom ili
apsolutnom imenu ili jednom relativnom za lokaciju. Puno ime započinje s rootom(/), i zatim
slijede grane datotečnog 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 uobičajeno 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 višu razinu možemo koristiti:
../condron/source/xntp
To ukazuje da je prvo potrebno ići 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 slučaju root
direktorija roditeljski direktorij je on sam. Direktorij je datoteka koja sadrži tablicu s imenima
datoteka koja se nalaze u njemu i svako ime datoteke pridružuje inode broju u listi. Inode je
specijalna datoteka dizajnirana da ju kernel može čitati kako bi dobio informacije o svakoj

40/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Struktura Unixa

datoteci. Određuje dozvole nad datotekama, vlasništvo, datum stvaranja, zadnjeg pristupa i
promjene, te fizičku lokaciju blokova podataka na disku koji sadrže datoteku. Sistemu nije
potrebna nikakva posebna struktura za podatke koji se nalaze u datoteci. Datoteka može biti
ASCII ili binarna ili kombinacija i može 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 objašnjenje dozvola nad datotekama na serveru temeljenom na
Unixu. Svaka stvorena datoteka ili direktorij imaju:
a) vlasnika
to je obično osoba koja je stvorila datoteku
vlasnik datoteke ili direktorija može davati različita dopuštenja
b) grupu
kako više korisnika može biti povezano u korisničku grupu, postoji grupno vlasništvo
vezano za pojedinu datoteku ili direktorij
c) ostalo (svijet)
svi ostali korisnici, u ovom slučaju bilo tko spojen na Internet
Postoje 3 načina zaštite datoteka i direktorija
a) r ((Read) - Čitaj)
korisnik koji ima dozvolu čitanja datoteke i može zaključati sadržaj te datoteke
korisnik koji ima dozvolu čitanja nad direktorijem može saznati koje se
datoteke nalaze u direktoriju (ako se traže detaljne informacije o datotekama unutar
direktorija, direktorij mora imati execute dozvolu)
b) w ((Write) - Piši)
korisnik koji ima dozvolu pisanja nad datotekom može mijenjati sadržaj te
datoteke
korisnik koji ima dozvolu pisanja nad direktorijem može mijenjati sadržaj tog
direktorija
c) x ((Execute)-Izvrši)
korisnik koji ima dozvolu izvršavanja nad datotekom može koristiti ime te
datoteke kao Unix naredbu
korisnik koji ima dozvolu izvršavanja nad direktorijem može kopirati
direktorije

41/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Andrija Martinović

SHELL

42/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

UVOD

U doba nastanka i razvijanja UNIX operativnog sistema, 1970-tih i 1980-tih, računala


nisu bila toliko moćna koliko su danas, tako da nije postojalo grafičko sučelje (GUI). Prvi
ulazno / izlazni uređaji bili su terminali i teleprinteri. Postojali su (višekorisnički) multiuser
serveri na koje se bilo moguće spojiti putem terminala i moglo se raditi u tekstualnom načinu
rada, komandnoj liniji (CLI), tj. SHELL-u.
I danas je ostalo popularno raditi u shell-u, ne samo zbog povijesnih razloga, nego i
praktičnih. Unix korisnicima je gotovo nezamislivo raditi bez shell-a, tj. terminala. Terminali
su i danas prisutni u raznim ustanovama i poduzećima, nije potreban dodatan software da bi
se dodao još jedan terminal, a važno je napomenuti i da je moguće i osobno računalo koristiti
kao običan terminal.
Nakon logiranja korisnik može raditi u shell-u. Danas u standardnim distribucijama (ne
onima za specijalne namjene) sve češće se korisnik nakon startanja nađe automatski u
grafičkom okruženju - XWindows, tako da terminal niti ne vidi. Naravno, u bilo kojem
trenutku može aktivirati ili terminal ili X-e (npr. Alt+F2).
Dakle, Shell je tekstualno okruženje pomoću kojega korisnik komunicira sa
operacijskim sustavom, po defaultu koristeći 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

SHELL

Shell je korisnički program kao i svaki drugi.

Shell je komandni interpreter UNIX operativnog sistema i može se promatrati kao sloj
koji se nalazi između kernela i korisnika. Interaktivan je s obzirom da ima direktnu
komunikaciju sa korisnikom. On dobiva korisničke zahtjeve, interpretira ih i predaje kernelu
na izvršavanje.
Shell je komandni interpreter, tj. još jedan sloj kojim je hardware računala sakriven od
korisnika.

44/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Shell ili CLI (Command Line Interpreter) je sučelje između korisnika i operativnog
sustava (UNIX-a), tj program koji interpretira ono što se napiše u komandnoj liniji.
Prvo što korisnik vidi kad se UNIX «digne» je login: pa password:. Nakon uspješnog
logiranja OS dodijeli UID (user ID) i GID (primary group ID) i dođemo do shell-a. Trebali bi
biti u svome (HOME) direktoriju ako postoji ili u ROOT (/) direktoriju.
U komandnu liniju, čiji defaultni prompt može izgledati: $ ili # (kod Bourne shell-a) ili
% (kod C shell-a), upisuju se naredbe.
Te komande mogu biti «built-in», tj. već ugrađene tako da se izvršavaju direktno iz
shell-a , ili se mogu indirektno pozivati iz nekih drugih programa. Ugrađene naredbe su
različite kod različitih verzija shell-ova. Iako su verzije UNIX-a slične, ipak postoje određene
razlike između verzija. Kompatibilne verzije (sh, bash, ksh) i posebna vrsta c shell-a (csh,
tcsh).
U većini verzija UNIX operativnog sustava obično su na raspolaganju sljedeće vrste
shell-ova:

SHELL KRATAK OPIS

/bin/sh - jednostavan za korištenje, fleksibilan, sa ugrađenim


Bourne Shell
programskim jezikom. /bin/rsh - reducirana verzija Bourne Shell-a.

/bin/csh - komandni interpreter i programski jezik koji podržava


C Shell
komandni buffer, kontrolu poslova i sintaksu C-like.

/bin/ksh - dodatne mogućnosti u odnosu na Bourne Shell./bin/rksh -


Korn Shell
reducirana verzija Korn shell-a.

/bin/tcsh - unaprjeđena verzija C shell-a. Ima bolje editiranje


Turbo C Shell
komandnih linija, kompletiranje imena fajlova, ponavljanja komandi.

Naravno, postoji daleko veći broj shell-ova, ali o tome kasnije.

45/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

OSNOVNA STRUKTURA UNIX-A

Na slici je prikazana arhitektura UNIX operativnog sustava. U centru strukture nalazi se


hardware koji opskrbljuje operativni sustav svim potrebnim hardware-skim resursima. Oko
hardware-a se nalazi niz slojeva koji odvajaju korisnika od stroja čineći mu na taj način
komforniji rad na računalu. Prvi sloj oko hardvera je jezgra (kernel) operativnog sistema koje
ima zadatak da više slojeve odvoji od sloja ispod, to jest da ih učini hardware-ski nezavisnim.
Slijedeći sloj čini komandni interpreter (shell). Prvenstveni zadatak ovog sloja jeste
interakcija sa korisnikom (prihvaćanje korisničkih zahtjeva, njihovo interpretiranje i
predavanje nižem sloju (kernelu) na izvršavanje). U najvišem sloju nalaze se različite
komande i korisnički programi čiji je zadatak direktno pružanje specifičnih usluga korisniku.
Na slici (dole), ovaj sloj je podijeljen na vise dijelova. Svaki dio predstavlja skup srodnih
komandi.
Imajući ovo u vidu, može se reći da razumijevanje UNIX operativnog sustava zahtjeva
poznavanje četiri njegove osnovne komponente: kernel, shell, komande i fajl sistem koji nije
eksplicitno prikazan na slici ali je implicitno sadržan u djelu kernela.

Dakle, UNIX OS se sastoji od:


jezgre (kernel)
zajedničkih programa
ljuske (shell)
viših programskih jezika
različitih namjenskih programa
Sada ćemo malo detaljnije objasniti kernel i shell.

46/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

KERNEL (JEZGRA)

Kernel UNIX operativnog sistema kontrolira pristup računaru, upravlja fajl sistemom,
resursima računara, diskovima, trakama, štampačima, komunikacionim linijama i drugim
uređajima. Na slici dat je pregled funkcija Kernel-a.

Za kernel (jezgru) možemo reći da je centralni dio operacijskog sustava koji se učitava
pri podizanju sustava, a upravlja računalnim sklopovljem, radom procesora i dodjelom
memorije.
Poznavanje jezgre operacijskog sustava nije nužno za korištenje računala.
Nedostupna je običnom korisniku koji može komunicirati s jezgrom samo preko poziva
sustavu.

47/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

LJUSKA (SHELL)

Ljuska je tumač ( tzv. interpreter ) naredbi i služi kao veza između korisnika i UNIX-a.
Svaki korisnik ima odvojenu kopiju ljuske pa prema tome one mogu biti različite 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 sljedeće akcije:
-getty osluškuje liniju i kada otkrije na njoj skup znakova zaključen znakom za
kraj retka, pokreće novi proces login, prenese mu pročitane znakove i nestaje
-login završava 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 korisničkih naredbi
Pokretanje korisničkih programa i komunikacija sa jezgrom
Prikazivanje rezultata na zaslonu
Prilikom spajanja na računalo, po uspješnoj identifikaciji, nalazimo se u
početnoj ljusci

48/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

VEZA UNIX-a I LJUSKE

Komunikacija korisnika i ljuske odvija se sljedećim aktivnostima: ljuska značka odziva


(eng. prompt)(%) naredba ljuska. Izlazak iz ljuske rezultira u preuzimanju linije terminala od
strane procesa init i sve ide iz početka (init getty login ). Ljuska pripada grupi korisničkih
programa. Kod operacijskog sustava nema nikakvih privilegija. To znači da svaki korisnik
može odabrati jednu od ponuđenih ljusaka ili (ako ima dovoljno znanja) može napisati
program koji će biti njegova ljuska. UNIX ne propisuje kako će izgledati ljuska. Zbog toga
danas postoji veći broj ljusaka međusobno različitih po mogućnostima ali s istim globalnim
zadatkom.
Danas su najrasprostranjenije slijedeće ljuske u UNIX-u:
sh – Stephen Bourne standard shell (Bourne shell)
ksh – David Korn shell (Korn shell)
csh – Berkeley C-shell (Bill Joy shell)
tcsh – poboljšana verzija ljuske csh
bash – GNU Bourne-Again Shell (kombinacija sh, ksh i csh sukladna s IEEE
Posix Shell&Tools specification (IEEE WG 1003.2)
rsh (eng. restricted shell) – dozvoljava samo nedestruktivne akcije na UNIX-u
(npr. uporaba za sajmove, predstavljanja, informacije i sl.)
rsh (eng. remote shell) – ljuska koja omogućuje izvođenje naredbi na
udaljenim računalima u mreži (TCP/IP)
ssh (eng. secure shell) – omogućuje sigurnu uspostavu veze preko mreže ali
mogu bit i nešto "egzotičnije", npr.:
psh – postscript ljuska (akcije posluživača NeWS)
ocsh – objektna ljuska (napisana pomoću ljuske csh i razvijena u okviru
Gruppe predmeta Računarski sustavi i procesi (RASIP) na FER-u)
sh4 – (tvrta 4-MATE, Zagreb). Ljuska je napisana u jeziku C uz korištenje
biblioteke curses, namijenjena je korisnicima UNIX-a na običnim terminalima
i omogućuje ugodan rad s datotekama (slično programu Norton u DOS-u).
Općenito za sve ljuske vrijedi pravilo: "Ako u obavljanju zadataka koristimo UNIX-ove
naredbe kao elemente, za njihovo povezivanje u kompleksnu cjelinu potrebno je koristiti
programiranje u jednoj od ljusaka". Ako je za rješenje zadataka potrebno koristiti osnovne

49/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

strukture i elemente nekog programskog jezika, preporuka je napisati program u jednom od


raspoloživih 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 otežan je i sigurnosni
mehanizam (problem bitova setuid i sticky).
Viši programski jezici ( C, Pascal, Fortran, LISP itd.) omogućavaju korisniku izradu
vlastitih programskih aplikacija unutar UNIX okruženja. Različiti namjenski programi (koji
se koriste pod UNIX OS) su programi za dizajniranje, obradu teksta, matematičke proračune
itd.
Dobra strana u ovom suparništvu je u tome što sve ljuske mogu istodobno postojati na
jednoj UNIX-ovoj instalaciji, a na krajnjim korisnicima je da odluče koju će koristiti. Ljuske
sh i csh su sastavni dijelovi gotovo svih inačica UNIX-a, a ostale ljuske su negdje prisutne, a
negdje ih treba dodatno instalirati.
Dva su osnovna načina korištenja ljuske:
interaktivni rad korištenjem preusmjeravanja i ulančavanja pojedinih
naredaba
skupna (eng. batch) obrada u kojoj se naredbe čitaju iz datoteke (eng. shell
script).

50/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

SHELL KAO SKRIPT INTERPRETOR

Uz pomoć VI (ili nekog drugog tekst editora) napiše se skripta. Ako prva
linija počinje sa # onda je C shell scripta. U suprotnom, script se tretira kao
Bourne shell script.
izvršavanje:
/bin/csh [-vx] script_name args ...
-v ispisuje linije skripte koje se izvršavaju
-x ispisuje komande koje se izvršavaju
ili:
% chmod +x script_name
% script_name args ...

Skripte se koriste kada je interaktivni rad težak i previše zamršen te kada zahtjeva
mnoge komplicirane akcije koje se ponavljaju.

51/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

STARTANJE SHELL-A

Shell se starta kao i svaki drugi program, programskom naredbom. UNIX je građen tako
da u operaciji boot procesa uključi i startanje Shell-a, zapravo to je zadnji korak u boot
procesu. Odmah po uključivanju računala 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 učitavanje jezgre odnosno alociranje računarskih uređaja i kad se
jednom starta kernel on ostaje u memoriji tokom čitavog rada računara odnosno do nestanka
napona u memoriji. Druga faza je identifikacija korisnika kako bi bila moguća dodjela
kontrolnih prava korisniku i u tu svrhu se pozivaju dva programa a to su “getty” i “login”.
Prvi ima funkciju obezbjeđivanja portova odnosno komunikacijskih kanala prema korisniku.
Ti kanali se označavaju kao “tty” sa rednim brojem iza toga. getty prima string sa tastature od
korisnika i prosljeđuje ga programu login koji određuje na osnovu tog stringa za koji
pretpostavlja da je korisničko ime (Username) korisnička kontrolna prava (permissions),
zatim se zahtjeva od korisnika da zada sljedeći string koji će od login-a biti prepoznat kao
korisnička lozinka (password). Ako password ne odgovara postojećem korisniku ili korisnik
nije definiran na toj mašini onda login ponovno vraća kontrolu programu getty, a ako je
identifikacija validna onda program login starta sljedeći program koji između ostalog služi za
izolaciju jezgra od korisnika a to je Shell. U svrhu ostvarivanja što veće sigurnosti sistema
startanje Shell-a može biti uskraćeno odnosno onemogućeno. Tu opet postoje opcije pomoću
kojih se određuje koji će se program odmah nakon logiranja startati. To može biti neki text
procesor ili neki spreadsheet program tako da korisnik nema pravo upravljanja fajlovima koji
nisu odgovarajućeg formata za taj program, i poslije isključivanja tog programa sistem
korisnika vraća ponovo na identifikaciju. Koji program će biti startan određuje se u fajlu
/etc/passwd koji sadrži, između ostalog, logine, kriptirane passworde, UID, GID, Ime
korisnika, itd.
Dva fajla, koja u stvari predstavljaju shell skripte, se izvršavaju u toku login procedure.
To su .login i .cshrc i oba se nalaze na HOME direktorijumu korisnika. Prvi se izvršava iz
login programa koji obavlja autorizaciju korisnika (provjera login imena i passworda). Ako je
autorizacija obavljena uspješno, sam login program starta shell korisnika. Slično, kao login,
shell izvršava svoj start-up fajl. Start-up fajl C shell-a je .cshrc. Oba spomenuta start-up fajla
služe za inicijalno automatsko izvršavanje određenih komandi, definiranje aliasa, varijabli,

52/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

radne okoline, i slično. Razlika između .login i .cshrc fajla je ta sto se .login izvršava prvi i to
prije startanja shell-a, ali to obično nije značajno
Tipičan sadržaj .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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

PRIJAVLJIVANJE SA TERMINALA

Da bi se koristile mogućnosti udaljenog računala, potrebno se na njega prijaviti. Da bi ta


prijava bila prijava bila jednaka kao da je računalo 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 pokreće posebnu instancu (kopiju) getty-a za svaki terminal za
koji je dozvoljeno prijavljivanje. getty učitava ime korisnika i pokreće login program koji
učitava šifru korisnika. Ako su korisničko ime i šifra ispravni login pokreće shell.
Shell je tada korisnikova radna okolina; može biti tekstualna, Bourne komandni shell ili
čak grafički shell - X-i...) . Kada shell program završi svoj rad npr. korisnik se odjavi, ili ako
je login prekinuo izvršavanje zbog neispravnog korisničkog imena ili lozinke, init ovo
registrira i pokreće novu instancu getty-a. Kernel ne zna ništa o prijavama jer sve potrebne
poslove obave sistemski programi.

54/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

SHELL KAO INTERPRETOR NAREDBI

Sintaksa naredbi

Kada login uključi Shell na ekranu se ispisuje komandni prompt koji obično počinje 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 pokušao interpretirati. Sintaksna pravila nalažu format u obliku
komande i argumenata:

$ naredba argumenti

naredba je neka izvršna datoteka kao npr. naredba, alat, shell, skripta, itd. Naredba mora
biti “executable” odnosno user mora imati pravo na izvrašanje te komande, pravo “x” u listi
prava koju ima svaka datoteka u UNIX-oidima.

Većina komandi očekuje argumente u sljedećoj formi:

55/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

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 određuje njeno ime i argumenti.
Zadaci shella su između ostalog i uklanjanje suvišnih informacija kao što su nepotrebni
razmaci između argumenata , itd.
U komandama se mogu koristiti univerzalni znakovi *,[] , ?.
UNIX je CASE SENSITIVE operativni sistem, odnosno string otkucan VELIKIM i
malim slovima nema isto značenje.
Na slici je prikazan dijagram toka izvršavanje naredbi.

Neki znakovii koji se sa tastature dobivaju kombiniranjem kontrolnih i standardnih tipki


imaju specijalna značenja. Najznačajniji su:

< Ctrl > S -izlaz na ekranu se privremeno zaustavlja.


< Ctrl > Q -izlaz na ekranu se nastavlja.
< Ctrl > D -najjednostavniji način odjavljivanja sa sistema.
< Ctrl > C -prekid procesa.
< Ctrl > Z -privremeno zaustavljanje procesa.

56/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Sve komande UNIX-a se, prema svojim funkcijama, mogu svrstati u neku od sljedećih
klasa:
obrada teksta -tekst editori (ed, ex, vi), spell checker, tekst formateri i
slično,
upravljanje podacima -kreiranje, organizacija i brisanje fajlova i
direktorijuma,
elektronske komunikacije -vise programa (write, mail) koji omogućavaju
razmjenu poruka među korisnicima,
programska okolina -mogućnost definiranja komforne programske
okoline korištenjem različitih uslužnih programa,
razvojno okruženje -kompajleri i interpreteri raznih programskih jezika,
linkeri, debageri,...
ostali uslužni programi -grafička podrška, X Windows.

Pisanje više naredbi u jednu liniju

Često se javljaju problemi tokom rada glede zadavanja naredbi. Ako korisnik želi zadati
nekoliko naredbi u jednom redu, odnosno želi jednom komandom narediti izvršavanje više
naredbi od jednom shell nudi takvu mogućnost na dva potpuno različita načina:

$ cd /usr/local/apache/conf; vi httpd.conf

to su zapravo dvije naredbe stavljene u jednu komandnu liniju koje koriste za editiranje
konfiguracionog fajla Apache web servera. Ključni sintaksni karakter je semikolon “;”. On
govori shellu da razdvoji dvije naredbe u jednoj komandnoj liniji. Shell će to uraditi, što znači
da će prvo promijeniti radni direktorij u /usr/local/apache/conf gdje se nalazi datoteka
httpd.conf i zatim će pokrenuti vi editor za editovanje httpd.conf fajla. Ali ovakav način
zadavanja naredbi bi trebao biti korišten samo onda kada korisnik točno zna kakvog tipa
izvršne fajlove pokreće. Ova vrsta sintakse bi se trebala izbjegavati ukoliko se radi o
određenim shellovim skriptama.

57/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Drugi način zadavanja više 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. Ključni znak je “&” i stavlja se iza naredbe koja
pokreće program koji želimo startati u pozadini. To su obično neki servisi jer nema potrebe da
servis zauzme jedan komandni prompt.

Pisanje jedne naredbe u više linija

Ponekad je potrebno zadati naredbe koje sa svojim argumentima zauzimaju više od


jedne komandne linije u promptu. To često uradi sam terminal ako ima mogućnost
automatskog wrapiranja teksta ali kod nekih tipova terminala to nije slučaj pa je potrebno
manualno prelomiti komandu u više linija:

$ echo ovo može biti predugačak text da bi stao u \


> jednu komandnu liniju

ovo može biti predugačak 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 pomoću 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 razluči što je opcija a što neki drugi argument. Prelamanje se vrši
upotrebom backslash karaktera tako što se piše 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 pažljiv jer ako poslije backslasha ne dođe

58/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

newline već recimo space pa onda newline backslash neće prelomiti liniju i shell će pokušati
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 točno 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 prevelikim razmacima’

ovo je text sa prevelikim razmacima

znak ( ’ ) se koristi za izbjegavanje grupa specijalnih znakova. Ali ako želimo koristiti
neke specijalne karaktere sa njihovim funkcionalnim značenjem onda se koristi (” ) escape
karakter:

$ echo ”moj home direktorij je $HOME”

Uslovno izvršenje komandi

Na osnovu prethodno izvršene komande moguće je usloviti izvršenje druge:

$ ls –l nepostojeći_fajl && echo ova naredba se neće izvršiti

ako prvi proces vrati nulu druga naredba će se izvršiti a ako vrati nonzero druga naredba
se neće izvršiti. Tako će naredba:

$ ls –l postojeći_fajl && halt

59/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

izlistati navedeni fajl i ugasiti računar.

$ ls –l fajl || ls -la

ako prvi dio komande vrati zero druga komanda ls se neće pokrenuti a ako vrati nonzero
komanda će izlistati sve u aktivnom direktoriju.

Uslovna izvršenja su omogućena upotrebom uslovnih iskaza && i || .

&& logičko AND

|| logičko OR

Znak ! ukoliko je napisan ispred i spaceom odvojen od naredbe predstavlja negaciju pa


se može kombinirati sa gore navedenim u svrhu ispunjavanja skoro svih situacija uslovnog
izvršenja. Treba napomenuti da ako se znak ! napiše odmah ispred naredbe bez odvajanja
spaceom to znači da shell treba da izvrši 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

učinit će isto, barem će to pokušati.

60/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Iniciranje Programa

Kada shell okonča interpretaciju komande onda pokušava inicirati izvršavanje


programa. Jezgra izvršava program ali shell inicira njegovo izvršavanje. Koko bi inicirao
izvršavanje shell pretražuje PATH standardnu varijablu u potrazi za direktorijem koji sadrži
odgovarajuću naredbu i starta subshell da pokrene program. Za razliku od shell-a podshell
može da sam mijenja radni direktorij ali nakon izvršenja naredbe shell ostaje u direktoriju u
kojem je bio kada je pokrenuo program.

Redirekcija INPUT-a i OUTPUT-a

Redirekcija inputa i outputa je zadatak shella. Shell prvo uradi redirekciju pa onda
izvrši komandu. Na primjer želimo da neki listing direktorija sačuvamo u jednom fajlu radi
kasnijeg indeksiranja recimo CD-a punog mp3-jeva:

$ ls –la > listing.txt

Ova komanda će upisati sve fileove u koji se nalaze u aktivnom direktoriju u fajl koji se
zove listing.txt.
Ali da bi naveli tipičan primjer redirekcije odnosno primjer koji dokazuje da se
redirekcija izvršava od strane shella je sljedeći. Naime ja ću sada zadati komandu koja treba
da izbroji linije u jednoj tekstualnoj datoteci:

$ wc –l .bash_history

143 .bash_history

$ wc –l <.bash_history

143
U prvom primjeru imamo rezultat koji je vratio program za prebrojavanje rijeci u
datoteci (opcija –l govori programu da prebroji redove) zajedno sa imenom fajla koji je

61/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

trebao da pretraži. Ovdje mu je rečeno gdje da traži podatke za obradu. U drugom primjeru
shell mu je samo proslijedio podatke za obradu pa stoga program nije ni znao odakle su
podaci došli.

Pipeline konekcija

Pipeline je standardni kanal na koji podaci ulaze ili izlaze. Pa je zato konekcija
pipelinea vrsta redirekcije inputa i outputa. Pomoću ove konekcije na lagan način je moguće
output jednog programa preusmjeriti ka standardnom inputu drugog. Također ovakve
konekcije su zadatak shella i obrađuju se prije samog izvršenja 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
ispiše na ekran.

Supstitucija imena fajlova

Uz pomoć shell-a moguće je na jednostavan način koristiti metakaraktere za


manipuliranje većom količinom datoteka. Kao što ste pretpostavljali shell je odgovoran i za
supstituciju. Supstitucija se izvršava prije samog izvršavanja programa:

$ ls file*

ova će naredba izlistati sve fajlove u aktivnom direktoriju čija imena počinju sa
stringom file.

62/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Upravljanje varijablama

Shell ima ugrađenu mogućnost da alocira memoriju u vidu varijabli. Zapravo, mnoge
stvari u shellu su riješene uz pomoć varijabli. Čitavo uređenje interfacea se u shellu može
uraditi pomoću varijabli:

$ MOJDIR=/home/mozaik

je jedan od načina definiranja varijabli, zapravo najčešće korišteni. Sintaksa je dakle:


ime_nestandardne_varijable, znak_jednakosti, sadržaj. U gore navedenom slučaju varijabla
MOJDIR sadrži string /home/mozaik.:

$ echo $MOJDIR

/home/mozaik

karakter $ odmah ispred imena varijable MOJDIR označava da se radi o varijabli jer bi
u protivnom komanda :

$ echo MOJDIR

vratila rezultat:

MOJDIR

Moguća je i supstitucija imena datoteka pomoću varijabli tipa:

$ ls –a $MOJDIR

ova komanda bi izlistala sve datoteke iz direktorija /home/mozaik.

63/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Uslovna supstitucija varijabli

Varijable je moguće definirati uslovno u zavisnosti od toga dali je varijabla definirana


ili ne. To se postiže upotrebom vitičastih zagrada. Ako:

$ echo $MOJDIR

ne vrati nikakav rezultat, komanda:

$ echo ${MOJDIR:-’/home/mozaik’}

$ /home/mozaik

će postaviti vrijednost odnosno neće u koliko je ta vrijednost prije to predefinirana. Ova


vrijednost će ali ostati definirana samo na nivou aktivne komande i poslije toga će se izbrisati.
Ovo je naravno moguće i uraditi na način da varijabla ostane definirana dok je mi opet na
neki način ne predefiniramo ili uništimo:

$ echo ${MOJDIR:= ’/home/mozaik’}

$/home/mozaik

I obrnuto ako je varijabla definirana njenu izmjenu možemo izmijeniti:

$ echo ${MOJDIR:+ ’/home/users/mozaik’}

ali ako varijabla nije predefinirana ostat će takva.

64/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Uslovna supstitucija varijabli sa provjerom greške

Ako varijabla prethodno nije setovana sljedeća komanda će vratiti error:

$ echo ${MOJDIR:?}

bash: MOJDIR: parameter null or not set

Ovdje bi dodao samo još to da bash podržava i polja varijabli. Polja mogu biti samo
jednodimenzionalna. Format polja je IME_VARIJABLE[n] gdje je n neki integer.

$# Sadrži broj argumenata proslijeđenih aktualnoj naredbi.

$$ Sadrži process ID aktualnog procesa.

Sadrži exit status posljednje završene naredbe. Programi po svom završavanju


$? vraćaju nulu (zero) ukoliko je proces uspješno okončan a ostale vrijednosti
(nonzero) ako nije. Ali ne moraju svi programi poštovati ova pravila.

$* Sadrži sve argumente proslijeđene programu.

Gdje je n neki integer sadrži određen argument po redoslijedu. Tako je $0 sama


$n
naredba bez argumenata, $1 prvi argument, $2 drugi, $3 treći, itd

$@ Isto što i $*

Standardne varijable su osnova za kontrolu okoline i bash koristi veliki broj standardnih
varijabli. Slučajno 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 nemoguće
promijeniti premda su one read-only ali sam pokušaj korištenja istih bi dovelo do neželjenih
mijenjanja vrijednosti pa je zbog toga na kraju data lista standardnih varijabli bash-a.

65/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

KONTROLA RADNE OKOLINE

Kad login uključi shell postavljaju se i standardne (ili okolinske enviromental)


varijable. Kao što je rečeno pomoću njih se može podešavati radna okolina korisnika. Tako,
na primjer varijabla PATH sadrži listu direktorija u kojima shell automatski traži
egzekutabilne fileove, varijabla TERM sadrži tip terminala, UID user ID, HOST ime mašine,
CPU vrstu procesora, USER ime usera, OSTYPE tip OS-a najčešće linux, itd. Korisnik može
mijenjati ove postavke jednostavno mijenjajući sadržaj standardnih varijabli. Ove postavke se
pohranjuju u shellove konfiguracione fajlove koji opet mogu biti različiti u zavisnosti od
verzije shella, distribucije unix-a, itd.

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 korištene u
drugim procesima.
Popis svih globalnih environment varijabli dobije se naredbom env ili printenv.
Poništavaju 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

HOME=/home/andrija
TERM=vt320
PWD=/home/andrija
TZ=MET-1METDST
LINES=25

Pojašnjenje nekih varijabli:

EDITOR Putanja do defoultnog editora


GROUP Login grupa
HOME Putanja do HOME direktorija
HOST Hostname operativnog sistema
IFS Interni separator polja, uglavnom white space
LOGNAME Login usera
PATH Putanja gdje se nalaze naredbe
PS1 Primarni prompt string
PS2 Sekundarni prompt string
SHELL Login shell koji se koristi
TERM Tip terminala koji se koristi
USER Ime korisnika

Dodjeljivanje vrijednosti globalnoj varijabli:


$ NAME=ime; export NAME

Dodjeljivanje vrijednosti lokalnoj varijabli:


$ name=ime

Trenutna vrijednost varijable:


$name ili ${name}

67/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

FUNKCIJE SHELL-A

Primarne funkcije Shell-a su ostvarivanje interakcije korisnika sa jezgrom, a sve u svrhu


sigurnosti datoteka na računalu. Zašto je to tako? Naime Jezgra je također u neku ruku
interpreter odnosno ono prevodi podatke koje dobije od programa procesorske instrukcije
razumljive samo računarskom hardveru. Podatke (instrukcije) koje dobiva kernel su
razumljive samo jezgri i bilo bi gotovo nemoguće da čovjek uči te instrukcije napamet i da ih
onda sam prenosi kernelu. Shell je program koji prevodi zahtjeve za kontrolu sistema kao što
su ažuriranje datoteka na sistemu, administraciju OS-a itd. Od usera se zahtjeva pridržavanje
određenih sintaksnih pravila i razumijevanje logike koje se Shell pridržava. Neovisno od vrste
Shell-a svi imaju zajedničke osnovne funkcije:
Interpretacija komandne linije (Command line interpretation)
Iniciranje programa (Program Initation)
Preusmjeravanje Inputa i Outputa (Input Output redirection)
Lančano 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

ZAJEDNIČKI FEATURES-I SVIM SHELL-OVIMA

Simbol/ comanda Značenje/akcija

> 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
() Izvrši u subshell-u.
`` Substitut izlaza uz naredbu
"" Dio quote (mogu i varijable i komande).
'' Cijela quote
\ Quote slijedeće znakove
$var Upotrijebi vrijednost za varijablu
$$ Process id.
$0 Command name.
$n n-ti argument (0<n<9).
$* Svi argumenti kao jedna riječ
# Početak komentara
bg Pozadinsko izvršavanje
break Prekid loop izraza
cd Promjena direktorija
continue Nastavak loop programa

69/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

Simbol/ comanda Značenje/akcija

echo Prikaži na izlazu (npr. ekran)


eval Evaluiraj argument
exec Izvrši
fg Foreground izvršavanje
jobs Prikaži aktivne procese
kill Terminiraj proces
newgrp Promijeni u novu grupu
shift Shift-aj poziciju parametara
stop Suspendiraj proces u pozadini
suspend Suspendiraj proces u foreground-u
time Vrijeme naredbe
umask Postavi dozvole nad fileom
unset Obriši varijablu ili funkciju
wait Čekaj dok završi proces u pozadini

70/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell

KARAKTERISTIKE RAZLIČITIH SHELL-OVA

Osobina Opis Bourne Korn C

Omogućuje kontrolu izvršavanja scripti pomoću


Kontrola toka Da Da Da
konstrukcija kao sto su petlje uslovne naredbe i sl.

Mogućnost praćenja interrupt i drugih signala koje


Praćenje signala Da Da Da
šalje UNIX.

U cilju povećanja sigurnosti sistema, nekim


Restriktivni shell korisnicima se dodjeljuje shell sa ograničenim Da Da Ne
mogućnostima.

Korisniku stoji na raspolaganju mogućnost da


alias komande preimenuje neke komande ili da vise komande Ne Da Da
ujedini u jednu.

Mogućnost da se više podataka identificira istim


nizovi Ne Da Da
imenom.

Mogućnost da se komande smještaju u buffer,


historija komandi Ne Da Da
kasnije modificiraju i ponovo izvršavaju.

Kompletiranje Mogućnost da se u komandnoj liniji automatski


Ne Da Da
imena fajlova dovrši ime započetog fajla.

Mogućnost obavljanja aritmetičkih operacija nad


Integer aritmetika Ne Da Da
varijablama u scriptama bez UNIX komandi.

Mogućnost praćenja i pristupa poslovima koji se


Kontrola posla Ne Da Da
odvijaju u pozadini.

Editovanje Mogućnost da se prethodna ili tekuća komandna


Ne Da Ne
komandne linije linija modificira tekst editorom.

71/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Siniša Julijan

SH I BASH

72/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

UVOD

Prva stvar s kojom se korisnici susreću na UNIX/LINUX operativnom sistemu je


command shell ili ljuska. Shell je termin za tekstualno okruženje pomoću kojega korisnik
komunicira sa sistemom koristeći 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
doživio je mnogo nadogradnji tako da danas postoji više inačica shell-a (csh, tcsh, bash, ksh,
psh, zsh) od kojih svaka nudi određena poboljšanja u odnosu na standardni sh shell.
Uobičajeni shell u Linux operacijskom sustavu je bash (Bourne Again Shell) i svi
daljnji primjeri odnositi će se većinom na bash ili sh shell.
Ako niste sigurni koji shell program koristi vaša distribucija, ukucajte sljedeće:

echo $SHELL

73/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

POVIJEST SHELLA

Prva važni shell bio je Bourne shell, koji je dobio ime po svom kreatoru Steve Bourne-
u. Ovaj shell je bio uključen 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 prošao,
Bourne shell je još ostao popularan i gotovo nepromijenjen. Mnogi alati i administracijske
funkcije oslanjaju se na ovaj shell.
Prvo široko rasprostranjeno alternativno okruženje bio je C shell ili csh. Ovo je
okruženje napisao Bill Joy sa Sveučilišta Kalifornije na Berkleyu kao dio Berkley Software
distribution (BSD) verzije Unix sistema, koja je izašla nekoliko godina poslije verzije 7. Ova
ljuska je uključena u sve trenutne verzije Unixa. C shell dobio je ime po sličnosti naredbi sa C
programskim jezikom. Na ovaj način Unix programeri mogu mnogo lakše 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 mogućnosti.

74/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

BOURNE AGAIN SHELL

Bourne Again Shell dobio je ime po Steve Bourne-ovom shell-u i kreiran je za


korištenje u GNU projektu. GNU projekt je započet od strane Richarda Stallmana, iz Free
Software Fondation (FSF) sa ciljem stvaranja Unix kompatibilnog sistema i zamjene svih
komercijalnih Unix programa sa slobodno distribuiranim programima. Na ovaj način nismo
samo dobili besplatne programe već i novi koncept, tzv. copyleft. Copyleft je zapravo licenca,
a programi koji su napravljeni pod tom licencom mogu biti slobodno distribuirani.
Bash ljuska je bila razvijena kako bi postala standardna ljuska na GNU sistemu i prvi
put je objavljena u Nedjelju 10. Siječnja l988. godine. Brian Fox je napisao originalnu verziju
i nastavio rad u sljedećoj dekadi. U ranoj l989. godini pridružio mu se i Chet Ramey, koji je
ovoj ljusci dao velik doprinos u rješavanju mnogih greški te dodavanjem mnogih opcija. Chet
Ramey je kasnije zamijenio Briana Foxa i postao vođa projekta. Prateći GNU principe, sve
verzije bash-a poslije 0.99 su slobodno dostupne iz FSF. Danas je bash standardni shell na
Linuxu a besplatna verzija je široko korištena na Unix operativnim sistemima.

75/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

OPĆENITO O UNIXU

Osnovni principi u Unixu:


Portabilan – napisan u C programskom jeziku
Dostupan za široki spektar računala – od malih desktop računala do velikih
superračunala
Vrlo dobar i pouzdan operativni sustav
Programsko okružje je vrlo bogato i produktivno

Filozofija iza Unix sistema


Programi sa jednostavnim input/output sučeljem
Programi su kreirani kao mali nezavisni moduli
Vrlo velika mogućnost kombiniranja više 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:
obične datoteke – tekst, programi....
direktoriji – su također datoteke i to takve koje sadrže imena datoteka koje
posjeduju
specijalne datoteke – devices, pipes (da i uređaji su datoteke, pipe-ove
ćemo spomenuti kasnije)

Unix ima monorootnu (samo jedan root) strukturu file sustava (za razliku od MSDOS,
Windows gdje ima više root-ova npr. C:\, D:\ itd).

76/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Standardna struktura direktorija na Unix sustavima:

77/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

UNIX FILE SYSTEM

Ovdje ću nabrojati neke od važnijih direktorija te njihov sadržaj:

/bin binarni podaci (programi - komande)

/dev uređaji (devices)


/dev/null nul-device
/dev/tty terminal uređaji

/lib lib datoteke

/include include header datoteke

/home korisnički home direktoriji

/usr korisničke datoteke


/usr/bin korisničke binarne datoteke (programi)
/usr/bin/openwin X windows datoteke
/usr/lib korisničke lib datoteke
/usr/include
/usr/local lokalne host datoteke

/tmp temp direktorij

/sbin administratorski alati

Path (staza, put do određene datoteke na Unix sustavu)

• Apsolutni /dir1/dir2/dir3 – gleda se od root-a

78/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

• Relativni dir1/dir2/ – gleda se od sadašnjeg direktorija


../ – nadređeni direktorij (parent)
~/ – home direktorij ~user
– user-ov home direktorij

Nekoliko naredbi za prikaz i manipulaciju datotekama

ls [options] [dir dir ...] – daje listu datoteka u direktoriju

opcije –a –l –F –R ....

pwd – ispisuje radni direktorij

cd[dir] – mijenja radni direktorij

df – traži disk
du – ispisuje iskorištenost prostora na disku

mkdir dir – stvara novi direktorij


rm file.... – briše file ili čak cijelo stablo direktorija

cp file1 file2..... target – kopira datoteke

mv file1 file2..... target – premješta datoteke


cat [file1 file2...] – prikaz datoteka

more file1 file2.... – prikaz datoteka stranu po stranu

file file... – doznaje tip datoteke

tail file ... – prikazuje zadnji dio datoteke

79/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Kada radite na Unix sustavu niste prepušteni sami sebi. Za svaku naredbu postoje help
stranice tzv. man pages, koje objašnjavaju kako radi program, sintaksa ... imena autora, e-mail
adresa za prijavu eventualnih grešaka u programu podaci o copyright-u ili bolje copyleft-u te
man stranice vezane uz trenutnu, koje bi možda trebali pročitati.

Općenito

man –k keyword - daje listu man stranica u uključujući i ključne riječi

A kako bismo potražili više 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

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 .

*********** i još puuuno opcija ************


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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

UNIX TEXT EDITORI

vi – standardni Unix editor (staromodan)


emacs i xemacs – GNU (free software) editor i njegova X windows verzija
jed – mala emacs varijanta
textedit – openwin editor
dtpad – CDE text editor

Što se rada u shelu tiče najkorišteniji su vi i emacs.

* (više o njima pročitajte u seminarima kolega Mario Strinić «vi» te Matko Pejčić
«emacs»)

82/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

UNIX SHELL

Shell ili ljuska je korisnički program kojemu je osnovna namjena olakšati interakciju
korisnika i sustava. To je zapravo naredbeni interpreter koji izvršava naredbe koje korisnik
unosi pomoću 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 određene korisničke radnje.
Ako povučemo paralelu s MSDOS operacijskim sustavom shell možemo usporediti s
COMMAND.COM programom, a shell skripte su slične .bat datotekama.
Mogućnosti koje pruža shell:

• podešavanje okružja
• pisanje shell skripti
• command history (pamti unešene naredbe tokom sessiona)
• command aliases (definiranje novog imena za postojeću komandu)
• command editing

Shell je samo program i s obzirom na to postoje više različitih 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, unaprijeđeni 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


početku, ako želite saznati u kojem shell-u radite utipkajte:

echo $SHELL

83/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Razni shell-ovi se pozivaju različitim naredbama (naravno, ako su instalirani):

sh, bash, ch, tcsh...

exit - napušta pokrenuti shell

Promjenu defaultnog login shell-a radimo sa naredbom (npr. u bash)

chsh /bin/bash

Usporedbu, što može koji shell možemo vidjeti ovdje:

84/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

UPOTREBA SHELL NAREDBI

Opći model:

command [options] [arguments]

wc –l file

korištenje više opcija: ls –aF

korištenje više argumenata: cat file1 file2 file3

Korištenje regularnih izraza:

? zamjenjuje jedan znak (character)

* zamjenjuje nula ili više znakova

[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]

mogući ispisi: File0 file0 File1 file1 File2 file2

*(Više o regularni izrazima s primjerima možete pročitati u seminaru «Regular


expresions» kolega Manuela Vidonisa i Zorana Zoričića)

85/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

OSTALI SPECIJALNI ZNAKOVI KOJE SHELL INTERPRETIRA

;&()|\^~%{}$#´″'@*?[]!<Return><Space><Tab>

Evo nekoliko primjera:

# komentira karakter

; ponavljanje više komandi u jednoj liniji

cd .. ; pwd

'command' expandira komandu npr.:

echo ″Radni direktorij je 'pwd'″

ispisuje

Radni direktorij je /home/user

Kako koristiti specijalne znakove?

\ prima slijedeći znak kakav je, bez interpretiranja

'.........' prima cijeli izraz bez interpretiranja

″....″ expandira samo znakove $ ' !

Primjer:

echo \\

ispisuje

86/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

echo \' '\ /$&' \'

ispisuje

' \ /$& '

87/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

PREUSMJERAVANJE STANDARDNOG ULAZA I IZLAZA


(REDIRECTING)

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

Preusmjeravanje standardnog ulaza:

mail user <pismo.txt

88/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

POVEZIVANJE (ULANČAVANJE) KOMANDI (PIPING)

Kada bismo npr. željeli saznati broj datoteka u direktoriju morati bismo napisati
otprilike slijedeće:

ls > lista ; wc < lista

dakle prvo bismo ispis komande ls spremili u datoteku lista, a potom bismo istu
datoteku stavili na standardni ulaz naredbe wc. Umjesto kreiranja datoteke lista mogli bismo
standardni izlaz komande ls direktno spojiti na standardni ulaz komande wc. Tu nam pomaže
mehanizam pipe-ove (cjevovoda).

ls | wc kao da smo pomoću cijevi povezali izlaz ls sa ulazom wc komande.

Možemo koristiti i više pipe-ova kako bismo povezali (ulančali) više komandi

ls dir1 dir2 dir 3 | sort | lp

Ovim nizom naredbi smo prvo dobili sadržaj direktorija dir1, dir2, i dir3, koji smo
poslali naredbi sort (na sortiranje), a potom poslali na ispis na printer.

Više o pipe-ovima možete pročitati u seminaru kolege Gorana Jurišića «Pipe i fifo».

Komandni alias-i ili kako definirati vlastitu komandu

• U različitim shell-ovima se različito zadaju.

Općenito

alias ime definicija (csh, tcsh)

alias ime=definicija (sh, ksh, bash)

89/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Primjer:

alias ll=″ls –l″


alias l=″ls -F″
alias rm=″rm -i″

alias – prikaz svih aliasa

unalias ime – briše alias

90/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

COMMAND HISTORY I COMMAND EDITING

Općenito, 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 pokreće ga. Za vrijeme dok je on pokrenut, zovemo
ga proces. Unix je multitasking Sustav, što znači da može pokretati više 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Podaci o procesima:

PID proces ID – jedinstveni cijeli broj

TT procesu pridružen terminal

STAT status procesa R – runnable, T – stopped, I – idle, W – swapped out, ...

TIME vrijeme procesora koje je koristio proces

COMMAND ime komande koja je pokrenula proces

Osim na normalan način, proces se može izvršavati 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 završi) i vi ne možete
dalje raditi na računalu. 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 ?

Općenito:

command &
[1] 276

Komanda je započela izvršavanje, ID procesa je vraćen i shell je spreman primiti novu


komandu.

92/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Suspendiranje foreground procesa – proces ulazi u stanje stopped :

^Z
[stopped]

Stavljanje procesa započetog u foregroundu u background:

^Z
bg

Stavljanje background procesa u foreground:

fg [process -id]

Ubijanje procesa:

kill [-9] process –id ...

93/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

ENVIROMENT I SHELL VARIJABLE

Standardne Unix varijable se dijele u dvije kategorije, enviroment i shell varijable. Shell
varijable se odnose sa na momentalnu instancu shell-a pa su stoga i kratkoga vijeka.
Enviroment varijable imaju veću važnost, jer traju koliko i radni session, a bivaju postavljene
nakon logina. One se konvencionalno pišu velikim slovima, dok se shell varijable pišu malim
slovima.
Korisnici mogu kreirati vlastite varijable kako bi podesili svoje radno okruženje
(enviroment), ali se bitno izbjegavati podudaranje sa imenima standardnih varijabli.

Radno okruženje je definirano setom enviroment varijabli.

Evo popisa najvažnijih enviroment varijabli:

Ime
Opis Uobičajena vrijednost
varijable
HOME apsolutno ime korisnikovog home-direktorija čita se iz etc/passwd
npr. /student/ivica
LOGNAME korisničko ime (npr. ivica) kojim se prijavljuje ivica
MAIL apsolutno ime direktorija gdje se nalazi inbox /usr/mail/ivica
za e-mail
PATH popis apstraktnih imena direktorija koje sustav /bin
pretražuje da bi našao i izvršio naredbe /usr/bin
SHELL apsolutno ime shell-a koju treba startati kao
login shell (npr. /bin/bash)
TERM zadaje tip terminala na kojem korisnik radi
TZ zadaje vremensku zonu i razliku od
Greenwich Mean time

94/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Kada želimo vidjeti stanje neke varijabli pišemo:

echo $ime_varijable

Primjer:

echo $PATH
.:/user/openwin/bin:/user/local/bin:/user/bin

Postavljanje enviroment varijabli na neku vrijednost (različito u raznim shell-ovima):

setenv name value -csh i tcsh

export name=value - sh i bash

Primjer:

setenv EDITOR emacs - csh i tcsh

export EDITOR=emacs - 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 način.

Općenito enviroment i shell varijable, koje imaju isto ime, su različite i neovisne, osim
što možda imaju jednake inicijalne vrijednosti. Ipak postoje iznimke:
Svaki put kada shell varijable home, user i term promjene vrijednost dotične
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Shell varijable su slične enviroment varijablama, ali se za razliku od njih ne prenose iz


child procesa.

Definiranje shell varijabli ( također različito u raznim shell-ovima):

set name=value (csh, tcsh)


set name=(value1 value2 value3)

name=value (sh, bash)

argv vrlo su važni shell programerima (komandni argumenti)


cwd trenutni radni direktorij
home Staza do home direktorija (ime home direktorija)
path lista direktorija koji sadržavaju komandne programe
prompt tekst string koji se prikazuje prije unosa komandi (prompt)
shell Vaš login shell
status kod koji pokazuje stupanj uspješnosti prijašnjih komandi
term tip terminala koji koristite

Primjer – podešavanje prompta:

prompt="$cwd \> "


/home/user >

Kao prompt prikazat će se trenutni direktorij – može smanjiti korištenje pwd komande,
a može 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

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 – označava 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 vitičastim zagradama:

datoteka=${LOGNAME}_datoteka

97/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

VAŽNE SISTEMSKE DATOTEKE

Svakom korisniku Unix sustava dodijeljen je set datoteka koji podešavaju standardno
radno okruženje. Od tih najvažnije su .shrc (.profile) (sh) ili .bshrc(bash), .login i .logout.
Gdje se nalaze?

Dobar način podešavanja vašeg okružja je da uvijek dodajete nove komande. Osim ako
stvarno znate što radite nemojte nikada potpuno zamijeniti njihov sadržaj.
S obzirom da se .login čita samo jedanput tokom jednog session-a, njegov smisao je
da postavi uvjete koji će važiti za cijeli session te da odradi akcije bitne samo prilikom
login-a.
.shrc ili .bshrc se koriste za postavljanje uvjeta i odrađivanje akcija prigodne za shell i
njegove instance.

Što gdje staviti? (općenito)

.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 izvršene za svaku instancu shell-a
.login

• export komande (uključujući gore navedenu PATH)


• kommande koje treba izvršiti samo jednom (prilikom logina) npr. stty, mesg,limit
• komande koje generiraju output

98/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Nakon što napravite izmjene u datotekama neće se vidjeti njihov efekt do slijedećeg
logina. Promjene u .shrc ili .bshrc možete provesti i ranije:

% source .cshrc

grep – nađi string

Sintaksa:

grep [-bchilnsvw] [-e izraz] [ime_datoteke....]

• Čita datoteke ili standardni ulaz


• traži specificirani izraz (patern) u svakoj liniji
• šalje rezultate na standardni izlaz

Primjeri:

grep user /etc/passwd - traži string user u datoteci /etc/passwd

find .-print | grep Unix - traži sve datoteke koje sadrže string Unix

find .-print | grep '^Unix' - traži sve datoteke koje započinju sa Unix

grep –v Unix datoteka - prikaži sve linije koje ne match-aju Unix

Neke korisne opcije:

-C broji linije
-h ne prikazuj ime datoteke
-l izlistaj samo datoteke koje sadržavaju linije sa zadanim uvjetom
-v prikaži linije koje ne zadovoljavaju uvjet
-x prikaži one linije koje u potpunosti zadovoljavaju uvjet

99/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Regularni izrazi za grep:

c bilo koji ne specijalni znak


\c isključi svako specijalno interpretiranje znaka c
^ početak linije
$ kraj linije
[....] bilo koji znak u rasponu
[^....] bilo koji znak van raspona
. bilo koji znak
r* nula ili više ponavljanja r
r+ jedno ili više ponavljanja r

100/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

AWK PROGRAMSKI JEZIK

AWK – autori Aho, Weinberger i Kernighan


awk je programski jezik pogodan za manipuliranje textom i za kreaciju
izvještaja

Verzije:
awk – originalna verzija
nawk – (new awk) – poboljšani awk-a
qawk – gnu awk – poboljšani nawk

dostupan je na Unix sustavima, a postoji i verzija za DOS

Primjer:

cat adresar.txt
John Doe 021-336699
Jane Doe 021-332211
John Smith 021-112233

awk ´
{print "Ime: ",$1,$2," Telefon: ",$3}
´adresar.txt

Ime: John Doe Telefon: 021-336699


Ime: Jane Doe Telefon: 021-332211
Ime: John Smith Telefon: 021-112233

*(više o awk-u možete pročitati u seminaru kolege Branimira Živkovića «awk i sed»).

101/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

PROGRAMIRANJE U SHELL-U

Kao što možete pokretati komande u shell-u tako možete koristiti njegov ugrađeni
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 ili


vi ime_datoteke

Kad ste završili sa radom u editoru dodajte dozvolu za izvršavanje:

chmod u=rwx ime_datoteke ili


chmod +x ime_datoteke

Pokrenite skriptu:

./ime_datoteke

Prva linija u skripti mora definirati shell:

#!/bin/sh Bourne shell

#!/bin/csh C shell

#!/bin/tcsh TC-shell

#!/bin/bash BASH shell

102/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

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 - argumenti
$0 - ime komande
$# - broj argumenata
$? - exit status zadnje pokrenute komande
$$ - PID trenutne instance shell-a
$! - PID zadnje komande pokrenute u pozadini
$* - string koji sadržava sve argumente
$@ - isto kao igore, osim kada je pod navodnicima

103/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Komanda shift

• pomiče 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

$var Expandira vrijednost varijable var

$(var) isto osim što zagrade zatvaraju ime varijabli koja će biti zamijenjena

$(var-nesto) ako je definirana, vrijednost od var; inače nesto i $var nije setirana na
nesto.

$(var=nesto) ako je definirana, vrijednost od var; inače nesto i $var je setirana na


nesto.
$(var?poruka) ako je definirana, vrijednost od var, inače ispiši poruku i izađi iz shella.
Ako je poruka prazna ispiši standardnu poruku.

$(var+nesto) Ako je definirana var, vrijednost od nesto, inače ništa

104/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Za čitanje korisničkog 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 traženi korisnik logiran):

user=$1 # ulazni parametar


if who | grep –s $user > /dev/null
then
echo "$user je logiran"
else
echo "$user nije logiran"
fi

105/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

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 istina ako datoteka postoji


-d datoteka istina ako je datoteka direktorij
-f datoteka istina ako je datoteka obična datoteka
-L datoteka istina ako je datoteka simbolički link
-r[wx] datoteka istina ako datoteka ima dozvolu za čitanje [pisanje, pokretanje]
-z string istina ako je string nul-string
-n string istina ako string nije null-string
str1=str2 istina ako su str1 i str2 isti
str1!=str2 istina ako su str1 i str2 različiti
n1 –eq n2 istina ako su brojevi n1 i n2 jednaki
(ostale ključne riječi: -ge, -gt,-le, -lt, -ne)

case

case word in
pattern1) command(s)
;;
pattern2) command(s)
;;

106/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

patternN) comand(s)
;;
esac

for – do – done

for var in list–of–words


do
commands
done

Primjer

#!/bin/bash
# uspoređuje 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

while – do – done & until – do – done

while command_list1
do
command_list2
done

107/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

until command_list1
do
command_list2
done

108/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

KREIRANJE NOVIH PROCESA

exec – pokretanje novog programa u istom procesu – preko memorijskog prostora


starog
procesa prepisuje se novi
fork – kreiranje novog procesa – fork vraća status 0 child procesu i ostale
vrijednosti parent
procesu

Kao najčešći primjer za exec i fork uzima se slijedeće:

109/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sh i bash

Što se to zbilo?

nakon uspješnog 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 završi
u toj novoj instanci shell-a se exec-a ls koji preuzme streamove obavi svoje i
umre
streamovi se otvaraju prvotnom shell-u, koji očekuje novu komandu
Happy Unix user is even more happy

110/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Marijana Ladan-Pelivanović

C SHELL, T C-SHELL

111/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

UVOD

Shell kao korisničko okruženje ima ogromne mogućnosti. Dostupne su velike skupine
programa, od tekstualnih procesora, programa za komunikaciju, administraciju sistema pa do
raznih programskih alata. Prvo široko rasprostranjeno alternativno okruženje UNIX sistema
bio je C shell. Nastao je na Berkeley sveučilištu u Kaliforniji a razvio ga je Bill Joy kao dio
Berkley Software Distribution (BSD) verzije UNIX sistema, koja je izašla nekoliko godina
poslije verzije 7 (1979). Inače C shell je dobio ime po sličnosti naredbi sa C programskim
jezikom. Oni programeri koji koriste C ili C++ najčešće programiraju u C-shellu. Kao i Korn-
Shell i C shell je produžetak sh shell-a. Tenex-C shell je poboljšana verzija C shell-a. Izvršni
program C shell-a nalazi se u datoteci /bin/csh.

112/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

START-UP FAJLOVI C SHELL-A

Start-up datoteke C shell-a su .cshrc i .login. Datoteke .login i .cshrc izvršavaju se u


toku login procedure, znači prilikom svakog pokretanja shell-a. Nalaze se u HOME
direktoriju korisnika. Prva se izvršava iz login programa koji obavlja autorizaciju korisnika.
Kada je autorizacija uspješno završena sam login program starta shell korisnika. Slično kao
login, shell izvršava svoju start-up datoteku. Ove start-up datoteke služe za inicijalno
automatsko izvršavanje određenih naredbi, definiranje aliasa, varijabli radne okoline i sl.
Razlika između .login i .cshrc datoteke je ta što se .login izvršava prva i to prije startanja
shell-a, ali to obično nije značajno. Korisniku se preporučuje dodavanje svojih definicija u
.cshrc datoteku. Komande set i setenv koristimo za inicijalizaciju varijabli, set se koristi za
shell a setenv još i za bilo koju podljusku. C shell koristi simbol ~ za označavanje direktorija
u path-u, npr. ~/.cshrc ili za specifikaciju drugih korisničkih login direktorija npr.
~username/.cshrc.

Primjer .cshrc datoteke:

# ! /bin/csh
# Sample .cshrc file
setenv EXINIT 'set smd sw=4 wm=2'
set history=50
set savhist=50
set ignoreeof noclobber
if ($?prompt) then
set prompt='[\!] % '
alias f finger -R
alias lo logout
endif

113/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

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

Komandne linije C shell-a

Shell naredbe su linije sastavljene od jedne ili više riječi, koje su odvojene razmakom ili
TABom. Prva riječ u liniji je naredba. Ostatak (ako ih ima) su argumenti (parametri) datoj
naredbi, a predstavljaju imena objekata na koje će naredba djelovati.

command options arg1 arg2 ... < Enter >

Opcije obično počinju crticom (-).

Primjer -ls naredbe za listanje sadržaja direktorija:


-ls
-ls -a -l

114/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Postavljanje prompta

Kod t (csh) prompt možemo postaviti tako da u našoj .cshrc datoteci postavimo
slijedeću liniju

set prompt=" % m % / % "

Ovim načinom, svaki put kada pritisnemo return, prompt će nam reći gdje se nalazimo
bez da prvo mijenjamo direktorij.

Leksička struktura

Shell dijeli ulazne linije u riječi, prazna mjesta i tabove. Specijalni karakteri kao '&', '|',
';', '<','>', '&&', '||', '<<', '>>' su uvijek odvojene riječi, bile one ili ne okružene praznim
mjestima (whitespace).

Specijalni karakteri uključujući i prazan space i tab mogu imati drugo značenje i biti dio
druge riječi, ukoliko se nalaze ispred backslash '\' ili jednostukog " ili dvostrukog "" navoda.

Nastavljanje i razdvajanje naredbi

Razdvajanje naredbi. Primjer: % ls -l; rm *.* <Enter>


;

Nastavljanje naredbe u više redova. Primjer:

\ % cat *.* \ <Enter>


grep "srce" | \ <Enter>
more <Enter>

115/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Aliasi

Prilikom rada na UNIX-u često se susrećemo sa naredbama koje imaju komplicirane


nazive. Ponekad naredbe koje često koristimo sadrže mnogo opcija i argumenata koji se
moraju navesti. Tada se koristimo aliasima.
Pomoću aliasa dugačke naredbe tj. naredbe s puno argumenata i opcija možemo skratiti
ili im dati druga jednostavnija imena. Aliasi se mogu definirati u naredbenoj liniji ili .cshrc
datoteci koristeći formu:

alias novoime=naredba

Znači novoime je alias za naredbu po imenu naredba.

Varijable

Za vrijeme rada shell pohranjuje tzv. shell varijable. Varijable u C shellu su definirane
korištenjem interne set naredbe. C shell podržava 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 najčešće korištenih varijabli: logname, home, path, mail, term automatski se
uključuju i u okolinu nakon ove naredbe, pa za njih nije potrebno upotrebljavati setenv.
Prilikom uključenja u okolinu, imena ovih varijabli se pišu velikim slovima npr. PATH.

116/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Setenv izlistava okolinu koja se predaje programima, dok set daje popis svih varijabli
koje poznaje sama ljuska.
Varijable u C shell-u možemo 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Najznačajnije predefinirane i ugrađene shell varijable

argv argumenti iz komandne linije


cwd trenutni direktorij
home HOME direktorij
Ako je setovana, shell će ignorirati <Ctrl> D sa terminala. Sprječava se
ignoreeof
neželjeni logout
Lista datoteka gdje shell provjerava da li je pristigla pošta. Ako je prva
mail riječ u mail broj onda je to interval na koliko se provjerava pristizanje
pošte.
noclobber Ako je setovana nije dozvoljeno prepisivanje datoteka redirekcijom
path lista direktorija gdje shell traži naredbe

String koji se pojavljuje na terminalu kada je shell spreman da primi


narednu naredbu. ! se zamjenjuje rednim brojem komandne linije. Obično
prompt
se postavlja na slijedeću vrijednost:

set prompt= "hostname'\!%"


user korisničko ime, startamo sa $USER
term tip terminala koji koristimo, startamo sa $TERM
shell Puno ime trenutnog shell-a, startamo sa $SHELL

118/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Povijest naredbi

Povijest naredbi je mogućnost smještanja naredbi u bafer, njihovo kasnije modificiranje


i ponovno izvršavanje. Znači shell pamti prethodno unesenu naredbu i omogućava da se ista
ponovno pozove. Po izlasku iz shell-a, lista se upisuje u ~/.history i tako biva zapamćena
između dva login procesa.
Sa history i savehist varijablama moguće je postaviti broj prethodno izvršenih naredbi
koje će biti opet pozvane. Primjer spremanja 100 zadnjih naredbi u shellu i 50 zadnjih naredbi
u .cshrc koje će biti pozvane sljedećim loginom.

set history=100 savehist=50

Prethodne naredbe moguće je pozvati i korištenjem ugrađenih history varijabli.

History substitution

!! Prethodna naredba. Primjer:

% !! < Enter>

Izvršava ponovno prethodnu naredbu.


!n Naredbena linija broj n. Broj n se može otkriti sa history
!-n Naredbena linija sa brojem za n manji od trenutnog
!string Zadnja naredbena linija koja počinje stringom. Primjer:

% c proba.c pr.c obj. o -o proba -lm


...
% !c
!?string? Zadnja naredbena linija koja sadrži string.

!n* Svi argumenti n-te naredbene linije. Ako se ne zada n podrazumijeva se


prethodna linija. Primjer:

119/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

% c proba.o pr.o obj.o -o proba


!n^ Prvi argument n-te naredbene linije
!n$ Zadnji argument n-te naredbene linije
!i:j j-ti argument i-te naredbene linije
^str1^str2 U zadnjoj naredbi zamijeni str1 sa str2
!n:s/str1/str2/ U n-toj komandnoj liniji zamijeni str1 sa str2.

Kontrola poslova (Job control)

Kontrola poslova je mogućnost praćenja i pristupa poslovima koji se odvijaju u


pozadini.

& Izvršavanje naredbe u pozadini (background). Primjer:


% du > zauzeto &
<Ctrl>Z Privremeno zaustavljanje procesa
bg [%job] 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] Prekida proces koji se izvršava u pozadini. Primjer:
% stop % infinite
<Ctrl> C Prekidanje trenutnog procesa.

120/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Praćenje Signala

U C shell-u jedino što možemo napraviti sa signalima je hvatanje signala SIGNIT

Pozivanje funkcije

Funkcije u shell script-ovima kao i u višim programskim jezicima predstavljaju osnovno


sredstvo modularizacije programa.
Postoje dva načina definiranja funkcija:

function ime {
naredbe
}
ili
ime ( ) {
naredbe
}

Funkcije se pozivaju jednostavnim navođenjem 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
pokazivača na te argumente kao nizove znakova. Prvi od tih nizova je ime samog pozvanog
programa. envp je niz pokazivača na nizove znakova oblika "ime=vrijednost" koji čine
okolinu. Posljednji pokazivač je NULL.

121/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Također, program koji ne koristi nikakve ulazne parametre može definirati main kao:

int main(void) { ... }

main treba vratiti cjelobrojnu vrijednost jer poziv možemo pojednostavljeno zamisliti
kao:
exit(main(argc, argv, envp));

Ako program završava pozivom exit na nekom mjestu, onda ne dolazi do povratka iz
main. Međutim, ako main normalno završava, onda je potrebna povratna vrijednost koja će
postati argument poziva exit.

Standardni ulaz i izlaz

Velika snaga UNIX-a je u preusmjeravanju ulaza i izlaza naredbi u datoteke (time i na


sve vanjske jedinice), kao i međusobno spajanje ulaza i izlaza više naredbi. Svaka naredba
ima:
standardni ulaz u program (stdin, tastatura,0)
standardni izlaz iz programa (stdout, monitor,1)
standardni izlaz za greške iz programa (stderr, monitor,2)

122/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Redirekcija

Mehanizam redirekcije omogućava kombiniranje osnovnih naredbi (npr. cat, grep, sort,
cut,tr) u cilju obavljanja složenih operacija.
Osnovni tipovi redirekcije (preusmjeravanja):

Preusmjeravanje izlaza naredbi za rezultate (stdout):


>
date > now

Dodavanje na kraj postojeće datoteke


>>
ps -ef >> proba

Preusmjeravanje izlaza naredbi za pogreške (stderr):


>&
ls abc>& er2 upisuje u stvorenu datoteku

>>&

dodavanje na kraj postojeće datoteke


ls abc >>& er1

Preusmjeravanje ulaza naredbi (stdin):


<
cat<.login čita iz postojeće datoteke

<<
cat<<EOF čita iz tijela datoteke tipkam...... EOF

123/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Piping

Jedna od moći komandne linije je mogućnost korištenja piping-a. Korištenje ove


tehnike u terminalu je dobar trik, a predstavlja i olakšanje pri radu. Piping je također široko
raširena metoda među C programerima. Bez pipinga, da bi napravili jednostavne zadatke
morali bi pisati velike količine 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 tekućem direktoriju koja sadrži mnogo linija teksta sadržanih od riječi TUX, a
zatim jednu rečenicu koja će sadržati riječ TUX i riječ Uni.

grep TUX datoteka_1.txt

Rezultat će biti izlistan na ekranu, a sačinjavat će pretragu za rečenicama koje sadrže


riječ TUX.

Ako napišemo

grep TUX datoteka_1.txt > tux_recenice.txt

rezultat možemo vidjeti u datoteci tux_recenice.txt. Znači, 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 zapiše rezultat naredbe grep, umjesto
da sve izlista na ekran. Ukoliko datoteka s tim imenom već postoji rezultat naredbe grep biti
će zapisan preko sadržaja te datoteke.
Ako umjesto znaka > stavimo znak >>, sadržaj već postojeće datoteke će ostati isti, a
rezultat će biti dodan na zadnju liniju teksta.
Prava moć pipinga je kada jedan program može čitati output nekog drugog programa.
Ako napišemo

grep TUX datoteka_1.txt | grep Uni

124/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Prva grep naredba izlista sve tux rečenice kao output. Znak | vrijednosti iz outputa
prenosi na input slijedeće naredbe, koja je također grep naredba. Druga grep naredba pregleda
sadržaj inputa u potrazi za rečenicama koje sadrže riječ Uni u sebi. Naredba grep na ovaj
način se koristi kao filter.

stout stdin
naredba1 naredba2

% naredba1 | naredba2

Redirekcija i piping u višestrukoj kombinaciji mogu činiti čuda.

Specijalni znaci u C shell-u (Pattern Matching)

Shell i neki tekst procesori dozvoljavaju zamjenu meta-karaktera ili wild cards
specijalnim znacima.
? Zamjenjuje samo jedan znak. Primjer:
% ls prim?.c
prim1.cprim2.c
% ls ?ead Ispisuje sve datoteke koji imaju 4 znaka i koji završavaju sa "ead"
* Zamjenjuje bilo koji string. Primjer:
% ls *.c
prim1.c prim2.c primer.c
% ls * Ispisuje sve datoteke trenutnog direktorija
% ls *ing Ispisuje sve datoteke trenutnog direktorija koji završavaju sa "ing"
[lista] Zamjenjuje bilo koji znak u listi Primjer:
% ls [blm] ead >bead, lead, mead
[x-y] Zamjenjuje bilo koji znak u rangu od x do y. Primjer:
% ls srce[a-g].c
srceb.c srced.c

125/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

{ string..} Grupiranje. Primjer:


% ls { x *y* ?z* }
x myfile yourfile xza yza
~home Trenutni direktorij korisnika
~user Home direktorij određenog korisnika

Regular expressions

Neki tekst procesori kao grep, egrep, sed, awk i vi omogućavaju pretraživanje pattern-a
umjesto fiksnih stingova. Takvi tekstualni modeli (pattern) su poznati kao regular
expressions.

. Zamjenjuje bilo koji znak


* Zamjenjuje nulu
$ Označava kraj linije

Proces kreiranja i izvršavanja C shell scripta

Zahvaljujući script-ovima, komandni jezik ljuske može se smatrati nekom vrstom


programskog jezika, riječ je o jeziku koji se interpretira, a ne kompilira. Zaista, jezik ljuske
ima razne osobine koje inače susrećemo kod običnih programskih jezika: mogućnost
testiranja uvjeta (istina/laž), uvjetno izvršavanje komandi (if), višestruko izvršavanje komandi
(for i while petlje), prebacivanje argumenata iz komandne linije u "program" (script).
Shell scriptovi se uglavnom koriste za poslove administriranja UNIX sistema, dakle za
upravljanje resursima i procesima, za pretraživanje i ažuriranje sistemskih datoteka i sl.
Uz pomoć VI (ili nekog drugog tekst editora) formiramo script. Ako prva linija počinje
sa # onda se radi o C shell scriptu. U suprotnom, script se tretira kao Bourne shell script.

126/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

izvršiti:
/bin/sch [-vh] script_name args ...

-v ispisuje linije skripta koje se izvršavaju


-x ispisuje naredbe koje se izvršavaju

ili:
% chmod +x script_name
% script_name args...

Argumenti naredbene linije

Argumenti iz naredbene linije prenose se u script varijable argv.

Primjer: Ekvivalentno:
echo $argv echo $*

echo $argv[2] echo $2

Kontrola toka

Omogućuje kontrolu izvršavanja scripta pomoću konstrukcija kao što su petlje, uvjetne
naredbe i sl.

IF (izvršava niz naredbi ako je uvjet istinit)

if (izraz) then if (izraz) then


naredba naredba
endif else if (izraz) then
naredba

127/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

else
naredba
endif (za postojanje i else)
Provjera datoteka:
if ( -c filename) then
....
gdje je -c :
-
Istinito ako korisnik koji izvršava script može čitati datoteku.
r
-
Istinito ako korisnik koji izvršava script može pisati u datoteku.
w
-
Istinito ako korisnik koji izvršava script može izvršavati datoteku.
x
-
Istinito ako datoteka postoji.
e
-
Istinito ako je korisnik koji izvršava script vlasnik datoteke.
o
-
Istinito ako je datoteka prazna.
z
-
Istinito ako je direktorij.
d

SWITCH (ovisno o ispunjenosti uvjeta izvršava se jedan od nekoliko zadanih nizova


naredbi)
switch ($var) switch($1)
case strl1: case -p:
naredba lp $2
breaksw breaksw
... case -c:
case strn: cc -c $2
naredba breaksw
breaksw case -l:

128/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

default: cc $2
naredba breaksw
breaksw endsw
endsw

FOREACH (izvršava niz naredbi određeni broj puta)


foreach var name (wordlist) foreach arg ($*)
naredba echo $arg
end end

WHILE (izvršava niz naredbi dok god je uvjet istinit)


while (izraz) set i=1
naredba set j=10
end while ($i<=$j)
echo Nešto
@i++
end

GOTO

loop:
naredba
goto loop

129/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

INTEGER ARITMETIKA

Mogućnost obavljanja aritmetičkih operacija nad varijablama u scriptu bez UNIX


naredbi

Aritmetičke operacije Logičke operacije

+ zbrajanje << pomicanje u lijevo


- oduzimanje >> pomicanje u desno
* množenje | ili operacija
/ dijeljenje ^ ekskluzivno ili
% dijeljenje po modulu & I operacija
++ inkrementiranje
-- dekrementiranje

Logički 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
univerzalni znaci dozvoljeni ($file =~ *.c).
!~ Istinito ako lijevi string ne odgovara stringu s desne strane. Univerzalni znaci
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 strane veći od desnog
>= Istinito ako je broj s lijeve str. veći ili jednak desnom
|| Logičko ili
&& Logičko i
{command} Istinito ako je naredba uspješno završena

130/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Neke najznačajnije ugrađene naredbe C-Shella

Bez argumenata prikazuje sve definirane aliase i njihove izraze. Samo sa


alias
name printa alias sa tim imenom. Kompletna naredba definira novi alias
[name[expression]]
pod imenom name.

bg [%job] Prebacuje proces u pozadinu

cd [name], chdir
Promjena trenutnog direktorija
[name]

Ispisuje words na standardnom izlazu. S opcijom -n sprječava se prelazak


echo [-n[words...]]
u novu liniju

exit [status] Izlazak iz shell-a sa statusnom linijom

fg [%job] Vraćanje procesa iz pozadine

history

jobs [ l ] Daje listu poslova. Sa -l dobiva se detaljnija lista.

kill

nohup [command Izvršava naredbu ignorirajući signale. Naredba se ne može prekinuti ni


[args...]] kada se korisnik koji je startovao odjavi sa sistema.

Preračunava tabelu direktorija u promjenjivoj path. Neophodno jedino


rehash
kada se dodaju nove naredbe dok smo prijavljeni u sistem.

repeat count
Ponavlja naredbu count puta.
command [args...]

setenv name value Postavlja varijable okoline (USER,PATH se postavljaju automatski)

Pomjera riječi u varijable u lijevo. Prva riječ se gubi. Anko nije definirano
shift [varijable]
ime varijable, korist se argv.

source [-h] Izvršava drugi script. Sa -h opcijom naredbe iz scripta se ne izvršavaju


filename nego samo umeću history u listu.

stop [%job]

Briše postavljene aliase čija imena odgovaraju patternu.


unalias pattern
Npr. unalias * briše sve.

131/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

unset pattern Resetuje sve varijable čija imena odgovaraju patternu. unset* resetuje sve

Briše varijable okoline čija imena odgovaraju patternu. unsetenv* briše


unsetenv pattern
sve.

Komentari i izlaz

Sve od # do kraja linije smatra se komentarom. Izlaz iz shella sa statusom status:

exit [status]

132/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

T C SHELL (TENEX-C-SHELL)

T shell odnosno Tenex shell je poboljšana 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. Uključuje:
Editiranje komandne linije
Nadzor login/logout procedure
History nadopunu
Periodično izvođenje naredbi
Ispravljanje gramatičkih pogreški (pravilno pisanje riječi)
Rad s dugačkim listama argumenata

Start-up Tcsh
Tcsh

Interaktivan Neinteraktivan

Login No-Login

Interaktivni i neinteraktivni Tcsh

Ukoliko je T-C-Shell povezan sa standardnim ulazom i izlazom( s virtualnom


konzolom) tada se radi o interaktivnom shellu. Interaktivni Bash podijeljen je u login Tcsh i
No-login Tcsh. Tcsh radi kao login-shell, kad se starta eksplicitno opcijom >>-l<< ili kada je
prvi argument (znači argument 0) >>-<<.
Login-shell najprije izvršava naredbe iz sistemskih datoteka >>/etc/csh.cshrc<< i
>>/etc/csh.login<<. Redoslijed je različit obzirom na verziju koja se koristi. Najčešće se
promatra datoteka ~/.tcshrc, ako ne postoji onda se promatra ~/.cshrc. Ukoliko postoji
redoslijed izgleda ovako: ~/.history, ~/.login i ~/.cshdirs.

133/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Login i Logout script

Prilikom startanja tcsh izvršavaju se slijedeće scripte:

/etc/csh.cshrc

/etc/csh.login (samo kao login shell)


/etc/environment (samo kod AIX kao login shell)

$HOME/.tcshrc

logout

/etc/csh.logout
$HOME/.logout

Posebnost tcsh je i autologout mehanizam.

user@sunce>tcsh -l
sunce/home/user>set autologout =1
#Nakon 1 min. ne događanja ništa
user@sunce>auto-logout

Podešavanje prompta

set prompt = " --%T %n % ~--\n$"

Kod tc shell-a postoje 3 vrste prompta

1. prompt1: Kazuje da tcsh očekuje novu naredbu

134/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

2. prompt2: "Nastavak prompta" javlja se kod nepotpune while ili foreach petlje kao i
poslije linija koje završavaju \.
3. prompt3: Ovaj prompt se javlja samo u slučaju greške i nudi malu pomoć kroz tcsh.

Editiranje komandne linije

Mogućnost da se prethodne ili trenutne komandne linije modificiraju tekst editorom.


Tcsh posjeduje mogućnost editiranja komandne linije i history. Mnoge verzije tcsh po
defaultu koriste emacs komandnu liniju editiranja, međutim moguće je i postavljanje vi
editora.

bindkey -v primjer za vi-editor


bindkey -e primjer za emacs-editor

Kompletiranje imena fajlova i liste

Mogućnost da se u naredbenoj liniji automatski dovrši ime započetog fajla.


Shell je obično u mogućnosti dopuniti riječ ako je napisana samo skraćenica. Npr.
upišemo samo dio riječi 'ls/usr/lost' i pritisnemo tab tipku kako bi pokrenuli complete-word
komandni editor.
Shell će sam dopuniti ime fajla '/usr/lost/' u '/usr/lost+found/' i u ulaznom baferu
nepotpuni naziv zamijeniti punim

Primjer:

echo $ar[tab]
echo $argv (ukoliko niti jedna druga varijabla ne počinje sa ar.)

Isto tako moguće je upisivanjem '^D' kako bi pokrenuli delete-char-or-list-or-eof


komandni editor ispisati nadopunu riječi. Shell ispisuje moguću nadopunu korištenjem
ugrađene ls -F i reprinta prompt i nedopunjenu komandnu liniju.

135/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Primjer:

>ls/usr/l[^D]
lbin/ lib/ local/ lost+found/
>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 riječi u listi definiramo sa $#var

136/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb C shell, T C-shell

Ispravljanje gramatičkih pogrešaka

Shell je u mogućnosti korigirati imena datoteka, naredbi i imena varijabli. Pojedine


riječi je moguće ispraviti uz pomoć spell-word komandnog editora. Ispravna shell varijabla
postavlja sena 'cmd' kako bi ispravili ime naredbe.

Primjer:

>set correct =cmd


> lz/usr/bin
CORRECT>ls/usr/bin (y|n|e|a)?

Moguće je odgovoriti sa 'y' ili pritisnuti space tipku kako bi ispravili liniju, 'e' ostaviti
naredbu neispravljenu u ulaznom baferu ili 'a' za prekid naredbe.

Automatsko periodično izvođenje komandi

Uz pomoć interne naredbe sched naredbe možemo izvoditi u određeno vrijeme ukoliko
shell nije zatvoren.

137/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

Predrag Jovanović

SHELL PROGRAMIRANJE
(shell i bash)

138/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

UVOD

Što je shell i vrste shell-a?

Shell je program koji je posrednik (sučelje) između korisnika i operativnog sustava,


prihvaća naredbe od strane korisnika i izvršava ih sistemskim pozivima prema kernelu (jezgri
operativnog sustava), te vraća rezultat operacije.
Postoji nekoliko vrsta shell-ova: Bourne shell (sh),C shell (csh),Korn shell (ksh), TC
shell (tcsh),Bourne Again Shell (bash).Bash shell je primarni shell na Unix računalima.

Kako se pokreće shell?

Shell se pokreće nakon uključivanja računala kao zadnji korak boot procesa.Odmah po
uključivanju računala Linux-ov boot proces obavlja niz radnji kako bi kontrolu nad sustavom
predao korisniku.Prva faza je učitavanje jezgre odnosno alociranje računalnih uređaja i kada
se jednom starta kernel on ostaje u memoriji tokom čitavog rada računala odnosno do
nestanka napajanja.Druga faza je identifikacija korisnika kako bi bilo moguće kontrolirati
određena prava korisnika na sustavu.U tu svrhu se pozivaju dva programa, a to su «getty» i
«login».Prvi ima funkciju osiguravanja portova odnosno komunikacijskih kanala prema
korisniku.Ti kanali se u linux-u označavaju kao «tty» s rednim brojem iza toga.Getty prima
niz znakova s tipkovnice i prosljeđuje ga programu login,koji na osnovu tog niza znakova za
koji pretpostavlja da je korisničko ime (username) korisniku dodjeljuje njegova korisnička
prava i dozvole (permissions), a zatim se zahtjeva od korisnika unos lozinke (password).Ako
password ne odgovara postojećem korisniku,onda login ponovo vraća kontrolu programu
getty,a ako je identifikacija uspješna program login starta shell program.

Funkcije shella

Primarne funkcije shell-a su ostvarivanje interakcije korisnika s kernelom,a sve u svrhu


sigurnosti datoteka na računalu.Kernel (jezgra) je u neku ruku interpreter odnosno on prevodi

139/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

podatke dobivene od programa u procesorske instrukcije razumljive samo hardware-u.Bilo bi


gotovo nemoguće da čovjek uči te instrukcije kako komunicirao s jezgrom.Shell je dakle
program koji prevodi korisničke zahtjeve za upravljanje nad sustavom.Od korisnika se
zahtjeva poštivanje određenih sintaksnih pravila i razumijevanje logike funkcioniranja sustava
koje se shell strogo pridržava.Neovisno od vrste Linux-ovog shella svi imaju zajedničke
osnovne funkcije:
interpretacija komandne linije (command line interpretation)
iniciranje programa (program initation)
preusmjeravanje ulaza i izlaza (input output redirection)
lančano 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?

Izvršna datoteka koja se sastoji od niza shell naredbi,skripta se ponaša kao


program,naredbe se izvršavaju sekvencijalno.Svaki od postojećih shellov-a ima svoj skriptni
jezik,postoje sličnosti 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
odgovarajući shell.
Prva linija skripte specificira odgovarajući shell.

Na primjer za Bourne Again Shell (bash):

#!/bin/bash

Skripte se pišu u nekom od tekstualnih editora Vi, Emacs npr.

140/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

primjer 01:

#!/bin/bash
# je oznaka za komentar
echo Moja prva skripta

Skriptu prije pokretanja moramo učiniti izvršnom,naredba koja nam to omogućuje je


naredba chmod.

chmod a+x ime_skripte


poziv skripte: bash ime_skripte

Postavljanje dozvola za izvršavanje skripte

chmod naredba i opcije

chmod mijenja dozvole za datoteku ili direktorij

opcije:
+ dodaje dozvolu
- uklanja dozvolu
r postavlja dozvolu za čitanje
w postavlja dozvolu za pisanje
x postavlja dozvolu za izvršavanje
u postavlja dozvolu za korisnika koji je kreirao datoteku
g postavlja dozvolu za grupu korisnika
o postavlja dozvolu za sve ostale korisnike sistema
a postavlja dozvolu za korisnika,grupu i sve ostale

141/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

Argumenti skripte

Shell skripta kao i naredbe može imati argumente.Pri pozivu skripte poslije imena mogu
se unositi argumenti.Vrijednosti argumenata mogu se koristiti unutar skripte korištenjem
operatora $ i broja.Prvi argument $1,drugi $2 itd. Specijalno $0 sadrži 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 “Treći unijeti argument je: $3”

poziv skripte: skripta05 danas je “padao snijeg”

rezultat: Prvi unijeti argument je:danas


Drugi unijeti argument je:je
Treći unijeti argument je:padao snijeg

Varijable

U shellu varijable nemaju tipove,mogu sadržavati brojeve,znakove i nizove znakova.Ne


moraju se čak ni deklarirati.Vrijednosti se pridružuju varijablama pomoću
“=”operatora.Korištenje vrijednosti varijable nam omogućava specijalni operator $ ispred
imena varijable.Imena varijabli mogu sadržavati znakove,brojeve i podvlaku,ne smiju
sadržavati rezervirane znakove shell-a kao što su uskličnici,& ampersand ili razmaci koji se
koriste za odvajanje naredbi i razdvajanje naredbe i argumenata.

142/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

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 omogućava grupiranje koda u cjeline pomoću funkcija.One rade na sličan
način kao kod programskih jezika.Funkcije nam daju mogućnost da neki dio koda ako se radi
o većoj količini,ne ponavljamo nekoliko puta.Funkcije se pozivaju njihovim imenom I
moguće ime proslijediti argumente.

Sintaksa:
ime_funkcije() {

naredbe
}

jednom definirana funkcija se poziva imenom i parametrima.

143/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

ime_funkcije [ param1 param2 param3 ]

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 Vaše ime:
read ime
echo “$ime,kako ste!”

Eksportiranje varijabli

Sve definicije varijabli unutar određene skripte su dostupne samo toj skripti.Međutim
ako želimo da su varijable definirane u skripti,vidljive i u nekoj drugoj skripti koja se poziva
iz tekuće,moramo koristiti naredbu export koja će osigurati kopije varijabli za sve skripte koje
se pozivaju iz tekuće.

primjer 05:
#!/bin/bash
var1=”ime_osobe”
export var1
druga_skripta
#!/bin/bash
var2=”prezime_osobe”
echo “$var1 $var2”

144/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

dakle kada se iz tekuće skripte pozove druga_skripta bit će joj proslijeđena kopija
varijable var1 i moći će ju koristiti unutar svog shella.

Aritmetičke shell operacije: naredba let

Naredba let je bash shell naredba koja se koristi za izvršavanje operacija nad
aritmetičkim vrijednostima.Naredba let može se inicirati ključnom riječi let ili postavljanjem
dvostrukih zagrada.Pridruživanje vrijednosti se kombinira s aritmetičkim izrazom,također se
mogu koristiti i operatori usporedbe.

Sintaksa:
let vrijednost1 operator vrijednost2

((vrijednost1 operator vrijednost2))

primjer 07:
#!/bin/bash
let “rez = 2 * 7”
echo $rez

-ako se želi koristiti razmak između operanada mora se sve stavit pod navodnike.

145/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

Operatori naredbe let:

Aritmetički operatori Funkcija

* množenje
/ dijeljenje
+ zbrajanje
- oduzimanje
% ostatak cjelobrojnog dijeljenja

Relacijski operatori
> veće od
< manje od
>= veće ili jednako
<= manje ili jednako
= jednako za naredbu expr
== jednako za naredbu let
!= različito
& logički AND
đ logički ILI
! logička negacija

Naredba test

Pomoću naredbe test možemo uspoređivati cjelobrojne vrijednosti, stringove,te


obavljati logičke operacije. Naredba se sastoji od ključne riječi test,iza koje se navode
vrijednosti koje se uspoređuju,a između njih je option ključna riječ koja određuje tip
usporedbe.Option se može smatrati operatorom,ali se zapisuje slovnom oznakom ispred koje
je znak minus.npr –eq.Vraća izlazni status 0 ako je usporedba točna.

Sintaksa: test vrijednost1 –option vrijednost2

146/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

primjer 08:

#!/bin/bash
num=5
test $num –eq 10
echo $?

rezultat: 1

Kao alternativa postoji mogućnost da umjesto ključne riječi 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: Funkcija

-gt veće od
-lt manje od
-ge veće ili jednako
-le manje ili jednako
-eq jednako
-ne različito

Usporedba nizova znakova

-z testiranje za prazan niz znak


-n testiranje za vrijednost
= jednakost
!= nejednakost
Str da li je vrijednost stringa null

147/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

Logičke operacije

-a logički AND
-o logički OR
! logička negacija

Testovi za datoteke

-f datoteka postoji,obična je
-s datoteka nije prazna
-r može se čitati
-w moguće pisanje u datoteku
-x moguće izvršavanje datoteke
-d ime datoteke je direktorij
-h ime je simbolički link
-c ime je oznaka uređaja
-b ime je blok datoteka

Kontrolne strukture

Bash shell ima skup kontrolnih struktura koje nam omogućavaju kontrolu toka
programa,odnosno redoslijed izvršavanja naredbi.
Uvjetna struktura If testira uspješnost izvođenja shell naredbe,a ne izraza kao u većini
programskih jezika.
If…then struktura mora završiti s ključnom riječi fi

if…then
Sintaksa: if naredba then
naredba
fi

if…then…else

148/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

Sintaksa: if naredba then


naredbe
else
naredbe
fi

primjer 08:
#!/bin/bash
if [ "bash”=”bash" ]; then
echo izraz se izračunao u true
fi

primjer 09:
#!/bin/bash
if [ $# -ne 1 ]; then
echo Netočan broj argumenata
exit 1
fi
echo $1

primjer 10:
#!/bin/bash
if [ "bash”=”shell" ]; then
echo izraz se izračunao u true
else
echo izraz se izračunao u false
fi

primjer 11:
#!/bin/bash
echo Unesite s za ispis datoteka prema veličini
echo inače ce se ispisati sve informacije

149/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

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 omogućavaju ponavljanje
naredbi.Poput bash if strukture,while i until ispituju rezultat naredbe.
Međutim,for i for-in strukture ne izvršavaju testove,već prolaze kroz niz
vrijednosti,dodjeljujući svaku vrijednost varijabli.

Sintaksa for-in: for varijabla in Sintaksa while: while naredba do


lista-vrijednosti naredbe
do done
naredbe
done

Sintaksa until: until naredba do Sintaksa for: for varijabla do


naredbe naredbe
done done

For-in petlja

For-in petlja je pogodna i za manipulaciju s datotekama.Možemo 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

primjer 12:
#!/bin/bash
for var in *.c
do
cp $var mybackup/$var
echo $var
done

primjer 13:
#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done

While petlja

Petlja while ponavlja naredbe.Počinje ključnom riječi 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

primjer 15:
#!/bin/bash
str=da

151/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

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 određene 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 pomoću $@.
$@ je specijalna varijabla čija vrijednost predstavlja listu argumenata komandne linije.

primjer 17:
#!/bin/bash
for var
do

152/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

cp $var mybackup/$var
echo $var
done

poziv skripte: bash uarg main.c lib.c io.c

A možemo i eksplicitno pozivati argumente pomoću 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 riječi
navedene pod navodnicima.

primjer 18:
#!/bin/bash
echo “Unijeli ste $# argumenata”
for var in $*
do
echo $var
done

poziv skripte: bash numarg jedan “dva tri” četiri

izlaz: Unijeli ste 3 argumenta


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”

153/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

for var in “$@”


do
echo $var
done

poziv skripte: bash numarg jedan “dva tri” četiri

izlaz: Unijeli ste 3 argumenta


jedan
dva tri
četiri

Logičke naredbe && i | |

Logičke naredbe izvršavaju logičke operacije na dvije naredbe shella.

Sintaksa: naredba && naredba


naredba | | naredba

U slučaju logičkog I (&&),ako su obje naredbe uspješno izvršene,uspješna je i logička


naredba i vraća izlazni status 0.Za logičku ILI naredbu ako je barem jedna od naredbi
uspješno izvršena,uspješna je i logička ILI (| |) naredba i vraća izlazni status 0.Logičke
naredbe nam služe za testiranje uvjeta u kontrolnim strukturama.

Case

Kontrolna struktura koja nam omogućava izbor između više opcija.Izbor se donosi
usporedbom vrijednosti sa ponuđenim vrijednostima.Struktura započinje ključnom riječi case,
zatim izračunavanje vrijednosti varijable,pa in. Zatim slijede opcije iza svake ide ),naredbe,pa
;; *) defaultna opcija. I ključna riječ esac na kraju.

154/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

Sintaksa:

case string in

opcija1)
naredbe
;;
opcija2)
naredbe
;;
*)
naredbe
;;
esac

primjer 19:
#!/bin/bash
# Program koji korisniku omogućava različit
# način za izlistavanje datoteka
echo s. ispis datoteka prema veličini
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

c)
ls *.c
;;
*)
echo Niste unijeli nijednu od opcija
esac

Korištenje preusmjeravanja i pipe operacija s kontrolnim strukturama

Kontrolne strukture možemo promatrati kao naredbe koje rezultat operacija šalju na
standardni izlaz.Izlaz je moguće preusmjeriti u drugu naredbu,program ili datoteku.U
kontrolnoj strukturi for-in možemo postaviti operator (>) koji služi za preusmjeravanje,
odmah poslije ključne riječi done kako bi izlaz petlje preusmjerili u datoteku.

primjer 20:
#!/bin/bash
artikli=”med jabuke sir voće”
for var in $artikli
do
echo “$artikli”
done > hrana

Pipeline je standardni kanal na koji podaci ulaze ili izlaze,stoga govorimo o pipeline-u
kao vrsti redirekcije standardnog inputa i outputa.Pomoću ove konekcije možemo vrlo
jednostavno izlaz jednog programa preusmjeriti na ulaz drugog programa.

Sintaksa: naredba1 | naredba2

primjer 21:
#!/bin/bash
for var in *.c
do

156/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

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 prosljeđuju do filtra za sortiranje koji sortira imena prije preusmjeravanja.

Trap strukture: trap

Trap struktura izvršava naredbu ili naredbe kada se dogodi određeni događaj.
Događaj se može dogoditi u bilo kojem trenutku u toku izvršavanja programa.Ovi
događaji se obično nazivaju signalima.Kada sustav primi signal,izvršava se trap i kontrola se
prenosi na naredbu dodijeljenu trap strukturi.

Sintaksa: trap ‘naredbe’ brojevi-signala

Trap struktura je osmišljena za upravljanje vanjskim događajima koji remete rad


programa.Najuobičajeniji je primjer signala prekida kojeg obično šalje korisnik pritiskujući
CTRL-C.Ako za vrijeme izvršavanja programa pritisnemo CTRL-C program će se
zaustaviti.Kad god se program prekine na ovakav način,postoje akcije koje možemo
poduzeti.Obično je to izlazak iz programa s vrijednošću greške.Sustav svakom događaju
dodjeljuje određen 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

echo $var
done | sort > cdat

Naredba trap se može koristiti za sprečavanje zaustavljanja programa zbog nekih


vanjskih događaja.Na primjer,pretpostavimo da ne želimo dati mogućnost korisniku da sam
zaustavi program s CTRL-C; želimo ignorirati sve vanjske događaje.Naredba trap može
presrest događaj CTRL-C i spriječiti zaustavljanje programa.To se može izvesti unošenjem
skupa praznih jednostrukih navodnika na mjestu prvog argumenta naredbe trap. ( trap ‘ ‘ 2 )

158/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Shell programiranje (shell i bash)

ZAKLJUČAK:

Linux-ov shell (bash) nije grafički orijentiran i za sve operacije koje želimo izvršiti nad
operativnim sustavom moramo poznavati naredbe kao i njihove formate argumenata.To je
naravno puno teže od GUI pristupa ali za neke operacije shell je jednostavno nužan i pruža
velike mogućnosti manipulacije nad sustavom kakve GUI ne pruža.Na primjer uzmimo neki
sustav koji isključivo koristi GUI za komunikaciju korisnika sa operativnim sustavom.Kada
se dogodi problem koji je prouzrokovao,na bilo koji način grešku u radu hardware-a ili
software-a odgovornog za rad grafike na računalu,što se često događa,čak i ti operativni
sustavi predlažu nakon što dožive kolaps,startanje svojevrsnog shell-a (command prompt-a)
za rješavanje problema sustava na nekom nižem nivou,bližem samim komponentama
računala.
Što se tiče pisanja skripti u shell-u,zaključak bi bio da se pisanjem skripti može postići
znatna ušteda u vremenu i smanjenje vjerojatnosti pogrešaka.
Jednostavno ako svaki dan odrađujemo slijedno određene akcije nad sustavom i na to
trošimo određeno vrijeme, trebalo bi razmisliti da li bi mogli napisati skriptu koja bi to
odrađivala za nas. Dakle imamo prednosti pisanja skripti: kreiranje vlastitih skripti za
obavljanje određenih zadataka, ušteda vremena, smanjuje se mogućnost pogreške,
automatizacija svakodnevnih zadataka, automatizacija administrativnih poslova time
povećana produktivnost.

159/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva

Marko Vuković

BASH – ADVANCED SHELL


PROGRAMIRANJE

160/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

UVOD – ZAŠTO SHELL PROGRAMIRANJE?

Sposobnost rada sa shell scripting-om je nužno svakom tko želi biti razumno efektivan
sistem-administrator, čak i ako nije stručan u pisanju script datoteka. Shvatimo to ovako: kad
se Linux računalo starta, ono pokreće script kôd u /etc/rc.d sa svrhom da nanovo postavi
konfiguraciju sustava i početnih usluga. Detaljno poznavanje ovog startup script kôda je
važno prilikom analiziranja ponašanja cjelokupnog sustava, i ako je to moguće: modificiranja
istog.
Pisanje script kôda nije teško za naučiti, budući da script kôd može biti upisan u
memorijske sekcije veličine jednog byte-a, i također postoji razmjerno malen set operacija i
naredbi koje su specificirane kao shell, koji nije teško shvatiti. Sintakse su jednostavne i
izravne, slične onima koje pozivaju ili povezuju razne segmente kôda u komandnoj liniji.
Postoji još i nekolicina pravila koja se također moraju naučiti. Većina kraćih kôdova radi
besprijekorno prvi put, a i otklanjanje grešaka kod dužih vrši se kratko i izravno, ali samo
zbog jednostavnosti kôda, budući da BASH ne sadrži nikakve debugging programe. No, o
tome kasnije.
Shell script kôd je "brza i prljava" metoda stvaranja prototipova složenih aplikacija.
Mogućnost rada čak i sa ograničenom funkcionalnošću često se smatra korisnom prvom
stranicom u razvoju projekta. Na ovaj način, struktura aplikacije se može testirati i
isprobavati, prije nego što se konačno kôdira u C++, Java-i ili Perl-u.
Shell scripting se drži klasične UNIX filozofije razbijanja složenih projekata u
jednostavnije podzadatke, i povezivanja komponenti i segmenata kôda. Mnogi smatraju ovaj
pristup boljim, ili barem estetskijim pristupom u rješavanju problema, od korištenja jednog od
"sve-u-jednom" jezika nove generacije (Perl), koji funkcioniraju na način da bude pristupačan
svakom korisniku, a što traži od zahtjevnijeg korisnika prilagođavanje svojeg načina
razmišljanja odgovarajućem programskom alatu.

161/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

OSNOVNI PRINCIPI RADA U BASH-U

U ovom ću seminaru opisati BASH, što je akronim za "Bourne-again shell" i


prestavlja prošireni dodatak na klasični shell scripting koji je razvio Stephen Bourne. BASH
je de facto postao standard shell scripting-a na svim varijantama UNIX-a. Većina principa
kojima ću se baviti u ovom seminaru također je povezana i sa ostalim verzijama shell
scripting-a, kao što su Korn shell (od kojeg potječu neke karakteristike BASH-a) i C shell i
njegove razne varijante.

Primjer: kôd za "čišćenje" log datoteka u /var/log


U ovom najjednostavnijem primjeru, kôd nije ništa drugo doli lista sistemskih naredbi
pohranjena u datoteci. Ako ništa drugo, onda ovaj način barem štedi vrijeme i trud prilikom
svakog ponovnog pretipkavanja tih naredbi kod svakog novog pozivanja istih:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp

U ovom primjeru nema ništa neočekivano, samo set naredbi koje mogu lako biti
izvršavane jedna po jedna izravno iz komandne linije radne konzole. Prednost stavljanja
naredbi u sript kôd ide dalje od primitivnog načela uštede truda i vremena kod tipkanja. Script
kôd lako može biti modificiran, izmijenjen, prilagođavan i generalno može ga se učiniti
pristupačnim za neku određenu aplikaciju.

162/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Izvršavanje script kôda

Nakon što je kôd napisan, možemo ga izvršiti naredbom sh scriptname, ili


alternativno bash scriptname (nije preporučljivo korištenje sh <scriptname,
budući ovaj način efektivno onemogućava čitanje iz ulazne biblioteke stdin unutar script
kôda). Puno sigurnije je napraviti da script kôd direktno izvršiv sa naredbom chmod.
Npr.:
chmod 555 scriptname (omogućava čitanje i izvršavanje)
ili:
chmod +rx scriptname (omogućava čitanje i izvršavanje
svim korisnicima),
chmod u+rx scriptname (omogućava čitanje i izvršavanje
samo autoru kôda).

Nakon što je script kôd postao izvršiv, može se testirati upisivanjem naredbe
./scriptname. Ukoliko nema problema u sintaksi, izvršavanjem kôda poziva se pravilni
prevodilac naredbi i obrađuje kôd.
Za zadnji korak, nakon testiranja i eventualnog otklanjanja grešaka, korisnik bi se
mogao odlučiti za pomicanje datoteke u /usr/local/bin (kao root direktorij), tako da
omogući pristup datoteci (kôdu) na način da bude izvršna i dostupna u cijelom sustavi. To se
odnosi na sve korisnike. Datoteka se jednostavno ozvršava pozivanjem: scriptname
[ENTER] iz komandne linije.

Otklanjanje grešaka (debugging)

BASH shell ne sadrži nikakav poseban debugger, niti ima specificirane naredbe za
otklanjanje grešaka. Greške u sintaksi ili pogreške u pisanju generiraju šifrirane poruke o
grešci koje često nimalo ne pomažu u otkrivanju grešaka nefunkcionalnog kôda. To je,
nažalost, jedna od mana ovog jezika.

163/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

UVOD U VARIJABLE I PARAMETRE

Poznavanje rada sa varijablama čini jezgru svakog programiranja kao što i one čine
jezgru svakog programskog jezika. Pojavljuju se u aritmetičkim operacijama i kvantitativnim
zadatcima, radu sa znakovnim nizovima, i nezamjenjive su u radu sa simbolima. No, varijabla
nje ništa više od memorijske lokacije ili seta memorijskih lokacija koje sadrže nekakvu
informaciju.

Referenciranje varijabli

Ime varijable je oznaka za njenu vrijednost, informaciju koju drži 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 sadrži. Jedini put kad se varijabla pojavljuje bez reference, bez prefiksa
$, jest kad je deklarirana ili pridružena, kad nije postavljena, kad se koristi u "export" načinu
rada ili u posebnim slučajevima kad avrijabla predstavlja signal. Pridruživanje može biti sa '='
znakom, u naredbi read i na početku petlje.
Zatvaranje referencirane vrijednosti pod dvostrukim navodnicima (" ") se ne
sukobljava sa zamjenom varijabli. Ovaj način se zove djelomični navod, nešto kao "slabi
navod". Korištenje jednostavnih navodnika (' ') koristi ime varijable doslovce, i supstitucija
nije moguća. 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 greškom, preporuča se korištenje duže
forme.

164/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Deklaracija varijabli

Deklaracija varijabli se koristi sa operatorom pridruživanja '=' (bez korištenja razmaka


prije i poslije znaka). Dotični operator se može koristiti u svrhu pridruživanja ili testiranja,
ovisno o kontekstu.

Primjer: jednostavna deklaracija varijable


U ovom odsječku je prikazan najednostavniji način pridruživanja vrijednosti nekom
imenu varijable:

echo
a=879
echo "vrijednost varijable \"a\" je $a."
let a=16+5 #pridruzivanje koristenjem 'let'
echo "vrijednost varijable \"a\" sada je $a."
echo

Primjer: deklaracija i referenciranje varijable


Slijedeći programski odsječak pokazuje kako se deklariraju varijable i potom kako se
vrši zamjena:

#!/bin/bash
a=375
hello=$a
echo hello
echo $hello #identicno kao i: echo ${hello}
echo "$hello"
echo "${hello}"
echo
hello="A B C D"
echo $hello # ispis: A B C D
echo "$hello" # ispis: A B C D

165/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

echo
echo '$hello' # ispis $hello
# ovdje uocavamo efekte
# razlicitih tipova navoda
echo
exit 0

BASH varijable: bez tipa

Za razliku od mnogih ostalih programskih jezika, BASH ne segregira svoje varijable


po "tipu". U originalu, BASH varijable su znakovni nizovi, ali, ovisno o kontekstu, BASH
dozvoljava cjelobrojne operacije i usporedbe varijabli. Ključni faktor je da li vrijednost
varijable sadrži znamenke.

Posebne vrste varijabli

Definiramo tri vrste varijabli:


Lokalne varijable: vidljive su samo unutar odsječka kôda ili fukcije
Globalne varijable: imaju utjecaj na ponašanje shell-a ili korisničkog sučelja.
Generalno, svaki proces ima svoje okružje, a to je grupa varijabli koje sadrže
informaciju na koju se stanoviti proces odnosi. Sa ovog stajališta shell se ponaša kao
bilo koji drugi proces. Svaki put kad se pokrene shell iznova, on stvara shell varijable
koje komuniciraju sa svojim globalnim varijablama. Svako novo dodavanje ili
mijenjanje globalnih varijabli uzrokuje da shell nanovo postavi svoje okružje i svaki
od tzv. "dijete"-procesa biva pod utjecajem takovog novog okružja. Prostor koji mogu
zauzimati varijable je ograničen. Upisivanje prevelikog broja globalnih varijabla ili
onih koje koriste previše memorijskih mjesta može prouzročiti probleme. Ako se u
script kôdu definiraju globalne varijable, one trebaju biti prijavljene u lokalno
okruženje script kôda. To je funkcija naredbe export. Ona se odnosi samo na
"dijete"-procese, dakle na recesivne procese.
Pozicijski parametri: argumenti dodani kôdu iz komandne linije: $0, $1, $2, $3... $0
je ime kôda, $1 ime prvog argumenta, $2 ime drugog, itd. Poslije devetog, argumenti

166/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

moraju biti označeni sa vitičastim zagradama: ${10}, ${11}, ${12}. Posebne


varijable $* i $@ isključuju sve pozicijske parametre.

167/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

exit i exit status

Naredba exit

Naredba exit se može koristiti za prekidanje izvršenja kôda, kao u programu u C-u.
Također može vratiti vrijednost, koje je neophodna u izvršavanju "roditelj"-procesa.

exit status

Svaka naredba vraća izlazni status znan kao exit status (negdje u literturi je
označen i kao return status). Uspješno izvršena naredba vraća nulu (0), dok neuspjela
naredba vraća broj različit od nule koji uglavnom označava broj greške (engl. error code).
Uspješno izvršene UNIX naredbe i programi vraćaju nulu kao izlazni status nakon uspješnog
kompletiranja, iako postoji i par iznimaka.

Uvjetne naredbe

Svaki kompletan programski jezik sadrži set nekakvih uvjetnih naredbi koje se
izvršavaju u skladu sa zadanim uvjetom. BASH ima naredbu test, razne operatore koji
koriste uglate i vitičaste zagrade, i if/then konstrukciju.

Uvjetne konstrukcije

Uvjetna konstrukcija if/then ispituje da li je izlazni status naredbe jednak nuli


(budući da "0" znači uspješno izvršenu naredbu prema pravilima UNIX-a), i ako jest, prealzi
u izvršavanje jedne ili više zadanih naredbi.
Također postoji i poseban operator "[" (lijeva uglata zagrada). On je sinonim za
naredbu test i postoji isključivo zbog razloga efikasnosti. Ova naredba prihvaća zadane
argumente kao izraze usporedbe ili ispituje fajlove, te vraća izlazni status usporedbe (0 za
istinito, 1 za pogrešno). if naredba također može ispitivati i exit status bilo koje
naredbe, ne samo produkt usporedbe.

168/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Naredba test ispituje tipove datoteka i uspoređuje nizove.Postoji još i naredba elif
kao sinonim za else if. Željeni efekt je gniježđenje jedne konstrukcije (unutarnje)
if/then unutar druge (vanjske).

169/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

PETLJE I GRANANJE

Petlje

Petlja je odsječak kôda koji iterira zadani set naredbi (ponavlja se) dokle god je
konrolni uvjet petlje istinit. BASH se u ovome ne razlikuje bitno od C-a. Sadrži naredbe for
(in), while, until, koje se koriste u kombinaciji sa do i done koje označavaju početak i
kraj odsječka vezanog uz petlju. Princip petlje je dakle, kao i u ostalim programskim jezicima
isti, pa će ovdje biti spomenuto nešto općenito o petljama, vezano za sam pojam petlje.
Kontrolne naredbe break i continue rade na istom principu kao i u ostalim
jezicima. Naredba break prekida izvršavanje petlje, dok naredba continue radi skok na
slijedeću iteraciju petlje, preskačući ostatak kôda u trenutnom ciklusu petlje.
Konstrukcije case (in)/esac i select tehnički ne predstavljaju petlju, budući da
ne iteriraju izvršavanje određenog programskog odsječka. Međutim, one, poput petlji,
diktiraju smjer izvršenja programa, ovisno o uvjetima zadanima na početku ili kraju bloka.
Naredba case (in) obavlja grananje na jedan od nekolicine programskih odsječaka, ovisno
o uvjetu. Služi kao prečica za višestruke if/then/else konstrukcije, i pokazala se izuzetno
korisnom pri stvaranju menija. Konstrukcija select, koja je usvojena iz Korn shell-a, je još
jedna alatka za stvaranje menija.

170/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Ugnježđene petlje

Ugnježđena petlja je petlja unutar petlje, tj. unutarnja petlja u bloku vanjske petlje. Tu
se dešava da prvi prolaz kroz vanjsku petlju pokreće i unutarnju, koja se izvršava do kraja.
Slijedeći prolaz kroz vanjsku petlju opet aktivira unutarnju. Ovo se ponavlja dok se vanjska
petlja ne izvrši do kraja. Naravno, naredbom break možemo u svakom dijelu vanjske ili
unutarnje petlje utjecati na prijevremeni prekid iterativnog procesa.

Primjer: ugnježđena petlja

for a in 1 2 3 4 5 #vanjska petlja


do
echo "stavi $outer u vanjsku petlju."
echo "----------------------"
inner=1 #resetiraj inner

for b in 1 2 3 4 5 #unutarnja petlja


do
echo "stavi $inner u unutarnju petlju."
let "inner +=1" #povecaj brojac inner za 1
done #kraj unutarnje petlje

let "outer +=1" #povecaj brojac outer za 1


echo
done #kraj vanjske petlje

171/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

INTERNE NAREDBE (BUILTIN-OVI)

Builtin (engl. builtin – ugrađeno) je naredba koja je sadržana unutar BASH-ovog seta
naredbi, dakle doslovce ugrađena u programski jezik. One postoje isključivo zbog efikasnosti
– izvršavaju se brže od eksternih naredbi, koje obično zahtijevaju račvanje posebnog procesa,
ili zbog toga što određene builtin naredbe trebaju izravan pristup samom jeziku.
Kad se neka naredba ili shell inicijaliziraju zbog izvršavanja nekog podzadatka, taj
proces se zove račvanje. Novi proces koji je nastao se naziva "dijete", a proces koji je
pokrenuo račvanje "roditelj". Dok "dijete" - proces obavlja svoj posao, "roditelj" je još u
postupku izvršavanja.
Generalno gledano, BASH builtin naredba ne kreira podzadatak, sve dok se izvršava
unutar nekog kôda. Eksterni sustav naredbi ili nekakav filter unutar kôda obično znaju
generirati podzadatke.
Builtin je također sinonim za sistemsku naredbu istog imena, međutim BASH ju
interno reimplementira. Npr. BASH naredba echo nije isto što i /bin/echo, iako je
ponašanje tih dviju naredbi skoro identično.
Postoje još i ključne riječi. To su razne riječi i interpunkcijski znakovi. One imaju
posebno značenje za shell, i neke predstavljaju granice programskih odsječaka sintakse nekog
kôda. Npr. sve uvjetne konstrukcije i ono što ide uz njih predstavljaju ključne riječi. Slično
kao i builtin-ovi, ključna riječ je implementirana u BASH-u, ali za razliku od builtin naredbe,
ona sama po sebi nije naredba, već dio veće komandne strukture.
Ni kod pregleda internih naredbi se BASH ne razlikuje previše od ostalih jezika.
Nabrojimo neke I/O naredbe koje su implementirane u ovom jeziku: echo, printf, read,
zatim naredbe za rad sa datotekama: cd, pwd, pushd, popd, dirs, pa rad sa varijablama:
let, eval, set, unset, export, typeset, declare, readonly, getopts, rad sa
kôdom: source, exit, exec, shopt.
Recimo nešto i o eksternim naredbama, a u kontekstu internih naredbi. Standardne
UNIX naredbe čine shell script kôd svestranijim. Vrlina BASH-a jest kombiniranje internih
naredbi sa jednostavnim konstrukcijama programa. Standardnih naredbi ima više vrsta.
Možemo ih podijeliti po karakteru, po načinu rada, po složenosti... Po složenosti se dijele na:
osnovne (ls, cat, chmod,...), te složene naredbe (expr, find, xargs,...). Po načinu rada
na naredbe za rad sa vremenom i datumom, za procesiranje teksta, za rad sa datotekama, za
matematičke operacije, itd.

172/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

ARITMETIČKO PROŠIRIVANJE

Aritmetičko proširivanje pruža jednostavan i izravan način obrade aritmetičkih


podataka u kôdu. Prevođenje znakovnog niza u brojevnu vrijednost je prilično izravno, i
koristi se u kombinaciji sa jednostrukim navodnicima (`...`), dvostrukim zagradama (
((...)) ), ili naredbom let. Navest ćemo par primjera aritmetičkog proširivanja u nastavku.

Aritmetičko proširivanje sa jednostrukim navodnicima

Često se koristi u kombinaciji sa naredbom expr.


Primjer: Aritmetičko proširivanje sa jednostrukim navodnicima
z = `expr $z + 3` #naredba expr vrsi prosirivanje

Aritmetičko proširivanje sa dvostrukim zagradama i


naredbom let

Upotreba dvostrukih zagrada u aritmetičkom proširivanju je potisnula korištenje


jednostrukih navodnika, koje je praktički izvan upotrebe i zbog sve većeg korištenja naredbe
let u istom kontekstu.
Primjer: Aritmetičko proširivanje sa dvostrukim zagradama
z=$(($z+3))
z=$((z+3))

#takodjer se mogu definirati operacije unutar


#dvostrukih zagrada

n = 0
echo "n = $n" # n = 0

((n += 1)) #povecaj n za 1


echo "n = $n" # n = 1

173/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Primjer: Aritmetičko proširivanje 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

I/O PREUSMJERAVANJE

Uvijek postoje tri osnovne "datoteke" koje su otvorene: stdin (predstavlja


tipkovnicu), stdout (predstavlja ekran) i stderr (predstavlja izlaz za javljanje greške,
također ekran). Te, i mnoge druge otvorene datoteke, mogu biti preusmjerene.
Preusmjeravanje obično znači slanje izlaznog stanja (određene datoteke, linije, programa ili
čak dijela kôda unutar script-a) prema ulazu druge datoteke, linije, programa,...
Svakom otvorenom fajlu se pridružuje njegov pokazivač (engl. file descriptor –
jednostavan broj koji operativni sustav pridružuje otvorenoj datoteci zato da ju može pratiti.
Pojednostavljena verzija pokazivača na datoteku u C-u.). Standardni pokazivači za stdin,
stdout i stderr su 0, 1 i 2. Za dodatne otvorene datoteke, ostaju nam pokazivači od 3 do
9. Ponekad se ti dodatni pokazivači koriste za dohvat jedne od standardnih datoteka, dakle
kao privremena duplicirana veza. Ovo pojednostavljuje vraćanje u normalni način rada poslije
kompleksnog preusmjeravanja i miješanja datoteka.

Naredba exec

Upotreba naredbe exec <ime_datoteke preusmjerava stdin prema nekakvoj


datoteci. Od te točke nadalje, svi podaci vezani uz stdin dolaze ravno iz te datoteke, za
razliku od svog normalnog izvora (obično unos iz tipkovnice). Ovo omogućava metodu
čitanja datoteke liniju po liniju i eventualno raščlanjivanje svake linije unosa korištenjem
naredbe sed i/ili awk.
Slično tome, naredba exec >ime_datoteke preusmjerava stdout u željenu
datoteku. Ovim postupkom se šalju svi izlazni podaci u spomenutu datoteku. I/O
preusmjeravanje je također pametan način da se izbjegnu problemi koji se javljaju kad su
neke varijable nedostupne, tj. unutar nekog subshell-a.

175/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Preusmjeravanje odsječaka kôda

Programski odsječci, poput onih sa while, until i for petljama, pa čak i sa


if/then naredbama također mogu sudjelovati u preusmjerivanju ulaza stdin. U nekim
slučajevima se čak i funkcije koriste u tu svrhu. Operator < na kraju bloka kôda osigurava da
se provede redirekcija.
Preusmjeravanje odsječka datoteke stdout ima za posljedicu upisivanje tog istog
bloka u zadanu datoteku. Pametna uporaba I/O preusmjerivanja omogućava komadanje i
spajanje snopova kôda komandnog izlaza, što dalje dovodi do stvaranja reportnih i log
datoteka.

176/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

PODZADATCI (Subshell-ovi)

Definicija podzadatka

Učitavanje shell datoteke ili kôda aktivira još jedan segment komandnog procesora.
Kao što se zadane naredbe interpretiraju u komandnoj liniji, slično se dešava i u procesu
izvršavanja seta naredbi u datoteci. Svako pokretanje shell script kôda je, općenito,
podzadatak nekog procesa "roditelja", početnog procesa iz kojeg je račvanjem nastao.
"Roditelj" proces je vidljiv na konzoli ili xterm sučelju. Međutim, shell script proces također
može i stvarati podzadatke. Takvi podzadatci se izvršavaju paralelno, što kao posljedicu daje
izvršavanje više procesa istodobno.

U globalu, eksterna naredba u nekom dijelu kôda može generirati podzadatak, i to


tamo gdje BASH builtin naredba to ne može. Ali, zbog ovog nedostatka, builtin naredbe se
izvršavaju efektivnije i brže od svojih eksternih alternativa.

Primjer: paralelno učitavanje i izvršavanje procesa


#spajanje i sortiranje oba seta listi istodobno
#ivrsavanje u pozadini osigurava paralelnu obradu

(cat list1 list2 list3 | sort | uniq > list123) &


(cat list4 list5 list6 | sort | uniq > list456) &

wait #ne pokreci slijedecu naredbu dok se


#podzadatci nisu izvrsili

diff list123 list456

Ovdje se za preusmjeravanje I/O podataka u podzadatak koristi tzv. pipe operator, tj. "|".

177/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

ZAKLJUČAK

Shell programiranje je principijelno jednostavan način pisanja programa, temeljen na


najjednostavnijim principima programiranja. Podržava klasične UNIX programe, koristi
interne naredbe kako bi se poboljšala efikasnost izvođenja istih, i slijedi najjednostavniji
princip rada s varijablama. Naravno da kod svakog programskog jezika uočavamo mane, pa
tako je i s ovim.
Konkretno u BASH shell scripting-u jednostavnost je u drugom smjeru mana, ali ne
koliko je vrlina, nasreću. BASH ne koristi nikakve debugging programe, težak je za
prepoznavanje i otklanjanje grešaka, što je, proporcionalno s veličinom kôda, isto toliko i veći
problem. Osim toga, postoje i situacije u kojima nije preporučljivo koristiti Shell scripting:
Intenzivni zadatci, pogotovo tamo gdje je brzina neophodna
Zadatci sa složenim matematičkim operacijama
Zadatci koji zahtjevaju prenosivost između radnih platformi
Složene, strukturirane aplikacije
Kritične backup aplikacije
Situacije gdje je prijeko potrebna sigurnost, gdje moramo garantirati čvrst integritet
sustava, kao i zaštitu od upada, provala i kompjuterskog vandalizma
Operacije sa izvršnim datotekama (BASH je ograničen na serijski pristup podatcima, a i
to samo u djelomično nespretnom i neefektivnom redak-po-redak načinu 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 –
Grafički modelirano sučelje od strane korisnika)
Zadatci koji zahtjevaju izravan pristup sistemskom hardveru
Zadatci koji zahtjevaju izravan pristup port-ovima ili I/O utorima
Aplikacije zatvorenog kôda

Ukoliko se korisnik nađe 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 kôda može biti koristan korak razvoja kôda.
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Manuel Vidonis, Zoran Zoričić

REGEX

179/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

REGULAR EXPRESSIONS
((pravilni | regularni) izrazi)

Početak regularnih izraza

Oko 1940. godine dva su neuropsihologa, Warren McCulloch i Walter Pitts, razvila
modele za koje su vjerovali da predstavljaju rad živčanog sustava na razini neurona. Postoji
veliki broj različitih realizacija neuronskih mreža, a samim tim postoji i mnogo podjela.

Neuronske mreže možemo klasificirati prema:


broju slojeva,
vrsti veza između neurona,
vrsti obučavanja neuronskih mreža,
smjeru prostiranja informacija,
vrsti podataka.
Neuronske mreže u informatici imaju veliku primjenu, služe za:
prepoznavanje oblika,
prepoznavanje govora,
prepoznavanje rukopisa,
kompleksne proračune i procjene,
predviđanje cijena na burzi,
vremenske prognoze,
kompresiju podataka, itd.

Kod realizacije neuronskih mreža na računalima, situacija otprilike izgleda tako da za


jedan neuron treba jedan procesor. Neuron je laički opisan kao procesor s lokalnom
memorijom. Pošto su regularni izrazi izvedeni iz neuronskih mreža, možemo pretpostaviti da
regularni izrazi na jednoprocesorskim sustavima zahtijevaju veliku količinu procesorskog
vremena.

180/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

MODEL NEURONA:

u1..n – ulazni podaci


w1..n – težinski koeficijenti
f( ) – funkcija
i– izlazni podatak

Nekoliko godina kasnije matematičar Stephen Kleene je te modele formalno


matematički opisao. Nazvao ih je regularni skupovi.
Kleene je razvio jednostavnu notaciju (sustav znakova) za izražavanje regularnih
skupova koju je nazvao regularni izrazi.
Sredinom prošlog stoljeća, 50-ih i 60-ih godina, regularnim izrazima su se bavili i
matematičari. Robert Constable je napisao dobar priručnik za matematički naklonjene
stručnjake:
"The role of finite automata in the development of modern computing theory".

RegEx je poseban jezik koji omogućava inteligentno uspoređivanje stringova, temelji


se na matematičkoj teoriji jezika, determinističkih i nedeterminističkih konačnih automata.
Prednost regEx – a je u tome što se usporedba stringa ne vrši, ali i može, prema nekom
fiksnom stringu.
Usporedba stringa vrši se prema nekom uzorku koji predstavlja određeni skup različitih
strigova ili znakova.
Kao rezultat usporedbe dobivamo sve one stringove koji u sebi imaju određeni uzorak.
Uzorak se određuje pomoću 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Zamjenski znakovi u raznim okolinama i programima:

Program ili okolina . [] ^ $ \( \) \{ \} ? + | ()

vi X X X X X
visual c++ X X X X X
awk X X X X X X X X
sed X X X X X X
Tcl X X X X X X X X X
Ex X X X X X X
grep X X X X X X
egrep X X X X X X X X X
fgrep X X X X X
Perl X X X X X X X X X

Kratki opis nekih programa koji koriste regEx - e:


awk:
awk [-fscript-name] [-Fc] [inline-script] [params] [filename]
awk pretražuje ulaznu datoteku (ili stdin) i traži linije ili polja koje zadovoljavaju uzorke te izvršava pridružene operacije.
Uzorci i akcije se zadaju u komandnoj liniji (inline-script) ili datoteci (script-name).
Omogućava referenciranje linije ili bilo kojeg polja u liniji.

182/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

grep, egrep, fgrep:

grep [options] PATTERN [FILE....]

grep je program koji na ulaznoj datoteci uspoređuje uzorak koji smo mu predali.
Uzorak se uspoređuje sa svakom linijom u datoteci. Linije u kojima imamo pogodak se
ispisuju ili broje, ovisno o opciji koju smo uključili pri pokretanju programa. više o tome:
man grep.
Program grep ima nekoliko različitih verzija:
egrep za proširene regularne izraze.
fgrep koristimo kad želimo raditi usporedbu samo prema nekom fiksnom
uzorku.

egrep == grep –E ...


fgrep == grep –F ...

više informacija: man grep

sed:
Supstitucija u sed-u: sed 's/uzorak1/uzorak2/ ' file

sed je stream editor i služi za izvođenje osnovnih tekstualnih transformacija na


svom ulazu.
sed se razlikuje od drugih editora po tome što za ulaz može primiti datoteku ili tok
podataka (pipeline).
više informacija: man sed

vi:
vi [options] [file]

vi ili vim (vi improved) je text editor koji se može koristiti za uređivanje bilo
kakvog teksta. Najviše se koristi za uređivanje programa.

183/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

vi txt1 – pokretanje vi editora i uređivanje txt1 datoteke


:q! – izlaz iz vi editora bez spremanja podataka

vi u ex modu nam omogućava korištenje supstitucije.


ex txt1
"txt1" 4L, 246C
Entering Ex mode. Type "visual" to go to Normal mode.
:q!

više informacija: man vi

184/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Kratki pogled na regEx – generator

Postoje dvije vrste regEx generatora: text – directed engines, regEx – directed engines.
Jeffrey Friedl ih je u knjizi "Mastering regular Expressions" nazvao DFA i NFA engines.
Razlika između text-directed generatora i regEx-directed generatora je u tome što je
regEx-directed nedeterministički , a text-directed deterministički.

"RegEx – directed generator je nestrpljiv u svom nastojanju da napravi pogodak."

RegEx – directed generator uvijek vraća najljeviji pogodak

RegEx – directed generator uvijek vraća najljeviji pogodak, čak i ako ga kasnije čeka
bolji pogodak. Kad uspoređujemo regularni izraz sa stringom, generator će početi na prvom
znaku stringa. Pokušat će usporediti sve permutacije izraza (ovisi o izrazu), svaki put istim
redoslijedom.
Rezultat toga je da regEx-directed generator uvijek vraća najljeviji pogodak.
Kad uspoređujemo regEx "cat" sa stringom "He captured a catfish for his cat.", regEx –
directed generator će usporediti prvi znak regEx-a 'c' s prvim znakom iz stringa 'H'.
Dešava se promašaj. Pošto ne postoje ostale permutacije na tom "mjestu" regEx-a
(regEx "cat" je običan niz znakova. Imali bi permutacije da, na primjer, pokušavamo
usporediti regEx [cb]at), parser nastavlja usporedbom 'c' na drugi znak stringa 'e'.
Promašaj, i isto na usporedbi sa spaceom. Dolazimo do 4. znaka stringa, 'c' pogađa 'c' .
Generator sada pokušava usporediti sljedeći znak regEx-a 'a' s 5. znakom stringa 'a'. Pogodak,
ali na 6. znaku stringa 't' ne pogađa 'p'. Generator sada zna da regEx ne može pogoditi string
počevši na 4. znaku. Nastavlja gdje je stao, a to je na 5. znaku stringa 'a'. Dešava se promašaj i
nastavlja se dalje.
Na 15. znaku stringa imamo pogodak: 'c' pogađa 'c' , 'a' pogađa 'a', 't' pogađa 't'.
Potpuni pogodak ("cat" vs. "catfish") i generator je zadovoljan.
Pošto se radi o pohlepnom generatoru, nema nastavka usporedbe, bez obzira na to što
kasnije u stringu postoji bolji rezultat ("cat" vs. "cat"). Za pohlepni algoritam "cat" vs.
"catfish" je na boljem mjestu.

185/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Zamjenski znakovi (Metacharacters):

. ^ $ * + ? { }[ ] \ | ( )

. zahvaća bilo koji znak


^ označava početak reda
$ označava kraj reda
* traži se nula ili više zadanih (Kllene star)
+ traži se jedan ili više zadanih
? traži se nula ili jedan znak
{ } koristi se kada želimo odrediti neko ponavljanje
[ ] koristi se kada želimo odrediti listu znakova koje tražimo, ili neki
raspon znakova [.-.]. Zamjenski znakovi unutar uglatih zagrada imaju
drugačije značenje (više o tome kasnije).
\ koristi se kad želimo isključiti specijalnu namjenu zamjenskog znaka,
ili kod specijalnih nizova
| koristi se kad želimo postaviti alternativni odabir
( ) koristi se za grupiranje izraza; izrazi se grupiraju i privremeno čuvaju u
memoriji, možemo ih referencirati s \1, ... .. .. .,\9

Količnici * + ? {min, max} (Quantifieres)

Potrebno je znati da su količnici pohlepni (greedy).


Općenito pohlepni algoritmi su oni koji uvijek uzimaju prvo rješenje, a ponekad prvo
rješenje nije najbolje, što u RE znači vraćanje unazad.
Količnici imaju minimalni i maksimalni broj pokušaja zahvaćanja nekog znaka.
Na primjer, regularni izraz ca*t će zahvatiti "ct" (0 'a' znakova), "cat" (1 'a' znak),
"caaat" (3 'a' znaka), i tako dalje.
Generator regEx-a će kod količnika *, +, {} ('*' – 0 ili više, '+' – 1 ili više, {min} – min
ili više) forsirati što više pogodaka, zato ih zovemo pohlepnima.
U izrazu *2 string "abcdrefghfds789254gfhh2568975hujkhfed" RE prvo prolaze do
kraja stringa, a tek onda pokušavaju usporediti broj 2.

186/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Sada imamo vraćanje (backtracking) prema početku sve dok ne nađe prvi broj 2
(gledajući s desna na lijevo).
Zahvaćeni string će biti "abcdrefghfds789254gfhh2".

Backtracking je posljedica pohlepnosti nekih zamjenskih znakova (*,+,{}); on uvijek


vraća najdesniji pogodak (njegovo je kretanje s desna na lijevo).
Pohlepnost možemo isključiti tako da iza svakog pohlepnog zamjenskog znaka pišemo
'?' . "*?" "+?" "{min, max}?" "??".
Sada je situacija malo drugačija. Uzmimo zadnji primjer: regEx .*?2 i string
"abcdrefghfds789254gfhh2568975hujkhfed". Regularni izraz sada nakon svakog znaka s
kojim je imao pogodak pokušava usporediti broj 2. Zahvaćeni string će sada biti
"abcdrefghfds7892".

Korak po korak primjer:


Regularni izraz a[bcd]*b, zahvaća slovo a, nula ili više slova iz liste [bcd], i na kraju
b.
Usporedimo to sa stringom "abcbd"

Korak Pogodak Objašnjenje


1 a Zahvaća 'a'
2 abcbd Zahvaća [bcd]*, ide daleko koliko može, a to je do kraja stringa
Pokušava zahvatiti b, pošto je trenutna pozicija kraj stringa, imamo
3 Promašaj
promašaj
4 abcb Povratak na početak, tako da [bcd]* zahvati jedan znak manje
5 Promašaj Pokušava b ponovo, trenutna pozicija je zadnji znak, a to je "d"
6 abc Ponovno natrag, tako da [bcd]* zahvaća samo "bc"
Ponovno pokuša s b.Ovaj put znak na trenutnoj poziciji je "b", znači
7 abcb
uspijeva

187/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Specijalni nizovi (Special Sequences):

\d \D \w \W \b \B \s \S \< \> \A \Z

'\d' zahvaća jednu znamenku


'\D' isključuje znamenku
'\w' zahvaća slovo, broj ili '_'
'\W' isključuje bilo koje slovo, broj ili '_'
'\b' zahvaća riječi koje imaju određene znakove na rubovima riječi
'\B' isključuje riječi koje imaju određene znakove na rubovima riječi
'\s' zahvaća bilo koji white space
'\S' isključuje bilo koji white space
'\<' početak riječi
'\>' kraj riječi
'\A' početak stringa
'\Z' kraj stringa

188/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Osnovni primjeri
(sintaksa zamjenskih znakova, sintaksa specijalnih nizova)

sintaksa zamjenskih znakova:

. zahvaća bilo koji znak

A.A Zahvaća bilo koji troslovni niz znakova koji počinje i završava s A.

PRIMJER:

A.A zahvaćeni stringovi: nezahvaćeni stringovi:


AA A A
AbA AbbA
ABA A__A
AzA AokoA
A.A A.LA

^ označava početak reda

^Koliko je sati zahvaća liniju koja počinje stringom "Koliko je sati"


^\d zahvaća liniju koja počinje brojem

PRIMJER:

^Koliko je sati zahvaćeni stringovi: nezahvaćeni stringovi:


"koliko je sati .. .." "Koliko je sada sati"

^\d zahvaćeni stringovi: nezahvaćeni stringovi:


1ds _987h
0ABD d0d

189/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

$ označava kraj reda

\d$ zahvaća liniju koja završava brojem


\.$ zahvaća liniju koja završava točkom

PRIMJER:

\d$ zahvaćeni stringovi: nezahvaćeni stringovi:


An52 dkkd
Bell1 bell
_5 6_
\.$ zahvaćeni stringovi: nezahvaćeni stringovi:
eto. marko.hr

* traži se nula ili više zadanih == {0,}

D\d*A zahvaća string koji između znakova D i A nema nijednu ili ima više
znamenki

PRIMJER:

D\d*A zahvaćeni stringovi: nezahvaćeni stringovi:


DA DBA
D0123A D1CA
D01A-KT DB23A

190/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

+ traži se jedan ili više zadanih == {1,}

D\d+A zahvaća string koji između znakova D i A ima jednu ili više znamenki

PRIMJER:

D\d+A zahvaćeni stringovi: nezahvaćeni stringovi:


D1A DA
D0123A D1CA
D01A-KT DB23A

? nula ili traži se jedan znak == {0,1}

25?6 zahvaća string koji poslije 2 nema nijedan ili ima jedan broj 5 i završava sa 6

PRIMJER:

25?6 zahvaćeni stringovi: nezahvaćeni stringovi:


256 2556
26 236
256adf 2d8

{ } koristi se kad želimo odrediti neko ponavljanje

2(5{2, 4})9 zahvaća sve stringove koji počinju s 2 i imaju min 2 i max 4 broja 5, a
sekvenca broja 5 završava s 9

PRIMJER:

2(5{2, 4})9 zahvaćeni stringovi: nezahvaćeni stringovi:


2559 259
255559 255555555559
255596 250559

191/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

[ ] koristi se kada želimo odrediti listu znakova koje tražimo

^[abc] zahvaća svaku liniju koja počinje slovima a, b ili c


^[A-Z] zahvaća svaku liniju koja počinje velikim slovom

PRIMJER:

^[abc] zahvaćeni stringovi: nezahvaćeni stringovi:


ako je zakon
bGet Bget
cuker Car

^[A-Z] zahvaćeni stringovi: nezahvaćeni stringovi:


A aS
Guru luk
Pas 23pc – TF

\ koristi se kad želimo isključiti specijalnu namjenu zamjenskog znaka ili


kad želimo uključiti specijalnu namjenu nezamjenskog znaka

\.\*.*\\ zahvaćeni stringovi su svi oni koji za prvi znak imaju '.', zatim '*'
te nula ili više bilo kojih znakova i završavaju znakom '\'

PRIMJER:

\.\*.*\\ zahvaćeni stringovi: nezahvaćeni stringovi:


.*asdasd\ .8995\
.*\ .*AAA

192/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

| koristi se kad želimo postaviti alternativni odabir

rib(a | e) zahvaća string koji kao prva tri znaka ima "rib", a kao četvrti znak ima
'a' ili e
(c|C)$ zahvaća linije koje završavaju s c ili C

PRIMJER:

rib(a | e) zahvaćeni stringovi: nezahvaćeni stringovi:


zaribati ribolov
ribež stribor

(c|C) $ zahvaćeni stringovi: nezahvaćeni stringovi:


Tko je u dv.C tko je u dv.C ?
Gdje je Wc c.

( ) koristi se za grupiranje izraza

(\w\.)(.\d) zahvaća sve one koji počinju slovom, brojem ili underscoreom te kao drugi
znak imaju točku, pa bilo koji znak i nakon toga znamenku

PRIMJER:

(\w\.)(.\d) zahvaćeni stringovi: nezahvaćeni stringovi:


_.d5 Dd5
A.D4 d.dd

193/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

sintaksa specijalnih nizova

'\d' zahvaća jednu znamenku

'\d' = [0-9]

\d\d\.0\d\* zahvaćeni su oni stringovi koji imaju niz: dvoznamenkasti broj


zatim točku i 0 te nijednu ili više znamenki

PRIMJER:

\d\d\.0\d\* zahvaćeni stringovi: nezahvaćeni stringovi:


22.05 D22g056
g22.0 22.988
22.088A c8.089

'\D' isključuje znamenku

'\D' = [^0-9]

^\D\d\d zahvaćene su sve linije koje počinju bilo kojim znakom osim
broja, a nakon toga imaju dvoznamenkasti broj

PRIMJER:

^\D\d\d zahvaćeni stringovi: nezahvaćeni stringovi:


_22dlf 555fhdj
g33_.c h5.tz

194/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

'\w' zahvaća slovo, broj ili '_'

'\w' = [0-9a-zA-Z_]

\w\d\d\w zahvaća sve one nizove znakova koji kao prvi znak imaju broj, slovo ili
'_', kao drugi i treći znak imaju dvoznamenkasti broj, a zadnji znak imaju isti kao i prvi

PRIMJER:

\w\d\d\w zahvaćeni stringovi: nezahvaćeni stringovi:


5556as s5aff
d99d456 7aaa

'\W' isključuje bilo koje slovo, broj ili '_'

'\W' = [^0-9a-zA-Z_]

\d\W\d zahvaća 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 zahvaćeni stringovi: nezahvaćeni stringovi:


26 2a5
2.6 222

195/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

'\b' zahvaća riječi koje imaju određene znakove na rubovima riječi

[0-9]\b zahvaća sve "riječi" koje kao prvi i zadnji znak imaju broj

PRIMJER:

[0-9]\b zahvaćeni stringovi: nezahvaćeni stringovi:


0fshdf0 ad9
1g9 _99s
987 99dl.

'\B' isključuje riječi koje imaju određene znakove na rubovima riječi

[0-9]\B zahvaća sve riječi koje nemaju znamenku kao prvi i zadnji znak

PRIMJER:

[0-9]\B zahvaćeni stringovi: nezahvaćeni stringovi:


adf 123
pl89pp 1vf.

'\s' zahvaća bilo koji white space

Znak Opis
\f Form-feed (početak reda)
Linefeed (novi red na početak)
\n
\r+\f
\r Carriage return (novi red)
\t Tab
\v Vertical tab

196/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

'\s' = [ \t \n\r\f\v]

^\s zahvaća sve linije koje počinju white spaceom

PRIMJER:
- za primjer smo odredili da točka označava početak linije
- početak linije ->' . '

^\s zahvaćeni stringovi: nezahvaćeni stringovi:


. Ides u ducan.. .idem

'\S' isključuje bilo koji white space

'\s' = [^ \t \n\r\f\v]

^\S zahvaća sve linije koje ne počinju white spaceom

PRIMJER:
- za primjer smo odredili da točka označava početak linije
- početak linije ->' . '

^\S zahvaćeni stringovi: nezahvaćeni stringovi:


.idem . Ides u ducan..

'\<' početak riječi

9\< zahvaća sve riječi koje počinju brojem 9

PRIMJER:

9\< zahvaćeni stringovi: nezahvaćeni stringovi:


9idem a9cd
945 899

197/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

'\>' kraj riječi

A\> zahvaća sve riječi koje završavaju slovom A

PRIMJER:

A\> zahvaćeni stringovi: nezahvaćeni stringovi:


1233A 1233
DA Da

'\A' početak stringa

PRIMJER:

\A... zahvaća prva tri slova nekog stringa

\A... zahvaćeni stringovi: nezahvaćeni stringovi:


Tada se zbilo... f\n

\A zahvaća početak stringa isto kao ^, samo što ^ uvijek zahvaća nakon \n

'\Z' kraj stringa

PRIMJER:

...\Z zahvaća zadnja tri slova nekog stringa

...\Z zahvaćeni stringovi: nezahvaćeni stringovi:


Tada se zbilo...\n f\n

\Z – zahvaća string ispred \n, a ako ne postoji string, može zahvatiti i \n, za
razliku od $ koji uvijek zahvaća ispred \n

198/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Lookahead Assertions

(?=regEx) nalazi li se ispred...

foo(?=bar) vs. foobat

Najprije se uspoređuje prvi dio regEx-a "foo" sa stringom "foobat". Usporedba se


izvršava kao što smo objasnili.
Imamo poklapanje "foo" s prva tri slova stringa "foobat". Nakon toga kreće regEx
generator s drugim dijelom usporedbe "bar" vs. "bat". Imamo dva pogotka, ali 'r' ne pogađa 't'
pa imamo promašaj.

foo(?=bar) vs. "foobar" Pogodak! Generator zahvaća foo jer se iza nalazi bar.

\t(?=MATEMATIKA) Tražimo pogodak na liniji:

MATEMATIKA MATEMATIKA 2 TALIJANSKI ...


Pogodak na matematici 2.

(?!regEx) da li se ispred NE nalazi ...

Tražimo pogodak nad imenima fajlova koji nemaju ekstenziju "bat" ili "exe".

.*[.](?!bat$|exe$).*$
Imamo pogodak na svakoj fajlu koji ne završava s "bat" ili "exe".

199/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Lookbehaind Assertions

(?<=regEx) da li se iza nalazi ...

(?<=a)b vs. "thingamabob"

Generator se kreće znak po znak i uvijek radi korak prema početku stringa te uspoređuje
sadržaj zagrade. Ako ima pogodak, gleda znak iza i uspoređuje ga sa znakom iza zagrade.

(?<!regEx) da li se iza ne nalazi ...

(?<!a)b vs "cab" promašaj.


(?<!a)b vs "bed" pogodak.
(?<!a)b vs "debt" pogodak.

Primjena regularnih izraza na nekim uniX alatima

EGREP

PRIMJER:

Datoteka tel_imenik
/*
Ana, Ban 3398-000
Alex, France 5598-999
Indi, Car 8895-977
Elvis, Potrag 9989-771
Marko, Zeus 1189-001
Zoran, Yevs 9987-573
*/

egrep "^A" tel_imenik

200/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

Ana, Ban 3398-000


Alex, France 5598-999

PRIMJER:

egrep "[xX]" tel_imenik

Alex, France 5598-999

egrep ' ( Indi|Elvis) ' tel_imenik

Indi, Car 8895-977


Elvis, Potrag 9989-771

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-Za-
z,]*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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

'^[0-9]+\.[0-9]+$'
Ako želimo samo int brojeve:
'^[0-9]+$'

PRIMJER:

Lg.txt
MANU LOGIN 01.01.2004. 12:00
GNO LOGIN 01.01.2004. 12:38
MANU LOGOUT 01.01.2004. 23:58
GNO LOGOUT 02.01.2004. 23:59
EXI LOGIN 03.01.2004. 23:15
EXI LOGOUT 03.01.2004. 23:29
ZORAK LOGIN 03.01.2004. 23:29
MANU LOGIN 03.01.2004. 23:30
ENA LOGIN 04.01.2004. 09:00
ZORAK LOGOUT 04.01.2004. 09:05
SETER LOGIN 04.01.2004. 10:01
MANEK LOGIN 04.01.2004. 10:03
SEKOviN LOGIN 04.01.2004. 10:05
MARA LOGIN 04.01.2004. 11:59
MANU LOGOUT 04.01.2004. 12:47
ZORAK LOGIN 04.01.2004. 23:00
SEKOviN LOGOUT 04.01.2004. 12:59
MARA LOGOUT 04.01.2004. 13:59
INED LOGIN 04.01.2004. 15:08
ENA LOGOUT 04.01.2004. 16:00
SETER LOGOUT 04.01.2004. 16:07
MANEK LOGOUT 04.01.2004. 16:26
INED LOGOUT 05.01.2004. 00:05
BREZ LOGIN 05.01.2004. 06:01
EXI LOGIN 05.01.2004. 08:02
MANU LOGIN 05.02.2004. 09:08

203/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

ZORAK LOGOUT 05.02.2004. 09:09


MANU LOGOUT 05.02.2004. 10:59
ZORAK LOGIN 06.02.2004. 11:55
ZORAK LOGOUT 06.02.2004. 12:59
EXI LOGIN 06.02.2004. 13:05
EXI LOGOUT 06.02.2004. 13:00
SETER LOGIN 10.02.2004. 08:00
EXI LOGIN 10.02.2004. 08:01
SETER LOGOUT 12.02.2004. 09:05
EXI LOGOUT 12.02.2004. 09:58
SETER LOGIN 13.02.2004. 08:08
SETER LOGOUT 14.02.2004. 09:05

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

zo@linux:~> egrep -E '^[^\D\S]*(0.\.01\.2004\..)(23)' lg

MANU LOGOUT 01.01.2004. 23:58


GNO LOGOUT 02.01.2004. 23:59
EXI LOGIN 03.01.2004. 23:15
EXI 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 LOGOUT 02.01.2004. 23:59
EXI LOGOUT 03.01.2004. 23:29
zo@linux:~>

Svi login-ovi setera.

zo@linux:~> egrep -E '^SETER.?LOGIN[^\D\S]*(1([0-


9]?)\.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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

SETER LOGOUT 12.02.2004. 09:05


SETER LOGOUT 14.02.2004. 09:05
zo@linux:~>

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

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][0-
9]\.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[0-
5][0-9]|[01][0-9][0-9])' ip.wpad
163.254.252.111
zo@linux:~>

AWK

PRIMJER:

F1/*
ime prezime kolicina naziv placeno
marko puzla 5 kocke 0
darko puh 1 kugla 1
darko on 7 kocke 0
marin draget 4 buli 1
eston sret 7 plast 1
narav tezak 4 marke 0
*/

awk_/*
$5 ~/[0]/ {print $0} $5 ~ /[0]/ {lines++}
END{print "Broj duznika:",lines}
*/

207/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

zo@linux:~> awk -f awk_ f1

marko puzla 5 kocke 0


darko on 7 kocke 0
narav tezak 4 marke 0
Broj duznika: 3

zo@linux:~>

Ili

zo@linux:~> awk '$5 ~/[0]/ {print $0} $5 ~ /[0]/


{lines++}END{print "Broj duznika:",lines} ' f1

marko puzla 5 kocke 0


darko on 7 kocke 0
narav tezak 4 marke 0
Broj duznika: 3

zo@linux:~>

vi – supstitucija u vi ex modu

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

:%s/function(\([^,]*\),\([^,]*\),\([^,]\))/function(\2,\1,\3)/g
:wq

zo@linux:~> cat sub1

function(x,x+1,x+2)

PRIMJER:

zo@linux:~> cat sub2

Marko Blazevic, Parduk, HR, 10000 Zagreb


Melten Bukrest, SmartNet, SLO,21100 Ljubljana
Jadranka Muzic ,APL ,HR, 21000 Split
Gonar Tenser, Siemens,HR ,42000 Varazdin
Drago Mio,Endor-Soft ,BIH, 50000 Sarajevo

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, 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

209/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

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, //inače 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 - - 16:30-18:00 16:30-18:00 8:00-9:35


MAT II MAT II NWP TALIJANSKI
DV.F101 DV.F101 DV.F101 DV.F02

19:00-21:20 - - 18:10-21:20 18:10-21:20 9:45-13:05


EKONOMIKA UNIX NWP(labosi?) PIN
DV.F101 DV.F101 DV.F112 DV.F02

13:15-14:50

210/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

PIN(labosi)
DV.F111

zo@linux:~> ex txt

"txt" 12L, 301C


Entering Ex mode. Type "visual" to go to Normal mode.
:%s/MAT/MATEMATIKA/g
MATEMATIKA II MATEMATIKA II NWP TALIJANSKI
:wq

zo@linux:~> cat txt


16:30-19:00 16:30-18:00 16:30-18:00 8:00-9:35
MATEMATIKA II MATEMATIKA II NWP TALIJANSKI
DV.F101 DV.F101 DV.F101 DV.F02

19:00-21:20 18:10-21:20 18:10-21:20 9:45-13:05


EKONOMIKA UNIX NWP(labosi?) PIN
DV.F101 DV.F101 DV.F112 DV.F02

13:15-14:50
PIN(labosi)
DV.F111

zo@linux:~> cat txt1

Kako bismo ubrzali stranicenje, trebamo podršku hardvera - asocijativnu memoriju.


TLB je hardverski uređaj koji kesira polja tabele stranica.
Postoje specijalne instrukcije kojima OS može upravljati TLB-om.
Tipična veličina TLB-a je 8-2048 ulaza.
zo@linux:~> ex txt1

"txt1" 4L, 246C

211/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb RegEx

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 podršku hardvera - asocijativnu memoriju.


Translation Look-Aside Buffer je hardverski uređaj koji kesira polja tabele stranica.
Postoje specijalne instrukcije kojima OS može upravljati Translation Look-Aside
Buffer-om.
Tipična veličina Translation Look-Aside Buffer-a je 8-2048 ulaza.

zo@linux:~>

Jedini zaključak koji možemo donijeti vezan uz regularne izraze je taj da regularni
izrazi bez obzira na to kako vam se činili na početku u nezamislivoj mjeri olakšavaju posao,
ako se ne slažete sa tom tvrdnjom pokušajte sami napisati rutinu za provjeru e-maila koja će
obuhvaćati sve slučajeve iz primjera.

212/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

Mario Strinić

VI EDITOR

213/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

UVOD

VI je „screen based“ editor, najčešće korišten na UNIXoidima. Osnovni razlog


uspješnosti VI editora su mnoga svojstva koja pomažu programerima, ali i mnoštvo
mogućnosti koje nudi u, nazovimo, svakodnevnom editiranju file-ova. Česta je pojava da ga
početnici izbjegavaju upravo zbog mnoštva mogućnosti koje nudi.
Osim VI-a postoje još dva standardna UNIX editora, to su:
ed – linijski orijentiran editor, prilično kompliciran za uporabu
ex –linijski editor – praktično jednakih mogućnosti kao i VI

Startanje:

VI pruža mogućnost 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 nešto poput:

„filename“ lines 21, 400 characters (ime file-a, broj linija i broj znakova)

Ukoliko file nije postojao pisat će nešto poput:

„newfile“ [newfile]

Za pokretanja bez imena file-a (bilo starog ili novog imena) donja linija bit će prazna.

214/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

MODOVI RADA:

VI editor ima dva moda rada:


komandni
insert

Komandni mod:

Omogućuje 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 očekivanju komande. Naredbe su obično 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 počinje sa 1-9 i odnosi se na broj znakova na koji želimo imati
učinak. Npr. naredba x20 će obrisati 20 znakova.
Where govori na koliko linija želimo učinak naredbe (također, može biti i naredba za
pomicanje kursora.

Jednostavne Naredbi:
a ulazak u insert mode
h miče kursor lijevo jednu poziciju
i 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 pomiče kursor jednu liniju dolje
k pomiče kursor jednu liniju gore
l pomiče kursor desni jednu poziciju
r mijenja znak „pod“ kursorom (count za zamjenu više znakova)
u povrat zadnje naredbe (undo)

215/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

x briše znak pod kursorom (count za obrisati count znakova)


q napuštanje VI editora (ukoliko je dokument mijenjan dobit ćemo
upozorenje)
q! napuštanje bez snimanja (nema upozorenja)
w snimanje (može se navesti iza w ime file-a)
wq snimiti i napustiti

Text baferi u VI

VI ima 36 bafera sa spremanje dijelova teksta i bafer opće namjene. Kad god je neki dio
teksta obrisan ide u bafer opće namjene ali se može pohraniti i u drugi bafer ako se tako
specificira. Bafer se specificira naredbom “ iza koje slijedi broj ili slovna oznaka bafera.

Na primjer:

“mdd – znači koristi bafer m i obriši trenutnu liniju ili


“mp – kopira sadržaja bafera m(uradi „paste“)

Sječenje (cut) teksta

Naredba koju obično koristimo za sječenje (cut) texta je d.

Kombinacije naredbe d:

dd – briše liniju
d^ - briše od pozicije kursora do početka linije
d$ - briše od pozicije kursora do kraja linije
dw – briše od trenutne pozicije kursora do kraja riječi
3dd – briše tri linije teksta od trenutne pozicije prema dole

Postoji i naredba y koja funkcionira na sličnom principu koja uzima tekst bez brisanja.

216/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

Lijepljenje (pasting)

Naredbe za lijepljenje su p i P. Jedina razlika među njima je u relativnoj poziciji


kursora gdje lijepe. p lijepi specificirani ili opći bafer poslije pozicije kursora, dok P p lijepi
specificirani ili opći bafer prije pozicije kursora. Specifiranje counta prije paste naredbe lijepi
tekst count puta.

Indentacija i provjera

VI editor ima sklop osobina koje mu omogućuju pomoć pri programiranju. Postoji
varijabla kojom možemo podesiti identaciju za svaki nivo ugnježdavanja koda. Varijabla je
sw.

Na primjer: :set sw=5 (podesit će pomak na 5).

Naredbe za indentaciju:

<< Pomiče trenutnu liniju na lijevo za širinu jednog pomaka


>> Pomiče trenutnu liniju na desno za širinu jednog pomaka

Posebno zgodna osobina VI editora je to što omogućuje provjeru koda za „visećim“


zagradama. Naredba % će tražiti lijevu pripadajuću zagradu.

Pretraživanje riječi i znakova:

VI posjeduje dva načina pretrage:


po znakovima
po riječima

217/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

Za traženje stringova koristimo naredbe: / i ?. Jedina razlika između ove dvije naredbe
je u tome što / traži string prema naprijed, dok naredba ? traži string prema natrag.Naredbe n i
N ponavljaju prethodnu naredbu u istom ili suprotnom smjeru. Neki znakovi u VI-u imaju
posebno značenje stoga je ispred njih potrebito staviti \ (backslash) da bi bili uključeni u
pretragu.

Specijalni znakovi:
^ - početak linije
. – odgovara jednom znaku
- označava 0 (nula) ili više znakova
$ - kraj linije
[ - početak seta pripadajućih znakova
< - krak riječi
>- početak riječi

Naredbe f i F traže znak na trenutnoj liniji.Naredba f traži naprijed, dok F traži unatrag.
Naredbe t i T traže znak na trenutnoj liniji, ali t pomiče kursor na poziciju prije traženog
znaka (tražeći unaprijed), dok T pretražuje unatrag do znaka prije traženog.

Gore navedene naredbe f i F, te t i T mogu biti ponovljene koristeći ; ili , gdje: ;


ponavlja pretragu u istom smijeru, dok , to radi u obrnutom smijeru.

218/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

PODEŠAVANJE VI-A

Moguće je podesiti način na koji se VI ponaša i to se radi naredbom :set.


Edit opcije raspoložive naredbom set:

noautoindent magic noshowmatch


autoprint mesg noshowmode
noautowrite nmodelines noslowopen
nobeautify nonumber tabstop=8
directory=/tmp nonovice taglength=0
nodoubleescape nooptimize tags=tags
/usr/lib/tags
noedcompatible paragraphs=IPLPPPQPP LIpplpipnpbp term=xterm
noerrorbells prompt noterse
noexrc noreadonly timeout
flash redraw timeoutlen=500
hardtabs=8 remap ttytype=xterm
noignorecase report=5 warn
keyboardedit scroll=11 window=23
keyboardedit! sections=NHSHH HUuhsh+c wrapscan
nolisp shell=/bin/csh wrapmargin=0
nolist shiftwidth=8 nowriteany

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 slijedeća 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 – podešava broj linija koje VI koristi (xx)

219/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

:set ws – ako je ova opcija upaljena ako ne pronađe željeni string počinje pretragu s
početka teksta
:set wm xx – automatski "word wrap", što znači da će preći u novu liniju poslije
određenog broja znakova (xx mora biti veći od 0)

220/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

SKRAĆENICE I MAPIRANJE DIRKI:

Veoma korisna naredba u VI-u je naredba skraćivanja naredbi (abbreviate command).


Naredba izgleda ovako:

:ab string thing to substitute for

Primjer:

Ako smo otkucali nešto poput „Pero Peric huuuuuuuuuuuuuum“ i ne želimo to stalno
ponavljati možemo napisati:

:ab Pe Pero Peric huuuuuuuuuuuuuum


Sada kad otkucamo Pe pojavit će se: Pero Peric huuuuuuuuuuuuuum

Skraćenice se mogu ukinuti. Naredba za to je unabbreviate.


U prethodnom primjeru bi bilo: :una Pe
Za listu skraćenica 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 slično skraćenicama, da se sekvenca tipki i potom sekvenca za zamjenu.

EXINIT Environment Variabla and the .exrc file:

Postoje dva načina za prilagođavanje(customize) VI-a korisniku. Ako kreirate file .exrc
u svom home direktoriju, sve komande tamo će biti čitane prilikom startanja VI-a.
Drugi način je da podesimo varijablu EXINIT. Opcije će biti smještene u vašem
shellsetup file-u. Ako koristite /bin/csh (C-Shell) koristite ovu naredbu:
setenv EXINIT '...'

221/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

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 više od jedne naredbe odvojite naredbe uspravnom crtom (|).

Primjer:
setenv EXINIT 'set ai nu wm=3|map g G'

Ako želite kreirati file .exrc možete staviti iste stvari u njega kao što je napisano pod
navodnicima poslije EXINIT.

222/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

POVRAT PODATAKA

Vi editira privremenu kopiju vašeg file-a i kad je editiranje završeno ili kad snimimo od
mijenja sadržaj privremene kopije sa novom. Ako nešto krene „naopako“ dok editirate file VI
će pokušati 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
slučaju biti upotrijebljena prilikom slijedećeg dizanja. Komanda bi trebala izgledati ovako vi
–r vitalinfo. Naravno, poslije povrata (recoveringa) file je potrebito ponovo snimiti.)

Upozorenja vezana uz rad na radnim stanicama:

Na dvije stvari treba paziti kada radimo sa radnim stanicama(workstations):


editiranje istog file-a u isto vrijeme u više puta
promjena veličine ekrana.

Pošto VI kopira originalni file i snima sadržaj kopije u originalni file, ako ste logirani
više od jedan put i editirate isti file više od jedan put koristeći VI, ako snimite na jednom
prozoru pa onda na drugom, promjene napravljene prvi put biti će prebrisane. Najsigurnije je
uvijek koristiti jednu kopiju file-a.

223/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

PREGLED NAREDBI:

Rezanje(cutnig), lijepljenje(pasting) i brisanje(deleting)

“ – specifiranje bafera koji se koristi


D – briše od trenutne pozicije do kraja linije
P – lijepi sadržaj bafera prije trenutne pozicije kursora
X – briše znak prije kursora
d – briše do where (pogledati modove rada)
p - lijepi sadržaj bafera poslije trenutne pozicije kursora
x – briše znak na kom je kursor

Umetanje teksta

A – dodaje na kraj trenutne linije


I – ubacuje na početak 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

Kretanje kursora unutar file-a

Ctrl + B – skrola nazad jednu stranicu. Count skrola navedeni broj stranica
Ctrl + D – skrola naprijed pola prozora. Count skrola broj linija
Ctrl + F – skrola naprijed jednu stranicu. Count skrola navedeni broj stranica
Ctrl + H – pomiče kursor jedan space lijevo. Count pomiče navedeni broj
mjesta
Ctrl + J – pomiče kursor dole jednu liniju u istoj koloni. Count pomiče
navedeni broj linija dolje

224/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

Ctrl + M – pomiče kursor na prvi znak slijedeće linije


Ctrl + N - pomiče kursor dole jednu liniju u istoj koloni. Count pomiče
navedeni broj linija dolje
Ctrl + P – Pomiče kursor gore jednu liniju u istoj koloni. Count pomiče
toliko linija gore
Ctrl + U – Skrola nazad pola prozora. Count skrola toliko linija.
$ - pomiče kursor na kraj trenutne linije. Count pomiče na kraj slijedećih
linija
% - pomiče kursor na mjesto parne zagrade
^ - pomiče kursor na prvi „non-whitespace“ znak
( - pomiče kursor na početak rečenice
) – pomiče kursor na početak slijedeće rečenice
{ - pomiče kursor na prethodni paragraf.
} – pomiče kursor na slijedeći paragraf
| - pomiče kursor na kolonu specificiranu sa count
+ - pomiče kursor na prvi non-whitespace znak u slijedećoj liniji
- pomiče kursor na prvi non-whitespace znak u prethodnoj liniji
_ - pomiče kursor na prvi non-whitespace znak u trenutnoj liniji
0 (Nula) – pomiče kursor na prvu kolonu trenutne linije
B – pomiče kursor nazad jednu riječ preskačući punktuaciju
E – pomiče kursor na kraj riječi preskačući punktuaciju
G – ide na broj linije specificiran sa count, ako count nije zadan onda ide na
kraj file-a
H – pomiče kursor na prvi non-whitespace znak na vrhu ekrana
L – pomiče kursor na prvi non-whitespace znak na dnu ekrana
M – pomiče kursor na prvi non-whitespace znak na sredini ekrana
W – pomiče se naprijed na početak riječi preskačući punktuaciju
b – pomiče kursor nazad jednu riječ. Ako je kursor na sredini riječi, pomiče
kursor na prvi znak te riječi
e – pomiče kursor naprijed jednu riječ. Ako je kursor na sredini riječi,
pomiče kursor na zadnji znak te riječi
h – pomiče kursor na lijevo jedan znak
j – pomiče kursor dolje jednu liniju
k – pomiče kursor gore jednu liniju

225/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

l – pomiče kursor na desno jedan karakter


w – pomiče kursor naprijed jednu riječ. Ako je kursor na sredini riječi
pomiče kursor na prvi znak slijedeće riječi

Kretanje kursora po ekranu

Ctrl + E – skrola naprijed jednu liniju. Count skrola toliko linija


Crtrl + Y – skrola nazad jednu liniju. Count skrola toliko linija
z – ponovo iscrtava ekran sa slijedećim opcijama:
“z<return>“ stavlja trenutnu liniju na vrh ekrana.
“z“ stavlja trenutnu liniju na centar ekrana
“z-“ stavlja trenutnu liniju na dno ekrana

Ako se stavi count prije z-a on mijenja trenutnu liniju u specificiranu. Npr. 18z stavlja
liniju 18 na centar ekrana.

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

Traženje teksta ili znakova:

, - ponavlja zadnje f, F,t ili T naredbu u obrnutom redoslijedu


/ - pretražuje file prema dole tražeći string specificiran poslije /
; - ponavlja zadnju f, F, t ili T naredbu
? – pretražuje file prema gore tražeći string poslije znaka ?
F – pretražuje trenutnu liniju unatrag tražeći znak specificiran poslije F
naredbe. Ako pronađe pomiče kursor na tu poziciju.
N – ponavlja zadnju pretragu zadanu sa / ili ? ali u obrnutom smjeru
T – pretražuje trenutnu liniju nazad tražeći znak specificiran poslije T
naredbe i pomiče se na kolonu pošto je pronađe
f – pretražuje trenutačnu liniju tražeći znak specificiran poslije f naredbe.
Ako nađe pomiče kursor na danu poziciju
n – ponavlja zadnju pretragu zadanu sa / ili ?
t – pretražuje trenutačnu liniju tražeći znak specificiran poslije t naredbe i
pomiče se na kolonu prije znaka ako je pronađen

Formatiranje znakova/linija

~ mijenja „case“ znaka po kursorom


< - pomjera linije do „where“ prema lijevo za jednu širinu pomaka
<< pomjera trenutnu liniju na lijevo i može biti specificirano sa count
- pomjera linije do „where“ prema desno za jednu širinu pomaka
<< pomjera trenutnu liniju na desno i može biti specificirano sa count
J – spaja trenutnu liniju sa slijedećom. Counr spaja navedeni broj linija

Snimanje i izlaz:

Ctrl + \ - napušta 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 – napušta VI i odlazi u EX mode
ZZ – napušta editor, snima ako ima izmjena

227/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

Miscellany:

Ctrl + G – Prikazuje ime file-a i status


Ctrl + L – Čisti i ponovo iscrtava ekran
Ctrl + R –Ponovo iscrtava ekran uklanjajući pogrešne linije
Ctrl + [ - Escape tipka. Odgađa prethodno danu komandu
Ctrl + ^ - ide nazad na prethodno editirani file
! – izvršava shell naredbu.
& - ponavlja prethodnu :s naredbu
. – ponavlja zadnju naredbu koja je promijenila file
: - početak tipkanja EX editor naredbi. Naredba je izvršena kad user otipka
return
@ - ispisuje naredbu spremljenu u baferu
U – vraća trenutnu liniju u stanje koje je bilo prije no što je kursor ušao u
liniju
m – označava trenutnu poziciju sa znakom specificiranim poslije m naredbe
u – vraća zadnju promjenu napravljenu na filu. Ponovno u će negirati
prethodno u

228/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb VI editor

ZAKLJUČAK

Vi editor predstavlja moćan alat za editiranje texta. Iz pobrojane liste naredbi lako je
vidljivo da je gotovo teško zamisliti neku operaciju sa tekstom koju VI ne može izvršiti.
Osim toga odvojenost modova rada (komandnog i insert moda) u bitnome olakšava
navigaciju kroz VI. Naredbe su jednostavne i logično postavljene.
Stoga nije nimalo čudno da je VI postao bazičnim editorom UNIX based Operacijskih
sustava.

229/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Matko Pejčić

EMACS

230/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

UVOD

Što je Emacs?

Emacs je besplatan, portabilan, nadogradivi tekst editor.


Besplatan znači da je izvorni kod (source code) za Emacs dostupan svima sa pristupom
internetu te se može besplatno kopirati i redistribuirati. Portabilan znači da se Emacs može
pokrenuti na nizu strojeva i radi na nizu operativnih sustava tako da se slobodno možete
pouzdati u činjenicu da možete koristiti isti program za uređivanje teksta neovisno kojim
strojem se služite. Sa riječi nadogradivi opisuje se treća, ali vjerojatno najvažnije
karakteristika Emacs-a. Ne samo da možete prilagoditi sve mogućnosti Emacs-a tako kako
vama najviše odgovara, već možete isprogramirati Emacs da radi stvari koje njegovim
kreatorima nisu uopće pale na pamet.
Zbog svega ovoga Emacs je izuzetno popularan i uspješan 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 sadrži „mod“ koji omogućuje lako editiranje koda u tom jeziku.
Kompajliranje, debagiranje , direktna interakcija sa interpreterom, skakanje po kodu na bilo
koju poziciju označenu simbolom (funkcija ili ime varijable), sve su to opcije koje pisac koda
može koristiti u Emacsu.
Emacs također sadrži programe za čitanje pošte (mail readers), za čitanje vijesti (news
readers),www, gopher i FTP klijente, „spell checking“ i psihologa (Rogarian therapist-probati
obavezno)
Emacs je većinom 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 različitih „add-on“ paketa,
od kojih vam većina omogućuje stvari o kojima kreator Emacsa nije ni sanjao.

231/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Varijacije Emacsa i kako je sve počelo

Emacs je ustvari ime za cijelu obitelj tekst editora koji ili nasljeđuju ili su inspirirani
nekom prethodnom verzijom.
Prvi Emacs za Unix stroj bio je Goselim Emacs koji je poslije postao komercijalan pod
imenom Unipress Emacs.
Kada se danas kaže Emacs misli se na GNU Emacs kojeg je napisao Richard Stallman,
osnivač Free software Fundation, i još uvijek ga održava.
Važno je napomenuti da postoje dva Emacs editora: Emacs i Xemacs. Xemacs sadrži
GUI-Graphic User Interface te zbog toga postaje sve popularniji. Mnogi ga čak nazivaju
modernom inačicom Emacsa. Međutim većina stvari navedenih u daljnjem tekstu odnosi se
na Emacs verziju 20.3, ali se golemi postotak svega toga može komotno upotrijebiti i za
Xemacs.

Kako doći do Emacs editora?

Vrlo lako. Ako koristite jednu od popularnih Linux distribucija kao Debian, RedHat,
Slackware, Emacs je vjerojatni jedna od opcija koju možete instalirati. Ako ne, možete lako
doći do Emacs source koda i sami ga kompajlirati. Posjetite GNU stranice i pronađite točnu
lokaciju za download:
http://www.gnu.org/software/emacs/emacs.html.

232/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

TEORIJA I PRAKSA TIPKOVNICE


I SKUPOVA ZNAKOVA

Jedan od prvih problema sa kojim se početnici na Emacs-u susreću je tipkovnica i skup


znakova. Budući da je portabilan, Emacs ne može znati kakvom tipkovnicom se vi služite i
koje sve tipke ta tipkovnica sadrži. Sve Emacs komande su 8-bitni ASCII znakovi, međutim
neke tipkovnice imaju tipke koje ne odgovaraju nekom određenom ASCII znaku. To je
naročito slučaj na PC i Macintosh tipkovnicama kada su spojene na Unix stroj preko nekog
posredničkog ili telekomunikacijskog programa. U tom slučaju, jedini podaci koji teku
između tipkovnice i Unix stroja su 8-bitni ASCII bajti.
Na primjer, tipična PC tipkovnica ima tipke označene sa PAGE UP i HOME,
strelicama, funkcijske tipke itd. Ne samo da sve ove tipke nemaju ASCII vrijednosti, već
uopće ne generiraju ASCII znake. PC ih može prepoznati kroz „scan codes“, ali što se događa
kada ste spojeni na Unix stroj preko telekomunikacijskog programa i pretisnete neku od ti
tipki?
Jedna od slijedećih stvari se dogodi, ovisno o telekomunikacijskom programu:
Uopće se ne pošalje ASCII znak
Jedan ASCII znak se pošalje, ali to je obično obavezan znak koji se razlikuje
od jednog telekomunikacijskog programa do drugog
Pošalje se neka izlazna sekvenca
Može se čak dogoditi da telekomunikacijski program mijenja vrijednost koju određena
tipka pošalje čak i kod tipki koje imaju pridruženu ASCII vrijednost!!! (Control-@ je čest
problem).
I na kraju još i operativni sustav može zamutiti stvari dodatno. Emacs očekuje da mu je
cijeli ASCII znak skup dostupan, ali može se dogoditi da OS uzurpira neke znake. Najbolji
primjer su control-S i control-Q koji se nekad koriste za kontrolu toka. To su važne Emacs
komande i morate biti sigurni da ih vaš telekomunikacijski ili bilo koji drugi program nije
oduzeo (Emacs se sam pobrine za OS) .
Kod svega gore navedenog Emacs je nemoćan. On samo vidi 8-bitne znake koje mu
dostavlja OS. Ali ako dobro razumijete vaš telekomunikacijski program nećete imati
problema sa Emacs-om i tipkama.

233/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Napomena: Emacs u nekim slučajevima koristi posebne znakove kao strelice (npr. pod
X-om ili kad se vrti pod DOS-m, gdje Emacs razumije događaje 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 Za bilo koji x, znak je Control-x


M-x Za bilo koji x, znak je Meta-x (više o Meta znakovima u
nastavku teksta).
C-M-x Za svaki x, znak je Control-Meta-x.
RET Tipka povratka (zapravo C-m).
SPC Razmaknica
ESC Tipka izlaza, odgovara joj C-[

234/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

NAREDBENA STRUKTURA EMACS-A

Za Emacs svaka udarac tipke je naredba, čak i jednostavni tipke kao A ili z (ispis
znakova) su naredbe za umetanje. Znakovi koji ne služe za ispis su naredbe za uređivanje;
miču kursor, skrolaju tekst, brišu ili kopiraju tekst itd.
Svaka naredba ima svoje ime koje možete pronaći u dokumentaciji (npr. kill-line,
delete- backward-char, ili self-insert-command). Ove naredbe su vezane za pritisak tipki zbog
lakog uređivanja. Takvo vezanje tipki i naredbi naziva se key binding ili samo binding
(vezivanje).
Skup svih vezivanja (binding-a) čini Emacsov skup naredbi (Emacs command set).
Međutim Emacs je nadogradiv, promjenjiv editor. To znači:
Vezivanje može biti različito za različite modove ovisno o nadogradi
Vezivanje može biti različito za različite modove ovisno o promjenama
U ovom tekstu opisana su standardna vezivanja.

Jednostavne tipke

Postoji 95 raznih ASCII znakova koji se mogu ispisati i svi su vezani uz self-insert-
command da bi se mogli umetnuti u tekst kada su odabrani. Za naredbe uređivanja Emacs
koristi sve control znake: C-a, C-b itd. Ali to je još 32 znakova, a Emacs ima više od 32
naredbe za uređivanje.
128 znakova u gornjoj polovici ASCII-a nisu zauzeti, ali kako ih otipkati? Emacs koristi
Meta tipku koja radi na isti način 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 višeg reda. To nam daje pristup znakovima kao
Meta-a, Meta-b itd. (Postoji također i Meta-A, ali da bi se izbjegla moguća zabuna
metaznakovi štampanih slova odgovaraju metaznakovima pisanih)
Što je sa control znakovima sa bit setom višeg reda? To su potpuno validni
metaznakovi; označavaju se sa C-M-a, itd. Za njihov odabir zajedno se drže pritisnute Control
i Meta tipke. Budući da su i Control i Meta Shift tipke M-C-a i C-M-a je zapravo isto. Zbog
ujednačenosti uglavnom se piše M-C-a.

235/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Prefiksne ili složene tipke

Control i meta tipke plus znakovi za ispis daju nam zajedno 256 moguće kombinacije
tipki, ili 160 naredbi za uređivanje, kada se oduzmu samo insertirajući znakovi. Ali Emacs
ima više od 160 naredbi za uređivanje! Zbog toga također koristimo prefiks naredbe. Prefiks
naredba je tipka koja kada ju pritisnemo ništa ne ispisuje, već čeka odabir neke druge tipke
zajedno sa njom čineći jednu naredbu. Svaka prefiks naredba dodaje još 256 mogućih
kombinacija za koje možemo vezati određene naredbe. Prefiks naredbe obično grupiraju
naredbe koje su na neki način povezane.
Standardne prefiks naredbe su:

C-c Koristi se za naredbe koje su specifične za određeni „mod“ tako da bi se


mogle koristiti za različite naredbe ovisno o kontekstu. To su najvarijabilnije
Emacs naredbe.
C-h Koristi se za Help naredbe
C-x Ovaj prefiks se najčešće koristi za naredbe za manipulaciju datoteka,
prozora i međuspremnika.

Prefiksi nam daju dodatnih 768 mogućnosti i zbroj se penje na 928. Ali Emacs ima više
od 928 naredbi! Zbog toga postoji mogućnost jedne subnaredbe od prefiks naredbe za neku
prefiks naredbu, kao npr C-x 4 ili C-x v , svako takvo vezivanje daje dodatnih 256
mogućnosti kombiniranja tipki. Postoji niz takvih dvoznakovnih prefiksa, ali su dosta
specijalizirani i ne sadrže cijeli skup od 256 naredbi. Postoje čak i tro-znakni prefiksi, ali
većina ljudi neće priznati da ih koristi.

Korištenje produženih naredbi (extended commannds)

Logičan zaključak svega gore navedenog je da čak i najveći Emacs zaljubljenik ne


može znati sve naredbe. Neke naredbe se koriste vrlo rijetko, i obično je lakše naći dugo ime
naredbe (koristeći info, Emacs-ov online sustav za pomoć) i utipkati ga direktno.
Postoji jedna Emacs naredba koja se koristi za izvršavanje bilo koje druge naredbe: M-
x. Kada upišete M-x Emacs vas traži da upišete dugo ime naredbe i onda ju izvrši.

236/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

ESC prefiks

Ne postoji drugi prefiks koji je istovremeno vrlo važan i potpuno suvišan kao ESC
prefiks.
Sve tipkovnice nemaju Meta tipku koja postavlja bit višeg reda (high order bit). Na PC-
u 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 može, ali i ne mora raditi.
Srećom č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
pokušavati držati ESC pritisnutim dok pritišćete neku drugu tipku, koristite ga kao prefiks i
otipkajte ga odvojeno. Ako ga zadržite pritisnutim sekundu predugo vjerojatno ćete izazvati
autorepeat što bi vas moglo vrlo zbuniti.

Previše naredbi?

Kako popamtiti sve ove naredbe? Jednostavno: nikako.Većina korisnika Emacs-a nauči
samo osnovne naredbe i sa tim su potpuno zadovoljni. Neki nauče osnovne naredbe i još neke
koje im trebaju za neke posebne zadaće. Neki konstantno uče nove naredbe da bi ubrzali
editiranje.
Vrlo mali broj korisnika dođe do stupnja da pišu svoje vlastite, potpuno nove Emacs
naredbe.

237/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

DATOTEKE, MEĐUSPREMNICI I PROZORI


(FILES, BUFFERS AND WINDOWS )

Emacs sadrži tri (zapravo četiri) strukture koje su neodvojivo povezane i vrlo važne za
razumjeti:
File (datoteka) - Datoteka je zapravo Unix datoteka na disku. Nikada ne
uređujete ovu datoteku, već učitavate kopiju u Emacs međuspremnik
(buffer) i pišete kopiju mađuspremnika na disk da ju spremite.
Međuspremnik (buffer) - Međuspremnik je interna podatkovna struktura
koja sadrži tekst koji uređujete. Emacs može imati više aktivnih
međuspremnika u isto vrijeme. Većina, ali nikako svi, međuspremnici fu
povezani sa datotekom. Međuspremnici imaju imena; međuspremnik koji je
aktiviran iz datoteke je gotovo uvijek nazvan po toj datoteci, i kažemo da
međuspremnik posjećuje datoteku (a buffer is visiting a file)
Prozor (window) - Prozor je vaš pogled na međuspremnik. Zbog
ograničenosti monitora vjerojatno nećete moći vidjeti sve vaše buffere
odjednom. Možete podijeliti ekran u koliko dijelova želite (ili za koliko
imate mjesta), ovisno koliko buffera želite vidjeti. Također je moguće da
više prozora gledaju različite dijelove istog međuspremnika.Prozore možete
stvarati i brisati kad kod želite, brisanjem prozora ne briše se sadržaj
međuspremnika.
Okvir (frame) - Okvir je sličan prozoru, ali se tretira kao posebna cjelina pod
X prozorskim sustavom.

Naredbe za manipulaciju datotekama

C-x C-f
find-file. Ovo je glavna naredba za učitavanje datoteke u međuspremnik. Kada izvršite
ovu naredbu Emacs čeka da upišete ime datoteke. Slijedeće provjerava da li već uređujete tu
datoteku u nekom drugom međuspremniku, i ako je tako jednostavno skače na već postojeći
međuspremnik i ne učitava datoteku ponovo. Ako je provjera negativna otvara se novi

238/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

međuspremnik, naziva se po datoteci i inicijalizira se sa kopijom datoteke. U oba slučaja


trenutni prozor prikazuje međuspremnik.

C-x C-s
save-buffer. Ovo je glavna naredba za spremanje datoteke, tj. za pisanje kopije
aktivnog međuspremnika na disk.

C-x s
save-some-buffers. Omogućuje vam da spremite sve međuspremnike koji posjećuju
datoteke, pitajući vas za svaki i nudeći nekoliko opcija (spremi, nemoj spremiti, baci pogled
pa ga možda spremi, itd.)

Naredbe za manipulaciju međuspremnika

C-x b
switch-to-buffer. Pita za ime međuspremnika i prebacuje međuspremnik trenutno
aktivnog prozora na taj međuspremnik.Ne mijenja konfiguraciju prozora. Ova naredba će
stvoriti novi prazan međuspremnik, ako upišete neko nepostojeće ime. Taj međuspremnik
neće posjećivati datoteku neovisno kako ga nazovete.

C-x C-b
list-buffers. Novi prozor se pojavljuje sa popisom svih međuspremnika, dajući ime,
obavijest o promjenama, veličinu u bajtima, glavni mod i ime datoteke koju posjećuje.

C-x k
kill-buffer. Pita za ime međuspremnika i uklanja cijelu podatkovnu strukturu za taj
međuspremnik iz Emacs-a. Ako je međuspremnik promijenjen ponuditi će vam se mogućnost
spremanja. Ovo ne briše pridruženu datoteku.

C-x C-q
vc-toggle-read-only. Učini međuspremnik read-only ili ga učini read-write ako je read-
only

239/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Naredbe za manipulaciju prozorima

C-v
scroll-up. Osnovna naredba za skrolanje naprijed za jedan cijeli ekran. Po defaultu
Emacs ostavlja dvije linije sadržaja sa prethodnog ekrana.

M-v
scroll-down. Isto kao i C-v samo se kreće unazad.

C-x o
other-window. Promjena aktivnog prozora. Neprekidan poziv ove naredbe rezultira
prolaskom kroz sve prozore, s lijeva nadesno i odozgo prema dole.

C-x 1
delete-other-window. Briše sve druge prozore osim aktivnog, čineći jedan prozor
veličine ekrana. Ova naredba ne briše međuspremnike i datoteke pridružene prozoru.

C-x 0
delete-window. Briše samo aktivan prozor, a drugima mijenja veličinu proporcionalno.

C-x 2
split-window-vertically. Po vertikali dijeli aktivan prozor u dva. Ovo rezultira
stvaranjem novog prozora, ali ne i novog međuspremnika Dva prozora sada gledaju isti
međuspremnik. Ovo vam omogućuje gledanje dva dijela međuspremnika istovremeno.

C-x 3
split-window horizontally. Po horizontali dijeli aktivni prozor u dva. Ovo rezultira
stvaranjem novog prozora, ali ne i novog međuspremnika Dva prozora sada gledaju isti
međuspremnik. Ovo vam omogućuje gledanje dva dijela međuspremnika istovremeno.
C-M-v
scroll-other-window. Radi isto što i C-v ali skrola drugi prozor. Ako imate više od dva
prozora skrola onaj prozor koji bi C-x o učinio aktivnim.

240/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

OSNOVNI KONCEPTI

Vjerojatno je važnije razumjeti ove osnovne koncepte nego znati bilo koju naredbu za
editiranje. Naredbe za editiranje su detalji: možete ih i sami naučiti,a ko temeljito obradite
osnove.

Ulaženje i izlaženje

Za ući u Emacs jednostavno utipkajte:

emacs

kada se digne, nećete editirati niti jednu datoteku. Sada možete upotrebom
odgovarajućih naredbi učitati datoteku za uređivanje. Druga mogućnost je da upišete

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 međuspremnika i izlaz iz Emacsa.
Emacs možete i suspendirati (u Unix-su to znači zaustavljanje programa i stavljanje ga
u pozadinu) koristeći naredbu C-x C-z (koja je vezana za suspend-emacs). Kako ga ponovo
pokrenuti ovisi o vašem shell-u, ali je vjerojatno temeljeno na fq naredbi.

Naredbe za samo-umetanje (self inserting commands)

Sada kada ste pokrenuli Emacs možete početi pisati u njega. Ne postoji potreba za
posebnim „insert modom“ ili tako nečim; upamtite znakovi za ispis (printing characters) se
sami umeću jer su vezani za self-insert-command.

241/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Ekran

Linija moda (The Mode Line)

Cijeli Emacs ekran je posvećen tekstu vaše datoteke, osim jedne linije blizu dna: to je
linija moda. Ova linija služi za informiranje, nikada ne možete u nju ući. Gotovo uvijek je na
neki način označena. Ona ispisuje važne obavijesti (koje se mogu mijenjati) kao:

Stanje međuspremnika. Da li je promijenjen, nije promijenjen ili je read-


only.
Ime datoteke koju uređujete.
Glavni mod.
Dio datoteke koju vidite na ekranu:
All Vidite cijelu datoteku
Top Vidite vrh datoteke
Bot Vidite dno datoteke
Percentage NN% pokazuje postotak datoteke iznad vrha prozora

Mali međuspremnik (The Minibuffer)

Prazna linija ispod linije moda je minibuffer. Emacs koristi minibuffer za prikaz poruka,
ali i za input kada vas Emacs traži da upišete nešto (tražiti će vas da upišete yes ili no kao
odgovor na pitanje, ime datoteke za uređivanje, dugo ime naredbe, itd.)
Minibuffer je također poznat kao echo area, zbog toga što Emacs tu daje „jeku“ pritiska
tipke, ako tipkate jako polako.

Č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 najčešće poruke su: „Mark set“ i „Garbage
collecting...“. Prva poruka znači da je Emacs odredio cilj (set a mark) za vas ovisno o vašoj
zadnjoj naredbi; automatsko određivanje cilja je poželjna mogućnost za neke naredbe. Druga

242/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

poruka znači da Emacs-ova lisp mašina preuzima spremanje (reclaming storage). Ovu poruku
možete ignorirati i nastaviti tipkati. Emacs neće izgubiti vaše znakove.

Duge linije (Long Lines)

Emacs ne prekida linije automatski, osim ako to od njega ne zatražite. Po defaultu


ostavlja linije onoliko duge koliko vi pišete. A što je još važnije ne dira vaše duge linije u
datotekama (neki editori kao stari vi su rezuckali linije).
Možda se čini dosadnim da morate udariti return na kraju svake duge linije, ali to je
zapravo defaultna postavka samo za neke modove. Razlog za to je taj što je Emacs editor za
programere, a svaki editor koji umeće prekide linija bez da mu vi to kažete nije dovoljno
pouzdan da se u njemu editira kod. U modovima za uređivanje teksta, Emacs umeče prekide
linija za vas.

Prekidanje i poništavanje (Interrupting and Abortiong)

Ponekad će Emacs učiniti nešto što ne razumijete: tražiti će neke informacije, ili će
zapištati kada pokušate nešto otipkati, ili će učiniti nešto jednako tako zbunjujuće. To samo
znači da ste pozvali neku naredbu greškom.
Kada se tako nešto dogodi samo trebati napisati C-q (što je vezano za keyboard-quit).
ZO je ASCII BEL znak koji prekida sve što Emacs radi. To će vas izvući iz bilo kojeg pitanja
koje vam Emacs postavi, prekinuti će bilo koju parcijalnu sekvencu tipki .
Budući da je Emacs potpuno rekurzivan, ponekada ćete morati otipkati C-q više puta,
kako bi izašli iz rekurzivnog niza naredbi. I za kraj, ako je Emacs potpuno zablokiran,
utipkavanje C-q tri puta zaredom brzo će prekinuti što god je uzrok blokade.

Pomoć

Emacs ima veliki i opširni online help, koji je dostupan preko help tipke C-h. C-h je
prefiks tipka. Pritisnite C-h dvaput i dobiti ćete listu podnaredbi; učinite to tri puta i dobiti

243/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

ćete prozor koji opisuje sve te naredbe (SPC će skrolat taj prozor). Neke od najboljih help
naredbi su:

C-h a
command-apropos. Traži ključnu riječ i onda ispisuje sve naredbe sa tom
Ključnom riječi u njenom dugom imenu.
C-h k
describe-key. Traži 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. Pokreće interaktivni pretraživač Emacs paketa.
C-h t
help-with-tutorial. Pokreće emacs tutorial.

Info

Emacs ima ugrađeni „hypertext documentation reader“, Info. Da bi ga pokrenuli


otipkajte C-h i ili M-x info RET. On sadrži svoj vlastiti tutorial. Tutorial pretpostavlja da
poznajte Emacs otprilike koliko je opisan u ovom dokumentu.

Beskonačni Undo i Redo

Jedna od najvažnijih Emacs naredbi je undo. Koji se poziva sa C-_. C-_ je validan
ASCII znak, ali ga neke tipkovnice ne generiraju pa također možete koristiti C-x u--.
Undo naredba je vrlo korisna kada učinite nešto što niste željeli. Jedan udarac tipkom
sve mijenja unazad.

244/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Kaže sa da Emacs ima beskrajan undo, jer možete izvršiti undo nad dugačkim nizom
naredbi, za razliku od nekih drugih editora. Kažemo da Emacs ima redu jer možete
promijeniti smjer dok izvršavate undu i tako u stvari pozvati undo na undo.
Jednom kada se naučite na ovu mogućnost nasmijati ćete se na svaki editor koji ju
nema. Vrlo je važno da se što prije udomaćite sa undo naredbom. Preporuča se pažljivo
čitanje undo dijela manuala i puno vježbe.

Backups i Auto Save Mode

Emacs nikad ne mijenja datoteku na disku dok mu vi to ne kažete, ali je vrlo pažljiv oko
spremanja vašeg rada:
Backup datoteke - Emacs uvijek sprema i prošlu verziju datoteke kada vi
izvršite spremanje. Ako se
vaša datoteka zove foo, onda se backup zove foo~. Iako je po defaultu
isključeno, Emacs će imati veći broj prethodnih verzija datoteka za vas,
foo.~1~, foo.~2~, foo.~3~. Vi sami odlučujete koliko verzija ćete spremati.
Auto-Save datoteke - Emacs po defaultu izvršava auto-save datoteke
dok ju uređujete. Auto-save datoteka za datoteku foo se zove #foo#. Ako se
Emacs (ili sustav) sruši, a vi niste uspjeli spremiti promjene na svojoj
datoteci većinu vašeg rada ćete moći naći u toj datoteci. Auto-save se, po
defaultu događa svakih 300 znakova ili kada naleti greška u sustavu.

Completion

Emacs nudi više mogućnosti nadogradnje (completion. To znači da Emacs pokušava


završiti vaša parcijalno otipkana imena datoteka, imena naredbi, itd. DA bi pozvali
completion pritisnite TAB.

245/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Davanje argumenata naredbama

Mnoge Emacs naredbe primaju argumente na isti način kao i funkcije ili procedure to
čine u programskim jezicima. Većina naredbi će vas tražiti argumente, npr. naredba za čitanje
datoteke će vas tražiti ime datoteke.
Postoji jedna vrsta argumenata koja je toliko česta da postoji poseban način njihovog
prosljeđivanja: brojevni argumenti. Veliki broj naredbi će brojevni argument interpretirati na
način da će se toliko puta pozvati. Naredba delete-char (vezana je na C-d) briše jedan znak
desno od kursora, ali ako joj se da brojevni argument n, izbrisati će n znakova.
Da bi se naredbi proslijedio brojevni argument, npr. 12, otipkajte C-u 12 prije naredbe
Ako tipkate dovoljno polako vidjeti ćete

C-u 1 2-

U echo području (echo area). Onda otipkajte C-d i tako ste naredbi delete-char dali
argument 12.
Budući da često ni ne znamo koliko točno puta želimo da se neka naredba ponovi,
postoji lakši način za prosljeđivanje brojevnih argumenata različitih veličina. C-u sam po sebi,
bez brojki, je jednak brojevnom argumentu 4. Još jedan C-u množi to sa još 4, čineći 16.
Slijedeće C-u množi to sa još 4 čineći 64, itd. Zbog toga se C-u naziva universal argument.
Važno je znati da sve naredbe ne interpretiraju brojevne argumente kao broj
ponavljanja; neke ih ignoriraju, a neke ih gledaju kao boolean (ili postoji argument ili ne).
Pročitajte dokumentaciju za naredbu prije nego ju probate.

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 način da kada ju napišete ona čeka jo jedan znak. Ali taj
znak se ne izvrši kao naredba već se umeće u međuspremnik. Dakle C-q ESC umeće Escape.

246/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Onemogućene naredbe (Disabled Commands)

Neke naredbe koje su vrlo zbunjujuće za početnike su po defaultu onemogućene. Kada


pozovete onemogućenu naredbu pojavljuje se prozor sa dokumentacijom za tu naredbu i nude
vam se tri mogućnosti

Razmak- da probate naredbu jednom i ostavite ju onemogućenom


Y- da ju probate i omogućite (nema upita kod ponovnog korištenja)
N- da ne učinite ništa (naredba ostaje onemogućena)

Vrlo vjerojatno ćete naići na jednu specifičnu onemogućenu naredbu M-ESC (također
poznata kao i ESC ESC), jer je vrlo lako otipkati dva Escape-a zaredom kada se koristi ESC
prefiks.

247/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

KRETNJE I OBJEKTI (MOTION AND OBJECTS)

Jedna od najčešćih stvari koje korisnik editora radi je pomicanje naokolo, da bi izvršio
određene naredbe. Emacs nudi mnoge naredbe za kretanje koje se odnose na tekstualne
objekte; za svaki tekstualni objekt, postoji naredba kretnje kojom se pomičete na početak ili
kraj objekta.
Sve te naredbe za kretanje primaju brojevne argumente za određivanje broja
ponavljanja.
Osnovni tekstualni objekt je znak. Emacs prepoznaje i niz drugih objekata ovisno u
kojem ste modu (C-ovski tekstualni objekt nema baš puno smisla ako ne editirate C kod).
Točna definicija objekta ovisi o vašim postavkama, ali još važnije varira od moda do
moda. Znakovi koji tvore riječ u Text modu, ne moraju biti isti kao oni koji tvore riječ u C
modu. Ovo je jako korisno jer možete koristiti iste naredbe za pomicanje, a opet da budu
različito podešene za različite vrste teksta.

Znakovi

C-f
Forward-char. Miče naprijed (desno) preko znaka
C-b
Backward-char. Miče nazad (lijevo) preko znaka

6.2 Riječi

M-f
Foreward-word. Miče naprijed preko riječi.
M-b
Backward-word. Miče unazad preko riječi.

248/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Linije (vertikalno)

C-n
next-line. Miče dolje do slijedeće linije.
C-p
previous-line. Miče gore do prethodne linije.

Kada se kreće po linijama kursor pokušava ostati u istom stupcu, ali ako je nova linija
prekratka, pozicionirati će se na kraj linije. Ovo je vrlo važno: Emacs ne umeće razmake na
kraj linija.

Linije (horizontalno)

C-a
begining-of-line. Miče na početak trenutno aktivne linije.
C-e
end-of-line. Miče na kraj trenutno aktivne linije.

E kao end (kraj), a A kao početak abecede.

Rečenice

M-a
backward-sentence. Miče na početak trenutno aktivne rečenice.
M-e
foreward-sentence. Miče na kraj trenutno aktivne rečenice.

249/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Odlomci

M-{
backward-paragraf. Miče na početak trenutno aktivnog odlomka.
M-}
foreward-paragraph. Miče na kraj trenutno aktivnog odlomka.

Stranice

C-x [
backward-page. Miče na početak trenutno aktivne stranice.

C-x ]
foreward-page. Miče na kraj trenutno aktivne stranice.

Stranice su u većini modova odvojene sa C-l.

Međuspremnici

M-<
beggining-of-buffer. Miče na početak međuspremnika
M->
end-of-buffer. Miče na kraj međuspremnika.

250/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Funkcije

Budući da su funkcije tako važan dio svakog programskog jezika, Emacs sadrži naredbe
za pomicanje kroz njih. Ove naredbe rade bez problema u većini modova. U Emacsu funkcije
i procedure se nazivaju defun kao i u Lispu.

C-M-a
begining-of-defun. Miče na početak trenutno aktivne defun.
C-M-e
end-of-defun. Miče na kraj trenutno aktivne defun.

251/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

BRISANJE, UBIJANJE I VRAĆANJE


(DELETING, KILLING AND YANKING)

Emacs-ove naredbe za brisanje su također bazirane na gore navedenim tekstualnim


objektima. Ali prvo da se razjasni terminologija: brisanje (deletion) označava brisanje teksta
iz međuspremnika bez spremanja; većina naredbi za brisanje radi na malim dijelovima teksta.
Ubijanje (killing) označava spremanje obrisanog teksta tako da ga se poslije može vratiti
(yanking).
Ubijeni tekst je spremljen u kill-ringu. Kill-ring sadrži zadnjih N ubijanja (kills). N je
po defaultu 30, ali to se može promijeniti promjenom kill-ring-max varijable. Kill-ring se
ponaša kao fifo struktura kod ubijanja, poslije 30-tog ubojstva (kill) prvo se briše. Za razliku
od toga, kod vraćanja (yanking) kill-ring se ponaša kao krug (možete vraćati stvari cirkularno
kao po krugu). kill-ring-max se ne odnosi na veličinu teksta (u bajtima) koju možete spremiti
u kill-ring (veličina je neograničena), već na broj ubojstava.

Znakovi

C-d
delete-char. Briše znak desno od kursora.
DEL
delete-backward-char. Briše znak lijevo od kursora.

Riječi

M-d
kill-word. Ubija sve do kraja riječi desno od kursora.
M-DEL
backward-kill-word. Ubija sve do početka riječi lijevo od kursora.

252/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Linije (horizontalno)

C-k
kill-line. Ubija do kraja trenutno aktivne linije ne uključujući newline znak.
Dakle, ako želite ubiti cijelu liniju potrebna su dva C-k.
C-u 0 C-k
kill-line. Ubije do početka trenutno aktivne linije, ne uključujući newline
znak.

Ako ste možda ste pomislili da C-u -1 C-k ubija liniju do početka, imali ste pravo, ali ta
naredba briše i newline znak ispred.

Rečenice

M-k
kill-sentence. Ubija do kraja trenutno aktivne rečenice uključujući i sve
newline znakove na koje naiđe.
C-u -1 M-k
kill-sentence. Ubija do početka trenutno aktivne rečenice uključujući i sve
newline znakove na koje naiđe.

Odlomci

Naredbe forward-kill-paragraph i backward-kill-paragraph postoje, ali po defaultu nisu


vezane za neke određene tipke.

Stranice

Ne postoje naredbe za ubijanje stranica

253/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Međuspremnici

Naredba kill-buffer ne ubija sav tekst u međuspremniku, već ubija cijelu strukturu
podataka međuspremnika

Funkcije

Ne postoje naredbe za ubijanje funkcija (defun).

Produžena ubojstva (Extended Kills)

Ako ubijete nekoliko objekata u nizu, neupotrebivši neku drugu naredbu (non-kill
naredu), sva ta ubojstva se vežu u jedan kill-ring. Možete, na primjer, ubiti dio teksta kao
nekoliko linija odabirom C-u 6 C-k naredbe. To će ubiti šest linija, ali će to biti samo jedno
ubojstvo (kill).

Vraćanje (Yanking)

Jednom kada ste ubili neki tekst, kako ga vratiti? Zadnje ubijeni tekst možete vratiti
(yank) sa C-y. Budući da Emacs ima samo jedan kill-ring, ubojstvo možete izvršiti u jednom
međuspremniku , a tekst vratiti (yank) u drugom. Da bi vratili prethodna ubojstva morate se
pomicati po kill-ringu. Počnite sa C-y i onda koristite M-y da bi se pomakli na prethodno
mjesto u kill-ringu zamjenom upravo vraćenog teksta prethodnim ubojstvom. Svaki daljnji M-
y miče as po kill-ringu, svaki put zamjenjujući vraćeni (yanked) tekst. Kada dođete do teksta
koji vas interesira jednostavno stanite. Svaka druga naredba prekida kruženje po kill ringu i
C-y vraća zadnje ubojstvo.

254/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

KOPIRANJE I POMICANJE TEKSTA

Emacs nema potrebu za posebnim naredbama za pomicanje i kopiranje teksta (već smo
ih naveli!!!). Za pomicanje teksta, jednostavno ga ubijte i vratite negdje drugdje. Za kopiranje
ubijte tekst i odmah ga vratite. Ništa se nije dogodilo osim što je tekst sada u kill- ringu,
spreman za izvlačenje, vraćanje.

255/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

TRŽENJE I ZAMJENA (SEARCH AND REPLACE)

Emacs sadrži niz neobičnih i poprilično složenih naredbi za pronalaženje i zamjenu.


Najvažnija je incremental search. To izvršava naredba isearch-forward, koja je vezana za C-s;
ona traži inkrementalno, jedan po jedan znak, kako vi upisujete string koji tražite
(search string). To znači da često Emacs nađe ono što vi tražite prije nego što vi upišete cijeli
string. Da bi prekinuli pretragu, jednostavno pritisnite RET ili otipkajte bilo koju Emacs
naredbu (što će izazvati prekid pretrage i izvršenje naredbe). Možete tržiti slijedeće
poklapanje sa C-s ili obrnuti pretragu sa C-r; DEL koristite za brisanje i promjenu onoga što
tražite.

Naredba isearch-backward, koja je vezana za C-r radi na isti način, ali traži unazad.

Sa vremena na vrijeme možda poželite tražiti ne-inkrementalno. To možete učiniti


utipkavanjem C-s RET text RET, gdje je text, onaj tekst koji tražite.

Puno korisniji je word search koji vam omogućuje traženje niza riječi neovisno o tome
kako su odjeljenje. Da bi pokrenuli tu vrstu traženja otipkajte C-s RET C-w word word word
RET.

Emacs također može pretraživati po regularnim izrazima. To je izuzetno moćan alat, ali
prekompleksan da bi ga se ovdje objasnilo.

Zamjena

Najvažnija naredba za zamjenu je query-replace (vezana za M-8). Ova naredba će od


vas zatražiti tekst za zamjenu i tekst koji želite zamijeniti te će potom izvršiti zamjenu unutar
trenutno aktivnog međuspremnika. Naredba query-replace je interaktivna, nakon svakog
pronalaska ponuditi će vam slijedeće mogućnosti:

SPC Izvrši zamjenu


DEL Nemoj izvršiti zamjenu

256/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

RET Zaustavi query-replace, ne izvršivši zamjenu


ESC isto kao i RET
. Izvrši zamjenu i zaustavi query-replace
! izvrši zamjenu i sve druge zamjenu u unutar međuspremnika bez daljnje interakcije

Postoji još podnaredbi, ali one zahtijevaju dodatno poznavanje Emacsa.

Postoji još naredbi za zamjenu koje bi trebali pobliže 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

OZNAKE I REGIJE (THE MARK AND THE REGION)

Emacs može manipulirati unaprijed određenim dijelovima teksta, a ne samo tekstualnim


objektima. To se radi na način da se odredi regija teksta; mnoge naredbe će se odnositi na tu
regiju.
Regija je tekst između točke (point) i oznake (mark). Point je u biti Emacs-ov termin za
kursor. Mark se postavlja sa naredbom C-@ (set-mark-command). Ta naredba postavlja mark
točno tamo gdje je point sa tim da sada point možete pomaknuti i tako dobiti regiju.
Svaki međuspremnik ima svoj point i mark, dakle i svoju regiju. (moguće je da
međuspremnik uopće nema mark i tako nema ni regiju).
Regija postoji nevezano uz to da li je prvo dođe mark ili point, postavite ih kako vama
odgovara. Regija je obično nevidljiva, ali ako vrtite Emacs na nekom programu sa prozorima
možete je učiniti vidljivom sa M-x (transient-mark-mode)
Mnoge naredbe koje pomiču point na neku veću udaljenost (npr. M-< ili C-s)
postavljaju mark na mjesto sa kojeg su krenule. Natpis „Mark set“ će se pojaviti u echo area
kada se to dogodi.
Kada koristite Emacs pod nekim sustavom kao X možete se poslužiti mišem za
označavanje regije, ali mnogi korisnici Emacsa preferiraju držati ruke non-stop na tipkovnici,
te koristiti naredbe za pomicanje.
Postoje neke posebne naredbe dizajnirane samo za to da postave regiju oko nekog
interesantnog dijela teksta.

M-@
mark-word. Postavlja regiju oko slijedeće riječi, ili od početka do kraja riječi kojoj ste
trenutno pozicionirani.
M-h
mark-paragraph. Postavlja regiju oko trenutno aktivnog odlomka.
C-M-h
mark-defun. Postavlja regiju oko trenutno aktivne funkcije (defun).
C-x C-p
mark-page. Postavlja regiju oko trenutno aktivne stranice.
C-x h
mark-whole-buffer. Postavlja regiju oko cijelog međuspremnika.

258/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

Sada smo odredili regiju. Što možemo sa njom učiniti?

C-x C-x
exchange-point-and-mark. Zamjenjuje point i mark. Brzo uzastopno izvršavanje
ove naredbe omogućuje viđenje dokle regija doseže.
C-w
kill-region. Ubija regiju
M-w
kill-ring-save. Sprema regiju u kill-ring bez da je briše iz međuspremnika.
C-x C-i
indent-rigidly. Uvlači 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 onemogućena.
C-x C-u
upcase-region. . Pretvara sva slova u velika. Po defaultu ova naredba je onemogućena.

Postoji još mnogo drugih naredbi.

259/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

UVLAČENJE (INDENTATION)

U modovima za programske jezike, Emacs koristi TAB tipku za automatsko uvlačenje


linije, sukladno sa pravilima za uvlačenje koja vrijede za dotični jezik. Na primjer u C modu
Emacs prepoznaje if, while, switch, do, for, funkcije itd. , te uvlači tekst ovisno o potrebi.
Dakako u većini jezika pravila za uvlačenje nisu striktno određena, pa Emacs dozvoljava da ih
svako odredi kako mu odgovara.

260/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

MODOVI

Glavni način na koji Emacs prilagođuje naredbe svakoj vrsti teksta je kroz major i
minor modes. Svaki međuspremnik ima major mod i nula, jedan ili nekoliko minor modova.
Nekada Emacs izabire major mo automatski, obično na temelju ekstenzije datoteke. Naravno
možete i eksplicitno odrediti mod.

Neki glavni modovi

Fundamental Mode
Osnovni mod koji je temelj svih modova. Odličan za editiranje teksta, samo što ne
pruža
neke dodatne mogućnosti
Text Mode
Za editiranje teksta. Sadrži posebne naredbe za spell checking centriranje linija itd.
Lisp Mode
Za editiranje Common Lisp source koda. Sadrži interaktivnu vezu sa Common Lisp
interpretorom u drugom međuspremniku.
Tcl Mode
Za editiranje Tcl source koda. . Sadrži interaktivnu vezu sa Tcl interpretorom u
drugom
Međuspremniku.
C Mode
Za editiranje C koda. Sadrži posebnu indentaciju itd.

Postoji još niz drugih glavnih modova od kojih su neki su jako specijalizirani (modovi
za editiranje e-mailova, za čitanje news grupa, pretraživanje World Wide Web-a itd.)

261/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Emacs

ŽELITE LI ZNATI VIŠE?

Za s daljnje informacije o Emacs-u pregledajte:

• GNU Emacs Frequently Asked Question List


• Info
• news grupe
♦ gnu.emacs.help
♦ comp.emacs
♦ gnu.emacs.announce
♦ alt.religion.emacs
♦ gnu.emacs.sources

262/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

Maja Mehinagić

LOGIN I ID

263/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

UVOD

UNIX sistem je višekorisnički (multi-user) operativni sistem. To znači da više od jedne


osobe može koristiti sistem u isto vrijeme. Sistem može opsluživati više od jednog korisnika
isto kao što može da izvršava više procesa u isto vrijeme za jednog korisnika. Višekorisnička
osobina omogućava da grupa korisnika radi zajedno, dijeleći informacije i zajedničke
programe na sistemu. Ako se UNIX nalazi na osobnom računalu, može postojati samo jedan
korisnik koji može koristiti višeprocesnu (multi-tasking) osobinu i pokretati više procesa
istovremeno.

Prijavljivanje na UNIX sistem

Svakome tko koristi UNIX sistem pridružuje se ime korisnika (user name) koje se
koristi prilikom prijavljivanja na sistem. To ime korisnika često se naziva i račun (account). U
praksi, jedna osoba može koristiti više korisničkih imena. Različita imena koristimo kada
koristimo sistem za različite potrebe.

NPR.
Jedna osoba koristi program za obračunavanje plaća i program za stanje računa. U
prvom slučaju korisnik se prijavljuje pod imenom ''plaća'', a u drugom slučaju pod imenom
''račun''. Više korisnika koji rade na istom projektu mogu sačinjavati grupu koja ima svoje
ime.
Jedan od korisnika UNIX sistema ima veća prava i obaveze nego ostali korisnici, tj. ima
funkciju super korisnika (super-user). To je osoba koja ima obavezu administriranja,
dodjeljivanja dozvola za rad novim korisnicima i koji se brine o cjelokupnom sistemu. Super
korisnik prijavljuje se pod imenom ''root''.

Kao dodatak imenu korisnika, prilikom prijave na sistem skoro uvijek je potrebno zadati
i lozinku (password). To je jedan niz karaktera koji je poznat samo danom korisniku i koji
treba biti ispravno dodijeljen radi dobivanja dozvola za rad sa sistemom. Super korisnik
poznaje lozinku korisnika samo prilikom dodjeljivanja dozvole za rad nekom od korisnika.
Nakon toga, poslije uspješnog prijavljivanja na sistem, korisnik može izmijeniti lozinku

264/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

naredbom passwd i tada je poznaje samo on. Super korisnik može dodijeliti novu lozinku
korisniku u slučaju da je korisnik zaboravio staru.

Da bismo dobili dozvolu za pristup UNIX sistemu, moramo izvršiti proces prijave na
na sistem (signing on). Taj proces se najčešće 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 približimo 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 naše korisničko ime i pritisnemo <ENTER>.


Primjećujete da dok pišemo korisničko ime, ono što tipkamo je istog trena prikazano na
ekranu. Kada utipkamo naše korisničko 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 unošenja lozinke na ekranu ne vidimo karaktere


koje utipkavamo na tastaturi. To je učinjeno radi veće sigurnosti jer lozinka pomoću koje
dobivamo dozvolu za rad treba služiti samo danom korisniku zbog mogućih zloupotreba.
Nakon uspješnog prijavljivanja na ekranu se pored ostalog i pojavljuje prompt-jedan ili više
karaktera koji nam kazuju da je UNIX spreman da primi i izvrši naredbu. Često je prompt #
za specijalne korisnike kao što je root,sysadm.... ili $ za obične korisnike.
U slučaju da pogriješimo prilikom unošenja imena korisnika ili lozinke, ponovno se
pojavljuje poruka login:. Isto tako, ime i lozinka moraju se unijeti u određenom vremenskom
intervalu, najčešće 60 sekundi. Ako je taj terminal premašen, postupak se mora ponoviti

265/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

ispočetka. To je sve napravljeno radi još veće sigurnosti tj. da ne bi neovlaštena osoba ušla u
UNIX sistem.

Završetak rada sa UNIX sistemom

Završetak rada sa UNIX sistemom vrši se utipkavanjem naredbe logout ili <ctrl-D>
(držimo tipku CTRL i pritisnemo tipku d), u trenutku kada se na ekranu nalazi prompt tj. kada
UNIX očekuje novu naredbu. Postoji i naredba exit kojom također možemo završiti rad tj.
odjaviti se sa sistema.

Korisnik mijenja svoju lozinku jednostavnim zadavanjem naredbe passwd kao što je
prikazano primjerom:

$ passwd
New password:studentica
Retype new password:studentica
$

266/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

STARTANJE UNIX SHELLA

Na slici 1 je prikazan postupak startanja shell-a prilikom prijavljivanja korisnika na


sistem. Svaku terminalsku liniju nadgleda po jedan getty proces čiji je zadatak da starta
program login koji radi provjeru imena korisnika i lozinke. Kada se korisnik ispravno
identificirao, program login starta odgovarajući shell prema informaciji koja se nalazi u
konfiguracijskom file-u /etc/passwd.

login:student
password:

login:studentica
password

Slika 1

267/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

Super korisnik

Na svakom UNIX sistemu pored običnih korisnika postoji određeni broj korisnika koji
ima specijalna ovlaštenja. To je korisnik poznat pod imenom ''root'' ili super korisnik.
Korisnik root može pristupati svim file-ovima na sistemu kao i svim procesima, a može čak i
uništiti cijeli sistem.
Korisnik root ne poznaje zabrane i postoje naredbe koje može izvršavati samo on. To su
na primjer podešavanje vremena na sistemu (date), podešavanje file sistema (mount) ili
kreiranje specijalnih file-ova (mknod).

Prvi način postajanja super korisnika je da dovedemo sistem u stanje u kojem može
raditi samo jedan korisnik (single-user state). To se događa uvijek kao međufaza podizanja
operativnog sistema (bootstrap). Tijekom boot-a inicijalni shell radi sa privilegijama super
korisnika. U višekorisničkom režimu rada (multi-user state), možemo se prijaviti na sistem
pod imenom root. Ako smo se prijavili kao običan korisnik, možemo se prijaviti kao root
korisnik pomoću naredbe:

$ su
Password:top_tajna
#

Također sa naredbom su (switch user) možemo da se prijavimo pod imenom bilo kojeg
korisnika:

$ su student
Password:msjs
$

Ako root izvršava naredbu su, tada se ne zahtjeva unošenje lozinke korisnika čije smo
ime zadali kao argument.

268/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

Definiranje korisnika i file /etc/passwd

Zavisno od verzije UNIX-a postoje 3 načina definiranja korisnika koji se mogu prijaviti
na sistem prema mjestu gdje se čuva popis korisnika i odgovarajuća lozinka:

Tradicionalni način – u /etc/passwd file-u


Opis korisnika je u /etc/passwd file-u, dok se lozinke i dodatne informacije
nalaze u /etc/shadow file-u
Pomoću NIS/NIS+ centralizirane baze podataka za sve u mreži

Svaki korisnik koji se može prijaviti na UNIX sistem definiran je jednom linijom u
/etc/passwd file-u:

# cat /etc/passwd
root:x:0:1:0000-Admin(0000):/:
daemon:x:1:1:0000-Admin(0000):/:
bin:x:2:2:0000-Admin(0000):/usr/bin:
sys:x:3:3:0000-Admin(0000):/:
adm:x:4:4:0000-Admin(0000):/var/adm:
uucp:x:5:5:0000-uucp(0000):/usr/lib/uucp:
...
student:x:107:15:maja:/home/student:/bin/csh
#

Polja u /etc/passwd file-u su odvojena znakom '':'' i uvijek moramo navesti svih šest
separatora. Značenje pojedinih polja /etc/passwd file-a prikazano je na slici 2.

POLJE OPIS

Ime korisnika Ime pod kojim se korisnik prijavljuje na sistem

Šifrirana lozinka (crypted password). Ako stoji x tada se opis lozinke


Lozinka
čuva u file-u /etc/shadow

UID Jedinstveni redni broj korisnika (User IDentiity) na UNIX sistemu.

269/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

Super korisnik uvijek ima UID=0. Ostali korisnici imaju UID počevši
od 101 ili 201

Redni broj glavne grupe (Group IDentitiy) kojoj pripada dani korisnik
GID
odgovara definiciji grupe u /etc/group

Uporaba se razlikuje zavisno od verzije UNIX-a. BSD UNIX koristi


GCOS polje to polje za smještanje podataka o korisniku, koje dobijemo kasnije
naredbom finger

Direktorij gdje se nalazi korisnik poslije prijavljivanja na sistem.


Home direktorij
Naziva se i login direktorij

Ime programa koji se koristi kao interpreter naredbi. Ako je


Inicijalni shell
izostavljeno podrazumijeva se standardni Bourne Shell (/bin/sh)

Ime korisnika se obično zadaje malim slovima, dužine do osam karaktera i ne smije
započinjati 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 smješta u drugo polje
/etc/passwd file-a, ako se radi o tradicionalnom načinu. Poslije zadavanja teksta lozinke, prvih
osam karaktera se kombinira sa ključem od dva karaktera, nakon čega se dobiva šifrirana
lozinka dužine 13 karaktera. Svaki puta kad se korisnik prijavljuje na sistem, lozinku koju
unese, šifrira se na isti način 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

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 koristeći sljedeće 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 između dvije izmjene lozinke. Ako su
oba karaktera nule (''..''), korisnik mora izmijeniti lozinku prilikom prvog sljedećeg
prijavljivanja. Ako je drugi broj veći od prvoga, tada samo super korisnik može izmijeniti
danu lozinku. Ostala dva karaktera predstavljaju broj tjedana kada je lozinka posljednji put
promijenjena, počevši od 1.siječnja 1970. godine. Inicijalni podaci o intervalima vremena
ubacuju se ručno pomoću vi editora.
Ako želimo privremeno zabraniti prijavljivanje nekom korisniku tj. da zaključamo
(lock) njegov račun, tada dodajemo ''LK'' ispred šifrirane lozinke u odgovarajućem polju.

UID kod svih UNIX sistema u mreži koji koriste NFS treba biti isti. Kod sistema koji
koriste NIS/NIS+ , taj problem je automatski riješen. Korisnik nobody je vlasnik file-ova koje
nije kreirao super korisnik, te im nitko ne može pristupiti. Korisnik noaccess služi za
prijavljivanje udaljenih korisnika čije je ime ''root''.

GID se koristi za utvrđivanje 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 služi za


smještanje GCOS broja računa (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
može promijeniti.

Inicijalni shell može biti sh,csh,ksh,bash,tesh ili uucico (koristi se kod UUCP
komunikacije).

271/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Login i ID

Naredbe za rad s lozinkama

NAREDBE OPIS

passwd korisnik Promjena lozinke danog korisnika

Lozinka vrijedi 84 dana i ne smije se mijenjati prvih 7


passwd –x 84 –n 7 korisnik
dana.

Korisnik se može prijaviti na sistem ali ne može


passwd –x 7 –n 10 korisnik
mijenjati lozinku.

Poručuje korisniku da kod sljedećeg prijavljivanja


passwd –f korisnik
promijeni lozinku.

passwd –x –1 korisnik Isključuje vremensku kontrolu trajanja lozinke.

passwd -w 14 korisnik Prikazuje upozorenje da lozinka ističe za 14 dana.

passwd -1 korisnik Privremena zabrana prijavljivanja danog korisnika.

Ukida privremenu zabranu prijavljivanja danog


passwd -u korisnik
korisnika.

272/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Nina Žugaj

TELNET I SSH

273/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

UVOD

Za pristupanje nekom udaljenom računalu putem lokalne ili Internet mreže, neovisno o
mreži, potrebno je koristiti protokole, pomoću kojih se može uspostaviti veza s udaljenim
računalom.
Telnet i SSH dva su takva protokola, koja omogućavaju spajanje i rad na nekom
udaljenom računalu.
Telnet je servis (program, a ujedno i naziv protokola), koji omogućuje pristup nekom
udaljenom računalu emulacijom terminala, a SSH je kriptirani protokol što znači da su svi podaci koji se šalju i

primaju kodirani, tj. sigurni od presretanja i čitanja.

Iako imaju istu funkciju (remote pristup računalima) i iako je SSH vrlo sličan telnetu,
zbog potencijalne ranjivosti telneta, SSH se pokazao daleko sigurniji, te se telnet polako
povlači iz upotrebe.
Također, u odnosu na FTP (File Transfer Protocol) ili tradicionalne BSD R-naredbe (R-
commands) - rlogin, rsh i rcp, SSH je sigurniji, a u njegove dvije implementacije SSH1 i
SSH2, ispravljeni su neki propusti. Većina njih se svodi na manje bugove, no bilo je i
nekoliko ozbiljnih sigurnosnih propusta. Najopasniji od dosad zloupotrebljavanih propusta
omogućava udaljenom napadaču korištenje računala kao root.
I protokol SSH1 se pri određenim konfiguracijama pokazao potencijalno ranjivim na
sesije koje se dekriptiraju tijekom transfera. Zato se savjetuje, kad god je to moguće,
korištenje jačeg protokola SSH2, jer su neke slabosti SSH1 ispravljene u protokolu SSH2.
Telnet i SSH rade na različitom portu:

telnet 23 / tcp
SSH 22 / tcp

Neovisno o vrsti protokola, da bi se korisnik spojio na neko udaljeno računalo mora na njemu imati otvoren korisnički račun
(account).

Telnet i SSH servisi baziraju se, kao i većina mrežnih servisa, na klijent-poslužitelj
modelu. Klijent uspostavlja vezu s poslužiteljskim računalom na kojem je pokrenut telnet
odnosno SSH daemon (tipično telnet na portu 23, a SSH na portu 22), nakon čega slijedi
razmjena podataka odnosno naredbi između tih računala.

274/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

TELNET

Upotreba TELNETA za pristup udaljenim računalima

Korištenjem protokola telnet omogućuje se interaktivan rad na nekom udaljenom


računalu.
Naredba telnet je standardna u svim implementacijama TCP/IP-a (Transmission Control
Protocol / Internet Protocol) i neovisna je o operacijskom sustavu. Tako je protokol telnet
ugrađen u program Telnet koji je standardni dodatak OS Windows. Također naredba telnet
osnovni je alat za prijavljivanje na daljinu pod Linuxom/Unixom.

Telnet pripada grupi emulatora terminalskog rada, što znači da on omogućava lokalnom
računalu da uspostavi vezu s udaljenim računalom, a nakon uspostave veze oponaša rad
terminala, tj. prilikom izvođenja operacija ne koriste se procesor i periferije lokalnog računala
već udaljenog računala. Osobno računalo (računalo korisnika) se u tom slučaju ponaša kao
obični terminal (koji ne posjeduje sekundarnu memoriju i procesor) kojeg i emulira telnet.

Da bi mogli koristiti resurse računala kojem pristupamo, na njemu treba imati otvoren
korisnički račun. Nakon otvaranja veze s udaljenim poslužiteljem pojavljuje se prozor koji
zahtijeva od korisnika da se prijavi za rad i to unosom korisničkog imena (logina) i šifre
(passworda). Nakon upisa istih korisnik može izvoditi naredbe i operacije na udaljenom
poslužitelju. U slučaju pogrešno upisanih podataka pojavljuje se obavijest o greški i
mogućnost ponovnog pokušaja. Ukoliko se šifra upiše krivo više od tri puta korisnički račun
obično se automatski zaključava iz sigurnosnih razloga.

275/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Premda neki sustavi pružaju mogućnost prijave kao gosta, takva je mogućnost rijetka
zbog sigurnosnih razloga.
Telnet korisnicima omogućuje i prijavljivanje na njihova vlastita računala iz udaljenih
lokacija, također unošenjem korisničkog imena i šifre. Na taj način korisnici mogu
provjeravati e-mail, uređivati datoteke i pokretati programe na svojim uobičajenim
računalima kao da su na njih prijavljeni lokalno. To se, međutim, može učiniti u okružju koje
se temelji na terminalima, jer se za to ne može koristiti sustav X Windowsa. Telnet pruža
samo emulaciju terminala za uobičajene terminale poput DEC VT-100, koji ne podržavaju
grafička okružja poput X Windowsa. Znači da je veza koju telnet omogućuje ograničena na
korištenje naredbenog sučelja pri radu.

Komponente ostvarivanja telnet veze

Tradicionalni mrežni servisi kao što su telnet, ftp, rsh i dr., iako vrlo praktični i
jednostavni za korištenje, ujedno sadrže i jedan veliki nedostatak – imaju implementiran vrlo
nizak nivo sigurnosti, budući da se u vrijeme njihova nastanka nije previše pažnje obraćalo na
sigurnost računalnih sustava.
Komunikacija nije kriptirana, te su moguće zlouporabe od strane neovlaštenih ili
zlonamjernih korisnika.
U današnje vrijeme kada sigurnosni aspekt predstavlja jedan od najvažnijih elemenata
svake računalne mreže taj problem svakodnevno dolazi sve više do izražaja.

276/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Inherentne slabosti kod takvih mrežnih servisa neovlaštenim korisnicima omogućuju


vrlo jednostavan dolazak do povjerljivih korisničkih informacija te prisluškivanje kompletnih
mrežnih sesija između klijentskog i poslužiteljskog računala. Također ne postoji nikakav
mehanizam koji bi omogućio međusobnu autentikaciju (authentication) računala, što
neovlaštenim korisnicima omogućuje lažiranje mrežnih sesija, te lažno predstavljane pod
imenom drugih računala.
Upravo gore navedeni elementi bili su podloga za nastanak SSH protokola i programa
koji ga implementiraju, kako bi se na taj način korisnicima omogućilo sigurno komuniciranje
s udaljenim računalima.
Osnovna sintaksa za telnet je sljedeća:

telnet [hostname]
=> hostname je ime udaljenog računala. Ako ime udaljenog
računala nije navedeno, telnet se pokreće u svom interaktivnom načinu rada, a ako je ime
udaljenog računala navedeno, telnet odmah pokušava započeti sesiju.

Telnet prihvaća nekoliko argumenata naredbenog retka:


-d
=> uključuje otkrivanje grešaka
-a
=> pokušava automatsko prijavljivanje
-n tracefile
=> uključuje praćenje i podatke iz praćenja sprema u datoteku
pod tracefile
-e escape_char
=> određuje da znak za izlazak iz sesije bude escape_char
-l user
=> korisničko ime user šalje udaljenom sustavu za automatsko
prijavljivanje. Ovaj argument automatski uključuje i argument -a.
port
=> ukazuje na broj porta koji treba koristiti za spajanje na
udaljeni sustav. Ovaj se argument koristi za određivanje različitih mrežnih programa. Ako
nije naveden, telnet se spaja na unaprijed zadani telnet port.

277/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Dakle, telnet sesiju korisnik pokreće utipkavši telnet, nakon čega slijedi ime računala na
koje se želi spojiti. Telnet zatim vraća poruku Trying i neku IP adresu (gdje je neka IP adresa
adresa računala koje je navedeno).
Ako se telnet uspješno spoji na računalo (što znači da je to računalo uključeno i da
mreža nije isključena), Linux/Unix će izvijestiti Connected to ime računala i zatim će reći da
je znak za izlazak iz sesije neka određena kombinacija tipki. Znak za izlazak određuje 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 računalu.
Nakon što se telnet uspješno spojio na udaljeni sustav bit će prikazana prijavna
informacija i sustav će zatražiti unos korisničkog imena i šifre. Pod pretpostavkom da
korisnik ima valjano korisničko ime i šifru, uspješno će se prijaviti i tada može interaktivno
raditi na udaljenom sustavu.
Na kraju rada svakako se treba odjaviti. Telnet zatim izvijesti da je udaljena sesija
zatvorena i korisnik se vraća se u naredbeni redak lokalne ljuske.

Primjer telnet sesije iz Linux računala koje se spaja na Linux računalo:

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 upućuje prompt: telnet>

278/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

U interaktivnom radu telnet raspoznaje slijedeće naredbe, čiji se popis dobije


navođenjem naredbe help:

close
=> prekid trenutno spojene veze
display
=> prikaz parametara
mode
=> promjena načina rada: line-by-line (utipkani sadržaj retka
prvo se prikazuju na lokalnom računalu, nakon čega se odjednom šalje udaljenom računalu)
ili character-at-a-time (većina pritisnutih tipki šalje se neposredno udaljenom računalu)
open hostname [port]
=> povezivanje s udaljenim računalom. Inicijalno: port 23.
quit
=> napuštanje 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
računalu
?
=> prikaz pomoći

Povratak u Unix ljusku obavlja se pritiskom na tipku <Enter>.


Za završetak rada s telnetom i prekidanje veze s udaljenim računalom dovoljno je
napraviti odjavu rada (logout).

279/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

SSH

SSH (Secure Shell = sigurna ljuska) je mrežni servis koji korisnicima omogućuje
uspostavu sigurnog komunikacijskog kanala između dva računala putem nesigurne računalne
mreže.
SSH servis svoj rad bazira na korištenju kombinacije simetrične i asimetrične
kriptografije, te metoda enkripcije koje omogućuju sigurniji prijenos podataka računalnom
mrežom.
Trenutno postoje dvije verzije SSH protokola, SSH1 i SSH2.
SSH2 je novija verzija, koja sadrži određena poboljšanja u odnosu na stariju verziju.

Originalna verzija SSH protokola razvijena je od strane Finske kompanije SSH


Communications Security Corp , koja je na određeni način zaštitila svoj proizvod, te samim
time ograničila mogućnosti njegovog korištenja.
Kao rezultat toga nastala je open-source implementacija istog protokola pod imenom
OpenSSH, koja se danas najčešće koristi, te će kao takva biti opisana u nastavku seminara.

280/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

KRIPTOGRAFIJA I ENKRIPCIJA PODATAKA

Kako je već spomenuto SSH servis koristi enkripciju podataka u svrhu njihove zaštite
od neautoriziranog pristupa.

U ovom dijelu biti će vrlo kratko iznesene osnovne napomene vezane za kriptografiju i
enkripciju podataka, kako bi se omogućilo lakše razumijevanje načina na koji SSH protokol
implementira sigurnost.
Postoje dvije osnovne grupe algoritama za enkripciju podataka:
simetrični algoritmi - bazirani na jednom tajnom ključu
asimetrični algoritmi - bazirani na tajnom i javnom ključu
Za enkripciju ili dekripciju podataka, osim samog algoritma, potrebno je poznavati i
ključ (key) na temelju kojeg algoritam provodi kriptiranje podataka.
Ovisno u koju od gore navedenih grupa algoritam spada, ovisi na koji će se način
provoditi enkripcija odnosno dekripcija podataka.
Kod simetrične kriptografije isti ključ se koristi i za kriptiranje i dekriptiranje podataka.
Pošiljatelj kriptira podatke tajnim ključem i tako kriptiranu poruku šalje na odredište.
Primalac poruke istim tajnim ključem može dekriptirati poruku odnosno doći do njenog
pravog sadržaja.

Slika: Simetrična kriptografija

Odmah se primjećuje jedan veliki nedostatak ove grupe algoritama, a to je taj da se i


pošiljatelj i primatelj na neki način moraju dogovoriti oko tajnog ključa koji će koristiti za
komunikaciju. Proces dogovora oko tajnog ključa predstavlja poseban problem, budući da je

281/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

razmjenu ključeva potrebno obaviti nesigurnim putem (mail, telefon ili sl.) što može ugroziti
privatnost ključa.
Prednost algoritama ove skupine je ta da su iznimno brzi što je glavni razlog njihove
učestale primjene. Najpoznatiji predstavnici ove grupe algoritama su DES (Data Encryption
Standard), IDEA, 3DES, Blowfish i dr.

Asimetrični algoritmi svoj rad baziraju na korištenju dva ključa umjesto jednoga. Svaki
korisnik u tom slučaju posjeduje svoj tajni i javni ključ. Ključevi su međusobno kompatibilni
na taj način da se poruka kriptirana jednim ključem može dekriptirati samo drugim ključem
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 slučaju je sljedeći:
pošiljatelj poruku kriptira javnim ključem primatelja poruke koji je svima
poznat i dostupan
primatelj poruku dekriptira svojim tajnim ključem koji je poznat jedino
njemu

Slika: Asimetrična kriptografija

Na taj način svatko svakome može poslati enkripcijom zaštićenu poruku pod uvjetom
da je poznat javni ključ primatelja poruke i time je omogućena sigurna i jednostavna razmjena
podataka između dva korisnika.

282/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Također, uklonjen je i problem razmjene ključeva koji se javljao kod simetrične


kriptografije. Najpoznatiji predstavnik ove skupine algoritama je RSA algoritam koji se
ujedno koristi i kod SSH protokola.
Nedostatak ove metode su nešto veći zahtjevi na procesorsku snagu računala, odnosno
nešto duže trajanje postupka enkripcije podataka.

Moderne metode enkripcije za svoj rad koriste kombinaciju simetrične i asimetrične


kriptografije.
Algoritmi asimetrične kriptografije koriste se na početku sesije za sigurno dogovaranje
tajnog ključa koji će se kasnije koristiti za kriptiranje samih podataka korištenjem nekog od
simetričnih algoritama. Na taj način postižu se optimalne performanse algoritma budući da su
iskorištene prednosti obje metode: sigurnost i brzina.

Upravo ovakav koncept iskorišten je i kod SSH protokola gdje se razmjena i dogovor
oko tajnog ključa sesije obavlja asimetričnim RSA algoritmom, da bi se u sljedećoj fazi tako
dogovoreni ključ koristio za simetričnu enkripciju podataka koji se razmjenjuju između
udaljenih računala.

283/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

SSH PROTOKOL

Osnovne karakteristike SSH protokola su:


smanjene mogućnosti provođenja DNS i IP spoofing napada, u kojima
neovlašteni korisnik pokušava ostvariti neautorizirani pristup računalnim
resursima udaljenog sustava lažiranjem IP adresa i DNS imena računala
implementirane metode autentikacije računala bazirane na RSA algoritmu
simetrične kriptografije
mogućnost preusmjeravanja proizvoljnih TCP/IP portova preko sigurnog
SSH komunikacijskog kanala (POP, FTP i dr.)
prije bilo kakve razmjene podataka između dva računala provodi se
kompletan postupak međusobne autentikacije klijenta i poslužitelja, čime se
bitno smanjuje mogućnost provođenja bilo kakvog napada na SSH servis
jednostavna upotreba programa koji implementiraju SSH protokol

Uspostava veze između dva računala SSH protokolom može se podijeliti u nekoliko
faza:
U prvoj fazi klijent i poslužitelj razmjenjuju podatke o inačici protokola koji
će se koristiti, obavlja se identifikacija korištenih SSH programskih paketa,
provjerava se ispravnost veze i sl. U ovoj fazi enkripcija podataka još se ne
koristi.
U sljedećoj fazi klijent i poslužitelj dogovaraju se o tajnom ključu 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 između klijenta i poslužitelja nakon ove
faze biti će kriptirani na dogovoreni način.
Slijedi treća faza u kojoj se klijent autenticira kod poslužitelja kako bi se na
taj način utvrdio identitet klijenta odnosno provjerile ovlasti pristupa za tog
klijenta. Ukoliko je sve prošlo u redu prihvaća se sesija između klijenta i
poslužitelja nakon čega je moguća sigurna razmjena podataka.

SSH podržava nekoliko načina autentikacije korisnika od kojih je najsigurnija ona koja
koristi RSA algoritam. Postoje metode bazirane na .rhost i host.equiv datotekama koje su

284/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

naslijeđene od rsh i njemu sličnih servisa, no iz sigurnosnih razloga ne preporučuje se


korištenje ovih metoda.
Najjednostavnija i vrlo često korištena metoda autentikacije je ona koja se bazira na šifri
korisnika. Pristup je identičan kao i kod većine drugih mrežnih servisa s osnovnom razlikom
što se ovdje korisnički podatci (korisničko ime i šifra) šalju mrežom kriptirani. U nastavku će
biti opisani osnovni postupci koje je potrebno obaviti kako bi se omogućilo korištenje SSH
servisa.

285/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

INSTALACIJA, KONFIGURACIJA I KORIŠTENJE


KLIJENTSKOG DIJELA SSH APLIKACIJE

SSH komercijalna verzija dostupna je na http://www.ssh.com/.


Programski paket Openssh moguće je skinuti na matičnoj web stranici openssh
projekta http://www.openssh.com/. Iako dolazi u distribucijama nekih Unix sustava (na
Debian i Linux Mandrake platformama), čime je olakšan postupak njegove instalacije,
ukoliko se program instalira zasebno, instalacija programa zahtjeva Zlib
(http://www.gzip.org/zlib/) biblioteku te OpenSSL (http://www.openssl.org/) programski
paket.

Korištenje osnovnih mogućnosti Openssh programa je vrlo jednostavno, što je bio jedan
od osnovnih ciljeva prilikom razvijanja ovog servisa.

Nakon što je program instaliran moguće se odmah spojiti na bilo koje udaljeno računalo
na kojem je instaliran SSH poslužitelj i na kojem korisnik ima otvoren valjani korisnički
račun.
Dovoljno je u naredbenom retku upisati naredbu:
# ssh -l <korisničko_ime> <ime-računala>
nakon čega će se korisniku prikazati poruka koja govori da se radi o pokušaju spajanja
na nepoznato računalo. Od korisnika se traži potvrda za nastavak postupka spajanja, čime ga
se upozorava da se prvi puta pokušava spojiti na udaljeno računalo.
The authenticity of host [hostname] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
Slijedi postupak unosa korisničke šifre za korisničko ime definirano -l parametrom i
ukoliko se unese valjana šifra korisnik je sigurnim SSH kanalom spojen na udaljeno računalo
na kojem može dalje raditi, tj. time se završava proces uspostave SSH sesije s poslužiteljem.

Ukoliko se prilikom pokušaja spajanja navede nepostojeće korisničko ime (putem -l


opcije), SSH poslužitelj neće prijaviti grešku o nepostojanju korisnika, već će korisnika
zatražiti da unese šifru za istoga.

286/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Na ovaj način SSH neovlaštenom korisniku onemogućuje pregledavanje postojećih


korisničkih računa na udaljenom računalu, budući da se ne primijeti razlika između pokušaja
spajanja na SSH poslužitelj s regularnim i neregularnim korisničkim imenom. Ovakav pristup
je sasvim poželjan sa stanovišta sigurnosti, budući da se ne želi neovlaštenom korisniku
omogućiti dolazak do liste postojećih korisnika na udaljenom računalu.

U ovom slučaju kompletan se proces autentikacije korisnika bazira isključivo na


njegovoj šifri, te se na ovaj način može spojiti svatko tko zna odgovarajuće korisničko ime i
šifru bilo kojeg korisnika sustava. Ukoliko korisnička šifra na bilo koji način bude
kompromitirana SSH autentikacija ovim putem gubi smisao. Zato se drugi način spajanja na
SSH poslužitelj bazira na RSA autentikaciji, odnosno na korištenju javnog i tajnog ključa
korisnika.

Kod ovog pristupa klijent poslužitelju u prvoj fazi postupka autentikacije šalje poruku
koja između ostalih informacija sadrži i podatak o njegovom javnom ključu koji želi koristiti
za autentikaciju. Poslužitelj u svojoj internoj bazi provjerava da li ima podatak o istom
korisniku, te ukoliko ima vraća korisniku znakovni niz (chalenge) koji je kriptiran javnim
ključem tog korisnika.
Nakon toga klijent mora dekriptirati primljenu vrijednost te vratiti odgovor poslužitelju,
koji će potvrditi uspješnu dekripciju primljene vrijednosti.
Budući da je dekripciju moguće obaviti jedino pomoću tajnog ključa istog korisnika,
poslužitelj prihvaća sesiju i autenticira korisnika.
U ovom slučaju poslužitelj nikada ne traži šifru korisnika budući da je kompletni proces
autentikacije obavljen na temelju javnog i tajnog ključa korisnika.
Da bi se omogućio ovakav proces autentikacije klijent prvo mora generirati svoj par
tajni/javni ključ, te nakon toga kopiju javnog ključa pohraniti na poslužitelju.

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 ključa korisnika pod čijim je ovlastima zadana
gore navedena naredba.

287/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Prilikom postupka generiranja ključeva korisnik će biti upitan da unese tzv. passphrase
niz koji pruža dodatni nivo zaštite kod korištenja SSH servisa i koji se može jednostavno
shvatiti kao šifra za korisnikov par ključeva.
Iako nije obavezno definiranje ovog niza (moguće je ostaviti prazan niz, tj. samo
pritisnuti <Enter>), korisnicima se iz sigurnosnih razloga preporučuje korištenje istoga.

Trenutno postoje dvije verzije SSH protokola, SSH1 i SSH2. Zbog toga je moguće ssh-
keygen programu proslijediti -t parametar kojim se definira za koji algoritam se želi stvoriti
par ključeva:

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

Budući da datoteke koje sadrže ključeve korisnika sadrže različita imena, za svaki od
algoritama moguće je generirati zaseban par ključeva. Na taj način omogućuje se spajanje na
različite SSH poslužitelje odnosno izbjegavanje eventualnih problema s kompatibilnošću
software-a između klijenta i poslužitelja.
Ključevi 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
sadrži javni ključ, a druga tajni ključ korisnika. Imena su im identična s jedinom razlikom što
javni ključ sadrži ekstenziju .pub.
Primjeri:

id_rsa
=> datoteka koja sadrži tajni ključ korisnika za SSH2 verziju
protokola koja koristi RSA algoritam za enkripciju
id_rsa.pub
=> datoteka koja sadrži javni ključ korisnika za SSH2 verziju
protokola koja koristi RSA algoritam za enkripciju

288/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

id_dsa
=> datoteka koja sadrži tajni ključ korisnika za SSH2 verziju
protokola koja koristi DSA algoritam za enkripciju
id_dsa.pub
=> datoteka koja sadrži javni ključ korisnika za SSH2 verziju
protokola koja koristi DSA algoritam za enkripciju
identity
=> datoteka koja sadrži tajni ključ korisnika za SSH1 verziju
protokola koja koristi RSA algoritam za enkripciju
identity.pub
=> datoteka koja sadrži javni ključ korisnika za SSH2 verziju
protokola koja koristi RSA algoritam za enkripciju

Nakon generiranja odgovarajućih ključeva posebnu pažnju treba posvetiti ovlastima


koje su pridijeljene pojedinim datotekama. Sve datoteke koje ne sadrže nastavak .pub sadrže
tajni ključ korisnika, te kao takve ne smiju biti dostupne nikome osim samome korisniku ( -
rw------- ovlasti).
Nepažljivo pridjeljivane ovlasti datotekama koje sadrže tajni ključ korisnika mogu
ozbiljno ugroziti sigurnost SSH sustava.

Kao što je već spomenuto, nakon generiranja vlastitog para tajni/javni ključ, kopiju
javnog ključa klijent mora pohraniti na poslužitelju 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 računalu, a ukoliko se koristi SSH2
verzija protokola potrebno je kopirati ključ id_rsa.pub ili id_dsa.pub u
$HOME/.ssh/authorized_keys2 datoteku udaljenog računala.
Nakon što je stvorena odgovarajuća $HOME/.ssh/authorized_keys ili
$HOME/.ssh/authorized_keys2 datoteka potrebno je ispravno postaviti ovlasti tih datoteka
kako bi se veza mogla uspješno 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Ukoliko je sve dobro podešeno potrebno je još samo pokrenuti proces spajanja SSH
protokolom na udaljeno računalo:
# ssh <ime_računala>
nakon čega je korisnik automatski prijavljen u sustav ukoliko je sve prošlo 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 računalom. Na ovaj
način dodatno je zaštićen korisnikov par ključeva, budući da je osim poznavanja tajnog ključa
u ovom slučaju potrebno i poznavati passphrase niz definiran prilikom postupka generiranja
ključeva čime se dodatno podiže sigurnosni nivo SSH sustava.

U $HOME/.ssh direktoriju korisnika koji koristi SSH servis postoji i datoteka pod
imenom known_hosts. Ona sadrži listu svih računala s kojima je klijentski dio SSH aplikacije
ikada komunicirao, zajedno s njihovim identifikacijskim oznakama (ssh_host_key), što
omogućuje dodatnu identifikaciju udaljenog računala s kojim se želi uspostaviti sesija.
Ssh_host_key je ključ koji sadrži svako računalo s instaliranim SSH servisom i generira
se prilikom instalacije programskog paketa. Koristi se u svrhu međusobne identifikacije
računala koja međusobno komuniciraju SSH protokolom.

Prilikom prvog spajanja na udaljeni SSH poslužitelj aplikacija će javiti da ne poznaje


udaljeno računalo te će korisnika tražiti potvrdu za nastavak uspostave veze. Ukoliko korisnik
odgovori potvrdno uspostavit će se veza s udaljenim računalom, nakon čega će to računalo
biti zapisano u known_hosts datoteku zajedno s njegovim ssh_host_key.pub ključem
primljenim od strane udaljenog računala. Svaki naknadni pokušaj spajanja na isto računalo
neće prijavljivati tu poruku budući da je računalo zabilježeno u spomenutu datoteku zajedno
sa svojom identifikacijom.
Ovakav pristup smanjuje mogućnost provođenja raznih napada na SSH servis, budući da
će pokušaj spajanja na računalo čiji ssh_host_key ne odgovara ključu koji je pohranjen u
known_hosts datoteku za to računalo, rezultirati neuspjehom.

SSH klijent može se pokrenuti s odgovarajućim parametrima čime se može preciznije


utjecati na način njegovog rada. Ove opcije potrebno je koristiti ukoliko se žele iskoristiti
naprednije mogućnosti SSH servisa.

290/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Neke od opcija koje je moguće proslijediti SSH programu u obliku argumenata su:

-c
=> definira se simetrični algoritam koji će se koristiti za
enkripciju podataka. Moguće vrijednosti ovog parametra su: des, blowfish i 3des. Inicijalna
vrijednost je 3des, budući da se isti smatra optimalnim. Blowfish je nešto manje sigurniji od
3des algoritma ali je zato znatno brži, dok je des algoritam ovdje moguće navesti isključivo iz
razloga kompatibilnosti sa SSH1 verzijom protokola, a iz sigurnosnih razloga ne preporučuje
se njegovo korištenje.
-f
=> zahtjeva se od ssh klijenta da radi kao pozadinski proces.
Ova se opcija vrlo često koristi u slučajevima kada se želi uspostaviti sigurni SSH kanal
između dva računala, koji će se kasnije iskoristiti za tuneliranje drugih TCP protokola.
-g
=> dozvoljava se udaljenim računalima spajanje na lokalno
preusmjereni port. Ova opcija također je vezana za mogućnost korištenja preusmjeravanja
portova.
-l
=> definira se korisničko ime (-l kao login) korisnika, pod kojim
se želi spojiti na udaljeno računalo.
-p
=> definira se port udaljenog računala na koji će se klijent
aplikacija spajati. Inicijalno je to port 22.
-x i -X
=> onemogućuje se ili omogućuje preusmjeravanje X11 sesija
peko sigurnog SSH kanala.
-C
=> omogućuje se kompresija podataka koji se prenose SSH
kanalom, a nivo kompresije može se definirati CompressionLevel parametrom u
konfiguracijskoj datoteci klijent programa.
-v

291/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

=> omogućuje se tzv. verbose mod rada u kojem program


ispisuje detaljne poruke vezane za svoj rad. Ova opcija koristi se u slučaju otklanjanja grešaka
kod SSH servisa.
-F
=> definira se konfiguracijska datoteka SSH klijent aplikacije.
Ova opcija definira se u slučaju kada se ne želi koristiti inicijalna config datoteka klijenta.
-L port:host:hostport
=> definira se port port koji će se na lokalnom računalu
preusmjeravati putem SSH kanala na port hostport udaljenog računala 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 poslužitelju koji će
biti preusmjeren na port hostport lokalnog računala host. Opcija koja se također koristi za
preusmjeravanje portova preko sigurnog SSH kanala.
-1
=> forsira se korištenje SSH1 verzije protokola.

-2
=> forsira se korištenje SSH2 verzije protokola.

Konfiguracijska datoteka SSH klijenta

SSH klijentski dio aplikacije svoje konfiguracijske parametre prima iz sljedećih izvora:
komandna linija
$HOME/.ssh/config konfiguracijska datoteka korisnika
/etc/ssh/ssh_config globalna konfiguracijska datoteka
Sve opcije koje se zadaju putem naredbenog retka nadjačavaju one definirane u
$HOME/.ssh/config datoteci, a sve definirane u $HOME/.ssh/config datoteci nadjačavaju one
definirane u globalnoj /etc/ssh/ssh_config datoteci.
Svi parametri koje je moguće proslijediti putem naredbenog retka moguće je definirati u
navedenim konfiguracijskim datotekama.

292/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Konfiguracijski parametri mogu se definirati za svako računalo na koje se želi spajati


tako da se navede ključna riječ Host koja definira na koja se sva računala parametri odnose.
Navedeni parametri vrijede sve do sljedeće ključne riječi Host nakon koje se navede parametri
za sljedeću vezu.
Na taj način moguće je definirati različite parametre sesije za spajanje na različita
udaljena računala. Ovo može biti vrlo korisna opcija, pogotovo ukoliko korisnik posjeduje
korisničke račune na više različitih SSH poslužitelja.

293/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

POSLUŽITELJSKI DIO SSH APLIKACIJE

Osnovni zadaci SSH poslužitelja su da osluškuje mrežne zahtjeve SSH klijenata, da


provodi odgovarajuće postupke autentikacije klijenata, da kriptira podatke na dogovoreni
način, te da omogući klijentu korištenje svih mogućnosti SSH servisa.

Konfiguracija SSH programa poslužitelja nalazi se u /etc/ssh/sshd_config


konfiguracijskoj datoteci.

Pokretanje SSH poslužitelja potrebno je omogućiti prilikom svakog podizanja sustava,


što je moguće postići dodavanjem odgovarajućih start skripti u /etc/rc direktorij.
Neki od brojnih konfiguracijskih parametara s kojima je moguće pokretati program su:

-b
=> definira se veličina ključa kojeg poslužitelj generira prilikom
instalacije. Inicijalno je to 768 bitova.
-d
=> pokretanje moda za otklanjanje grešaka. Ukoliko se zada ova
opcija sustav će u log datoteke bilježiti sve akcije vezane za rad poslužitelja, a ujedno će se i u
konzoli generirati odgovarajuće poruke što olakšava otklanjanje grešaka.
-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 izvršavanje
postupka autentikacije. Ukoliko se klijent ne autenticira za to vrijeme poslužitelj prekida
sesiju s klijentom. Inicijalna vrijednost ovog parametra je 600 sekundi.
-h
=> definira se datoteka iz koje se čita javni ključ poslužitelja.
Ovaj parametar potrebno je definirati u slučajevima kada se sshd program pokreće pod
ovlastima drugog korisnika budući da isti nema ovlasti pristupa ssh_host_key datoteci koja
inicijalno sadrži ovu vrijednost. U tom slučaju korisnik definira vlastitu datoteku kojoj ima
pristup, te je nakon toga navede kao parametar sshd poslužitelju.

294/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

-i
=> ovaj parametar definira se u slučajevima kada se sshd
program pokreće putem inetd poslužitelja. U principu se ovakav pristup ne preporučuje,
budući da se na taj način nešto usporavaju performanse sustava.
-p
=> definira se mrežni port na kojem poslužitelj osluškuje
zahtjeve klijenta. Na ovaj način moguće je ssh daemon programu zadati bilo koji port koji će
se koristiti za uspostavu mrežnih sesija. Inicijalno je to port 22.

Konfiguracijska datoteka SSH poslužitelja

Kako je već ranije spomenuto sshd program svoju konfiguraciju čita iz datoteke
/etc/ssh/ssh_config (osim ukoliko nije drugačije definirano -f parametrom).
U toj datoteci moguće je definirati brojne ključne riječi kojima se utječe na rad sshd
poslužitelja, a neke od njih su:

AllowGroups
=> parametar koji se koristi za definiranje grupe korisnika koja
ima prava pristupa SSH poslužitelju. Moguće je navesti više korisničkih grupa, pri čemu se
iste odvajaju razmakom. Inicijalno je dozvoljeno spajanje korisnika bez obzira kojoj grupi isti
pripada. Moguće je korištenje wildcard znakova * i ? za preciznije definiranje liste
korisničkih grupa.
AllowUsers
=> slično kao i AllowGroups parametar, samo što se odnosi na
korisnike, a ne na grupe korisnika.
AllowTCPForwarding
=> ovaj parametar omogućuje tuneliranje ostalih protokola
preko SSH sigurnog kanala. Inicijalno je postavljen na vrijednost "yes".
Banner
=> parametar koji je omogućen samo kod SSH2 verzije
protokola, a definira datoteku čiji će se sadržaj prikazati korisniku prilikom uspostave veze s
udaljenim računalom.

295/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Chipers
=> definiraju se grupe algoritama koje se mogu koristiti za
kriptiranje podataka. Moguće je definirati sljedeće algoritme: aes128-cbc, 3des-cbc, blowfish-
cbc, cast128-cbc i arcfour. Moguće je definirati više algoritama pri čemu se isti u tom slučaju
odvajaju zarezom.
CheckMail
=> definira se da li sshd poslužitelj mora provjeravati mail
korisnika prilikom njegovog spajanja. Inicijalna vrijednost ovog parametra je "no".
Deny Groups i Deny Users
=> parametri kojima se na sličan način kao i kod AllowGroups i
AllowUsers omogućuje zabrana pristupa SSH servisu. Korištenjem ovih parametara moguće
je vrlo precizno definirati kojim korisnicima je omogućeno korištenje SSH servisa.
IgnoreRhosts
=> onemogućuje se autentikacija korisnika na temelju .rhosts i
hosts.equiv datoteka. Inicijalna vrijednost ovog parametra je "yes", budući da se ovaj način
autentikacije smatra manje sigurnim.
IgnoreUserKnownHosts
=> definira se da li sshd poslužitelj 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 korisničke šifre. Inicijalna vrijednost ovog parametra je "yes".
PermitRootLogin
=> definira se da li je dozvoljeno prijavljivanje pod korisničkim
računom administratora sustava. Inicijalna vrijednost ovog parametra je "yes". Moguće je
definirati sljedeće vrijednosti ovog atributa: yes, no, forced-commands-only (omogućuje
prijavljivanje administratora na temelju njegovog para tajni/javni ključ) i without-password
(bez korisničke šifre).
Port
=> definira se mrežni port na kojem sshd poslužitelj osluškuje
zahtjeve. Inicijalno je to port 22.

296/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

Protocol
=> definira se verzija protokola koju koristi sshd program
poslužitelj. Moguće 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 stanovišta sigurnosti, kojom se od sshd
poslužitelja zahtjeva da provjeri IP adresu i ime računala s kojeg zahtjev dolazi. Na ovaj način
pruža se dodatna zaštita od IP i DNS spoofing napada u kojima neovlašteni korisnik lažira IP
adresu ili ime računala s kojeg konekcija dolazi, kako bi na taj način ostvario neautorizirani
pristup resursima drugog sustava.
RhostsAuthentication
=> definira se da li je moguća autentikacija samo na temelju
.rhosts ili hosts.equiv datoteka. U normalnim okolnostima ne preporučuje se korištenje ove
metode budući 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 nešto
je sigurnija u odnosu na prethodno navedenu, ali je također 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", budući da se ovaj mehanizam autentikacije smatra prilično
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

X11Forwarding
=> omogućuje se preusmjeravanje X11 protokola putem
sigurnog SSH kanala. Inicijalno je ova mogućnost isključena.

Pomoću ovih parametara moguće je vrlo precizno definirati ponašanje SSH daemon
programa.

Authorized_keys datoteke

Kako je već ranije spomenuto authorized_keys datoteka sadrži popis javnih RSA
ključeva svih korisnika koji se SSH protokolom žele spajati na SSH poslužitelj pomoću 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 moguće je
koristiti obje datoteke ukoliko se želi da poslužitelj jednako podržava SS1 i SSH2 verzije
protokola.
Svaki redak ove datoteke sadrži jedan javni ključ (RSA ili DSA, ovisno o korištenom
algoritmu enkripcije) korisnika.
Znak # kao i većini drugih slučajeva predstavlja početak komentara te se kao takav
ignorira.
Za datoteku $HOME/.ssh/authorized_keys osim što je na raspolaganju korisniku u
čijem se home direktoriju nalazi, također se preporučuje da bude dostupna administratoru
sustava. U nju će korisnici kopirati svoj javni ključ za SSH1 verziju protokola, ili preciznije
rečeno identity.pub datoteku.
U datoteku $HOME/.ssh/authorized_keys2 korisnici kopiraju ključeve 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 sadrže privatne ključeve tog računala. Slično kao što i svaki korisnik
posjeduje svoj par javni/tajni ključ, tako i svako računalo koje koristi SSH servis ima svoj
zasebni par ključeva. Ove datoteke iz tog razloga moraju imati ovlasti koje samo

298/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

administratoru sustava omogućuju njihovo pregledavanje i mijenjanje. Sshd program se iz


sigurnosnih razloga neće htjeti pokrenuti ukoliko su ovlasti ovih datoteka krivo postavljene.
/etc/ssh_host_key.pub, /etc/ssh_host_dsa_key.pub, /etc/ssh_host_rsa_key.pub
datoteke

Navedene datoteke sadrže javne ključeve računala na kojem se nalaze. Za razliku od


tajnog ključa opisanog u prethodnoj stavci ova datoteka može biti dostupna ostalim
korisnicima. Njezin sadržaj se također generira korištenjem ssh-keygen naredbe.

etc/ssh_known_hosts i $HOME/.ssh/known_hosts datoteke

Ove datoteke koriste se u slučajevima kada se proces autentikacije provodi na temelju


.rhosts datoteke u kombinaciji sa RSA postupkom. Javni ključ računala koje se žele spojiti se
mora nalaziti u ovoj datoteci ukoliko se želi uspješno uspostaviti veza sa SSH poslužiteljem.
Iste datoteke klijent SSH aplikacija koristi kako bi provjerila identitet udaljenog računala na
koje se pokušava spojiti. Ukoliko se u ovome koraku primijete bilo kakve neregularnosti
sesija se prekida.

/etc/hosts.allow i /etc/hosts.deny datoteke

Datoteke kojima se može točno kontrolirati dozvola pristupa pojedinim servisima


instaliranim na istom računalu. Datoteke se koriste u kombinaciji sa tcp_wraper programskim
paketom u svrhu povećane kontrole pristupa pojedinim TCP mrežnim servisima.

$HOME/.rhosts datoteka

Ova datoteka sadrži razmakom odvojene vrijednosti korisničko ime - ime računala, i svi
tako navedeni korisnici sa navedenog računala mogu se spojiti na to računalo bez navođenja
korisničke šifre.
Korištenje .rhosts datoteke naslijeđeno je od starijih mrežnih servisa kao što su rsh, i
rlogin koji se danas više ne koriste. Iz navedenog odmah se može zaključiti zašto se
korisnicima nikako ne preporučuje korištenje ovakvog mehanizma autentikacije, budući da je

299/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

isti prilično nesiguran. Ukoliko se želi omogućiti ovakav način autentikacije, to je potrebno
eksplicitno navesti u konfiguracijskoj datoteci sshd poslužitelja.

$HOME/.shosts datoteka

Shosts datoteka je posebno određena datoteka koja obavlja ulogu .rhosts datoteke, s
jedinom razlikom da se koristi isključivo za ssh servis.

/etc/hosts.equiv datoteka

U ovoj datoteci navedena su imena računala koja se mogu spojiti na dotično računalo
bez odgovarajuće korisničke šifre, pod pretpostavkom da korisnik ima isto korisničko ime na
oba računala.
Slično kao i kod .rhost datoteke korisnicima se iz sigurnosnih razloga ne preporučuje
korištenje ove datoteke u svrhu autentikacije udaljenih korisnika.

/etc/shosts.equiv

Isto kao i /etc/hosts.equiv, samo što datoteka vrijedi isključivo za SSH servis.

300/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

OPĆENITO O PREUSMJERAVANJU
TCP PORTOVA I SFTP

Preusmjeravanje portova, popularno zvano tuneliranje, je mehanizam koji korisniku


omogućuje preusmjeravanje inače nesigurnog TCP prometa preko sigurnog SSH
komunikacijskog kanala.
Na ovaj način moguće je proizvoljne, inače nesigurne (nekriptirane) mrežne servise kao
što su POP, IMAP, SMTP, telnet i dr., preusmjeriti preko SSH kanala te ih na taj način zaštiti
od neovlaštenog promatranja.
Na sljedećoj slici prikazan je princip na kojem se bazira tuneliranje protokola preko
SSH sigurnog kanala:

Slika: Tuneliranje protokola

Princip je sljedeći:
SSH klijentu potrebno je reći koji se port na lokalnom računalu želi tunelirati kroz
sigurni SSH kanal, i na koji port udaljenog računala se taj promet želi preusmjeriti. U tu svrhu
koristi se već prije spomenuta -L opcija ssh klijenta.
Nakon toga kompletni promet lokalnog računala koji se šalje na u prethodnoj fazi
definirani port biti će putem sigurnog SSH kanala preusmjeren na sshd poslužitelj navedenog
udaljenog računala.
Sshd poslužitelj prima kriptirani promet na SSH portu 22 i prosljeđuje ga servisu na
port koji je u prvom koraku definiran kod ssh klijenta.
Servis vraća odgovor na primljeni zahtjev, te ga prosljeđuje sshd poslužitelju, koji ga
putem SSH kanala vraća klijentskom dijelu aplikacije.

301/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

SSH klijent prima odgovor i prosljeđuje ga servisu koji je inicirao sesiju.


Općenita sintaksa naredbe kojom se omogućuje 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 poželjno navesti kako bi kreirani ssh tunel radio
kao pozadinski proces. Na taj način nakon uspostave SSH tunela omogućuje se oslobađanje
konzole, te je moguće zadavanje drugih naredbi.
Ukoliko se ne proslijedi parametar -f nakon uspostave SSH kanala korisnik će morati
preći u drugu konzolu ukoliko želi izvršavati naredbe na lokalnom računalu.
Parametar -L služi za definiranje parametara postupka tuneliranja, odnosno za
definiranje portova koji će biti preusmjereni. Prilikom proizvoljnog odabira porta preporučuje
se uzimanje nekog visokog porta koji nije korišten od strane nekih drugih aplikacija, tj.
uzimanje nezauzetog porta. Lista portova koji su zauzeti od strane drugih programa može se
naći u datoteci /etc/services.
Ukoliko se ssh klijent želi pokretati kao pozadinski proces (parametar -f) neophodno je
na kraju naredbe zadati naredbu koju će poslužitelj izvršiti nakon prihvaćanja sesije, npr.
naredbu sleep koja ujedno korisniku daje dovoljno vremena da se klijent aplikacijom servisa
koji se tunelira (telnet, FTP) spoji na udaljeno računalo. Naredba sleep kao argument prima
broj sekundi koji će udaljeni proces biti spreman prihvatiti zahtjev klijenta.
Tuneliranje telnet servisa teoretski nema previše smisla, budući da je SSH sam po sebi
sigurna zamjena za telnet servis. Moguće je bilo koji TCP protokol tunelirati kroz SSH kanal
(POP, POP3, IMAP, FTP i sl.). Protokoli koji su najveći kandidati za SSH preusmjeravanje
su oni koji ne implementiraju nikakve mehanizme zaštite podataka.
Tuneliranje FTP protokola (FTP slično kao i telnet servis podatke mrežom šalje u
čistom tekstualnom obliku) na način kako je to gore opisano nešto 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
budući da postoje dva moda rada FTP protokola aktivni i pasivni.
Sftp je program koji dolazi u paketu s openssh programskim paketom, a omogućuje
sigurnije korištenje FTP protokola pomoću SSH protokola. Korištenje sftp programa
preporučuje se svim korisnicima kao sigurnija zamjena za tradicionalni FTP servis, a
korištenje programa je vrlo jednostavno, budući da su sve naredbe naslijeđene od običnog
FTP protokola.

302/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

SCP

S openssh programskim paketom dolazi i scp program.


Scp (Secure Copy) program omogućuje sigurno kopiranje datoteka između lokalnog i
udaljenog računala. Sigurno kopiranje datoteka bazira se na korištenju SSH protokola,
odnosno kriptiranju podataka koji se prenose računalnom mrežom.
Osim sigurnosti koju nude, dodatna prednost sftp i scp programa je ta što ne zahtijevaju
instalaciju dodatnih programa poslužitelja na udaljenom računalu. Razlog tomu je taj što oba
programa svoj rad baziraju na SSH protokolu, te kao takvi koriste sshd poslužitelj.
Korištenje scp naredbe vrlo je slično korištenju klasične cp Linux/Unix naredbe s
jedinom razlikom što se kopiranje odvija između udaljenih računala.
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 računalu
host. Myname parametar definira korisničko ime korisnika na udaljenom računalu.
# scp local_dir/* myname@host:remote_dir
=> Slično kao i u prethodnom primjeru, samo što se kopira
kompletni sadržaj direktorija local_dir.
#scp /home/peric/* peric@test2:/home/peric
=> Kopiranje sadržaja home direktorija korisnika peric sa
lokalnog računala test1, u home direktorij istog korisnika na računalo test2
WinSCP je besplatni programski paket za Windows operativne sustave (Win
95/98/NT/2000/ME/XP), koji omogućuje kopiranje datoteka između lokalnog i udaljenog
računala.
Program svoj rad bazira na ranije spomenutom SCP (Secure Copy) protokolu koji dolazi
kao dio ssh paketa. Podržane 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 uspješno WinSCP klijent aplikacijom uspostaviti veza s udaljenim
računalom, potrebno je na njemu imati pokrenut sshd program poslužitelj, budući da se
kompletna veza odvija putem SSH protokola.

303/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Telnet i SSH

ZAKLJUČAK

Tehnologija i znanost munjevitom brzinom grabe naprijed, a najbrže od svih se


razvijaju znanosti i tehnologije vezane uz računala. Svaki napredak ima svoje prednosti i
nedostatke.
U mrežnim okolinama, dok distribuirano računarstvo uzima sve više maha, te se više ne
može vjerovati u dobronamjernost korisnika sustava, kontrola pristupa i autentikacija
korisnika postaju nužan uvjet.

U ovom seminaru dan je kratki pregled osnovnih karakteristika telnet i SSH protokola,
te neke od mogućnosti njihove primjene. Opisani su temeljni programski paketi neophodni za
korištenje SSH protokola, kao i osnovni postupci njihove konfiguracije.

Može se zaključiti da je osnovna namjena SSH protokola da omogući kreiranje sigurnih


sesija između dva računala. Na taj način uklanja se najveći nedostatak mrežnih servisa kao što
su telnet i sl., a to je nezaštićenost prijenosa podataka.
Podaci se kod takvih protokola prenose računalnom mrežom u čistom tekstualnom
obliku što neovlaštenim korisnicima omogućuje jednostavan dolazak do povjerljivih
korisničkih informacija. Upravo zato se svim korisnicima preporučuje prelazak na sigurnije
implementacije istih servisa, tj. korištenje SSH protokola.
Iz istih razloga poseban je naglasak dan upravo sigurnosnim svojstvima ovog protokola,
što je ujedno i njegova najveća snaga.

304/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

Frane Gjeldum

ARHIVIRANJE NA
UNIX RAČUNALIMA

305/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

STANDARDNI TAR PROGRAM

Opći dio

Program «tar» se koristi na «linux» operativnim sustavima za stvaranje i manipuliranje


tar arhiva. Arhivom nazivamo pojedinačan file koji sadrži više 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 možemo stvoriti tar arhivu možemo vršiti razne manipulacije. Tako npr.
možemo
ekstrahirati tj. istisnuti dokumente iz već prije napravljenih arhiva , promijeniti ili
izlistati dokumente koji su prije spremljeni u arhivu.
Sami početci uporabe tara vežu se za magnetsku vrpcu pa tako kratica «tar» na
engleskom znači «tape arhiver». Modernije verzije tara danas pristupaju raznim dostupnim
uređajima, dokumentima, pa i programima.
Tar arhive se koriste na mnogo načina .Evo neke od njih:
-Kao spremište Posebno se to koristi pri transferu kroz mrežu, gdje se
spremaju u arhive razni povezani dokumenti. Jedini način da se pohrani
nekoliko dokumenata na traci, a da se zadrže informacije o njihovim
imenima je upravo korištenjem arhiva.
-Kao Back up Postupak kopiranja kolekcije dokumenata na disk ili
traku kao zaštita od mogućih oštećenja ili gubitaka.
-Za transport Arhivu kreiranu na jednom sistemu lako prenesemo na
drugi sistem i tamo ekstrahiramo njen sadržaj

Obično arhive dolaze s ekstenzijom «.tar»! Nije potrebno navoditi ekstenziju, ali dobro
je radi preglednosti.

306/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

Autori tara
Tar je originalno napisao John Gilmore, ali mnogi drugi su ga modificirali i
unapređivali.
Važno je istaknuti da je tar zajednički proizvod rada više ljudi koji su koristeći tar
uočavali probleme, pronalazili rješenja i podijelili svoja mišljenja.

Osnovne tar operacije i opcije

Tar može primiti različite argumente koji specificiraju i definiraju akcije nad pojedinim
dokumentima ili arhivom. Glavni tipovi argumenata spadaju u dvije klase:
operacije
opcije
Dozvoljeno je specificiranje i više od jedne opcije odjednom, a isto tako nije potrebno
navođenje nikakve opcije. Dok kod izvršavanja određenih operacija zahtjeva se specificiranje
samo jedne odjedanput. Većinu tar operacija i opcija možemo pisati u bilo kojem od tri forme:
Long (mnemonic) forma
Short forma
Old style forma
Na primjer umjesto tipkajući naredbu ;

tar - -create - -verbose - -file=afiles.tar apple angst aspic(Long form),

možemo tipkati naredbu ;

tar –c –v –f afiles.tar apple angst aspic(Short form)

Tri najčešće korištene operacije

U radu s arhivama i tar programom najčešće:


--create
-c kreiramo novu arhivu,

307/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

--list
-t listamo sadržaj arhive ili

--exstract
-x ekstrahiramo članove arhive.

«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 lakše
razumijevanje naredbi i izbjegavanje grešaka. Opcija ima mnogo i sada ćemo samo dotaknuti
tu temu. Dvije najkorištenije opcije su «File» i «Verbose» opcija.
File opcijom određujemo ime arhive s kojom tar radi. Ukoliko navedemo ime arhive tar
će upotrijebiti «default», obično predodređenu traku priključenu za naše računalo ili ako nema
trake, javiti će grešku.

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 određene stvari.

Primjer «Long» i «Short» forme za opciju «Verbose»:

--verbose
-v
Nakon upoznavanja s osnovnim tar opcijama proučiti ćemo kako kreirati arhive, listati
arhive i ekstrahirati članove iz arhive.

308/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

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 sadrži 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 se da se nalazimo u direktoriju «practice» koji je poddirektorij «home»
direktorija.

Da bi stavili dokumente «blues», «folk», «jazz» u arhivu «collection.tar» upotrijebiti


ćemo slijedeću naredbu:

$ tar --create –file=collection.tar blues folk jazz

Redoslijed argumenata nije važan kada upotrebljavamo «long» opciju forme, pa se


može napisati:

$ tar blues --create folk – file=collection.tar jazz

Naravno, vidljivo je da je iz ovog redoslijeda teže razumjeti naredbu. Redoslijed


argumenata postaje važan upotrebom «short forme» gdje pogrešan redoslijed može dovesti do
neželjenih rezultata. Kada listamo sadržaj radnog direktorija (ls) vidjet ćemo da se arhiva
«collection.tar» i dokumenti «blues», «folk» i «jazz» nalaze u njemu. Kreirana arhiva nije
uništila kopije dokumenata u direktoriju. Zaključno, moramo navesti operaciju i ime
dokumenata inače tar neće raditi. Vrlo je važno pogledati da već ne postoji dokument u
radnom direktoriju istog imena ,kao arhiva koju ćemo imenovati prethodnom navedenom
naredbom jer će tar izbrisati trenutni sadržaj tog dokumenta. Naravno direktorije smo prije
kreirali ,a arhivu «collection.tar» stvaramo i imenujemo prethodnim primjerom tar naredbe.

Koristeći istu naredbu s «verbose»opcijom, tar će sam dodati imena dokumenata koje
koristi dok radi .To se često koristi da prikažemo akcije koje inače ne bi vidjeli.

$ tar – create --verbose --file=collection.tar blues folk jazz

309/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

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 može vidjeti, sistem reagira jednako bez obzira da li uporabimo «long» ili
«short» formu. Već je prije napomenuto da pogrešan redoslijed može dovesti do neželjenih
rezultata kod upotrebe «short» opcije. Kao primjer evo naredba:

$ tar –cfv collection.tar blues folk jazz


Ovdje dolazi do greške jer se stvara arhiva imena «v» jer je najbliže argumentu «file
name».U daljnje probleme neću ulaziti.

Važno je napomenuti da je moguće 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 sadržajem postupkom ekstrahiranja. Tako naš direktorij «practice»
,koji se nalazi u «home» direktoriju ,možemo arhivirati u novu arhivu «music.tar» tipkajući
naredbu:

$ tar --create --verbose --file=music.tar practice


practice/
practice/blues
practice/folk
practice/jazz
practice/collection.tar

310/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

Primjećuje se da arhiva nije u poddirektoriju «practice» ,već u našem «home»


direktoriju iz kojeg je tar i bio pozvan..

Listanje arhiva

Često želimo znati što pojedina arhiva sadrži. Lako doznamo imena članova arhive
upotrebom list operacije. Tako npr. možemo pregledati sadržaj arhive «collection.tar»
tipkajući naredbu:

$tar – list –file=collection.tar

Na što bi tar odgovorio :


Blues
Folk
jazz

Moguće je i točno odraditi član neke arhive pa nam tar vrati samo njega:
$tar – list –file=collection.tar blues

Pak da bi dobili sadržaj 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

Kako ekstrahirati članove iz arhive

Naravno nema smisla kreirati arhivu s članovima ako ne možemo te članove izvaditi i
uporabiti. Za ekstrahiranje članova upotrebljava se operacija (-- extract,-x). Ekstrahiranje
članova arhive ne mijenja samu arhivu; možemo taj postupak obaviti onoliko puta koliko
nam treba. Slično i drugim operacijama možemo 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 točno odrađen č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»)


Slično 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 ekstrahiranog
direktorija.
U slučaju da je dokument bio arhiviran,a da u svom imenu sadrži 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 sljedećoj
naredbi:

$ tar – xvf music.tar practice/folk practice/jazz

(Direktorij «practice» koji se nalazi u arhivi «music.tar» sadrži dokumente «folk» i


«jazz» koje želimo ekstrahirati.)

312/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

Napredne tar operacije

U ovom poglavlju spomenuti će se pet preostalih operacija tar programa.:


«-- append», «-- update», «-- concatenate», «-- delete» i «compare».
Ove operacije i mnoge njihove opcije prosječni korisnici tar programa ne uporabljuju
tako često. One obavljaju specifične funkcije i poprilično su korisne kad ih zatrebamo.
Pokušat ćemo ukratko se dotaknuti i dati poneki primjer svake od njih. Kroz primjere
koristimo i dalje iste dokumente i direktorije kao i do sada.

Kako dodati dokument već postojećoj arhivi(-- append)

Ako želimo dodati dokument već postojećoj arhivi ,ne trebamo kreirati novu arhivu;
možemo koristiti « –append (-r)».Koristeći «append» možemo dodati dokument istog imena
kao i dokument u arhivi a da se taj dokument ne izbriše. Tar dozvoljava beskonačan broj
dokumenata sa istim imenima. Važno je navest ime dokumenta koji dodajemo kao argument
jer nema «defaulta».
Da bi demonstrirali uporabu operacije «append», kreirat ćemo dokument «rock» u
«practice direktoriju a nakon toga ga dodati arhivi «collection.tar»Moramo utipkati sljedeću
naredbu:

$tar – append –file=collection.tar rock


( Kada bi pogledali sadržaj arhive pomoću « list »operacije, vidjelo bi se da je
dokument «rock» pridodan arhivi.)

Ažuriranje arhive koristeći – update

Vrlo slična operacija kao «append» je «--update (r)».Ona ažurira tar arhivu
uspoređujući datum kreiranja ili modificiranja člana arhive s datumom kreiranja ili
modificiranja dokumenta istog imena.
Ako je dokument modificiran u skorije vrijeme nego član arhive ,onda se novija verzija
dokumenta dodaje u arhivu. Tako će postojati stara i nova verzija u arhivi. Da bi razumjeli
kako to sve radi ,kreirat ćemo novi dokument , «classical», u «practice» direktoriju i malo
nešto dodati u dokument blues, čime ga zapravo mijenjamo.

313/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

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 vraća imena dokumenata s kojima radi, a to su u
ovom slučaju dokumenti koji trebaju biti ažurirani(«updatirani»).

Spajanje arhiva s – concatenate

Da bi dodali jednu ili više arhiva na kraj neke druge arhive trebamo uporabiti « –
concatenate (--catenate,-a)» operaciju. To je mnogo lakše nego dodavati svaki član
pojedinačno.
Nova arhiva nakon spajanja će se zvati istim imenom kao prva navedena arhiva u
naredbi i sadržavat će članove svih arhiva, čak i ako se članovi isto zovu, zajedno će
koegzistirati. Znači da nema brisanja članova.

Uklanjanje članova arhive koristeći «-- delete»

Da bi uklonili pojedini član neke arhive koristeći operaciju «– delete», potrebno je


navesti ime arhive i nakon toga ime člana kog želimo izbrisati. Ako ne navedemo ime člana
ništa neće 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

«Back up» i ponovna obnova dokumenata

Kreirati arhivu koja sadrži sve dokumente u tom «file» sistemu znači napraviti «back
up» tog file sistema. Te arhive mogu biti ponovno uporabljene da se obnovi tj. restaurira
svaki od arhiviranih dokumenata. To je posebno značajno ako se fizički ošteti disk ili slučajno
obriše neka datoteka.
Kopije file sistema nazivamo «dumpovima».

314/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

Treba razlikovati
potpune arhivske kopije(«full dumps»)
diferecijalne kopije(«incremental dumps»)

Obično se radi potpuna arhivska kopija jedanput na tjedan, a diferencijalna kopija


jednom na dan. To znači da će se svaki dan raditi «back up» svih dokumenata nastalih ili
promijenjenih od zadnje potpune kopije. To znači da će neki dokumenti biti arhivirani više od
jedanput .Takva strategija nam omogućava restauriranje file sistema s preciznošću od jednog
dana ekstrahirajući 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 obično 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 možemo i tipkati naredbe rukom .
Vrlo zgodna stvar je da se dokumenti mogu restaurirati tipkajući 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 obično rade na prenosivim medijima; magnetske vrpce ,diskete ,« tape


catriges» i razni drugi mediji. Količina podataka koji se mogu pohraniti ovisi naravno o
veličini diska ili trake, ali i o načinu na kojim su formatirani.
Prednost magnetskih medija je da se mogu ponovno uporabiti. Arhive jednostavno
obrišemo i ponovno uporabimo magnetski medij. Ipak takve medije treba zaštititi od
magnetskog polja ,a kada počnu proizvoditi greške ,s vremenom ih treba zamijeniti.

315/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

«CPIO» PROGRAM

Cpio kopira dokumente u tar ili cpio arhivu. Arhiva može biti dokument na disku ili
npr. magnetskoj traci. Slično kao i tar obavlja i ekstrahiranje van arhiva. Gnu cpio podupire
sljedeće 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.
Pošto podržava i tar format , cpio je kompatibilan i sa tar programom.
Kod ekstrahiranja cpio prepoznaje vrstu formata arhiva i može čitati i arhive kreirane na
računalima sa drukčijim poretkom bajtova.

Gnu cpio izvodi tri primarne funkcije i tri operativna načina 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.
Tipičan način da stvorimo listu imena dokumenata je da uporabimo «find» naredbu. U
tom slučaju poželjno je dodati find naredbi opciju «-depth» da smanjimo probleme s
dozvolama nečitljivih direktorija.

Opća 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

Generalna sintaksa sadrži mnogo opcija pa bi predugo trajalo objašnjavanje svake od


njih. Nadam se da će biti bar malo razumljivija nakon što pokažemo par primjera.
U prvom primjeru prikazat ćemo arhiviranje sadržaja 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» vraća imena dokumenata redoslijedom kako ih
dodajemo
u arhivu. Opcije mogu stajati skupa ali mora ispred njih doći 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 sadržaj arhive.
Arhiva se nalazi na standardnom ulazu. Moguće je uporabiti i predloške («paterns») pa
samo imena dokumenata u arhivi koja se podudaraju sa zadanim predlošcima će biti
ekstrahirana. Ako nisu zadani predlošci, ekstrahirat će se svi dokumenti iz arhive.
Ekstrahiranje arhive zahtjeva malo više razmišljanja jer cpio neće kreirati direktorije za
obnovljene dokumente po « defaultu», ni ti će prepisati stare dokumente bez da mu zadamo
opciju.

Opća 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

[--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 smještaju u trenutno aktivni direktorij. Opcija «-i» ekstrahira arhivu a «-v»
prikazuje imena dokumenata redoslijedom kako se ekstrahiraju.)

% cpio -idv < tree.cpio


( Ovom naredbom se sadržaj čitavog stabla direktorija ekstrahira u trenutni direktorij.
Opcija «-d» služi za kreiranje direktorija ako je potrebno. Posebna «-u» opcija se može
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,


kombinirajući 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.

Opća sintaksa: cpio {-p|--pass-through} [-0adlmuvLV] [-R [user][:.][group]]


[--null] [--reset-access-time] [--make-directories] [--link]

318/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

[--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 između «find» i «cpio».Opcija «-p» označava cpio-u da doda dokumente u
direktorij «new dir».

Usporedba tar i cpio programa

Iako se uporabljuju za slične stvari, postoje određene razlike .


Glavna razlika je u sintaksi tj. naredbama koje tipkamo i formatu zaglavlja. Tar je malo
više orijentiran prema trakama .Ako je npr. u pitanju restauracija na magnetskoj traci, a
dogodila se neka greška, tar će stati u tom trenutku dok bi cpio preskočio mjesto s greškom i
pokušao restaurirati ostatak dokumenata.
Prednost cpio programa je upravo to da ne bi blokirao sve pa kažemo da on mnogo
efikasnije upotrebljava medije .
Tar uvijek koristi 512 bajtova za dokument zaglavlja dok cpio uzima onoliko mjesta
koliko mu je potrebno za zaglavlje.
Još jedna razlika je da cpio arhivira specijalne dokumente ,a tradicionalni tar ne.
Postoje još neke razlike u radu s simboličnim linkovima itd.!
Naravno neko se može upitati zašto je napravljen cpio kad je tar već postojao i radio
slične stvari. Istina je ustvari da je cpio nastao prvi.
Mnogi ljudi koji su radili na ta dva programa su vremenom razvijali razne verzije
uvijek težeći za boljim rješenjima .

319/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

« DD » PROGRAM

Još jedan program , sličan tar ili cpio programima koji se može uporabiti za arhiviranje
je dd program. On kopira dokumente («files») uz manipuliranje ulazno-izlaznim
(i/o)veličinama blokova. Opcionalno se mogu vršiti konverzije nad dokumentima.
Po «defaultu» kopira dokumente sa standardnog ulaza na standardni izlaz.

Opća sintaksa:
dd[option]…

Navest ćemo neke opcije koje program prima:

«if=file» (čita iz FILE umjesto iz standardnog ulaza)


«of=file» (piše u FILE umjesto na standardni izlaz)
«ibs=bytes» (čita BYTES bajtove po redoslijedu)
«obs =bytes» (piše BYTES bajtove po redoslijedu)
«bs=bytes» (čita i piše BYTES bajtove po redoslijedu
«cbs=bytes» (konvertira bajtove po redoslijedu)
«skip=blocks» (preskače blokove ibs; blokovi na ulazu prije kopiranja)
«seek=blocks» (preskače 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Arhiviranje na Unix računalima

U sljedećoj «shell» naredbi kopirat ćemo podatke u blokove velike 512 kb,
Između diska i trake ali nećemo spremati ni restaurirati podatke u «labelu» na početku
diska.

Primjer:
(dd bs =4k skip=1 count=0 && dd bs=512 k) < $disk > $ tape
-kopirano je sve osim «labele» na početku 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Davorin Šajnović

UNIX devices, mounting devices

322 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

UVOD

UNIX je u razdoblju nastajanja predstavljao jezgru operacijskog sustava, a kasnije je


ovo ime značilo i dodatne uslužne programe koji su postali sastavni dio UNIX-a i
omogućavali riješavanje različitih pitanja. Danas izgovarajući riječ UNIX u širem smislu,
podrazumijevamo jezgru UNIX-a, uslužne programe, dodatne mrežne servise, koa što su
TCP/IP protokol, prijenos datoteka za udaljeni rad, raspodijeljeni sustav datoteka NFS,
mrežna informacijska baza NIS. Podrazumijevamo i zaista ogroman niz uslužnih programa
koji se uglavnom mogu besplatno skinuti s Interneta, a kod novijih instalacija već su po
definiciji ugrađeni 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 područje i za svako od njih mogla bi se napisati knjiga. U ovom
seminarskom radu trudio sam se pokriti neke osnovne stvari tipa montiranja uređaja kao što je
CD-ROM, usb, diskovne particije i slično koje mnogima početnicima u početku zadaju
glavobolje posebno onim korisnicima koji su navikli na prijateljsko okruženje Windowsa.
Iako se o ovom području može zaista jako puno toga napisati, trudio sam se što je više bilo
moguće pojednostaviti neke stvari koje slučajnom čitatelju mog seminarskog rada u potrazi za
nekim riješenjem može pomoći u svladavanju problema. Skupio sam nekoliko najčešće
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 uložiti truda i imati puno puno
strpljenja da bi se na kraju dobili rezultati. U drugom dijelu obrazložio sam Sambu
programski paket koji je vrlo popularan zbog svoje sigurnosti i stabilnosti. Dat je uvid u
konfiguraciju Sambe kao i neke osnovne stvari pomoću kojih se može steći dojam o samom
paketu i njegovim mogućnostima.

323 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

MOUNT

Sustavi datoteka

Da bi mogli montirati neki od uređaja tipa diska ,cd-rom-a ili npr. Usb-sticka moramo nešto
spomenuti o sustavima datoteka. Cijela priča se svodi na to da ne možemo jednostavno
ubaciti cd-rom ili priključiti usb stick i i očekivati da sustav sve sam obavi(pročita podatke ili
ih zapiše) već moramo te uređaje «montirati». Sustavi datoteka tvore osnovu za pohranu
podataka na Linux računalima. Linux programi, biblioteke, sustavske datoteke i korisničke
datoteke se nalaze u sustavima datoteka. Zbog specifičnog svojstva Linuxa da sve resurse s
kojima raspolaže tretira kao datoteka ,kod UNIX-Linux korisnika se uvriježila izreka «sve je
datoteka». S gledišta korisnika postoje tri vrste datoteka:
- obične datoteke
- kazala datoteke
- specijalne datoteka
Malo ćemo pogledati ovu zadnju vrstu tj. specijalne datoteke! Specijalne datoteke su vrlo
neobično ali zgodno svojstvo UNIX-a. Specijalne datoteke se koriste(čitaju, pišu) kao i obične
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 nužno.Tako ako želimo pisati na pisaču pišemo u datoteku «/dev/lpt». Prednost ovakve
organizacije ulaza i izlaza je sljedeća:
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 zaštitni mehanizam i za datoteke i za ulazno-izlazne jedinice itd.

Slika 1. Prikaz dijela strukture kazala

324 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Pogledajmo za šta se koriste direktoriji /dev, /etc, /mnt .


direktorij /dev sadrži specijalne datoteke,vanjske jedinice,kao npr. diskovi, pisači itd.
direktorij /etc sadrži dosta izvedbenih i podatkovnih datoteka vezanih uz sam
operacijski sustav i njegovu konfiguraciju. Ono je vrlo važan direktorij jer sadrži mnoge
datoteke za podešavanje sustava kao i datoteku fstab koja sadrži 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 fizički smješteni na
raznim dijelovima diska, na različitim diskovima ili čak računalima. Ako je jedna od tih
particija smještena 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.

Postavljanje i uklanjanje sustava datoteka

Sad kad smo nešto rekli o sustavima datoteka pogledajmo kako se moze dodavati i
uklanjati CD-ROM, diskovna particija, usb mp3 player, flopy disk itd.
Da bismo uspostavili sustav datoteka u stablu direktorija, moramo imati fizičku
particiju, CD-ROM , flopy i sl. Isto tako moramo provjeriti postoji li direktorij u kojem
želimo dodati sustav datoteka. Samim postavljanjem sustava datoteka nećemo dodati(stvoriti)
takav direktorij mount point, već on mora postojati prije nego počnemo stvarati sustav
datoteka. Recimo da želimo stvoriti sustav datoteka u direktoriju /mnt za CD-ROM(pogon
/dev/sr0). Mora postojati direktorij /mnt inače će postupak biti prekinut. Nakon što ste pod tim
direktorijem stvorili sustav datoteka svi podatci sa CD-ROM-a pojavit će se u direktoriju
/mnt , inače je on prazan.Napomenimo i to da se unutar direktorija /mnt može kreirati više
različitih sustava datoteka tipa CD-ROM-a, WIN_C particije, usb, flopy pa im se pristupa na
način /mnt/cd-rom ili /mnt/usb itd.
Da bismo uspostavili sustav datoteka upotrijebit ćemo naredbu «mount» , a sintaksa je
sljedeća: «mount device mountpoint» tj. gdje je device fizički uređaj(disk ili particija) koji

325 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

montiramo a mountpoint mjesto montiranja odnosno mjesto u stablu direktorija na kojem se


stvara sustav datoteka.Naredbu mount mogu koristiti isključivo superkorisnici inače bi sustav
sigurnosti bio narušen. Napomenimo još nekoliko argumenata koje koristi naredba mount.
Ako nije navedena opcija koja vam je potrebna , program mount će je potražiti u datoteci
/etc/fstab.

Argument Opis
-w Stvaranje sustava dat. Sa dozvolom za čitanje i pisanje

-r Stvaranje sustava dat. Sa dozvolom samo za čitanje

-n Stvaranje sustava bez zapisivanja u datoteku /etc/mtab

-t type Određivanje vrste sustava datoteke(ext2,msdos,nfs itd)

-a Stvaranje svih sustava dat. Koji se nalaze u /etc/fstab

-o popis_opcija Osim ovih opcija možete koristiti i dodatne!Vidi


stranicu man mount
Tablica 1. Argumenti naredbe mount

Primjer mountanja FAT particije:

Prvo moramo vidjeti kako je označena particija koju hočemo dići! U zavisnosti o tome na
koju smo granu stavili hard disk, označavanje diska može biti sljedeće:
hda - primarni master
hdb – primarni slave
hdc – sekundarni master
hdd – sekundarni slave
Isto tako potrebno je znati i «broj» particije na disku koju hoćemo montirati. To ćemo
najlakše saznati ako u konzoli otipkamo sljedeće: cat /proc/partitions
Dobiti ćemo listu particija zajedno sa veličinama(izraženo u blokovima) i brojem particije.
Kada znamo koje particije želimo montirati, trebamo to ubaciti u /etc/fstab fajl ,možete ga
editirati sa vi editorom na način da utipkate vi fstab. Otvorit će se nešto slično ovome:
/dev/hda7 swap swap pri=1 0 0
/dev/hda6 /ext2 defaults 1 1
/dev/hda5 /boot ext2 defaults 1 1

326 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

none /dev/pts devpts gid = 5, mode = 620 0 0


none /proc proc defaults 0 0

Potrebno je ubaciti tekst za win particije , nešto ovako:


/dev/hda7 swap swap pri=1 0 0
/dev/hda6 /ext2 defaults 1 1
/dev/hda5 /boot ext2 defaults 1 1
/dev/hda1 /win/c vfat defaults 1 0
/dev/hda8 /win/d vfat defaults 1 0
none /dev/pts devpts gid = 5, mode = 620 0 0
none /proc proc defaults 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 kažemo Linuxu da montira win
particije.Ti direktoriji moraju postojati inače ćemo dobiti poruku da je montiranje
nemoguće(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 ručnog mountanja bilo kojih particija ili uređaja(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 kaže montiraj, -t ukazuje Linuxu na fajl sistem particije, vfat govori da je to
FAT a može biti i iso9660 u slučaju da se montira cdrom uređaj itd. /dev/hda1 govori da se
mounta hard disk br. 1 a možemo pisati i /dev/cdrom ako hočemo mountati cd-rom uređaj.
/win/c direktori gdje hočemo montirati particiju a obično se koristi /mnt kao mount
point(/mnt/win/c).
A odmontiravanje ide ovako:
umount /dev/hda1.

327 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

328 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Primjer mountanja NTFS particija:

#Mountanje NTFS particija


cd /mnt
mkdir windows
fdisk -l
#vidite gdje vam se nalazi particija sa NTFS
#to bi bilo , ovako
Disk /dev/hda: 41.1 GB, 41174138880 bytes
255 heads, 63 sectors/track, 5005 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 4623 5005 3076447+ f Win95 Ext'd (LBA)
/dev/hda4 * 1 4622 37126183+ 7 HPFS/NTFS
/dev/hda5 4623 5005 3076416 83 Linux
Partition table entries are not in disk order
zatim odete na /etc/fstab , kucate u liniju ispod :
/dev/hda4 /mnt/windows ntfs rw 1 0
umjesto hda4 , stavite particiju gdje se nalazi windows
zatim editirajte /etc/mtab i unesete ispod u sljedecu liniju :
/dev/hda4 /mnt/windows ntfs rw 1 0

#izađete iz editora (nakon sto snimite promjene)

Nastavak :
mount /mnt/windows Kasnije koristite samo "mount /mnt/windows" U ranijim verzijama
distribucija pisanje po ntfs particijama nije bilo dozvoljeno iz sigurnosnih razloga (zbog
nestabilnosti dijela kernela koji se brine o pisanju).

Napomena editirati možete na način da otvorite u vi editoru na način vi /etc/fstab i zatim


pritisnite tipku «insert» unesete promjene i spremite klikom na «escape» zatim na «:» i
unesete «wq» te pritisnete enter.

329 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Primjer mountanja usb-stick/mp3-player sticka:

Da bi smo mogli uopće koristiti USB potrebno je saznati koji driver je potreban za sam
USB.To će mo naći tako da otkucamo naredbu dmesg ili lspci i dobijemo nešto slično ovome:
otipkajmo:
localhost @root $ lspci –v | grep USB
00:07.2 USB Controller: VIA Technologies, Inc. USB (rev 1a) (prog-if 00 [UHCI])
Subsystem: VIA Technologies, Inc. USB Controller
00:07.3 USB Controller: VIA Technologies, Inc. USB (rev 1a) (prog-if 00 [UHCI])
Subsystem: VIA Technologies, Inc. USB Controller

Iz ovog gore vidimo da nam je potreban UHCI driver u kernelu za core USB-a, a treba nam i
driver za massstorage i SCSI driver...
Kernel dio! Ako nemate kernel-sorce instaliran na vaše računalo instalirajte ga sa
instalacijskog cd-a ili downlodajte svoju verziju s interneta.
Evo kratkod primjera instalacije s cd-a.
cd /mnt/cd_rom
rpm –i kernel-sorce 2.6.8.1 (ili koji već imate...)
i potvrdite s enterom sve do kraja!
Ukoliko imate instaliran kernel dio ovo gore preskočite!
Otipkajmo sljedeće naredba:
cd /usr/src/linux
make menuconfig
Zatim odaberite:
Device drivers SCSI device support
<M>SCSI disk support
zatim,
USB support
<M>UHCI HCD(most Intel and Via) support
<M>USB Mass Storage support
i na kraju
File systems DOS/FAT/NT Filesystem

330 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

<M>MSDOS fs support
<M>VFAT (Windows-95) fs support

Kad ste sve odabrali spremite promjene i otipkajte sljedeće:


make modules
make modules_install
Ako je sve prošlo OK pozovemo te module:
modprobe usb-storage
modprobe vfat
modprobe msdos
modprobe usb-uhci
modprobe sd_mod
Priključimo usb–stick i kucajte dmesg...
Trebali bi dobiti nešto poput ovoga:
usb 1-2: new full speed USB device using address 3
scsi0 : SCSI emulation for USB Mass Storage devices
Vendor: Model: Rev:
Type: Direct-Access ANSI SCSI revision: 02
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 znači 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 sljedeće:
localhost@root $ df –h

331 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

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 potvrđuje da je naš usb uspješno montiran.

Fstab(file system table) i mtab(mounted filesystem table)

Kao što smo već mogli vidjeti u gornjim primjerima smo editirali datoteku fstab.Datoteku
fstab čitaju mount , umount ,swapon i fsck naredbe, zato je bitno da su u njoj točni podatci.
Naredbe mount i umount koriste datoteku fstab da bi znale što želimo da uradimo ako smo na
komandnoj liniji zadali samo ime particije ili točku povezivanja. Pogledajmo kako bi mogla
izgledati datoteka fstab:

/dev/sda1 /boot ext2 defaults 1 1


/dev/sda5 /home ext2 defaults 1 2
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
/dev/sdb7 swap swap defaults 0 0
LABEL=/usr /usr ext2 defaults 1 2
LABEL=/var /var ext2 defaults 1 2
Itd.....................

U svakom redu ima po šest polja razdvojenih razmacima. Svaki red opisuje po jedan sistem
datoteka. Polja su obično poravnata zbog bolje preglednosti ali to nije obavezno. Prvo polje
prikazuje ime uređaja ili oznake koja mu je pridružena naredbom e2label(LABEL=oznaka).
Datoteka fstab može sadržavati veze do udaljenog sistema i u tom slučaju prvo polje sadrži
NFS putanju. Zapis server: /resurs upućuje na direktorij /resurs na računalu serveru. U
drugom polju zadaje se točka povezivanja, a treće polje označava tip sistema datoteka. Točno
ime tipa koristi se kako bi se raspoznali određeni sustavi datoteka u ovisnosti od konfiguracije
sistema. Četvrto polje sadržava opcije za povezivanje(po defaultu je rw, za čitanje i upis).

332 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Peto polje se obično ne koristi, a u njemu je zadana učestalost ispisa koja se može 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 moguće , tako da se ne zadaje ista vrijednost za dva sustava datoteka koji
su na istom disku jer će pomjeranje glave naprijed i nazad znatno pogoršati performanse.
Samo sustavi datoteka na odvojenim diskovima ispituju se paralelno.
Sada koristeći 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 obično
izvršava iz pokretačkih skripti u toku podizanja sistema. Operator –t ograničava tu operaciju
na sisteme datoteka određenog 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 sadržaj datoteke mtab. Isto tako ako želimo nešto 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 potraži dodatni argument koji
ako ne postoji jednostavno dobijemo poruku da se specificirani filesystem ne može
odmontirati jer nije montiran. Važno je napomenuti da sustav datoteka ne može biti
odmontiran jedino ako je zauzet. Ako pokušamo odmontirati takav filesystem dobit ćemo
poruku o zauzeću. Da bi sustav bio zauzet dovoljno je da user promijeni direktorij naredbom
„cd“ i da taj filesystem bude zauzet. Naredbom # cat /etc/mtab možemo vidjeti sadržaj
datoteke mtab-a.

333 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

SAMBA

Uvod

U ovom dijelu opisano je instaliranje, podešavanje i korištenje paketa Samba. Pomoću sambe
možemo učiniti sljedeće:

• Dijeliti Linux sustave datoteka s Windows operativnim sustavima


• Dijeliti sustave datoteka iz operativnih sustava Windows s Linuxom
• Dijeliti pisač koji radi u okružju Windowsa s Linuxom
• Dijeliti pisač spojen na Linux računalo s Windowsima

Samba je protokol koji koriste Microsoftovi operativni sustavi za dijeljenje datoteka i pisača.
Tvrtke Microsoft i Intel su 1987. god. razvile protokol SMB(Server Message Block) ,a
Andrew Trigdell je prilagodio sustav raznim UNIX i Linux računalima.
Samba je danas dobro podržana i stalno se razvija i proširuje funkcionalnost. Nudi stabilan
mehanizam velike snage za integriranje računala pod Windowsom u mrežu pod Linuxom.
Adut sambe je to što je podrebno instalirati jedan paket na jedno računalo pod Linuxom, a na
strani Windowsa nije potreban dodatni softwer pod uvjetom da je računalo pod Windowsima
konfigurirano za rad u „Microsoft mreži“.

Instalacija i konfiguriranje Sambe


Samba se isporučuje uz skoro sve novije distribucije Linuxa(SuSE , Red Hat, Debian,
Mandrake...) Zakrpe se mogu naći na www.samba.org. Prvo trebamo izmjeniti datoteku
smb.conf kako bi rekli Sambi kako će se ponašati. U ovoj datoteci se navode direktoriji i
pisači koji se zajednički koriste, ovlasti i opći parametri Sambe. Napomenimo da Samba
osigurava veliki stupanj sisurnosti ali samo pod uvjetom da je ispravno iskonfigurirana. Dvije
stvari koje treba srediti kako bi osigurali osnovni nivo sigurnosti su:

334 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

• U datoteci smb.conf računala definiraju koji klijenti mogu pristupati resursima preko
Sambe. U datoteci treba da se nalaze samo IP adrese(ili rasponi adresa) koji tu trebaju
biti.
• pomoću zaštitne barijere(firewall) s filtriranjem paketa blokirati pristup TCP
priključcima koje koristi CIFS s Interneta. To su TCP priklj. od 137 – 39.

Ovo je primjer cjele datoteke smb.conf za jednostavnu mrežu:


[global]
# workgroup = Ime NT domena ili ime radne grupe
workgroup = MojaGrupa

#Navodi računala koja mogu da pristupaju objektima preko Sambe


#Ovdje je to dopušteno samo računalima na dvije mreže klase C
host allow = 192.168.1 192.168.2

#Automatsko učitavanje liste printera iz datoteke


printcap name = /etc/printcap
load printers = yes

#Koristi se zsebna zapisnička datoteka za svako računalo , granica veličine 500K za svaku
log file = /var/log/samba/log.%m
max log size = 500
#definiranje načina zaštite resursa. Većina korisnika želi sigurnost na nivou korisnika.
#Detalji se mogu naći 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 prouči spomenuta dokumentacija
;encrypt password = yes
;smb passwd file = /etc/smbpasswd

335 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

#Većini korisnika ova opcij daje bolje performanse.Proučiti datoteku speed.txt u stranicama
#priručnika
socket options = TCP_NODELAY

#Djeljenje matičnih direktorija korisnika.


[homes]
comment = Home Directories
browseable = no
writable = yes

#Djeljenje svih pisača


[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes

#Djeljenje određenog direktorija


[devel]
comment = Zajednički direktorij prodajnog odjela
path = /devel/shared
public = no
writable = yes
printable = no
create mask 0775

NAPOMENA !
Printeri moraju biti konfigurirani na Linux računalu.
Micanjem komentara „;“ aktiviraju se zakomentirani redovi.

336 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Iz komentara se može vidjeti da korisnici kada se prijave na svoja računala mogu koristiti
matične 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 započinje
imenom odlomka u uglatim zagradama, primjerice odlomak [global]. Unutar svakog
odlomka paratetri se određuju pomoću parova „ime = vrijednost“, primjerice
workgroup=MojaGrupa. Datoteka smb.conf sadrži tri posebna odlomka [global], [homes],
[printers], te jedan ili više korisničkih odlomaka. Odlomak [global] upravlja parametrima koji
se koriste za kompletan smb poslužitelj, a sadrži osnovna podešenja(default)vrijednosti koje
se koriste u drugim odlomcima. Prvi redak odlomka [global] definira radnu grupu kojoj
pripada naše računalo. Isto tako sadrži i mjesto na kojem je definiran sustav za ispis na našem
poslužitelju ,a u sljedećem retku je naznačeno mjesto gdje se nalazi datoteka za podešenje
ispisa.
Odlomak [homes] omogućuje mrežnim klijentima povezivanje s korisničkim početnim
direktorijem na našem poslužitelju, a da pritom nema izravnog zapisa u datoteci smb.conf.
Uputimo li zahtijev za određenom uslugom na poslužitelj samba on će prvo pregledati
datoteku smb.conf i potražiti poseban odlomak koji odgovara traženoj usluzi. Ako ne nađe
odgovarajući zapis u datoteci, program Samba provjerava odlomak [homes]. Ako on postoji,
Samba traži datoteku s lozinkama, a u njoj početni direktorij onog korisnika koji je uputio
zahtijev. Nakon toga će taj direktorij postati dijeljeni direktorij na mreži.
Odlomak [printers] određuje način ispisa u slučaju da u datoteci smb.conf nema posebnih
zapisa koji se odnose na način ispisa. Kao i kod odlomka [homes], ako nije nađen poseban
zapis koji određuje način ispisa na pisač, Samba koristi odlomak [printers] kako bi
korisnicima omogućila pristup pisačima koji su definirani u datoteci /etc/printcap. Parametar
printable možemo podesiti na vrijednost yes i u tom slučaju se zadani pisač može koristiti za
ispis. Parametar guest ok služi za podešavanje mogućnosti ispisa za korisnika koji se prijavio
kao gost.

337 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Dijeljenje direktorija

Nakon što se uspješno postavi poslužitelj Samba, možemo stvoriti posebne dijeljene
direktorije kojima mogu pristupati određene grupe korisnika ili javne direktorije kojima
mogupristupati svi. Pretpostavimo da želimo napraviti direktorij kojem dozvoljavamo pristup
samo određenog korisnika. Trebamo napisati novi odlomak i unjeti potrebne podatke. Zadati
ćemo korisnika, stazu korisničkog direktorija i još neka podešenja:
[davorovdir]
comment = Davorov udaljeni direktorij
path = /usr/local/src
valid users = tomi
browseable = yes
public = no
writable = yes
create mod = 0700
Na ovaj način stvoren je dijeljeni direktorij pod nazivom davorovdir. Staza do direktorija na
lokalnom poslužitelju je /usr/local/src. Kako browsable ima vrijednost yes direktori će se
pojaviti u mrežnom poopisu direktorija, a kako je parametar public postavljen na no moći će
mu pristupati samo korisnik s imenom tomi. Pristup drugim korisnicima možemo omogućiti
tako da ih se navede u parametru valid users.

338 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Provjera datoteke smb.conf


Nakon što smo stvorili datoteku s podešenjima, trebamo je još provjeriti pomoću programa
testparm. Radi se o jednostavnom programu za provjeru datoteke s podešenjima
/etc/smb.conf. Ako program ne nađe greške prilikom izvršavanja možemo koristiti datoteku
smb.conf.
Primjer naredbe za pokretanje programa testparm: testparm [configfile[hostname hostip]]
gdje argument configfile upućuje na mjesto na kojem se nalati datoteka smb.conf . Proizvoljni
parametar hostname hostip upućuje program testparm da provjeri ima li host mogućnost
pristupa servisima koji se spominje u datoteci smb.conf. Sljedi primjer izlaza programa
testparm . Ako je u datoteci smb.conf nađena greška, program testparm će izvjestiti o tome.
#testparm
Load smb config files from /etc/smb.conf
Processingsection „[homes]“
Processingsection „[printers]“
Loaded services file OK.
Press enter to see, a dump of your service definitions
Nakon što pritisnemo enter program će otvoriti pojedini odlomak iz datoteke smb.conf.

Pokretanje samba poslužitelja


Poslužitelj Samba sadrži dva programa-demona: smbd i nmbd. Demon smbd omogućuje
dijeljenje datoteka pisača, a nmbd podršku za NetBIOS.
Da bi pokrenuli/zaustavili poslužitelj Sambu možemo upotrijebiti sljedeću naredbu:
/etc/rc.d/init.d/samba start | stop.

339 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Uporaba programa smbclient


Program smbclien omogućuje korisnicima Linuxa pristup drugim, obično Windows,
računalima. Razlog tome je što ako želimo pristupiti datotekama na drugim računalima,
možemo upotrijebiti razne metode kao što su FTP,NFS i r- naredbe(npr. rpc).
Program smbclient koristi FTP sučelje koje nam omogućuje prijenos datoteka putem mreže na
drugo računalo koje koristi Sambu. Za razliku od NFS-a, program smbclient ne nudi
mogućnost građenja dijeljenog direktorija kao da se radi o lokalnom direktoriju.
Da bismo prenjeli datoteku s jednog na drugo mjesto, moramo se najprije povezati sa
poslužiteljom Samba pomoću sljedeće naredbe:
smbclient '\\WORKGROUP\PUBLIC' –I win.netwharf.com –U tomi
Parametar \\WORKGROUP\PUBLIC određuje servis na udaljenom računalu, odnosno
određeni sustav datoteka ili pisač. Opcija –U omogućuje nam upis korisničkog imena pod
kojim želimo ostvariti vezu. Program Samba će zatražiti da upišemo lozinku i zatim nas
postaviti u prompt smb: \ gdje oznaka \ predstavlja radni direktorij.

Neke naredbe programa smbclient


Naredba Parametri Opis
? or help [command] Nudi pomoć za pojedinu naredbu ili općenito pomoć

! [SHELL COMMAND] Izvršava se određena naredba iz ljuske ili se korisnik


prebacuje u određenu ljusku.
cd [directory] Premješta korisnika na odabrani direktorij na računalu-
poslužitelju.
lcd [directory] Premještanje korisnika na odabrani direktorij na
lokalnom računalu.
Del [files] Brisanje odabranih datoteka na poslužitelju.

mkdir [directory] Stvaranje direktorija na udaljenom računalu

print [file] Ispis odabrane datoteke na udaljenom računalu.

Tablica 1. Prikaz naredbi programa smbclient

340 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Otklanjanje grešaka u Sambi


Sambi obično ne treba mnogo nadzor prilikom rada.Ipak ako se dogodi problem, informacije
se mogu potražiti na dva glavna izvora: zapisničke datoteke za svakog kljijenta i pomoću
naredbe smbstatus. Mjesto na kojem se čuvaju zapisničke datoteke definirano je u datoteci
smb.conf i u tom direktoriju možemo naći po jednu datoteku za svakog klijenta koji je
pokušao uspostaviti vezu. Program smbd skraćuje te datoteke tako da ne pređu zadanu
maximalnu veličinu.

Primjer zapisnika gdje je prikazano uspješno povezivanje i jedna pogrešno otkucana lozinka:
[2004/27/12 19:59:26] smbd/reply.c Rejecting user 'ned' : autentication failed
[2004/27/12 20:05:06] smbd/service.c klum (192.168.1.51) connect to service ned as user
ned (uid =500, gid = 500) (pid 1275)
[2004/27/12 20:10:43] smbd/service.c klum (192.168.1.51) closd connection to service ned
[2004/27/12 20:05:44] smbd/service.c klum (192.168.1.51) connect to service admin as user
ned (uid =500, gid = 500) (pid 1275)

Naredba smbstatus omogućava ispitivanje aktivnih veza i otvorenih datoteka. Te informacije


posebno su korisne prilikom ispitivanja problema sa zaključavanjem (koji korisnik je otvorio
datoteku xy s isključivim pravop čitanja i pisanja?).Prvi odjeljak rezultata nabraja resurse s
kojima se korisnik povezao. Drugi dio sadrži spisak aktivnih zaklučavanja datoteka, a treći
prikazuje korištene resurse programa smbd.

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 Name
--------------------------------------------------------
1275 DENY_WRITE RDONLY EXCLUSIVE+BATCH/home/admin/doc/ips.txt
1275 DENY_NONE RDWR NONE /home/ned/install_notes.txt

Rezultat naredbe smbstatus sadrži prilično dugačke redove koji su ovdje skraćeni zbog
jednostavnijeg prikaza i jasnoće!

341 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Poslje greški u radu, programi pod Windowsima često ostavljaju zaključane datoteke iza sebe
što izaziva probleme prilikom ponovnog pokretanja programa. Može se nasilno otključati
datoteka zaustavljanjem procese smbd koji je zaključao tu datoteku.Nasilno otključavanje
može dovesti do grešaka u datotekama.

Zaključak

Samba programski paket je vrlo moćan alat u slučajevima kada postoji potreba za
međusobnim dijeljenjem računalnih resursa između računala sa instaliranim Linux i Windows
operativnim sustavima. S obzirom na sve češće situacije u kojima se unutar iste računalne
mreže intenzivno koriste računala sa instaliranim različitim vrstama i inačicama operativnih
sustava (tipično Linux i Windows, ali nisu isključeni niti ostali operativni sustavi), snaga
ovog programskog paketa dolazi do izražaja. Naime, Samba paketom omogućava se
međusobno dijeljenje diskovnog prostora (engl. shares), zatim pisača, pa čak i serijskih
portova između različitih operativnih sustava, što ovaj programski paket čini gotovo
neizbježnim izborom u 'mješovitim' radnim okolinama. Velika prednost Samba paketa leži u
činjenici da Samba može zamijeniti Windows poslužitelje potrebne za uspostavu lokalne
mreže (WINS poslužitelj i kontrolor domene). Cijene Windows poslužitelja su relativno
velike dok se Samba distribuira besplatno. Treba uzeti u obzir da se Windows NT poslužitelji
dodatno naplaćuju ovisno o tome koliko je računala u mreži na njih spojeno. Iako Samba
paket još uvijek nema potpunu funkcionalnost NT poslužitelja, on se bez problema može
koristiti u manjim lokalnim mrežama (do 30 računala) kod kojih nema potrebe za pomoćnim
WINS poslužiteljem i pomoćnim kontrolorom domene koje Samba još uvijek ne podržava.
Samba WINS poslužitelj i kontrolor domene rade zadovoljavajuće na računalu sa P166
procesorom i 128MB RAM-a što su puno manji zahtjevi od onih koje nameće Windows NT
operacijski sustav. Može se zaključiti da je Samba dobra (i jeftinija) zamjena za Windows NT
poslužitelje u malim lokalnim mrežama kao što su SOHO mreže.

342 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Branimir Živković

AWK & SED

343 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

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
inačica programa napravila je programski jezik moćnijim, predstavlja korisnički definirane
funkcije, višestruki ulazni sljedovi, izračun regularnih izraza.
Ta nova inačica postala je uglavnom dostupna sa Unix System V Release 3.1. izdanjem.
Inačica u System V Release 4 izdanju dodaje neka nova svojstva i ispravlja ponašanje u nekim
od ‘tamnih strana’ jezika.
Specifikacija za awk u POSIX Command Language and Utilities standardu dodatno je
pročistila 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 također pridonio svojim dijelovima
koda. 1988 i 1989 godine, David Trueman temeljito prerađuje gawk kako bi bio
kompatibilan sa novijim awk programom. U preradi mu je pomogao Arnold Robbins.
Tekući razvoj fokusiran je na popravcima pogrešaka, poboljšanje izvedbe, poklapanje
sa standardima, i povremeno, nova svojstva.

344 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

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
korisnički definiranih funkcija i pravila u obliku:
pattern {action}

Svako pravilo specificira uzorak (eng. pattern) koji tražimo i akciju (eng. action) koja će
se izvršiti kada pronađemo uzorak. Uzorak je regularan izraz, poseban uzorak, raspon uzorka,
ili bilo koji aritmetički izraz.

BEGIN je poseban uzorak koji služi kao oznaka akcije koju awk izvodi prije čitanja bilo
kojeg ulaznog zapisa.
END je poseban uzorak koji služi kao oznaka akcije koju awk izvodi nakon što su
pročitani svi ulazni zapisi.

Možete zadati raspon uzorka kao:

pattern1,pattern2

Ovaj raspon uspoređuje sve retke od retka koji se slaže sa prvim uzorkom pattern1 do
retka koji se slaže sa drugim uzorkom pattern2, uključivo sa tim uzorcima. Ako izostavite
uzorak, ili ako brojčana vrijednost uzorka nije nula, awk izvodi akciju koja daje rezultat za taj
redak.
Akcija je slijed navoda okončan znakom točka zarez (;), znakom za novi redak, ili
zatvorenim vitičastim 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) može biti i slijed naredbi ograđen vitičastim zagradama.

# if statement
if (condition)
statement

345 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

[else
statement]

# while loop
while (condition)
statement

# do-while loop
do
statement
while (condition)

# for loop
for (expression1; condition; expression2)
statement

Naredba for je ekvivalentna sljedećem:

expression1
while (condition){
statement
expression2
}

Naredba for može biti u obliku:

for (i in array)
statement

awk izvodi naredbu statement za svaki element u nizu array.

346 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Naredba

break

odmah izlazimo iz for ili while naredbe.

continue

zaustavlja tekuće ponavljanje for ili while naredbe i počinje slijedeće ponavljanje (ako
takvo postoji).

Next

završi sve obrade za tekući ulazni zapis i odmah započinje obradu slijedećeg 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 završava. awk postavlja exit status programa nabrojčanu
vrijednost koju sadrži izraz expr. Ako izostavite izraz (expr), exit status je 0.

return [expr]

izlazimo iz funkcije. Ako specificirate izraz expr, funkcija vraća vrijednost izraza expr
kao svoj rezultat, inače, rezultat funkcije nije definiran.

delete array[i]

obrišemo element i iz zadanog niza array.

347 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Postoje dva načina da se specificira awk program:


a. Direktno na naredbenom retku. U tom slučaju, program je argument jednog
naredbenog retka, obično ograđen apostrofima (') kako bi spriječili shell u nastojanju da ga
proširi.
b. Koristeći –f prog opciju.

Program možete 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 možete postaviti na neku početnu vrijednost koristeći:


var=vrijednost

Na naredbenom retku možete naizmjenično postavljati početne vrijednosti varijabli i


imena ulaznih spisa. awk obrađuje postavljanje početnih 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 pročita ulazne podatke iz f1 i


postavlja vrijednost varijable a na 2 prije nego što pročita ulazne podatke iz f3.

Postavljanje početne vrijednosti varijable koje se pojavljuje prije prve datoteke u


naredbenom retku izvodi se odmah nakon početne akcije (BEGIN). Postavljanje početne
vrijednosti varijable koje se pojavljuje nakon zadnje datoteke izvodi se neposredno prije
posljednje akcije (END).

348 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Opcija -v dozvoljava nam da dodijelimo vrijednost varijable prije početka izvođenja


awk programa (to je prije početne akcije - BEGIN).
Npr.
awk -v v1=10 -f prog datafile

awk dodjeljuje varijabli v1 pripadajuću vrijednost prije početne akcije (ali nakon
standardnog dodjeljivanja vrijednosti ugrađenim (eng. built-in) varijablama kao što su FS (niz
znakova za razdvajanje polja) i OFMT, te ugrađene varijable imaju posebno značenje za
awk).
awk dijeli ulaz na zapise. Po standardu, zapise razdvajaju znakovi za prijelaz u novi red.
Ako želite, možete specificirati neki drugi znak za razdvajanje zapisa.
awk slijedno uspoređuje 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 (obično znakovi za razmak (eng. blank), znakovi novog retka (eng. newline), ili
vodoravne oznake tabulatora (eng. horizontal tab characters)) razdvajaju polja.
Moguće je specificirati neki drugi niz znakova (eng. string) za razdvajanje polja
koristeći
–F ere opciju.

Možete izostaviti dio awk pravila koji se odnosi na uzorak ili dio koji se odnosi na
akciju ali nije moguće izostaviti oboje. Ako izostavite uzorak, awk izvodi akciju za svaki
ulazni zapis (to znači 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

OPCIJE

-F ere

specificira produžen regularni izraz koji služi za odvajanje polja.

-f prog

vraća awk program koji sadrži datoteka prog. Ako se na komandnom retku više
puta pojavi opcija –f, kao rezultat dobijemo program koji je konkatenacija svih
specificiranih programa.

-v var=value

dodjeljuje vrijednost varijabli var prije početka izvođenja programa. Ovu opciju
možete specificirati puno puta.

350 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

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 podvučenih crta koji započinje slovom ili
podvučenom crtom.
awk dijeli ulaz na zapise, a zapise dijeli u polja. Specifikacije polja imaju oblik $n gdje
n kreće od 1 do NF (ugrađena varijabla koja sadrži informaciju o broju polja u tekućem
zapisu). Takva specifikacija polja odnosi se na nto polje tekućeg ulaznog zapisa. $0 (nula)
odnosi se na čitav tekući 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 upućuje na niz elemenata.
Svaki takav izraz može sadržavati bilo koji niz znakova. Za višestruke izraze indeksa, awk
ulanča vrijednosti niza znakova svih izraza i odvaja ih oznakom SUBSEP. Početna 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 početnu vrijednost.
Vrijednost varijable koja nije postavljena na neku početnu 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 odgovarajuću brojčanu vrijednost; awk koristi vrijednost koja odgovara
kontekstu.
Kad pretvaramo brojčanu vrijednost u niz znakova odgovarajuće vrijednosti, awk
provodi radnju ekvivalentnu pozivu funkcije sprintf . Ako upotrebljavate niz znakova u
kontekstu brojke, i awk ne može interpretirati sadržaj niza znakova kao broj, tretirat će
vrijednost tog niza znakova kao broj nula.

351 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Brojčane konstante su sljedovi decimalnih znamenki.


Konstante sastavljene od niza znakova su u navodnicima, npr. “a literal string”.
Konstantan string može sadržavati slijed znakova za prekid koji su prikazani u tablici 1.

Escape Character

\a audible bell
\b backspace
\f formfeed
\n newline
\r carriage return
\t horizontal tab
\v vertical tab
\ooo octal value ooo
\xdd hexadecimal value dd
\/ slash
\" quote

Tablica 1. Konstantan string za prekidni niz u programskom jeziku awk.

awk podržava proširene regularne izraze. Kad awk čita program, prevodi znakove
ograđene slash znakovima (/) kao regularne izraze.
Na primjer:

/foo.*bar/{print $1,$3}

rezultat ove naredbe bit će ispis svih redaka koji sadrže niz znakova foo , te nakon toga
bilo koji niz znakova koji završava nizom znakova bar.

awk određuje uvjet indeksa u nizu na slijedeći način:

index in array

352 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

gdje index izgleda kao izraz ili (izraz,…,izraz). Ovaj uvjet se izračuna kao 1 ako je
vrijednost niza znakova predstavljena sa index ujedno i indeks u nizu, inače se uvjet izračuna
kao 0 (nula). Na taj način pouzdano znamo postoji li taj element niza.

Tablica simbola

Tablici simbola možete pristupiti preko ugrađenog niza SYMTAB.

SYMTAB[expr]

je isto što i varijabla imenovana kao rezultat izračuna izraza. Na primjer:

SYMTAB["var"]

je sinonim za varijablu var.

353 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

OPERATORI

Unarni operatori su +, -, ++ i --. Operatore ++ i -- možete koristiti kao postfiksne ili


kao prefiksne operatore. Binarni aritmetički operatori su +, -, *, /, % i ^.

Uvjetni operator

expr ? expr1 : expr2

Izraz expr mora kao rezultat dati broj. Ako je taj broj različit od nule izračunava se izraz
expr1 i njegov rezultat je rezultat cijelog izraza. Ako je taj broj jednak nuli izračunava 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 sadrži barem jednu znamenku. awk
interpretira svaki string ili varijablu na desnoj strani operatora ~ ili !~ kao dinamički
regularni izraz.
Relacijski operatori su <, <=, >, >=, == i !=. Kad su oba operanda koje uspoređujemo
brojke, awk uspoređuje njihove brojčane vrijednosti, inače ih uspoređuje kao string
vrijednosti. Operand je brojka ako je to cijeli broj (eng. integer) ili broj sa pomičnim 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 izračuna izraza koristi se
Short Circuit Evaluation.

354 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Logički ‘i’ operator


&&
prvo se izračunava lijevi operand, ako je lijevi operand kao rezultat dao nulu, desni
operand se ne izračunava.

Logički ‘ili’ operator


||
Prvo se izračunava lijevi operand, ako lijevi operand kao rezultat nije dao nulu, desni
operand se ne izračunava.

Varijabli možete dodijeliti vrijednost sa

var=expr

Ako je op binarni aritmetički operator, naredba

var op= expr

je ekvivalentna naredbi

var = var op expr

razlikuju se u tome što se var izračunava samo jednom.

355 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

ARGUMENTI NAREDBENOG RETKA

awk postavlja ugrađenu varijablu ARGC na broj argumenata naredbenog retka.


Ugrađen niz ARGV ima elemente indeksirane znamenkama od nula do ARGC-1, niz daje
argumente naredbenog retka onim redom kojim su se pojavili u naredbenom retku.

ARGC count i ARGV vector ne sadrže opcije naredbenog retka (započete sa -) ili
program datoteku (koja slijedi nakon -f). Oni sadrže ime naredbe, naredbe za inicijalizaciju u
obliku

var=vrijednost

i imena datoteka sa ulaznim podacima.

awk zapravo kreira ARGC i ARGV prije nego što učini bilo što drugo. Zatim prolazi
kroz ARGV i obrađuje argumente. Ako je argument vektora ARGV prazan string, awk ga
izostavlja. Ako sadrži znak jednakosti (=), awk to interpretira kao dodjeljivanje vrijednosti
varijabli. Ako je to znak minus (-), awk odmah čita ulazne podatke sa standardnog ulaza dok
ne naiđe na kraj datoteke; inače, awk tretira argument kao ime datoteke i čita ulazne podatke
iz te datoteke sve dok ne dosegne kraj datoteke.

356 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

ULAZNI PODACI

awk dijeli ulazne podatke na zapise (eng. records). Znak za razdvajanje zapisa odvaja
svaki zapis od onog slijedećeg. Vrijednost ugrađene varijable RS daje tekući znak za
razdvajanje zapisa, standardno započinje 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) grouping
$i V[a] field, array element
V++ V— increment, decrement
++V --V
A^B exponentiation
+A -A !A unary plus, unary minus, logical NOT
A*B A/B A%B multiplication, division, remainder
A+B A-B addition, subtraction
AB string concatenation
A<B A>B A<=B comparisons
A>=B A!=B A==B
A~B A!~B regular expression matching
A in V array membership
A && B logical AND
A || B logical OR
A?B:C conditional expression
V=B V+=B V-=B assignment
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

357 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

awk dijeli zapise u polja. String za razdvajanje polja, određuje ga vrijednost ugrađene
varijable FS, razdvaja svako polje od slijedećeg. Možete postaviti određeni string za
razdvajanje polja tako da dodijelite neku vrijednost varijabli FS, ili tako da specificirate -F
ere opciju na naredbenom retku. Varijabli FS možete dodijeliti regularni izraz. Na primjer:

FS = "[,:$]"

kaže da znak zareza, dvotočke ili dolara može razdvajati polja.

Slijedeća lista ugrađenih varijabli omogućuje različite dijelove informacija o ulaznim


podacima.

NF broj polja u tekućem zapisu


NR broj ukupno pročitanih zapisa
FILENAME ime datoteke koja sadrži tekući zapis
FNR broj zapisa pročitanih iz tekuće datoteke

getline
učita slijedeći ulazni zapis u $0 i razdijeljuje zapis u polja. Varijable NF, NR i FNR su
prikladno postavljene.

getline var
učita slijedeći ulazni zapis u varijablu var. awk ne razdijeljuje zapis u polja (što znači
da se tekuća $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 učita slijedeći
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 učita slijedeći zapis iz
te datoteke u varijablu var, ali ga ne razdijeljuje u polja.

358 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

expr | getline
interpretira vrijednost string izraza expr kao naredbeni redak koji treba izvršiti, awk
proslijedi izlazne podatke te naredbe u funkciju getline i učita ih u $0 na sličan način kao
getline <expr.

expr | getline var


izvršava vrijednost string izraza expr kao naredbu i prosljeđuje izlazne podatke te
naredbe u funkciju getline. Rezultat je sličan kao getline var <expr.

Možete imati samo ograničen broj otvorenih polja i kanala (eng. pipe) u isto vrijeme.
Polja i kanale možete zatvarati tijekom izvršavanja koristeći 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 uspješno zatvori kanal, vraća broj nula. Ako zatvarate polja i
kanale koji vam više nisu potrebni, možete koristiti bilo koji broj polja i kanala tijekom
izvršavanja awk programa.

359 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

UGRAĐENE ARITMETIČKE FUNKCIJE

atan2(expr1, expr2)

vraća arctangent od expr1/expr2 u rasponu od –pi do pi.

exp(expr), log(expr), sqrt(expr)

vraća eksponencijalnu vrijednost, prirodni logaritam, i drugi korijen od brojčane


vrijednosti izraza expr.

int(expr)

vraća onaj dio koji je cijeli broj (eng. integer)od brojčane vrijednosti izraza expr.
Ako izostavite (expr), funkcija vraća onaj dio koji je cijeli broj od $0.

rand()

vraća slučajan broj s pomičnim zarezom u rasponu od 0 do 1.

sin(expr), cos(expr)

vraća sinus i kosinus od brojčane vrijednosti izraza expr (interpretirane kao kut u
radijanima).

srand(expr)

postavlja početnu točku rand() funkcije na vrijednost cijelog broja zadanog


izrazom expr. Ako izostavite (expr), awk koristi točno vrijeme kao standardnu
početnu točku.

360 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

UGRAĐENE STRING FUNKCIJE

n = sub(regexp, repl, string)

U nekoj string vrijednosti traži prvi podniz znakova koji se poklapa sa proširenim
regularnim izrazom regexp, te zamjenjuje taj podniz sa nizom znakova zadanim sa repl. awk
zamijeni svaki znak ampersand (&) u repl nizu znakova sa podnizom znakova string
vrijednosti koji se poklapa sa regexp. Takvo posebno ponašanje možete spriječiti tako da
stavite znak backslash (\) ispred znaka ampersand. Ako izostavite argument string, funkcija
sub() će umjesto njega koristiti tekući zapis. Funkcija sub() vraća broj nula ako nije izvršena
zamjena, te broj jedan ako je zamjena izvršena.

n = gsub(regexp, repl, string)

Radi na isti način kao funkcija sub(), osim što funkcija gsub() zamijeni svaki podniz
koji se nalazi u string vrijednosti i poklapa se sa izrazom regexp. Funkcija gsub() vraća broj
izvršenih zamjena.

pos = index(string, str)

Vraća mjesto prvog pojavljivanja izraza str u string vrijednosti. Ako funkcija index() ne
pronađe izraz str u string vrijednosti, vratit će broj nula.

len = length(expr)

Vraća broj znakova u string vrijednosti izraza expr. Ako izostavite (expr), funkcija
koristi referencu $0. Zagrade oko izraza expr su neobavezne.

n = ord(expr)

Vraća integer vrijednost prvog znaka u string vrijednosti izraza expr.

361 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

str = sprintf(fmt, expr, expr...)

Formira listu izraza expr, expr... koristeći specifikaciju string vrijednosti fmt, te vraća
formatiran string. String fmt se sastoji od specifikacija pretvorbi koje pretvaraju i dodaju
slijedeći izraz expr u string, to su najčešće znakovi koje funkcija sprintf() dodaje u string. Te
specifikacije pretvorbi su slične onima koje koristimo po ANSI C standardu.
Specifikacije pretvorbi su u obliku

%[-][0][x][.y]c

gdje je
- poravna polje po lijevoj strani; default je poravnavanje polja po desnoj
strani
0 nula na početku ispisuje broj sa nulom na početku
x je minimalna širina polja
y je preciznost
c je znak za pretvorbu

Za string, preciznost je najveći broj znakova koji trebaju biti ispisani iz string
vrijednosti. Za broj, preciznost je broj znamenki koje trebaju biti ispisane sa desne strane
decimalne točke kada se ispisuje broj sa pomičnim zarezom (eng. floating point). Ako je x ili
y znak zvjezdica (*), najmanja širina polja ili preciznost je vrijednost slijedećeg izraza expr u
pozivu funkcije sprintf().

Znak za pretvorbu c je jedan od slijedećih:


d decimal integer
i decimal integer
o unsigned octal integer
x,X unsigned hexadecimal integer
u unsigned decimal 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

c single character of an integer value; first character of string


s string

n = split(string, array, regexp)

Razdijeli string u polja. Izraz regexp je regularni izraz koji određuje niz znakova za
razdvajanje polja i namijenjen je za ovu operaciju. Funkcija raspoređuje odvojena polja u
elemente niza array; indeksi niza počinju od 1. Funkcija split() vraća broj polja u koja je
podijelio string vrijednost (taj broj je ujedno i najveći indeks tog niza). Izraz regexp dijeli
zapis na isti način kao i FS string za razdvajanje polja. Ako izostavite argument regexp,
funkcija split() koristit će tekuću vrijednost varijable FS.

str = substr(string, offset, len)

Vraća podniz znakova iz string vrijednosti koji počinje na mjestu offset i uzima najviše
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 vraća 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 vraća rezultat. Ako
izostavite izraz expr, funkcija toupper() umjesto izraza koristi $0.

363 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

SISTEMSKE FUNKCIJE

status = system(expr)

izvršava string vrijednost izraza expr kao naredbu. Na primjer

system("tail " $1)

poziva naredbu tail, koristeći string vrijednost od $1 kao datoteku koju tail pretražuje.

Korisnički definirane funkcije

Možete definirati svoje funkcije koristeći oblik

function name(parameter-list){
statements
}

Definicija funkcije može se pojaviti na mjestu od pattern {action} pravila. Lista


vrijednosti (eng. parameter-list) sadrži bilo koji broj normalnih (skalarnih) i array varijabli
odvojenih zarezom. Kada pozivate funkciju, awk prosljeđuje 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 vraća onome tko ju je pozvao kada izvrši zadnju naredbu u funkciji ili kada
dosegne eksplicitnu return naredbu. Povratna vrijednost, ako postoji, specificirana je u
return naredbi.

364 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

IZLAZNI PODACI

Naredba print ispiše svoje argumente u jednostavnom formatu. Ako nema argumenata,
ona ispiše tekući 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 odgovarajuće vrijednostiizlaznih podataka. ORS i OFS
su ugrađene varijable i njihove vrijednosti možete 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 pomičnim zarezom. Default vrijednost
varijable OFMT je %.6g; možete promijeniti tu vrijednost tako da varijabli dodijelite neku
drugu string vrijednost. OFMT se primjenjuje samo na brojeve sa pomičnim zarezom (eng.
floating point).
Naredba printf oblikuje svoje argumente koristeći fmt argument. Oblikovanje je isto
kao kod ugrađene funkcije sprintf(). Za razliku od naredbe print, naredba printf ne dodaje
znak za razdvajanje izlaznih podataka automatski, te na taj način omogućuje programu puno
precizniju kontrolu nad izlaznim podacima.
Naredbe print i printf pišu na standardni izlaz. Možete 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 piše izlazne podatke u tu datoteku. Isto tako, ako dodate izraz >>expr,
awk pridodaje izlazne podatke tekućem sadržaju datoteke.
Da bi isključili dvosmislenosti, naredbe kao ovakva

print a > b c

su sintaksno neispravne. Koristite zagrade kako bi izbjegli dvosmislenost.

365 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

SED

Sintaksa naredbenog retka

Sintaksa za pozivanje sed programa ima dva oblika:

sed [-n][-e] `command' file(s)


sed [-n] -f scriptfile file(s)

Prvi oblik dozvoljava vam da specificirate naredbu za obradu na naredbenom retku,


okruženu jednostrukim navodnicima. Drugi oblik dozvoljava vam da specificirate scriptfile,
datoteku koja sadrži sed naredbe. Oba oblika mogu se koristiti istovremeno, i mogu biti
korišteni više puta. Skripta (eng. script) za obradu koji dobijemo kao rezultat je lančanje
naredbi i script datoteka.

Prepoznaju se sljedeće opcije

-n
Ispisuj samo retke specificirane sa p naredbom ili p indikatorom stanja (eng. flag) za s
naredbu.

-e cmd
Slijedeći argument je naredba za obradu. Korisno ako je specificirano više skripti.

-f file
Slijedeći argument je datoteka koja sadrži naredbe za obradu.

Ako je prvi redak skripte “#n”, sed se ponaša kao da je bila specificirana opcija –n.

366 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Sintaksa sed naredbi

Uobičajen oblik sed naredbi je:

[address[,address]][!]command [arguments]

sed kopira svaki redak ulaznih podataka u prostor za uzorak. sed instrukcije sastoje se
od adresa (eng. address) i naredbi za obradu (eng. editing commands). Ako se adresa naredbe
slaže sa retkom u prostoru za uzorak, naredba se primijeni na taj redak. Ako naredba nema
adresu, primjenjuje se na svaki ulazni redak. Ako naredba promijeni sadržaj prostora,
naknadne adrese će se primijeniti na tekući redak u prostoru za uzorak, ne na originalan ulazni
redak.

Adresiranje uzorka

Adresa može biti broj retka ili uzorak, ograđen u slash znakove (/uzorak/). Uzorak
opisujemo koristeći regularne izraze. \n može biti korišten 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 slažu sa tom
adresom. Ako su specificirane dvije adrese odvojene zarezom, naredba će biti primijenjena na
raspon redaka između prve i druge adrese, uključivo sa tim adresama. Neke naredbe
prihvaćaju samo jednu adresu: a, i, r, q, i =.
Operator ! napisan nakon adrese prouzroči da sed primijeni naredbu na sve retke koji
se ne slažu sa adresom.
Vitičaste zagrade ({}) koristimo da bi ugnijezdili jednu adresu unutar druge, ili da bi
primijenili višestruke naredbe na istu adresu.
[/pattern/[,/pattern/]]{
command1
command2
}

367 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

Otvorena vitičasta zagrada mora biti na kraju retka, a zatvorena vitičasta zagrada mora
biti sama u retku. Nakon zatvorene vitičaste zagrade ne smije biti razmaka.

Zamjenski znakovi regularnih izraza za sed

U slijedećoj tablici nalaze se pattern-matching zamjenski znakovi (eng.


metacharacters).

Special Usage
Characters

. Slaže se sa svakim pojedinačnim znakom osim sa newline znakom.


* Slaže se sa bilo kojim brojem (uključivši nula) pojedinog znaka (uključivši
znak specificiran regularnim izrazom) koji se nalazi neposredno prije znaka
zvjezdica.
[…] Slaže se sa bilo kojom klasom znakova zatvorenom između uglatih
zagrada. Svi drugi zamjenski znakovi gube svoje značenje kada su
specificirani kao članovi klase.
\{n,m\} Slaže se sa rasponom pojavljivanja pojedinog znaka (uključivši znak
specificiran regularnim izrazom) koji se nalazi neposredno prije. \{n\} će
se slagati sa točno n pojavljivanja, \{n,\}će se slagati sa baren n
pojavljivanja, i \{n,m\} će se slagati sa bilo kojim brojem pojavljivanja
između n i m.
^ Određuje mjesto regularnog izraza koji slijedi na početku retka. Znak ^ je
poseban jedino kada se pojavi na početku regularnog izraza.
$ Određuje mjesto koje prethodi regularnom izrazu na kraju retka. Znak $ je
poseban jedino kada se pojavi na kraju regularnog izraza.
\ Ne obrađuje poseban znak koji ga slijedi.
\(\) Sprema uzorak ograđen između “\(” i “\)” na posebno mjesto za držanje
podataka. Na taj način, u jedan redak može biti spremljeno do devet
uzoraka. Mogu biti “ponovo pokrenuti” pomoću znaka za izlazni slijed “\1”
do “\9”.

368 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Awk & sed

\n Slaže se sa ntim uzorkom koji je prije toga spremljen pomoću “\(” i “\)”, n
je broj od 1 do 9 i spremljeni uzorci se broje slijeva.
& Ispisuje cijeli tekst koji se slaže kada znak koristimo u string vrijednosti za
zamjenu.
Tablica 3. Pattern-Matching Metacharacters

Osnovne sed naredbe

About the Syntax of sed Commands


Comment
Substitution
Delete
Append, Insert, and Change
List
Transform
Print
Print Line Number
Next
Reading and Writing Files
Quit

Skup sed naredbi sastoji se od 25 naredbi.

369 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Tomislav Grgac

SED

370/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

1. UVOD

1.1. Što je SED?

SED je kratica za Stream EDitor. Napisao ga je sad već pokojni Lee E. McMahon 1973.
i 1974., a nastao je kao logični nastavak na UNIX naredbu GREP. SED je neinteraktivni
editor dizajniran da bude posebno koristan u tri slučaja:
a) kod tekstualne obrade datoteka prevelikih za jednostavno interaktivno editiranje;
b) za editiranje datoteka bilo kojih veličina kada su sekvence komandi editiranja
prekomplicirane za jednostavno tipkanje u interaktivnom modu rada;
c) za efikasno izvođenje višestrukih funkcija globalnog editiranja sa ulaza u jednom
koraku.
Umjesto da mijenjamo datoteku interaktivno pomičući kursor po ekranu (kao kod tekst
procesora), korisnik šalje SED-u skriptu komandi za editiranje plus ime datoteke za editiranje
(tekst za editiranje može također doći kao izlaz iz Pipe-a). U tom smislu SED radi kao filter -
koji briše, dodaje ili mijenja znakove, riječi ili linije teksta. Njegov djelokrug aktivnosti
odnosno primjene ide od malih, jednostavnih promjena do onih vrlo kompleksnih.

1.2. Vrste SED-ova

SED u primjeni se može naći u dvije osnovne kategorije: "besplatni" i komercijalni. a


platforme na kojima se vrti idu od UNIX-a, OS/2, CP/M-a, MSDOS-a i WINDOWS-a.
Pod pojmom "besplatni" ne znači nužno da ga nećete morati platiti već da se baziraju na GNU
općoj licenci te da su po njoj "besplatan software" i da možete dobiti izvorni kod i dalje ga
razvijati. Spomenut ću samo neke od mnogobrojnih verzija SED-a koje se mogu naći na
internetu:
• ssed v3.60
• GNU sed v4.0.5 (i ostale niže verzije)
• BSD (podržava multi-byte znakove)
• HHsed

371/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

2. SINTAKSA I KORIŠTENJE

Sintaksa SED naredbe ima dvije forme:


> sed [options] 'command' file(s)
> sed [options] -f scriptfile file(s)

Prva forma omogućava nam da direktno u komandnoj liniji upišemo naredbe za


editiranje unutar jednostrukih navodnika, dok nam druga omogućava 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 način rada te sintaksu za sve opcije i naredbe od
adresiranja do funkcija te ćemo za svaku dati i stvarni primjer. Primjeri će ići postepeno, od
nekih općih do kompliciranijih, kako ćemo obrađivati pojedine funkcije. Također treba
napomenuti da će u većini primjera ulazi i izlazi iz SED-a biti datoteke, što nipošto ne znači
da su to jedini načini, dapače, u mnogo slučajeva pipe ili preusmjeravanja su jednostavniji,
logičniji, praktičniji, a možda i jedini načini ulaza ili izlaza obzirom na svrhu upotrebe SED-a
ili operacije koje mu slijede ili prethode.

2.1. Način rada

Sed radi na slijedeći način:


- prije bilo kakvog editiranja, sve naredbe za editiranje se skupljaju u formu iz koje se
koriste u fazi izvršavanja;
- naredbe se prevode u redoslijedu kako nailaze, a to je obično i redoslijed kojim će
biti izvršavane u fazi izvršavanja;
- naredbe se izvode jedna po jedna, a ulaz naredbe je izlaz prethodne naredbe;
- svaka linija za editiranje sa ulaza se kopira u prostor uzoraka (pattern space);
- sve naredbe za editiranje se izvršavaju po redu za svaku liniju sa ulaza;
- naredbe za editiranje se primjenjuju za sve linije s ulaza osim ako adresiranjem ne
specificiramo koje linije obrađujemo;
- ako naredba promijeni liniju s ulaza, naredba koja slijedi će se izvršavati na
promijenjenoj liniji, a ne na izvornoj;

372/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

- Izvorna linija ili ulazna datoteka nakon obrade ostaje nepromijenjena jer naredbe za
editiranje mijenjaju kopiju izvorne linije s ulaza. Takva kopija se proslijeđuje na
standardni izlaz, ali se isto tako može preusmjeriti u datoteku.

2.2. Opcije

Sed prepoznaje tri moguće opcije sa komandne linije:


• -n - onemogućava standardni izlaz; prikazuje samo linije specificirane sa
zastavicom (flag) '/p'. Standardno ponašanje 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 ništa:

>sed -n 'command' input

ili možemo tu izlaz te datoteke pipe-om preusmjeriti u sed i također ništa ne ispisati:

>cat input | sed -n 'command'

Idemo sada ispisati, recimo, od 4. do 12. reda:

>sed -n '4,12/p' input

• -e - označava da je slijedeći argument naredba za editiranje; nije potreban osim u


slučaju postojanja višestrukih komandi za editiranje.

Primjer:
Obradit ćemo datoteku "input" sa dvije sed naredbe:

>sed -e 'command1' -e 'command2' input

• -f - označava da je slijedeći argument ime datoteke koja sadrži naredbe za


editiranje.

Primjer:
Obradit ćemo datoteku "input" sa naredbama iz skripte "script te još jednom naredbom nakon skripte:

>sed -f script -e 'command' input

373/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

2.3. Adresiranje

Linije teksta iz datoteke za obradu mogu se pojedinačno selektirati pomoću adresa.


Adresiranje može biti preko broja linije ili kontekstno.

2.3.1 Adresiranje breko broja linije


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 izjednači
sa adresom broja linije. Brojač zbraja kumulativno preko više datoteka s ulaza, odnosno ne
resetira se prilikom otvaranja nove datoteke.
Kao poseban slučaj, sa adresiranjem pomoću 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 našli na 412 liniji sa wc naredbom i
to možemo napraviti na slijedeći način:

> sed '100,412 ostatak naredbe' input

ili kraće koristeći $:

>sed '100,$ ostatak naredbe' input

Pošto interni brojač linija radi kumulativno na više datoteka, evo jednog primjera i za to (uz preusmjeravanje rezultata u datoteku
"output":

>sed '100,$ ostatak naredbe' input1 input2 input3 > output

ili na drugačiji način (s pipe-om), ali s istim učinkom:

>cat input1 input2 input3 | sed '100,$ ostatak naredbe' > output

koristeći znak ! kao negaciju probajmo adresirati sve osim linija između 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 slijedeći način:
• Obični znak (niti jedan od dolje obrađenih), je izraz, i u tekstu traži taj znak;

374/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

Primjer:
Napisat ćemo naredbu koja traži znak A u datoteci input:

>sed '/A/' input

ili riječ UNIX:

>sed '/UNIX/' input

• Znakom '^' označavamo da se traži izraz koji se nalazi na početku linije


(započinje tim izrazom);

Primjer:
Tražimo u datoteci input sve linije koje započinju sa slovom A:

>sed '/^A/' input

ili riječi UNIX:

>sed '/^UNIX/' input

• Znakom '$' označavamo da se traži izraz koji se nalazi na kraju linije (završava
tim izrazom);

Primjer:
Ponovit ćemo prethodni primjer ali ovaj put tražimo pojavu slova A na kraju linije:

>sed '/A$/' input

ili riječi UNIX:

>sed '/UNIX$/' input

Evo jednog zanimljivog primjera - kako naći praznu liniju:

>sed '/^$/' input

• Znak '\n' traži oznaku za novu liniju (ali ne novu liniju u prostoru uzoraka
"pattern space");

Primjer:
Tražimo oznaku za novu liniju:

>sed '/\n/' input

ovakva traženja su korisna kada želimo umetati ili brisati linije

• Znak '.' traži bilo koji znak osim "terminal newline";

375/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

Primjer:
Tražimo liniju koja nije prazna:

>sed '/./' input

• niz znakova u uglatim zagradama '[ ]' traže bilo koji od tih znakova u stringu, a
ako je prvi znak u stringu '^' traže se bilo koji znakovi osim tih navedenih u
uglatim zagradama '[ ]'; sa znakom '-' označujemo niz uzastopnih znakova;

Primjer:
Tražimo liniju koja počinje s brojem:

>sed '/^[0-9]/' input

ili liniju koja ne počinje sa znakom A iza kojeg slijedi znak C - tu možemo primjetiti različito značenje znaka ^, kao početak i kao
negacija:

>sed '/^[^AC]/' input'

probajmo sad tražiti liniju koja završava nekim od znakova između A i K:

>sed '/[A-K]$/' input

• Izraz iza kojeg stoji znak '*' traži bilo koji broj pojava (uključujući nijednu)
izraza koji mu prethodi;

Primjer:
Tražimo znak A iza kojeg slijedi 0 ili više pojava (zaredom) znaka B:

>sed '/AB*/' input

ili liniju koja počinje sa razmacima:

>sed '/^ */' input'

• konkatenacija (spajanje) izraza je opet izraz koji traži konkatenaciju stringova


koji se podudaraju sa komponentama izraza;

Primjer:
Kako bi recimo našli riječ UNIX bez obzira da li je pisana velikim ili malim slovima:

>sed '/[Uu][Nn][Ii][Xx]/'

• izraz unutar sekvence '\ \' ima identičan učinak kao i običan izraz bez te
sekvence, ali ima popratni učinak koji ćemo opisati pod funkcijom 's' i pod
slijedećom točkom;

376/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

• izraz '\(n,m\)' (n i m su brojevi) traži niz pojava znakova koji se traže unutar
sekvence '\ \' napisane prije nje; '\n\)' će tražiti n-tu pojavu; '\n,\)' će tražiti
najmanje n-tu pojavu; '\(n,m\)' će tražiti bilo koju pojavu između n i m;

Primjer:
Printat ćemo samo linije koje sadrže 65 znakova i više

>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 više adresa od
maksimalno dozvoljenih, to će se smatrati greškom.
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
između traženih (adresiranih), uključujući 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 slijedeće podgrupe:
• Funkcije orijentirane na cijelu liniju (Whole-Line Oriented Functions) koje
dodaju, brišu ili mijenjaju cijele linije teksta;
• Zamjenske Funkcije (Substitute Functions) koje traže i mijenjaju regularne
izraze unutar linije;
• Ulazno izlazne funkcije (Input-Output Functions) koje se bave čitanjem i
zapisivanjem linija ili datoteka;

377/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

• Funkcije više ulaznih linija (Multiple input-line functions) koje traže izraze koji
se protežu kroz više linija;
• Funkcije čuvanja i dohvaćanja (Hold and Get Functions) koje omogućavaju
spremanje i učitavanje ulaznog teksta za kasniju upotrebu;
• Funkcije kontrole toka (Flow of Control Functions) koje kontroliraju redoslijed
primjene funkcija;
• Ostale funkcije (Miscellaneous Functions)

2.4.1. Funkcije orijentirane na cijelu liniju (Whole-Line Oriented


Functions)
• d - brisanje linija (delete lines)
Funkcija d briše iz datoteke (ne zapisuje na izlaz) sve linije koje se podudaraju s
njenom adresom. Također ima popratni učinak da se niti jedna druga naredba
neće izvršavati preko obrisane linije. Čim se funkcija izvršila, nova linija se čita
s ulaza i editiranje započinje s prvom naredbom iz skripte.

Primjer:
Obrisat ćemo sve linije koje sadrže riječ UNIX:

>sed '/UNIX/d' input

obrišimo sve linije od prve koja sadrži riječ hello do i uključujući one koja sadrži riječ goodbye (ovdje vidimo primjer dvije adrese):

>sed '/hello/,/goodbye/d' input

obrišimo sad sve prazne linije:

>sed '/^$/d' input

obrišimo sve linije koje započinju s točkom i preusmjerimo u output (točka je specijalni znak i za nju je potrebna escape sekvenca \.):

>sed '/^\./d' input > output

• n - slijedeća linija (next line)


Funkcija n čita slijedeću liniju s ulaza zamjenjujući 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 sadržaj
privremenog buffera koji je prazan):

>sed -e 'n' -e 'G' input

378/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

• a\ <text> - dodavanje teksta (append)


Funkcija a dodaje tekst iz argumenta nakon linije koja je adresirana. Funkcija se
piše na kraju linije, iza nje se piše '\', a tekst koji se dodaje ide u slijedeću liniju.
Ukoliko tekst iz argumenta ide u više 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 izvrše 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 računalima" iza svake linije koja sadrži riječ "Kolegij":

>sed '/Kolegij/a\
>Programski alati na UNIX računalima' 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 počinje s "#":

>sed '/^#/i\
>/*Komentar: ovo je pretprocesorska direktiva*/' input

• c\ <text> - zamjena teksta (change)


Funkcija c briše adresiranu liniju i zamjenjuje je sa tekstom iz argumenta. Poput
finkcija i i a ako postoji više linija teksta s kojim se zamjenjuje, nove linije
moraju biti skrivene sa '\'.
c funkcija može imati dvije adrese te samim time adresirati regiju teksta. Takva
selektirana regija se briše te se umjesto nje umeće tekst iz argumenta (umetanje
se vrši jednom za cijelu regiju, a ne za svaku pojedinačnu liniju iz regije).

379/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

Primjer:
Zamijenit ćemo svaku liniju koja je prazna s linijom koja sadrži 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

2.4.2. Zamjenska funkcija (Substitute Function)


Jedna vrlo važna funkcija mijenja dio linije preko kontekstne adrese.
s<pattern><replacement><flags> - s funkcija zamjenjuje dio linije selektiran uzorkom
<pattern> sa zamjenom <replacement>. Argument <pattern> sadrži uzorak, identičan kao u
kontekstnom adresiranju obrađenom u poglavlju 2.3.2. Jedina razlika je da kontekstne adrese
moraju biti odvojene (delimited) znakom '/', dok argumenti <pattern> funkcije s mogu biti
odvojeni bilo kojim znakom osim znakom za razmak ili novu liniju.

Primjer:
Zamijenit ćemo pojavu teksta "Zgb" sa "Zagreb":

>sed 's/Zgb/Zagreb/' input

ili isto to ali još i tekst "St" sa "Split":

>sed -e 's/Zgb/Zagreb/' -e 's/St/Split/' input

probajmo sada maknuti sve praznine na početku linije:

>sed 's/^ *//' input

Po defaultu će samo prvi niz znakova koji se podudara s uzorkom biti zamijenjen, ali i
tome se može doskočiti (vidi flag g ispod).
<Replacement> nije uzorak, odnosno svi posebni znakovi koji se upotrebljavaju kod
uzorka, nemaju specijalno značenje. 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 računalima" koristeći specijalni znak & (primjetimo da ne moramo
koristiti escape sekvence za navodnike):

>sed 's/UNIX/"Programski alati na & računalima"/' input

380/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

• \d - (d je jednoznamenkasti broj) bit će zamijenjen sa d-tom pojavom znakova


koji se traže 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 sadrži izraz "alati programski", regularni izraz "hvata" svaku od podgrupa, dok zamjenski izraz \2\1
zamjenjuje redoslijed grupa i producira izraz "programski alati"

Argument <flags> može sadržavati slijedeće zastavice (flag-ove):


• g - zamjenjuje <replacement> argument za sve pojave argumenta <pattern> u
liniji. Nakon uspješne zamjene, potraga za slijedećom instancom argumenta
<pattern> počinje iza prethodno umetnutog niza znakova.

Primjer:
Zamijenit ćemo svaku pojavu teksta "password" sa "xxxxxxxx" između prve i 15 linije:

>sed '1,15 s/password/xxxxxxxx/g' input

• n - (n je broj između 1 i 512) zamjenjuje <replacement> argument za n-tu


pojavu argumenta <pattern> u adresiranoj liniji.

Primjer:
Zamijenit ćemo treću 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 uspješno


obavljena. Tu možemo primjetiti da ako postoji više s funkcija koje imaju p
zastavicu (flag), koje uspješno izvedu zamjenu na istoj liniji s ulaza, tada ćemo
na izlaz dobiti više kopija obrađene linije - po jednu za svaku uspješnu zamjenu.

Primjer:
Ako naša input datoteka sadrži tekst:
>Prva linija
>Dobro more Dobro jutro
>treća linija

tada primjenom slijedeće sed naredbe:

>sed 's/Dobro/Plavo/p input

kod većina verzija SED-a dobivamo na ispis slijedeće:

381/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

>Prva linija
>Plavo more Dobro jutro
>Plavo more Dobro jutro
>treća linija

objašnjenje toga je da SED po default-u printa sve linije, dok p flag traži ispis uspješno izmjenjene linije. Ukoliko primjenimo slijedeću
sintaksu:

>sed -n 's/Dobro/Plavo/p' input

dobivamo:

>Plavo more Dobro jutro

onemogućili smo default-ni ispis -n opcijom, a p flagom tražili ispis samo promijenjene linije. Ako pak želimo dobiti ispis cijele datoteke,
uključujući i promijenjene linije te da nema dupliciranja, nećemo koristiti niti -n opciju, niti p flag.

Recimo da želimo u našoj 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) omogućuje da se linija koja je uspješno bila


obrađena s funkcijom zapisuje u datoteku danu argumentom <filename>. Tu,
kao i kod p zastavice (flag-a) možemo imati zapisivanje više različitih 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) moguće je specificirati do 10 različitih
naziva datoteka.

Primjer:
Koristit ćemo datoteku input sa sadržajem iz prethodnog primjera i primjenom slijedeće 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 korištenja w flaga:

> sed 's/Dobro/Plavo/g' input > LPT1:

382/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

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.

2.4.3. Ulazno-izlazne funkcije (Input-Output Functions)


• p - funkcija koja piše adresiranu liniju na standardni izlaz . Linija se zapisuje u
trenutku nailaska na p funkciju, bez obzira što slijedeće naredbe za editiranje
rade na liniji.

Primjer:

>sed 'p' input

ovakvom sintaksom vjerojatno ćemo izazvati neželjeni učinak - ispisivat će se sve linije duplicirane. Zbog toga najčešće koristimo
funkciju p zajedno s opcijom -n:

>sed -n 'p' input

Recimo da želimo printati linije od 35 do kraja datoteke, tada ćemo koristiti:

>sed -n '35,$p' input

ili od linije koja sardrži riječ "početak" pa do linije koja sadrži riječ "kraj":

>sed -n '/početak/,/kraj/p' input

evo još jednog zanimljivog primjera gdje printamo sve linije osim one koja sadrži izraz "ne printaj" (primjetimo upotrebu ! funkcije
opisane u poglavlju 2.4.6.:

>sed -n '/ne printaj/!p' input

• 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 slijedeće
naredbe za editiranje rade na liniji. Moguće je specificirati do 10 različitih
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 može stajati sama i recimo
da cijelu promijenjenu datoteku želimo spremiti možemo koristiti slijedeću opću 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 različite, dapače, w funkcija (i w flag s funkcije) će vrlo rado izvršiti
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 izvrši povratka nema.

383/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

• r <filename> - čita sadržaj datoteke zadane argumentom <filename> i dodaje


(append) ga nakon linije koja se poklapa s adresom. Datoteka će se pročitati i
dodati (appendirati) bez obzira što slijedeće naredbe za editiranje rade na
obrađivanoj liniji. Ako su funkcije r i a (opisane gore) izvršene na istoj liniji,
tekst iz funkcije a i funkcije r su dodani onim redom kako su funkcije
izvršavane. Ako pak datoteka iz argumenta <filename> ne može biti otvorena,
smatra se da je "NULL file", te se neće tretirati kao greška.

Primjer:

>sed 'r source' input

ovakvu sintaksu nemojte koristiti osim ako niste sigurni da to želite. Naime, pošto nema adresiranja, ovakav kod će uzrokovati da se
sadržaj datoteke source ubaci iza svake linije datoteke input, što može biti nezgodno ako je datoteka source jako velika. Probajmo radije
ubaciti njen sadržaj iza 4 linije datoteke input:

>sed '4r source' input

Sintaksa r funkcije ne dopušta specifikaciju više od jedne adrese tako da će slijedeći kod uzrokovati grešku:

>sed '4,7r source' input

ako ipak želimo ubaciti sadržaj 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: Pošto postoji limit na broj datoteka koje se mogu otvoriti istovremeno, treba
obratiti pažnju da ne bude više od 10 datoteka spomenutih u w funkciji i w zastavici (flagu) s
funkcije, te da se taj broj smanjuje za 1 ako se izvršava i r funkcija (samo jedna datoteka za
čitanje može biti otvorena).

2.4.4. Funkcije više ulaznih linija (Multiple Input-Line Functions)


Postoje tri funkcije, i sve se pišu velikim slovima, koje se posebno bave s prostorom
uzoraka (pattern space) koji u sebi sadrži ugrađene nove linije (embedded newline). Njihova
uloga je u principu da omoguće traženje uzoraka teksta preko više linija s ulaza.
• N - slijedeća linija (next line) - funkcija koja slijedeću liniju s ulaza dodaje
(append) trenutnoj liniji u prostor uzorka. Dodana linija je odvojena od
prethodnog sadržaja s oznakom za novu liniju. Koristeći '\n' za pronalaženje
kraja linije, uzorak se može proširiti preko više linija.

384/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

Primjer:
Sama za sebe N funkcija nije previše zanimljiva jer ne mijenja ulazni tekst, ali probajmo napraviti slijedeće:na liniju koja završava s
točkom, dodat ćemo slijedeću liniju s ulaza (opet ćemo koristiti funkciju grupiranja { }):

>sed '/\.$/ {
>N
>s/\n//
>}' input

ili drugi primjer gdje ćemo izbrisati sav tekst između riječi "početak" u prvoj liniji i riječi "kraj" u drugoj liniji (opet koristimo funkciju
grupiranja i to sada i sa njenim ugnježđivanjem):

>sed '/početak/ {
>N
>/\n.*kraj/ {
>s/početak.*\n.*kraj/početak kraj/
>}
>}' input

• D - funkcija koja briše prvi dio višelinijskog prostora uzoraka kreiranog N


funkcijom i to do i uključujući prve oznake za novu liniju. Nakon izvršenja
nastavlja se editiranje s prvom naredbom iz skripte. Ukoliko ova funkcija
potpuno izbriše prostor uzoraka (a to znači da je oznaka za novu liniju bila
ujedno i kraj), tada se čita nova linija s ulaza.

Primjer:
Koristit ćemo primjer sličan prethodnom samo ćemo ovog puta obrisati liniju u kojoj se nalazi riječ "početak" ako se u slijedećoj liniji
nalazi riječ "kraj":

>sed '/početak/ {
>N
>/\n.*kraj/ D
}' input

• P - funkcija koja štampa prvi dio višelinijskog prostora uzoraka kreiranog N


funkcijom i to do i uključujući prve oznake za novu liniju.

Primjer:
I opet primjer s "početak" i "kraj", ali sada, umjesto brisanja, isprintat ćemo liniju u kojoj se nalazi riječ "početak" ako se u slijedećoj
liniji nalazi riječ "kraj":

>sed -n '/početak/ {
>N
>/\n.*kraj/ P
}' input

i sada evo primjera gdje kombiniramo sve tri Multiple input line funkcije (najčešći redoslijed njihove primjene je prvo N pa P i na kraju
D); tražimo liniju koja sadrži riječ "početak", učitavamo slijedeću liniju, ako u njoj postoji riječ "kraj" brišemo sav tekst između njih,
printamo i brišemo prvu liniju:

385/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

>sed '/početak/ {
>N
>/početak.*kraj/ {
>s/početak.*kraj/početak 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.

2.4.5. Funkcije čuvanja i dohvaćanja (Hold and Get Functions)


Pet je funkcija koje omogućavaju spremanje te dohvaćanje spremljenog sadržaja za
moguću naknadnu upotrebu:
• h - čuva prostor uzoraka - h funkcija kopira sadržaj prostora uzoraka u posebni
privremeni buffer. Prethodni sadržaj privremenog buffera se time uništava.
• H - funkcija koja dodaje (append) sadržaj prostora uzoraka u buffer iza
postojećeg sadržaja, s time što ih odvaja novom linijom. Čak i ukoliko je sadržaj
buffera bio prazan, funkcija H će svejedno prvo dodati novu liniju.
• g - dohvaća sadržaj buffera - g funkcija kopira sadržaj buffera u prostor uzoraka,
uništavajući njegov prethodni sadržaj.
• G - funkcija koja dodaje (append) iza sadržaja prostora uzoraka oznaku za novu
liniju te sadržaj buffera. Ukoliko je buffer bio prazan, oznaka za novu liniju se
svejedno dodaje iza prostora uzoraka.

Primjer:
Ubacit ćemo praznu liniju iza svake linije datoteke input:

>sed 'G' input > output

prilično jednostavno, ali što ako već imamo praznih linija u datoteci input, a želimo samo jednu liniju razmaka između svake "neprazne"
linije:

>sed -e '/^$/d' -e 'G' input > output

Evo koda koji će kopira od 4. do 10. na kraj datoteke:

>sed -e '4h' -e '5,10H' -e '$G' input > output

• x - izmjena - ova funkcija izmjenjuje sadržaj prostora uzoraka sa sadržajem


buffera.

386/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

Primjer:

sed 'x' input > output

ovakva sintaksa će dodati praznu liniju na početak datoteke i izbrisati zadnju liniju. Evo kako radi: na prvoj liniji se izmjenjuje sadržaj
privremenog buffera (koji je prazan) sa sadržajem 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.

2.4.6. Funkcije kontrole toka (Flow of Control Functions)


Ove funkcije se ne bave editiranjem odnosno mijenjanjem linija s ulaza, već kontroliraju
primjenu funkcija na linije selektirane u adresnom dijelu.
• ! - funkcija koja uzrokuje da se slijedeća naredba (napisana u istoj liniji)
primjenjenjuje na sve linije koje NISU selektirane u adresnom dijelu (ekvivalent
NOT operatoru).

Primjer:
Već smo imali primjere upotrebe funkcije !, ali evo još primjera: recimo da želimo na svim linijama koje NE započinju s "Početak"
zamijeniti sve pojave stringa "nešto" s "nešto drugo":

sed '/^početak/!s/nešto/nešto drugo/g' input

ili isto na svim linijama osim onih između 5 i 16:

>sed '5,16!{
s/nešto/nešto drugo/g'
'} input

• { } - funkcija za grupiranje naredbi omogućuje da se skup naredbi unutar nje


tretira, na linijama selektiranim u adresnom dijelu, kao jedan blok. Prva naredba
u bloku može (i ne mora) biti u istoj liniji sa { dok se zatvaranje bloka naredbi
označava sa } i mora biti u posebnoj liniji. Također je bitno spomenuti da se
grupe mogu ugnježđivati.

Primjer:
Pošto smo već u prijašnjim primjerima imali upotrebu funkcije za grupiranje, evo jednog primjera njenog ugnježđivanja (nesting):

>sed /^Početak/ {
>/10000/ {
>s/Zgb/Zagreb/2
>s/^/Promijenjeni /
>}
>}' input

evo pojašnjenja što smo napravili: adresirali smo sve linije koje počinju s "Početak"; primjenjujemo funkciju za grupiranje i u njog
adresiramo sve linije koje sadrže 10000; na njima primjenjujemo novu funkciju grupiranja u kojoj mijenjamo drugu pojavu stringa "Zgb"
u "Zagreb" i na početak linije umećemo string "Promijenjeni"

387/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

• :<label> - ova funkcija bilježi mjesto u listi naredbi za editiranje kojem se mogu
obratiti b i t funkcije (obrađene ispod). Argument <label> može biti niz od osam
ili manje znakova. Ukoliko postoje dvije ili više istih labela funkcije :, generirat
će se compile time diagnostic te neće biti pokušaja izvršenja. Funkcija : i njen
argument se pišu zajedno (bez razmaka).

Primjer:
Primjer za samu funkciju je prilično besmislen. Funkcija će zabilježiti dio koda, ali bez funkcija grananja b i t, nikad neće 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
znači da, ako je ima izvršenje se nastavlja na liniji obilježenoj funkcijom : i
pripadajućom labelom, a ako je nema, kontrola se transferira na kraj skripte.
Ukoliko pak nije pronađena funkcija : s istom labelom, generirat će se compile
time diagnostic te neće biti pokušaja izvršenja. Funkcija grananja može se
iskoristiti za izvršavanje niza naredbi kao procedura koja može biti zvana više
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 uspješno izvršena neka promjena. Ukoliko je, izvršava
se grananje do labele markirane : funkcijom, a ukoliko nije, ne događa se ništa.
Zastavica (flag) koja označava da je uspješno izvršena promjena na liniji se
poništava izvršavanjem t funkcije ili čitanjem nove linije s ulaza.
Primjer:
Ako postoji više praznih linija zaredom, brišemo sve osim jedne:

>sed '/^$/ {
>:loop
>N
>s/^\n$//
>t loop
>}' input

postupak je slijedeći: tražimo praznu liniju; kad i ako je nađemo grupiramo daljnje funkcije i labelom označavamo početak; učitavamo
slijedeću liniju; radimo zamjenu: ako linija između svog početka i kraja ima samo embedded newline brišemo ga; ako je za supstitucija
uspjela granamo se do labele loop i ponavljamo dok god se supstitucija ne izvrši (linija nije prazna).

388/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

2.4.7. Ostale funkcije (Miscellaneous Functions)


• = - ova funkcija piše na standardni izlaz broj linije selektirane u adresnom dijelu.

Primjer:
Evo kako možemo saznati koliko linija ima naša 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 počinje s "Početak"

>sed -n '/^Početak/=' input

ako pak želimo ispred svake linije dodati njen broj koristimo slijedeću sintaksu:

>sed -n -e '=' -e 'p' input

• q - quit - funkcija koja uzrokuje da se trenutna linija zapiše na izlaz (ako treba),
svi dodani ili pročitani tekstovi da se zapišu i da se prekine izvršavanje.

Primjer:
Ako želimo isprintati prvih 10 linija koristeći q funkciju to bi izgledalo ovako:

>sed '10q' input

apsolutno isti učinak dobili bi koristeći p funkciju:

>sed -n '1,10p' input

slijedeći kod bi printao sve linije od prve do i uključujući i onu u kojos se nalazi "traženi tekst" i nakon toga prekinuo rad:

>sed '/traženi tekst/q' input

Napomena: Pri korištenju q funkcije treba biti oprezan ako se promjene zapisuju u originalnu datoteku iz koje čitamo jer nakon izvršenja
funkcije q nema više zapisivanja na izlaz.

Obje funkcije primaju samo jednu adresu tako da ako želimo raditi s više 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 podržavaju neke druge verzije. Za te funkcije
nećemo davati primjere već ćemo ih samo popisati i objasniti:
• y - transform - funkcija slična zamjenskoj funkciji s (ima istu sintaksu), a radi
trasformiranje znakova u adresnom dijelu sa znakovima u replacement dijelu
• l - ispusuje trenutni sadržaj prostora uzoraka (korisno kod debuggiranja skripte)
• ; - function (command) stacking - funkcija koja nam omogućuje slaganje više
SED funkcija jednu iza druge bez upotrebe -e opcije ili { } funkcije.

389/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

3. ZAKLJUČAK

Prilikom izrade ovog seminara našao sam se u dilemi: da li od početka krenuti sa


stvarnim, konkretnim primjerima rješavanja nekog određenog, konkretnog problema čije su
sintakse obično prilično nerazumljive i komplicirane ili početi od jednostavnih i općenitih
primjera pa ih vremenom kombnirati i "komplicirati".
Tražeći literaturu i primjere na internetu, ustanovio sam da je onih prvih puno više te da
je većina materijala rađena površno i pogotovo nesistematično. Najbolji primjer toga su
materijali koji daju popis opcija, adresiranja i funkcija abecedno, ne pazeći na njihovo
grupiranje ili način rada samog SED-a, čime je vrlo teško korisniku početniku naći i
primjeniti ono što mu treba.
Stoga sam odlučio da ovaj seminar bude pisan za nekog tko se još sa SED-om nije
susretao, a želi ga naučiti i nakon toga ga znati uspješno primjeniti, a za one koji imaju kakav
stvaran problem, možda im posluži neka od gotovih skripti koje se nalaze u dodatku.
U svakom slučaju, SED je izuzetan alat. Na žalost, većina ljudi ne uspije shvatiti
njegovu pravu snagu. Jezik je vrlo jednostavan, ali dokumentacija je loša. Korisnici
(programeri) će pisati programe za editiranje nekog teksta često neznajući da isti cilj mogu
postići sa nekoliko ili čak jednom sed naredbom.

390/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

4. DODATAK

Skripta za brisanje više od jedne prazne linije između "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 riječi 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

Skripta za formatiranje teksta tako da ni jedne linija nije duža 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

Skripta za obrtanje redoslijeda znakova na svakoj liniji datoteke s ulaza

# Reverse a line; add a new-line to the end


s/$/\
/

# Move first character at the end. The regexp matches


# until the first character has become the new-line
tx
:x
s/\(.\)\(.*\n\)\(.*\)/\2\1\3/
tx

# Remove the new-line


s/^.//

Skripta za obrtanje redoslijeda linija datoteke s ulaza

1! G
h
$p

392/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

Skripta za centriranje svih linija datoteke na 80 znakova (lako podesivo na druge


veličine)

# 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/

Skripta za brisanje C i C++ komentara (Brian Hiles, Paolo Bonzini)

# Remove C and C++ comments, by Brian Hiles (brian_hiles@rocketmail.com)

# Sped up (and bugfixed to some extent) by Paolo Bonzini (bonzini@gnu.org)


# Works its way through the line, copying to hold space the text up to the
# first special character (/, ", '). The original version went exactly a
# character at a time, hence the greater speed of this one. But the concept
# and especially the trick of building the line in hold space are entirely
# merit of Brian.

: loop

# This line is sufficient to remove C++ comments!


/^\/\// s,.*,,

/^$/{
x
p
n
b loop
}

393/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

/^"/{
: 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb SED

s/..//
b loop
}
b ccom
}

: break
H
x
s,\n\(.[^"'/]*\).*,\1,
x
s/.[^"'/]*//
b loop

Skripta za printanje duplih linija s ulaza

# print all duplicated uniq lines on a sorted input


# like `uniq -d'

$b
N
/^\(.*\)\n\1$/{
s/.*\n//
p
:b
$b
N
/^\(.*\)\n\1$/{
s/.*\n//
bb
}
}
$b
D

395/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

Krešimir Hećimović

GCC COMPILER

396/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

"Ne smije vam past na pamet kritizirati GCC dok ga dobro ne upoznate!"
Pavle Špoljarić
Zagreb, 08.01.2004.

SOFTWARE

Računala ne mogu ništa napraviti bez uputa korisnika. Da bi napravili bilo koji posao
morate računalu dati niz instrukcija. Taj set instrukcija naziva se računalni program. Software
se odnosi na skup računalnih programa i procedura koje opisuju kako koristiti te programe.
Možemo reći da je software kolekcija programa koje povećavaju mogućnosti hardware-a.
Software vodi računalo pri svakom koraku, gdje da počne i gdje da završi određeni posao.
Proces izrade softvera je ono što svi nazivamo programiranje. Računalni software se obično
dijeli na dvije široke kategorije:
sistemski software
aplikacijski software
Sistemski software Znamo da je program set instrukcija koje se moraju učitati u
računalo da bi moglo raditi. Kad upalite računalo neki programi se izvrše i aktiviraju različite
dijelove računala i spremaju ga za rad. Taj set programa je sistemski software. Stoga možemo
reći da je sistemski software set od jednog ili više programa napravljenih za kontroliranje rada
računala kao sistema (komunikacija s printerom, diskom, kontrola upotrebe memorije i
procesora i sl.). Bez sistemskog softwareas (operacijskog sustava- DOS, WINDOS, UNIX)
nije moguće raditi na računalu. Razvoj sistemskog softwarea je kompleksan posao i zahtjeva
mnogo znanja o računalnoj tehnologiji. Zato se za razliku od aplikacijskog softwarea ne
razvija kod kuće.
Aplikacijski software je set programa koji izvršavaju operacije za određenu primjenu
(pisanje teksta, izrada statističkih izvještaja, analiza podataka itd). Jedan primjer aplikacijskog
softwarea su programski jezici.

Odnos između hardwarea, softwarea (sistemskog i aplikacijskog) i korisnika

397/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

PROGRAMSKI JEZICI

Upoznati smo sa terminom "jezik". Jezik je sistem komunikacije između dvije ili više
osoba. Možemo komunicirati na nekoliko jezika: hrvatski, engleski, njemački... No kako
komunicirati sa računalom. Računalo neće razumjeti govorne jezike (za sada) za prijenos
podataka i instrukcija. Zato postoje programski jezici posebno razvijeni da možete prenijeti
podatke i instrukcije računalu za obavljanje određenog posla. FORTRAN, BASIC, C,
COBOL samo su neki od mnoštva programskih jezika. Instrukcije i programi pišu se u
određenom 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 može se kategorizirati u slijedeće kategorije:


jezici visoke razine - High Level Languages
jezici niske razine - Low Level Languages (strojni i asemblerski jezici)

Jezici niske razine

Termin niska razina znači blizina načinu rada stroja. Jezici niske razine su strojno
orijentirani i zahtijevaju širok spektar znanja o hardwareu i njegovoj konfiguraciji. Oni su
jako blizu hardwareu (velika brzina izvođenja) ali su teški za pisanje programa.

a) Strojni jezik
Strojni jezik je jedini jezik koji računalo direktno razumije, ne zahtjeva nikakav
prijevod. Često ka zovemo i strojni kod. Napisan je kao set binarnih brojeva: 1 (jedinica) i 0
(nula). Instrukcija može izgledati ovako: 1011000111101. Kad sa određenim sekvencama
koda "nahranimo" računalo, ono prepozna kod i pretvara ga u električni signal potreban za
izvršenje tog koda. Taj jezik nije lako naučiti jer ga je teško shvatiti (no nije nemoguće). To je
jezik efikasan za računalo no nije za programera. Osim što ga je teško programirati, kod u
strojnom jeziku još je teže debugirati.
Jedina prednost je što se program u strojnom jeziku izvršava vrlo brzo jer procesoru nije
potrebno prevoditi instrukcije. Strojni jezik je jezik prve generacije.

398/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

b) Asemblerski jezik
To je prvi korak ka poboljšanju strukture programiranja. Pošto računalo prepoznaje
brojeve i slova određena kombinacija alfanumerika se može iskoristiti za zamjenu strojnog
koda. Asemblerski jezik, dakle, tvori set simbola i slova a prevoditelj (asembler) je taj koji
prevađa asemblerski jezik u strojni. Programiranje u asemnbleru je mnogo lakše jer
omogućava programeru da lakše shvati kod. Npr. liniju koda (izmišljena) "CPx1000 R1", koja
kopira (CP-copy) sadržaj s adrese(x) 1000 u registar R1, lakše je shvatiti nego "1010 1000
1110" (1010-copy, 1000-adresa, 1110-registar).
Asebblerski jezik ima istu razinu izvršavanja 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 računalo možda se neće pokrenuti na drugim računalima sa drugačijom konfiguracijom
hardwarea.

Jezici visoke razine

Asemblerski jezik i strojni jezik zahtijevaju duboko poznavanje hardwarea, dok je u


jeziku visoke razine potrebno samo poznavanje instrukcija (naredbi) u engleskom jeziku i
logiku problema bez obzira koje računalo koristili. Jezici visoke razine su jednostavni jezici
koji koriste engleski i matematičke simbole poput +,-,*,/,% itd.
Jezici visoke razine su problemski orijentirani jer su naredbe prikladne za rješavanje
određenih problema. U FORTRAN-u, na primjer naredbe su prilagođene za rješavanje
matematičkih problema, a u COBOL-u za poslovne probleme. Stoga su problemski
orijentirani jezici napisani na takav način da više sliče jeziku problema. U govoru poslovni
čovjek koristi poslovne termine a znanstvenik znanstvene. Velika je prednost jezika visoke
razine što su laki za naučiti i koristiti jer na neki način sliče govornom jeziku – engleskom.
Svaki jezik visoke razine mora se pretvoriti u strojni jezik da bi ga računalo moglo
razumjeti.

399/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

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 (najbliži 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 piše 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 može prevoditi samo one izvorne programe koji su pisani u jeziku za koji je
kompajler namijenjen. Fortran kompajler neće kompajlirati izvorni kod napisan u COBOL-u.
Objektni program koji napravi kompajler je strojno ovisan. To znači da se programi
kompajlirani za jednu platformu neće izvršavati na drugoj. Zato svaka platforma mora imati
svoj kompajler za određeni programski jezik. Platformska neovisnost postiže se korištenjem
jezika više razine na različitim platformama.

400/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

Interpreter

Interpreter je jedna druga vrsta prevodioca koja se koristi za prevođenje programskih


jezika viših razina u strojni jezik. On uzima jednu naredbu jezika više razine, prevodi ju u
strojni jezik i odmah ju izvršava. Prevođenje i izvršavanje izvodi se za svaku naredbu.
Uvelike se razlikuje od kompajlera koji prevodi cijeli program u strojni jezik i ne izvršava 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 izvršenje svake naredbe svaki put najprije prevodi pa onda izvršava. Zato se
kompajlirani program izvršava mnogo brže nego interpreterski program.

401/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

OBJEKTNO ORIJENTIRANO PROGRAMIRANJE

Objektno orijentirano programiranje temelji se na nekim starim idejama, proširuje ih i


objedinjuje na nov način. Rezultat toga je svestranost i korak naprijed za umjetnost
programiranja. Objektno orijentiran pristup čini programe intuitivnijim, bržim, više
podložnim modifikacijama i lakšim za razumijevanje. On vodi ne samo prema alternativnim
načinima izrade programa nego i k alternativnim načinima shvaćanja programskih zadataka.
Za one koji nisu nikad koristili objektno orijentirano programiranje za izradu aplikacija,
može se činiti da je objektno orijentirano programiranje velika prepreka. Ono donosi nov
način izrade stvari koje se mogu isprva činiti čudnima, te novu terminologiju na koju se treba
neko vrijeme navikavati. Terminologija će na kraju pomoći no nije ju lako naučiti zato je
pomalo teško početi.

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 olakša prevođenje matematičkih 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 naučiti, koji
bi bio prikladan za različite aplikacije, neovisan o platformi i omogućavao da se kompleksni
matematički izrazi pišu slično običnoj algebarskoj notaciji. Uz sve to ideja je bila da bude
gotovo jednako efikasan pri izvršavanju kao asemblerski jezik. Pošto je FORTRAN mnogo
lakše kodirati programerima je omogućeno 500% brže pisanje programa, dok se efikasnost
izvršavanja smanjila za samo 20%. To je omogućilo programerima da se više posvete
rješavanju 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 računalne 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 teško prenašati program s jednog stroja na drugi.

402/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

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 počeo s revizijom 1977.). U tu verziju
uključene su neke nove opcije:nov način rukovanja greškama i mehanizmi za velike
programske projekte. Zadnja verzija, Fortran '90 (više nije sve velikim slovima) dodaje još
novih mogućnosti: rekurziju, pokazivače i korisničke tipove podataka.
Budućnost Fortrana '90: Trenutna istraživanja u teoriji kompajlera uključuju
sposobnosti kompajlera da generira objektni kod koji će moći iskoristiti mogućnosti velikih
paralelnih računala. Fortran '90 kompajleri su glavne mete takvih istraživanja.

Programski jezik C je prvobitno razvio Dennis Richie (Bell Laboratories) 1970. iz


BCPL-a (B Compiler), s namjerom da se pokreće na PDP-11 sa UNIX operacijskim
sustavom. Prvobitni naziv mu je bio NB (New B). Iako je namijenjen da se pokreće pod
UNIX-om, postojao je veliki interes za pokretanje C-a pod MS-DOS-om na IBM PC i
kompatibilnim računalima. To je odličan jezika takvu okolinu zbog jednostavnosti izraza,
cjelovitosti koda i širokog spektra primjene. Zbog jednostavnosti pisanja C compiler je
obično prvi jezik visoke razine dostupan na svakom novom računalu, uključujući
mikroračunala, miniračunala i mainframe računala.
C nije najbolji jezik za početnike, jer na prvi pogled izgleda zagonetan. On dopušta
programeru širok raspon operacija od visoke razine do vrlo niske, približavajući se razini
asemblerskog jezika. Gotovo da nema granice dozvoljene fleksibilnosti. Jedan iskusan C
programer davno je izjavio: "U C-u možete programirati sve", mnogo C-programera i još vise
C-programa mogu potvrditi njegovu izjavu. Sa velikom dozom slobode koju pruža C morate
prihvatiti i velik dio odgovornosti, jer je vrlo lako napisati program koji se ruši zbog bezvezne
male greške koju će neki drugi kompiler označiti i pozvati fatal error. U C-u ste prepušteni
sami sebi.
Programiranje u C-u je odlično na područjima gdje bi ste željeli koristiti asemblerski
jezik sa jednostavnošću pisanja i lakoćom održavanja. Kaže se da program napisan u C-u

403/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

"plaća" povećanje od 20 do 50% u brzini izvedbe, jer niti jedan jezik visoke razine nije tako
cjelovit kao asemblerski jezik. Ipak vrijeme koje se uštedi na kodiranje može biti ogromno,
što čini C najpoželjnijim jezikom za mnoge programere. S druge strane, pošto većina
programa troši 90 posto svoga vremena u samo 10 posto ili manje koda, moguće je napisati C
program i potom prepraviti mali dio koda u asemblerskom jeziku i na taj način dobiti na
brzini programa, kao da je cijeli napisan u asemblerskom jeziku.
Kad je postalo očigledno da programski jezik C postaje vrlo popularan jezik dostupan
na različitim platformama, grupa zabrinutih pojedinaca sastala se da predloži standardni set
pravila za korištenje C-a. Grupa je predstavljala sve sektore software industrije i nakon
mnogo sastanaka i puno predložaka, napisali su prihvatljiv standard za programski jezik C.
Prihvaćen je od strane ANSI-a (American National Standards Institute) i ISO-a (International
Standard Organization). Nitko ga nikome nije nametnuo, no pošto je tako široko prihvaćen
bilo bi nerazborito, za bilo kojeg pisca compiler-a, odbiti prilagoditi se standardu.
Danas više nije bitno treba li kod programskog jezika C pronalaziti loše strane ili ga
hvaliti, kao što nema smisla raspravljati o tome je li dobra sadašnja signalizacija na
prometnicama ili bi bilo bolje zamijeniti značenje crvenog i zelenog svijetla. Bavimo li se
djelatnošću u kojoj se koristi jezik C, moramo ga što prije usvojiti i primjenjivati. Pri tome
postoje različite razine korištenja među kojima je najvažnija razumijevanje već napisanog
programa C uz mogućnost njegove promjene (prilagodbe) pri rješavanju 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 1983-
1985 (danas AT&T Labs i Lucent Bell Labs). C++ je nastavak na C. Prije 1983 Stoustrup je
na C dodao dodatne mogućnosti i formirao jezik koji je sam zvao "C sa klasama".
Kombinirao je korištenje klasa Simule i objektno orijentirane mogućnosti sa snagom i
iskoristivošću C-a. Pojam C++ prvi je puta upotrebljen 1983. C++ je dizajniran za UNIX
okruženje, no ubrzo je prihvaćen na drugim operacijskim sustavima. Sa C++-om programeri
su dobili mogućnost da poboljšaju kvalitetu koda i dijelove koda su mogli ponovno koristiti.

404/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

C++ implementira izdvajanje podataka (data abstaction) koristeći koncept "klasa"


(class), uz druge mogućnosti, da bi omogućio objektno orijentirano programiranje. Novi
koncept "preklapanja operatora" (operator overloading) uveden u C++-u nije viđen u drugim
objektno orijentiranim programima. Neke dodatne mogućnosti C++-a dozvoljavaju
niskorazinski pristup memoriji no i dalje sadrže 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 omogući sofisticirano


objektno orijentirano programiranje u C standardu. On je nastavak ANSI C standarda, i zato
je moguće postojeće C programe prilagoditi korištenju software frameworka bez gubitaka
uloženog rada u originalni razvoj. Pošto Objective-C uključuje C, kad radite sa njim dobivate
sve mogućnosti C-a. Možete birati kada želite nešto napraviti na objektno orijentiran način
(na primjer definiranje klase), a kada zadržati proceduralne programske tehnike (definiranje
strukture i nekih funkcija umjesto klasa).
Štoviše, Objective-C je jednostavan jezik. Sintaksa mu je mala, nedvosmislen je i lako
ga je naučiti. Objektno orijentirano programiranje, zbog terminologije i naglaska apstraktnom
dizajnu, često predstavlja poteškoće početnicima. Dobro organiziran jezik poput Objective-C-
a može olakšati put prema znanju objektno orijentiranog programiranja. U usporedbi sa
drugim jezicima baziranim na C-u, Objective-C je dinamičan. Kompajler čuva veliku količinu
informacija o objektima koje koristi prilikom izvođenja. Odluke koje bi u nekim slučajevima
bile napravljene tijekom kompajliranja mogu se odgoditi sve do vremena izvođenja. To daje
Objective-C programima neobičnu fleksibilnost i moć. Na primjer, dinamičnost Objective-C-
a donosi prednosti koje se teško mogu dobiti u drugim objektno orijentiranim jezicima:
Objective-C podržava otvoreni stil dinamičkog spajanja, stil koji može smjestiti
jednostavnu arhitekturu za interaktivna korisnička sučelja. Poruke nisu nužno vezane uz
klase, primatelje ili selektor metoda, stoga software framework može dopustiti korisnicima
donošenje odluka pri izvođenju i dozvoliti razvijačima slobodu izraza u njihovu dizajnu.
Dinamičnost Objective-C-a omogućava izgradnju naprednih razvojnih alata. Sučelje
prema načinu izvršavanja omogućuje pristup informacijama o pokrenutim aplikacijama, pa je

405/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

moguće 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 igaračih konzola i video rekordera. Oak je isprva napravljen za
korištenje u set-top kutijama dizajniranim za video-on-demand usluge (npr. teletext). Taman
kad je posao s proizvođačima set-top kutija bio pri kraju pojavio se WWW (World Wide
Web). Oak dizajneri počeli su shvaćati trend te se njihov fokus prebacio na Internet i
WebRunner (browser s omogućenim Oak-om) je rođen. Oak je preimenovan u Java a
WebRunner postaje HotJava browser. Oduševljenje Internetom privuklo je mnoge dobavljače
softwarea tako da su Java razvojni alati mnogih proizvođača ubrzo postali dostupni. Isto
oduševljenje odrazilo se na proizvođače softwarea koji su netom pohitali da pobliže upoznaju
Javu i njene mnoge divne mogućnosti.
Java je čisti objektno orijentiranim jezik.. To znači da je u Java programu sve objekt i
sve proizlazi iz bazne klase (root object class). Java okružje uključuje stotine klasa i metoda u
šest glavnih područja. Jedna od Javinih najprivlačnijih mogućnosti je njen standardni library
(Rich Standard Library). Mnogi će kao prednost Jave istaknuti mogućnost dinamičke
alokacije varijabli, a glavni razlog koji je omogućio brzo prihvaćanje Jave je sličnost Javine
sintakse sa popularnim programskim jezikom C++.

406/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

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 slijedeće
zahtjeve; prvo, to je rekurzivna kratica za "GNU's Not Unix", drugo, to je riječ i treće zabavno
ga je izgovoriti.
Riječ "slobodan" ne odnosi se na cijenu, već na slobodu. Možete ili ne morate platiti
određenu cijenu da biste dobili GNU software. Bilo kako bili, jednom kad imate GNU
software imate tri specifične slobode pri njegovoj upotrebi:
Prvo: slobodu kopiranja programa i dijeljenja među prijateljima i kolegama
Drugo: slobodu izmjene programa na bilo koji način, jer imate izvorni kod
Treće: slobodu distribucije unaprijeđene verzije, na taj način pomoći izgradnju društva
(Ako redistribuirate GNU software, možete naplatiti fizički čin prijenosa kopije ili možete
kopije davati)
GNU projekt je začet 1983 kao način vraćanja kooperativnog duha koji je nekad bio
prisutan – da se ponovno omogući suradnja sklanjajući prepreke koje nameću vlasnici
softwarea. 1971, kad je Richard Stallman počeo karijeru u MIT-u, radio je u grupi koja je
koristila termin "besplatan software". Čak su i neka računalna poduzeća distribuirala besplatni
software. Programerima je omogućen zajednički rad.
Do kraja 1980 gotovo sav softwaer je bio u nečijem vlasništvu (propritary), a njegovi su
vlasnici priječili suradnju korisnika. To je učinilo stvaranje nečega poput GNU Projekta
potrebnim.
Svako računalo zahtjeva operativni sistem; ako nema besplatnog operativnog sistema,
ne možete pokrenuti računalo bez da dohvatite vlasnički softvare. Tako je prva stvar pri
stvaranju besplatnog softwarea bila napraviti besplatni operacijski sustav. Operacijski sustav
nije samo jezgra (kernel); on uključuje i kompajlere, editore, programe za obradu teksta i
mnoge druge stvari. Pisanje operacijskog sustava je vrlo velik posao, te je trajao nekoliko
godina.
Odlučili su napraviti operacijski sustav kompatibilan s UNIX-om jer je bio isproban i
portabilan, a kompatibilnost bi učinila prelazak s UNIX-a na GNU laganim. Inicijalni cilj da
se napravi UNIX-oidni operacijski sistem bio je postignut. Do 1990. napravljeni su ili nađeni
svi glavni dijelovi osim jednog – jezgre. Tada je Linus Torvalds razvio besplatnu jezgru –
Linux. Spajajući Linux sa gotovo završenim GNU sistemom dobiven je kompletan operativni

407/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

sustav: Linux baziran GNU sistem. Procjenjuje se da stotine tisuća ljudi danas koristi Linux-
based GNU sisteme, uključujući Slackware, Debian, Red Hat i druge.
Međutim GNU Projekt nije ograničen na operacijske sustave. Njihov cilj je omogućiti
cijeli spektar software-a, što god neki korisnik može poželjeti. To uključuje i aplikacijski
software.
Želja im je omogućiti software za ljude koji nisu stručnjaci na polju računala. Zato se
trenutni razvija drag'n'drop desktop s ikonama (slično Windowsima) da bi početnici lakše
koristili GNU sisteme. GNU Projekt također želi omogućiti besplatne igre i ostale oblike
zabave (neke igre su već dostupne).
Kako daleko može ići besplatan software? Nema granica, osim kad zakona poput
patentnih sistema potpuno zabrane besplatan software (želi se patentirati ideja????). Krajnji
cilj je omogućiti besplatan software za sve što korisnici požele – i na taj način vlasnički
softvare potjerati u zaborav.

408/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

GCC

Kratka povijest GCC-a

Izvorni autor GNU C Compilera (GCC) jer Richard Stallman, osnivač GNU projekta.
Svaki UNIX-oid (operativni sustav baziran na UNIX-u) treba C kompajler, a u to vrijeme
nije bilo besplatnih stoga ga je GNU Projekt morao razviti od početka. Rad na kompajleru
sponzoriran je donacijama pojedinaca i kompanijama Free Software Foundation-u,
neprofitnoj organizaciji koja je nastala da podrži rad GNU Projekta. 1987. godine izlazi prvo
izdanje GCC-a. To je bio veliki pomak pošto je GCC bio prvi portabilni ANSI C
optimizirajući kompajler izdan kao besplatni software. Od te godine GCC je postao temelj
sveg besplatnog softwarea.
GCC je izdan pod GPL-om (GNU Public License).GPL podrazumijeva od svakoga tko
promjeni GNU software i redistribuira izmijenjeni proizvod, da ponudi svoje izmjene u
izvornom kodu GNU zajednici. Tako će izmjene uvelike koristiti cjelokupnoj software
zajednici.
Velika revizija kompajlera desila se 1992. godine serijom 2.0 kojom je dodana
mogućnost kompajliranja C++-a. 1997. kreirana je eksperimentalna grana kompajlera (EGCS
– Enhanced (Experimental) GNU Compiler System) koja je poboljšala optimizaciju i podršku
za C++. Te mogućnosti su integrirane u glavni dio razvoja GCC-a i postale dostupne kao 3.0
verzija GCC-a 2001.
Danas je GCC proširen na mnoge dodatne programske jezike, uključujući FORTRAN,
Java, Objective-C. Dijelovi za druge jezike, poput Mercury-a i Pascal-a postoje, no još nisu
integrirani u GCC. Kratica GCC se sada koristi umjesto novog imena "GNU Compiler
Colection". Njegov razvoj vodi GCC Upravljački Odbor (GCC Steering Committee), skupina
predstavnika GCC korisničke zajednice iz industrije, istraživanja i akademske zajednice.
Odbor se ujedinio brine i da netko ne bi preuzeo kontrolu nad GCC-om (da se ne uništi baza
besplatnog softwarea).

409/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

Glavne Odlike GCC-a

GCC je, prije svega, portabilni kompajler – moguće ga je pokrenuti na većini danas
dostupnih platformi i može napraviti kod za mnoge tipove čipova, od 8-bitnih
mikrokontrolera do procesora korištenim u superračunalima.
GCC nije samo kompajler, on može i kros-kompajlirati (cross-compile) svaki program,
tj proizvesti izvršne datoteke za različite datotečne sustave od onoga na kojem se kompajler
izvršava. To je prilično korisno za računala sa ugrađenim sustavom (embedded systems) koja
nisu sposobna pokrenuti kompajler. GCC je napisan u C-u i može sam sebe kompajlirati, tako
da može biti prebačen na drugi sustav u budućnosti.
Programi u svakom jeziku mogu biti kompajlirani u GCC-u ili kros-kompajlirani za bilo
koju arhitekturu. Na primjer ADA program moguće je kompajlirati za mikrokontroler ili C
program za superračunalo.
GCC ima modularni dizajn što dopušta lako dodavanje podrške za nove jezike i
arhitekture. Dodavanje novog front-enda za jezik u GCC omogućuje korištenje tog jezika na
bilo kojoj platformi. Slično tome, dodavanjem podrške za novu platformu svim jezicima je
ona dostupna.
Najbitnije i najvažnije GCC je besplatan software. Znači možete ga koristiti i
modificirati kao i svaki drugu GNU software.
Kad se govori o C++ kompajleru najčešće se koristi izraz "G++", no pošto postoji samo
jedan kompajler, može ga se zvati "GCC" bez obzira na koji se jezik misli. Termin "G++"
koristan je kad se želi naglasiti kompajliranje C++ programa.

Front Endovi koje nudi GCC (kompajleri podržani od GCC-a):


• C, C++, Objective C
• Ada 95 (GNAT)
• Fortran77, Fortran95
• Pascal
• Modula-2, Modula-3
• Java (od verzije gcc 3.0)
• Cobol
• Chill (Cygnus)

410/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

Strojevi (računala) podržani 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
• ……

Sistem kompajliranja GCC-a

Sistem kompajliranja uključuje slijedeće faze


• Predprocesor
• Kompajler
• Optimizator
• Asembler
• Linker
Compiler Driver je zaslužan za koordinaciju tih faza

Način izvršavanja GCC-a

411/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

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. Poopćena
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 kaže: 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 izvrši naredbu "gcc mojfile.c -o
mojprogram" (koja generira "mojprogram").
Pravila u make file-ovima izvršavaju se pozivom UNIX-ovog make programa sa
parametrom <ime_programa> u komandnoj liniji. (U gornjem slučaju: "make mojprogram").
Prednost korištenja make datoteke je:
nije potrebno ponovno pisati dugačke naredbe za kompajler
make kompajlira samo one datoteke koje treba, odnosno one kojima su zavisnici pravila
izmijenjeni
Obično se napiše i pravilo sa metom "clean" koja uklanja sve izvršne i sve objektne
datoteke npr.
clean:
________/bin/rm –f mojprogram
Primijetite da meta "clean" nema zavisnika, to jest, ako napišete "make clean" u UNIX
promptu, naredba će se uvijek izvršiti.
Također, po defaultu , ako napišete samo "make" bez parametra (mete), izvršiti će se
prvo pravilo u make datoteci. Stoga je tipični početak make datoteke navođenje default-nog
pravila:
default: mojprogram
kojim se osiguramo da će naredba "make" imati željene posljedice.

412/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

Predprocesor

Predprocesor je program koji u izvornom kodu programa traži predprocesorske


direktive koje prevodi i u skladu s rezultatom previđenja 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 služe
kao pokrate za dulje konstrukcije. C predprocesor se koristi samo u C, C++ i Objective-C
izvornim kodovima. U prošlosti je bio korišten kao generalni program za obradu teksta.
Danas bi se "zagušio" kad bi u kodu pronašao nešto što se krši sa leksičkim zakonima C-a. Na
primjer, apostrofe će prevoditi kao početak konstante i javljati će grešku. Također je
nemoguće osloniti se na očuvanje karakteristika koje nisu značajne za C obitelj programskih
jezika. Ako bi predprocesirali Make datoteku, sve TAB-ove bi maknuo i Make ne bi radio.
Ako je čovjek malo pažljiv može se provući i iskoristiti C predprocesor za stvari koje
nisu C. Neki programski jezici mogu proći (Pascal, Ada, itd). Mnogi problemi mogu se
izbjeći pisanjem C ili C++ komentara (/**/,//) umjesto komentara tog jezika, i pisanjem
jednostavnih makroa.
Kad god je moguće trebali bi koristiti predprocesor vezan uz jezik u kojem se piše kod.
Moderne verzije GNU asemblera imaju makro postrojenja. Većina programskih jezika visoke
razine ima svoju kondicionalnu kompilaciju i uključne mehanizme. Ako sve drugo padne u
vodu, može se pokušati 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 kros-
kompajler (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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

Kros-kompajler (m68k-rtems-gcc) čita datoteke koje sadrže C program (filex.c) i sve


datoteke koje uključuju (#include – predprocesorska direktiva) te ih pretvara u instrukcije
MC68360 strojnog koda. Prebacivanje uključuje tri odvojena posla:
- Predprocesor skuplja sve uključene datoteke i proširuje 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 sadržan u "objektnim datotekama" (object files). Za svaku C
izvornu datoteku (filex.c) postoji jedna objektna datoteka (filex.o). Kros-linker (m68k-rtems-
ld) spaja izvršni RTEMS, objektne datoteke proizašle iz C izvornih datoteka i library rutine
koje poziva C kod u jedan izvršni image (datoteka koja je prividno izvršna). Taj image je
samostalni program koji se može prenijeti bilo gdje, a izvršiti samo na MC68360
platformama.

414/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

Optimizator

Oprimizator poboljšava (optimizira) GCC/G++ asemblerski kod za Pentium ili Pentium


Pro instrukcije ili bez MMX instrukcija. Rezultat optimizacije je brže izvođenje 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 može 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 moguće prevesti u NASM kod koji omogućuje lakše prenošenje
programa u asemblerskom obliku.

Asembler

GAS

GAS je GNU Asembler na koji se oslanja GCC.


Pošti je GAS napravljen da podržava 32-bitno UNIX računalo, koristi standardnu
AT&T sintaksu koja jako sliči sintaksi standarda za m68k asemblere i standard je za UNIX
svijet. Sintaksa nije ni gora ni bolja od intelove sintakse. Jednostavno je drugačija. Kad se
naviknete na nju izgleda više 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 moguće C-ove vanjske simbole direktno uključiti u izvorni
kod asemblera bez rizika zabune i bez potrebe za podvučenim (underscore)
prefiksima.
Redoslijed operanada je prvo izvor(i) a zatim odredište, što je obrnuto od Intelove
konvencije. Pa će Intelova sintaksa mov eax,edx (prebaci sadržaj registra edx i
registar eax) u GAS-u izgledati mov %edx,%eax.
Veličina 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

dakle bila movl %edx,%eax.. No GAS ne zahtjeva strogu AT&T sintaksu, pa je sufiks
opcionalan kad se veličina može pogoditi iz operanda registra a u ostalim slučajevima
defaultna vrijednost je 32 bita (s upozorenjem)
neposredni operandi su označeni 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 sadržaju 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 postiže zatvaranjem indeksnih registara ili indirektne
adrese memorijske ćelije u zagrade; kao u testb $0x80,17(%ebp) (testira viši bit byte
vrijednosti na 17 mjestu od ćelije na koju pokazuje %ebp)

Postoje neki programi koji mogu prebacivati izvorni kod između AT&T i Intel
asemblerske sintakse, neki su čak sposobni raditi konverziju u oba smjera.
NASM projekt (Netwide Assembler) pruža i386 assembler, napisan u C-u, koji bi
trebao biti dovoljno modularan da na kraju podrži sve poznate sintakse i formate objekata.
Odnedavno GAS podržava i Intelovu sintaksu.

Linker

Linker povezuje sve potrebne datoteke u jednu cjelinu. Linker konstruira tablicu
objektnih modula i njihovu veličinu (u byte-ovima). Na osnovi te tablice, svakom objektnom
modulu pridruži početnu adresu. Zatim, rješava sve nedosljednosti alokacije. npr. nalazi sve
instrukcije koje referenciraju memoriju i dodaje realokacijske konstante jednake početnim
adresama modula. Na kraju se rješavaju vanjske reference – nalazi se adresa vanjske
memorije i procedura i ažuriraju se instrukcije.
Objektni modul je linearna struktura podataka koja sadrži identifikator ili tablicu
sadržaja. U tablici sadržaja nalazi se:
tablica simbola (imena simbola i offset u tekstualnom/podatkovnom
segmentu)
tablica vanjskih referenci (koje se varijable koriste no u stvari su u drugim
modulima)

416/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GCC compiler

ime simbola,
lista instrukcija koje koriste simbol,
simbole proglašene vanjskima (tip external) u trenutku definicije,
nerazriješeni simboli u trenutku translacije se smatraju vanjskima,
programski tekst – npr asemblirane instrukcije (binarno),
programski podaci – npr konstante,
rječnik relokacija,
lista instrukcija koje treba obnoviti kad se program učita na adresi koja nije
$0000
oznaka kraja modula.
Nakon linkanja napravi se izvršna datoteka koja izgleda gotovo isto kao gore opisan
objektni modul.
Kad se program pokrene, u stvari se pokreće program koji se zove "loader". On čita
datoteku koja sadrži program, učita ju u memoriju i sredi relokacije (ako je program učitan na
mjestu različitom od $0000).

417/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Janko Rade

GDB
THE GNU SOURCE LEVEL
DEBUGGER

418/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

UVOD

Debugger
Debugger nam služi da bismo vidjeli što se dešava unutar programa dok se izvodi ili da
bismo vidjeli što je program radio kada se srušio.
Debugger je općeniti koncept koji se koristi u različitim programskim jezicima za
pronalaženje grešaka i uvid u izvršavanje programa.

GDB (GNU debugger)

GDB može raditi četiri osnovne zadaće (plus još puno drugih stvari koje proizlaze iz
osnovnih) da bi pomogao naći greške:
Pokrenuti program, navesti bilo što bi moglo djelovati na njegovo ponašanje.
Zaustaviti program točno na navedenom položaju.
Pretražiti što se to dogodilo na tom položaju (dijelu programa) kada je
program stao.
Promijeniti kod u tom programu tako da se može ispravljati jednu grešku i
nastaviti s ispravljanjem druge greške.
GDB je besplatan (slobodan) program, zaštićen sa strane General Public License
(GPL)-a.
GPL daje slobodu kopiranja i prilagođavanja koda programa osobnim zahtjevima i
potrebama. Svaki čovjek koji dobije tu slobodu također dobiva pravo da distribuira taj svoj
program, ali svima mora dati pravo uvida u svoj kod.
Razne softwerske kuće koriste zaštitu autorskih prava da bi ograničili individualnu
slobodu, a Free Software Foundation koristi GPL da bi održali tu slobodu.
U osnovi GPL je dozvola koja daje slobodu. Tu slobodu (dozvolu) nitko ne smije
nikome uskratiti.
Richard Stallman je originalni autor gdb-a i puno ostalih gnu programa. Razvitku gdb-a
je doprinijelo mnogo ljudi.

419/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Ulaženje i izlaženje iz gdb-a

Ovaj odlomak objašnjava kako pokrenuti gdb i kako izaći iz njega.


Osnove:
o «utipkaj» gdb da uđeš u gdb.
o «utipkaj» quit ili Ctrl-d da izađeš i gdb-a.

Pozivanje gdb-a

Pozivanje gnu debuggera radi se tako da pokreneš program gdb. Jednom kada se
pokrenuo, gdb prihvaća i obrađuje komande s tipkovnice sve dok mu se ne kaže da izađe iz
programa (quit).
Gdb se također može pozvati s raznim varijantama opcija i argumenata da bi se dobila
razumljivija okolina za ispravljanje grešaka. Uobičajeni način pokretanja gdb-a je pokretanje
s jednim argumentom, tj. upišemo gdb pa ime programa kojega želimo ispravljati.
gdb program

Gdb se također može pokrenuti i tako da poslije imena programa upišemo i ime core
file-a (CORE file je datoteka koja sadrži neke dijelove adresnog prostora od programa koji se
ispravlja, a gdb pristupajući exe fileu sam traži ostale dijelove adresnog prostora).
gdb program core

Kao drugi argument također se može napisati i PID (process ID) ako se želi ispravljati
proces koji se izvršava 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 može još na puno načina pokrenuti tako da se koriste opcije s komandne linije.
GDB te može prisjetiti tih opcija ako se upiše
gdb –help ili gdb -h

420/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Snimanje izlaznih poruka

Ako se želi snimiti izlazne poruke gdb-ovih komandi u datoteku za to postoji nekoliko
načina:

set logging on
Uključivanje ispisa izlaznih poruka.
set logging off
Isključivanje ispisa izlaznih poruka.
set logging file
Promjena imena datoteke gdje se spremaju izlazne poruke.U default-u:gdb.txt’.
set logging overwrite [on|off]
Prepisivanje datoteke za spremanje izlaznih poruka.
set logging redirect [on|off]
Ako želite da se poruke ne ispisuju na ekranu nego samo u datoteku, trebate opciju
redirect na vrijednost ON.
show logging
Prikazuje trenutne vrijednosti opcija za ispis izlaznih poruka.

Upravljačke komande gdb-a

Komandna linija
Komandna linija gdb-a se sastoji od jedne linije za unos. Ne postoji ograničenje dužine
komandne linije.
Poslije komande se upisuju argumenti značajni za tu komandu. Neke komande ne
dozvoljavaju argumente.

Nadopunjavanje komandne linije


Gdb može sam završiti komandu koju želimo napisati ako za njen nastavak postoji samo
jedna mogućnost, ali može i ponuditi sve ostale komande koje zadovoljavaju početak koji
smo upisali.
To je moguće ako se nakon početka komande pritisne (hTABi). Npr.

421/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Info bre (hTABi) gdb će završiti komandu sa info breakpoints


To vrijedi za komande, podkomande i imena simbola u programu.

Pomoćne informacije
Pomoć i informacije o komandama uvijek možemo dobit koristeći komandu help
Help ili h

(gdb) help
List of classes of commands:
aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Kompajliranje i pokretanje programa unutar GDB-a

Prije pokretanja programa trebamo generirati s kompajlerom ispravljačke informacije


(debugging information), osim ako ispravljamo već pokrenuti proces.
Te informacije su pohranjene u objekt koji opisuje tipove varijabli u programu i
povezanost izvornih brojeva linija i adresa u kodu.

run ili r Run komanda se koristi da bi pokrenuli program unutar gdb-a. Prvo se
specificira ime programa pa onda argumenti.

422/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Argumenti:
Ako se pokrene program samo sa run bez argumenata onda on nasljeđuje argumente od
posljednje run komande koja je izvršena ili po postavkama komande set args.
Show args pokazuje koji su argumenti podešeni da se automatski pokreću kada sami ne
navedemo argumente.

Ulazi i izlazi programa:


Program koristi ulaze i izlaze na isti terminal kao gdb.
info terminal Pokazuje informacije o ulaznim i izlaznim opcijama koje koristi
program.
Možemo jednostavno preusmjeriti ulaze i izlaze programa komandom run npr.:
run > outfile
pokreće program ali se izlaz zapisuje u «outfile».

Još jedan način da se preusmjeri ulaze/izlaze programa na druge terminale pomoću


komande tty npr.:
tty /dev/ttyb
- preusmjerava ulaze/izlaze na terminal ttyb.

Zaustavljanje i nastavljanje izvršavanja programa

Glavna svrha ispravljanja programa je ta da možemo zaustaviti program prije nego se


sruši tako da možemo saznati gdje i zašto je došlo do prekida. Unutar gdb-a program se može
zaustaviti iz više razloga: signali, zaustavne točke, ili dolazak na novu liniju nakon naredbe
step. Tada možemo provjeravati i mijenjati varijable, postavljati nove prekidne točke ili
brisati stare, pa onda nastaviti sa izvršavanjem.
info program
- prikazuje informacije o statusu, procesu i razlogu zašto je stao; nezavisno da li je taj
program pokrenut ili nije.

423/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Breakpoints, watchpoints & catchpoints


Točke prekida, točke pregleda i točka zahvata
Točka prekida se koristi da bi zaustavili program na određenom mjestu. Za svaku točku
prekida se mogu postaviti uvjeti za detaljniji prikaz. Postavljanje se može izvršiti preko
komande break i njenih različitih varijanti koje se po liniji, funkciji i točnoj memorijskoj
adresi postavljaju na mjesta prekida.
Točka pregleda je posebna točka prekida koja zaustavlja program kada se vrijednost
varijable ili funkcije promijeni. Točke pregleda se drukčije postavljaju od točaka prekida, ali
ih se uključuje- isključuje s istim komandama.
Točka zahvata je također posebna točka prekida koja zaustavlja program kada se
mijenjaju događaji kao čitanje iz library –a. Kao i sa točkama pregleda tako i sa točkama
zahvata koriste se drukčije komande, ali ih se uključuje - isključuje s istim komandama kao za
točke prekida.
GDB dodjeljuje brojeve na svaku točku koju napravimo, ti brojevi počinju od 1 i
povećavaju se za 1. Ti se brojevi koriste kada se te točke žele promijeniti ili izbrisati.

Postavljanje točaka prekida


Točke prekida se postavljaju komandom break (b). Postoji više načina odlučivanja gdje
će točka prekida zaustavljati program.

break Postavljanje točke prekida

break function na funkciju “function”


break +offset Na broj(offset) linije
break –offset ispred/iza (+/-) od trenutne linije

424/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

break linenum
break filename:linenum
break filename:function
break *address Na adresu “address”
break ... if cond Sa uvjetom “cond”
tbreak args Samo za jedno zaustavljanje
hbreak args Hardware točke prekida
thbreak args Hardware točke prekida za jedno zaustavljanje
rbreak regex Na svim funkcijama koje odgovaraju na izraz
“regex”

info watchpoints [n]


info breakpoints [n] Ispisuje tablicu svih točaka prekida, točaka
info break [n] pregleda i točaka zahvata koje nisu izbrisane

Stupci tablice “info”


Breakpoint Numbers #
Type Breakpoint, watchpoint, ili catchpoint.
Disposition
Enabled or Disabled y/n
Address memorijska adresa
What mjesto u kodu

Postavljanje točaka pregleda


Točka pregleda je posebna točka prekida koja zaustavlja program kada se vrijednost
varijable promijeni bez da znamo točno mjesto gdje se to desilo. Točke pregleda se
implementiraju softverski ili hardverski ovisno o sistemu. Softverske točke su puno sporije od
hardverskih.

Postavljanje točke pregleda


watch expr Za izraz .
rwatch expr Koja će se zaustaviti kada se “expr” pročita iz programa.

425/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

awatch expr Koja će se zaustaviti kada se “expr” pročita ili upiše u program.

info watchpoints ispisuje popis preglednih točaka , isto kao i info break
GDB postavlja hardverske točke pregleda ako je to moguće zato što su jako brze, a ako
ne može onda postavlja softverske točke prekida koje su znatno sporije i pokazuju promjenu u
slijedećem redu koda.
Ako je bio u mogućnosti postaviti hardversku točku pregleda kada postavimo komandu
watch, gdb prijavljuje
Hardware watchpoint num: expr

Ponekada se ne može postaviti hardverska točka pregleda zato što tip podataka koju
nadgleda ima širi opseg od opsega koju može sama pridružiti.
Postavljanje točaka zahvata
Pomoću komande catch postavljamo točke zahvata.

catch event Zaustavlja kada se desi događaj “event”


event:
throw Bacanje C++ exception-a.
catch Hvatanje C++ exception-a.
exec Poziv komande exec.
fork Poziv komande fork.
vfork Poziv komande vfork.
load
load Dinamično učitavanje shared library-a ili učitavanje
libname library-a:libname”.
unload
unload Dinamično zatvaranje shared library-a ili zatvaranje
libname library-a:”libname”.

tcatch event Postavljanje točke zahvata samo za jedan korak “step”.

426/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Brisanje točaka prekida

Kada nam više ne trebaju točke prekida potrebno ih je obrisati. Kada ju obrišemo ona
više ne postoji. S komandom clear brišemo točke prekida ovisno o tome gdje se nalazi, sa
komandom delete brišemo ih ovisno o njihovom broju. To vrijedi i za točke pregleda i za
točke zahvata.

Clear briše svaku točku koja postoji u slijedećoj instrukciji


Clear function briše svaku točku koja postoji u slijedećoj funkciji
clear filename:function
clear linenum
clear filename:linenum briše svaku točku koja postoji u određenom redu koda
“linenum”
delete [breakpoints] [range...] briše svaku točku u opsegu “range”. Ako se ne navedu
argumenti, obrišu se sve točke

Isključivanje točaka prekida

Isključivanje točaka prekida se koristi ako točke prekida zatrebaju kasnije; da ih ne


brišemo pa ponovo radimo nove. Isključivanje i uključivanje se radi sa enable i disable
komandama specificirajući broj točke na kojoj se želi komanda izvršiti.

disable [breakpoints] [range...] isključivanje točaka prekida


enable [breakpoints] [range...] uključivanje točaka prekida
enable [breakpoints] once range... poslije zaustavljanja programa postaju isključene
enable [breakpoints] delete range... samo jednom zaustavlja program pa umire

Uvjeti zaustavljanja programa

Ako se ispuni zadani uvjet moguće je postaviti točke prekida koje zaustavljaju program.
Uvjet je zadan Boolean izrazom. Ako je True točan, onda se zaustavi program. Uvjeti se
također koriste i kod točaka pregleda.

427/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

condition bnum expression uvjet broj_točke izraz

Nastavljanje i step-anje(koračanje)

Nastavljanje znači da program nastavlja s izvršavanjem dok ne naiđe na kraj ili neku
kontrolnu točku. Step (korak) znači izvršavanje trenutne linije koda i prebacivanje u slijedeću
liniju.

continue [ignore-count] ignore-count određuje koliko break-ova da ignorira.


c [ignore-count]
fg [ignore-count]
step nastavljanje do slijedećeg reda koda
step count Nastavljanje, ali onoliko puta koliko je zadano “count”-om
next [count]
set step-mode
set step-mode on
set step-mode off preskače sve linije koje nemaju ispravljačke informacije
until Dok se izlazi iz frame-a until komande u drugi frame
stepi arg
nexti arg
ni Izvršavanje jedne strojne instrukcije

Pretraživanje stoga

Kada se program zaustavi analizirajući kod, tražimo kada i zbog čega je stao kako
bismo popravili grešku 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 može se pregledavati pomoću naredbi za pretraživanje.

428/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

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 počevši od 0
prema gore. Ti brojevi samo služe da bi se razlikovali i prepoznavali okviri.

frame args koristimo za prebacivanje iz jednog okvira u drugi i ispisivanje


vrijednosti.
select-frame samo prebacivanje bez ispisivanja

Prethodni tragovi

Prethodni tragovi(backtrace) su informacije o tome kako je program došao na mjesto na


kojem se nalazi.
backtrace
bt ispisuje prethodne tragove koje je prešao program
Zaustavljanje backtrace-a se vrši pomoću (CTRL+C)
backtrace n
bt n ispisuje samo podatke o unutarnjem okviru (frame-u) specificiranom s “n”
backtrace -n
bt - n ispisuje samo podatke o vanjskom okviru (frame-u) specificiranom s “n”.

Backtrace ispisuje i ime datoteke, argumente i broj linije u kodu.

bt 3 pokazuje unutarnja tri okvira(frame).


#0 m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8)
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...)

429/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Odabir okvira

Većina 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 odabir okvira “n”
frame addr
f addr odabir okvira na adresi “address”
up n pomicanje okvira “n” po stogu prema gore
down n pomicanje okvira “n” po stogu prema dolje

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.

Informacije o okvirima

frame
f ispisuje informacije o okviru koji je trenutno odabran
info frame
info f

Ispisuje detaljnije informacije o trenutno odabranom okviru u obliku:

430/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

• adresa okvira
• adresa slijedećeg okvira (up)
• adresa slijedećeg 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 ispisuje informacije o okviru na adresi “addr”
info args ispisuje argumente iz okvira
info locals ispisuje lokalne varijable okvira

Pretraživanje podataka

Uobičajeni način pregleda podataka je komandom print (p).


print expr
print /f expr Ispisuje vrijednost izraza “expr”
print
print /f Ispisuje vrijednost zadnjeg izraza ako se ne napiše koji izraz.

Izrazi

Print i sve druge gdb-ove komande prihvaćaju izraze i izračunavaju njihovu vrijednost.
Izrazi mogu biti konstante, varijable, operatori, uvjetni izrazi, pozivi funkcija i string-ovi.

GDB ima podršku za slijedeće operatore:


@ “@” koristi se za upravljanje memorijom kao jednim nizom (array)
:: “::” određivanje varijable po uvjetima u kojima je nastala.
{type} addr odnosi se na objekt tipa “type” pohranjenog na adresi “addr”

431/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Ispis izlaznih vrijednosti

Gdb ispisuje vrijednosti ovisno o tipu podataka, a to nam ponekad neodgovara. Npr:
trebamo hexadecimalnu vrijednost broja ili decimalni prikaz pointera ili dio memorijske
lokacije kao string. To se radi tako da poslije print komande koristimo kosu crtu(slash) pa
željeni argument:
x broj u hexadecimalni oblik.
d broj u decimalni oblik(signed).
u broj u decimalni oblik(unsigned).
o broj u oktalni oblik.
t broj u binarni oblik.
a kao apsolutnu adresu
c kao slovo (character)
f kao broj s pomičnim zarezom

Pretraživanje memorije

Za pretraživanje memorije se koristi komande x (examine) u nekoliko varijanti


x/nfu addr
x addr
x Pretraživanje memorije

“n”,”f“ i “u” su parametri koji određuju u kojem obliku se radi ispis memorije, a “addr “
mjesto sa kojega se počinje ispisivati memorija.

n broj ponavljanja
f način prikaza
u veličina jedinice u
b byte - ima.
h ili polu riječima(2 byte-a)
w ili rječima(4 byte-a)
g ili velikim riječima(8 byte-a).

432/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

Automatski prikaz

Ako želimo svaki put kada program stane ispisati vrijednost neke varijable, onda nam
gdb to može 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
brišemo s liste izraze.
Lista izgleda ovako

2: foo = 38
3: bar[5] = (struct hack *) 0x3804

Ispis prikazuje identifikacijske brojeve, izraz i njegovu trenutnu vrijednost. Također se


može odrediti u kojem obliku će se ispisivati koje varijable (vidi Ispis izlaznih vrijednosti).

display expr dodaje izraz “expr” u listu automatskog prikaza.


display/fmt expr dodaje izraz “expr” u određenom formatu “fmt” u listu
automatskog prikaza.

undisplay dnums...
delete display dnums... briše izraz određen identifikacijskim brojem “dnum”
disable display dnums... isključuje ispisivanje, ali ga je kasnije moguće opet uključiti
enable display dnums... uključuje ispisivanje automatskog prikaza
display ispisuje trenutne vrijednosti isto kao i kada stane program
info display ispisuje popis varijabli koje se ispisuju

433/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb GDB

434/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Marko Ferk

GNU MAKE

435
/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

UVOD
Kako biste se priremili za korištenje makea, morate napisati file nazvan makefile koji
opisuje povezanost sa bilo kojim, executable jezikom za programiranje i koji omogućuje
ažuriranje svakogfilea. Tipično,u programu file je ažuriran iz fileovih objekata, koji su redom
napravljeni compiling izvorom fileova.

Kad ste jednom napravili odgovarajući 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 odlučio koji podatak treba biti ažuriran.
Za svaki od tih fileova on izdaje naredbe pohranjene u bazi podataka.

Možete stvoriti argumente na komandnoj liniji makea kako bi se kontroliralo koje fileove
treba rekompilirati i kako.

436/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PREDSTAVLJANJE MAKEFILEOVA

Makefile vam je potreban da biste dali naredbu makeu. Najčešće nam makefileovi
pokazuju kako kompajlirati i povezati program.
U ovom ćemo poglavlju govoriti o jednostavnom makefileu koji povezuje kako kompilirati i
složiti tekst koji se sastoji od osam C izvora i 3 glavna filea. Makefile također upućuje kako
pokrenuti naredbe koje su izričito tražene (primjerice, ukloniti određeni file kao radnja
čišćenja).

Kad make rekompajlira editor, svaki izmijenjeni izvor C filea mora se rekompajlirati. Ako je
glavni file promijenjen, svaki će izvor C filea koji uključuje glavni file, on se mora
rekompajlirati kako bi se sačuvao. 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 sačuvani iz prethodnih kompajlacija, moraju povezati kako bi se stvorio
novi izvršni editor.

KAKO PRAVILO IZGLEDA

Jednostavni makefile sastoji se od pravila slijedećeg tipa:


target… : prerequisites …
command

Meta (target) je obično naziv filea koji je generiran programom; primjeri targeta su izvršni
fileovi. Meta također može 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 više fileova.
Naredba (command) je radnja koji make izvodi. Pravilo može imati više od jedne naredbe,
svake u svom nizu.
Imajte na umu: trebate umetnuti tab oznaku na početku svakog naredbenog reda. Ovo se
odnosi na vas neoprezne.

437/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Obično je naredba u pravilu s preduvjetom i služi 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 sadrži naredbu delete spojenu s metom `clean` nema preduvjete.

Pravilo (rule) nadalje objašnjava kako prepraviti određene fileove koji su mete određenog
pravila. Make iznosi naredbe preduvjeta da stvore ili ažuriraju metu (target). Pravilo također
može objasniti kako i kada izvesti neku radnju.

Makefile mora sadržavati i drugi tekst osim pravila, ali jednostavni makefile treba sadržavati
samo pravila. Pravila se mogu doimati do neke mjere kompliciranijima nego što je ovdje
prikazano, no svi više ili manje odgovaraju vezi.

JEDNOSTAVNI MAKEFILE
Ovdje je nanizan makefile koji opisuje način o kojem izvršni 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 uključujući `defs.h`, a samo oni koji definiraju naredbe za
montiranje uključuju `command.h`. Samo fileovi na niskim nivoima koji se mijenjaju pri
montiranju uključuju `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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 koristeći blackslash-newline. Ovo je kao korištenje
jedne druge linije, ali se lakše čita.
Kako biste koristili ovaj makefile da biste stvorili odgovarajući file, utipkajte:
make
Kako biste koristili make da biste izbrisali odgovarajući file i sve objekte iz direktorija,
utipkajte:

make clean

U ovom primjeru mete uključuju odgovarajući 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 uključuju `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 ažurirati.
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 sadrži metu i preduvjet. Ove shell naredbe govore
kako ažurirati file metu. Tab oznaka mora doći na početak svakog naredbenog niza kako bi se
razlikovale naredbene linije od ostalih linija u makefileu. (Imajte na umu da make ne zna ništa
o tome kako naredbe funkcioniraju. Ovisi na vama da tražite naredbe koje će ažurirati file
metu na pravi način. Sve što make čini jest da izvršava naredbe po pravilima koje ste vi
zatražili kat file meta treba biti ažurirana.)

439/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Meta `clean` nije file, već samo naziv radnje. Budući da ne želite iznijeti radnje u ovom
pravilu, `clean` nije preduvjet nijednog drugog pravila. S tim u vezi, make nikad ne
poduzima ništa s tim ukoliko to izričito zatražite. Imajte na umu da ovo pravilo ne samo da
nije preduvjet, već ih niti ne sadrži, tako da je jedina svrha pravila vršiti tražene naredbe. Mete
koje se ne odnose na fileove, nego su samo radnje zovu se lažne mete (phony targets).

KAKO MAKE PROCESIRA MAKEFILE


Make započinje prvom metom (ne mete čiji nazivi počinju sa `.`). Ovo se naziva
default goal. Ciljevi (goals) su mete koje make (strives) ultimativno na ažuriranje.
U jednostavnom primjeru iz prethodnog poglavlja, pogrešan je cilj ažurirati odgovarajući
program `edit`; stoga to pravilo primjenjujemo prvo.
Zato, kad izdate naredbu
make
make očita makefile u trenutnom direktoriju i počne procesirati prvo pravilo. U ovom
primjeru, ovo je pravilo za povezivanje `edit` i stoga make lako procesira ovo pravilo. Mora
procesirati pravila za fileove o kojima `edit` ovisi, a koji su u ovom slučaju objekt fileovi.
Svaki je od ovih fileova procesiran u skladu sa svojim pravilom. Ova pravila upućuju na
ažuriranje svakog `.o` filea kompilirajući njegov izvorni file. Bilo koji glavni file nazvan
preduvjetom češći je od objekt filea ili ako objekt file ne postoji.

Druga su pravila procesirana jer se njihove mete pojavljuju kao preduvjeti cilja. Ako neko
drugo pravilo ne ovisi o cilju to se pravilo ne procesira, ukoliko ne kažete makeu da to učini
(naredbom kao što je `make clean`).

Prije rekompajlirana objekt filea, make razmatra ažuriranje preduvjeta, izvornog filea i
glavnih fileova. Ovaj makefile ne specificira da se bilo što učini za njih -- `.c` i `.h`
fileovi nisu mete nikakvih pravila, tako da make za ove fileove ne čini ništa. No make će
automatski ažurirati generirane C programe, poput onih koje su napravili Biton i Yacc po
vlastitim pravilima.

Nakon rekompajliranja bilo kojeg objekt filea koji je potreban, make odlučuje da li će
prespojiti `edit`. Ovo se mora napraviti ukoliko file `edit` ne postoji ili ako je bilo koji

440/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
ažurira `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 našem primjeru, trebali smo izlistati sve objekt fileove dvaput u našem 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, možemo ga dodati
jednoj listi i drugu zaboraviti. Možemo ukloniti rizik i pojednostaviti makefile koristeći
varijablu. Varijable dopuštaju tekstualnom nizu da se definiraju odjednom i zamijene na
višestruka 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:

objects = main.o kbd.o commadn.o display.o \


insert.o search.o files.o utils.o

Nadalje, na svakom mjestu gdje želimo umetnuti listu naziva objekt fileova, možemo
zamoijeniti vrijednost varijable tako da upišemo `$(objects).`
Evo kako izgleda kompletan jednostavni makefile kada koristite varijablu za objekt fileove:

objects = main.o kbd.o command.o display.o \


insert.o search.o files.o utils.o

441/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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)

JOŠ JEDAN STIL MAKEFILEOVA


Kad su objekti stvarani samo po implicitnim pravilima, alternativni stil makefilea je
moguć. U ovom stilu makefileova, vaše se grupe unose po njihovim preduvjetima umjesto po
njihovim metama.

PRAVILA ZA ČIŠĆENJE DIREKTORIJA


Kompiliranje programa nije jedina stvar za koju ćete pisati pravila. Makefileovi
zajedički govore kako učiniti još neke stvari pokraj kompiliranja programa; na primjer, kako
poništiti sve objekt fileove i tako da direktorij bude `clean`.
Evo kako bismo mogli napisati make pravilo za čišćenje našeg editora iz primjera:
clean :
rm edit $(objects)

442/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PISANJE MAKEFILEOVA

ŠTO MAKEFILE SADRŽI


Makefileovi sadrže pet vrsta stvari: eksplicitna pravila, implicitna pravila, varijabilne
definicije, direktive i komentare. Pravila, varijable i direktive opisane su dalje u ovim
poglavljima.
Eksplicitno pravilo kaže kad i kako prepraviti jedan ili više fileova, nazvanih metom
pravila. Izlistava druge fileove o kojima meta ovisi, nazvanim preduvjetima mete.
Također može dati naredbe za korištenje pri kreiranju ili ažuriranju meta.
Implicitno pravilo govori kad i kako prepraviti razred fileova zasnovano na njihovim
nazivima. Opisuje kako meta može ovisiti o fileu sa nazivom sličnim meti i daje
naredbe za kreiranje ili ažuriranje takve mete.
Varijabilna definicija je linija koja određuje vrijednost tekstualnog niza za varijablu
koja može kasnije biti zamjena u tekstu. Ovaj jednostavni primjer makefilea prikazuje
varijabilnu definiciju objekta kao liste svih objekt fileova.
Direktiva je naredba da make učini nešto specijalno dok očitava makefile. To
uključuje:
- čitanje drugog makefilea
- odlučivanje
- definiranje varijable iz (verbatim) niza koji sadrži višestruke redove.

`#` u nizu makefilea označuje komentar. S ostatkom se niza ignorira, samo što
(trailing backslash) koji nije nestao iz drugog backslasha nastavlja komentar kroz
višestruki niz. Niz koji sadrži samo komentar (možda i sa razmakom ispred) prazan je
i ignorira se. Ako želite koristiti doslovce znak # učinite to backslashom (npr. \#).
Komentari se mogu pojaviti u bilo kojem nizu makefilea iako se oni posebno tretiraju
u određenim situacijama.

Sa komandnom skriptom (ako niz počinje s likom TAB) čitav se niz prenosi u shell, kao sa
bilo kojim drugim nizom koji počinje sa TAB. Shell odlučuje kako će se interpretirati tekst: je
li ovo komentar ili nije odlučuje shell.

443/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Sa direktivom define komentari se ne ignoriraju tijekom definiranja varijabli. Kad je


varijabla proširena, tretirati će se ili makeovim komentarom ili kao tekst u komandnoj skripti,
ovisno o sadržaju.

KOJE IME DATI VAŠEM MAKEFILEU


Kad make traži makefile, pokušava kroz slijedeće nazive, redom:
GNUmakefile`, `makefile` i `Makefile`.

U normalnim okolnostima trebati sve makefileove nazvati `makefile` ili `Makefile`. Prvi je
naziv provjeren, `GNUmakefile` nije preporučljiv za većinu makefileova. Trebali biste
koristiti ovaj naziv ukoliko imate makefile koji je specifičan GNU makeu i kojega neće
razumjete ostale verzije makea. Ostali make programi traže `makefile`, `Makefile`, ali ne i
`GMUmakefile`.

Ukoliko make ne pronađe ni jedan od ovih naziva, ne koristi niti jedan makefile. Zatim
morate specificirati cilj sa naredbenim argumentom i make će pokušati dokučiti kako da ga
prepravi koristeći samo ugrađena implicitna pravila.

Ukoliko želite koristiti nestandardni naziv za vaš makefile možete specificirati naziv sa `-f`
ili `--file` opcijom. Argumenti `-f name` ili `--file=name` govore makeu da
očita naziv name kao makefile. Ukoliko koristite više od više od jedne `-f` ili `--file`
opcije možete specificirati više makefileova.

444/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PRIDRUŽIVANJE DRUGIH MAKEFILEOVA


Include direktiva govori makeu da prekine očitavanje trenutnog makefilea i očita
jedan ili više makefileova prije nego što nastavi. Taj niz direktive u makefileu izgleda ovako:

Include filenames…

Filenames (nazivi fileova) ne mogu sadržavati shell file naziv veze.

Dodatni prostori dopušteni su i ignorirani na početku niza, ali tab nije dopušten. Prostor je
poželjan između include i naziva filea, te između naziva više fileova. Dodatni prostor
ignorira se tu i na kraju direktive. Komentar koji započinje sa `#` je dopušten na kraju niza.
Ukoliko naziv filea sadrži bilo koju varijabilnu ili funkcijsku referencu, on se proširuje.
Na primjer, ako imate tri `.mk` filea, `a.mk`, `b.mk` i `c.mk`, te $(bar)
ekspanzije do bla bla onda je slijedeće proširenje
include foo*.mk $(bar)
jednako
include foo a.mk b.mk c.mk bla bla

VARIJABILNI MAKEFILEOVI
Ako je definirano okruženje varijabilnog MAKEFILEA, make promatra njegovu
vrijednost kao listu naziva dodatnih MAKEFILEOVA koje će očitati prije drugih. Ovo djeluje
dosta slično include direktivi: različiti direktoriji pretraženi su za te MAKEFILEOVE.

Osnovna uporaba MAKEFILEOVA jest u komunikaciji između rekurzivnih zazivanja


makea. Obično nije poželjno namještati varijablu okruženja prije nego što make zazove gornji
nivo jer je najčešće bolje ne razmještati makefileove izvana. Kako god, ukoliko koristite make
bez određenog makefilea, makefile u MAKEFILEOVIMA može uraditi korisne stvari kako
bi vam pomogao da implicitna pravila djeluju bolje, poput npr. definiranja puta kojim se traži.

445/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

VARIJABILNA MAKEFILE_LISTA
Kako make očitava različite makefileove, uključujući bilo kakvo postizanje iz varijabli
MAKEFILEA, naredbenog niza,, default fileova, ili iz include direktiva, njihovi će se
nazivi automatski dodati varijabli MAKEFILE_LISTE.
To znači da je prva stvar što make učini jest pregled posljednje riječi u ovoj varijabli i to će
biti naziv trenutnog makefilea. Kad je jednom trenutni makefile uporabio include,
posljednja riječ će biti tek-pridruženi makefile.

Ako makefile nazvan Makefile ima ovakav sadržaj:

name1 := $(word $ (word $(,MAKEFILE_LIST)),$(MAKEFILE_LIST))


include inc.mk
name2 := $(word $(words $(MSKEFILE_LIST)),$(MAKEFILE_LIST))
all:
@echo name1 = $(name1)
@echo name2 = $(name2)

očekivat ćete da ima ovakav output:

name1 = Makefile
name2 = inc.mk

OSTALE POSEBNE VARIJABLE


GNU make također podržava posebne varijable. Zapazite kako će svaka vrijednost
koju pridodate varijabli biti ignorirana, uvijek će vraćati njezinu posebnu vrijednost.
Prva posebna varijabla je .VARIABLES. Kad se proširi, vrijednost sadrži listu naziva svih
globalnih varijabli definiranih u svim makefile očitavanjima do te točke. Ovo uključuje i
varijable koje imaju prazne vrijednosti kao i dograđene varijable, ali ne uključuje bilo koje
varijable koje su definirane samo meta-specificiranim sadržajem.

446/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KAKO SE MAKEFILEOVI STVARAJU


Ponekad se makefileovi mogu preraditi iz drugih fileova, poput RCS ili SCSS fileova.
Ako se makefile izradi iz drugih fileova, želite da make ima ažuriranu verziju makefilea koju
će učitati.

Nakon očitavanja svih makefileova make će razmotriti svaki kao ciljnu metu i pokušati je
ažurirati. Ako makefile ima pravilo koje govori kako to učiniti ili ako se implicitno pravilo na
to odnosi, bit će ažurirano ukoliko je potrebno. Nakon što su svi makefileovi provjereni,
ukoliko su se neki izmijenili, make započinje fazu čišćenja i ponovnog očitavanja
makefileova.

Ako znate da se jedan ili više vaših makefileova ne mogu preraditi i želite spriječiti make da
izvrši pretragu implicitnim pravilom, možete koristiti bilo koju uobičajenu metodu
sprječavanja implicitnog pretraživanja. Na primjer, možete napisati eksplicitno pravilo sa
makefileom kao metom, te praznu zapovjednu nit.

447/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

OČITAVANJE DIJELA IZ DRUGOG MAKEFILEA


Ponekad je korisno imati makefile koji je po svemu baš poput ostalih makefileova.
Često možete koristi `include` direktivu kako biste uključili jedno u drugo, te kako biste
dodali više meta ili varijabilnih definicija. Bilo kako bilo, ako dva makefilea daju različite
naredbe za istu metu, make vam neće dopustiti da to učinite. No postoji drugi način.

U ovom makefileu u kojega želite priključiti drugi možete koristiti match-anything pravilo
kako biste naredili da se prepravi bilo koja meta, što se ne može napraviti iz informacije u
sadržanom fileu. Make će pregledati drugi makefile.

Na primjer, ako imate makefile nazvan `Makefile` koji govori kako napraviti metu `foo`
(i druge mete). Možete napisati makefile nazvan `GNUmakefile` koji sadrži:

foo:
frobnicate > foo
%: force
@$(MAKE –f Makefile $@
force: ;

KAKO MAKE OČITAVA MAKEFILE


GNU make radi svoj posao u dvije faze. Tijekom prve faze očitava sve makefileove i
analizira sve varijable i njihove vrijednosti, implicitna i eksplicitna pravila i konstruira graf
ovisnosti svih meta i njihovih preduvjeta. Tijekom druge faze make koristi interne strukture
kako bi se odlučilo koje mete treba ponovno izgraditi, te potiče pravila koja su za to potrebna.

Važno je razumjeti ovaj dvofazni pristup jer ima izravan značaj na to kako se ponašaju
varijable i funkcijsko proširenje; ovo je često izvor zabuna pri pisanju makefilea. Ovdje ćemo
prikazati zbroj faza u kojima se proširenja odvijaju za različite konstrukcije unutar makefilea.
Kažemo da je proširenje trenutno ukoliko se događa za vrijeme prve faze: u ovom će slučaju
make proširiti bilo koju varijablu ili funkciju u tom razredu. Ako se proširenje ne izvede
odmah, kažemo da je ona deferirana. Ona se ne odvija dok god se bilo koja konstrukcija
kasnije ne pojavi u trenutnom kontekstu ili pak u drugoj fazi.
Možda niste upoznati s nekima od ovih konstrukcija.

448/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PRIJENOS VARIJABLI

immediate = deferred
immediate ?= deferred
immediate := immediate
immediate += deferred or immediate

define immediate
deferred
endef

Za pridodavanje operatora, `+=`, desna se strana razmatra trenutno ukoliko su varijable


prethodno uređene kao jednostavne varijable (`:=`) i drugačije.

KONDICIONALNI IZVADAK
Sve instance kondicionalne sintakse su u potpunosti izbačeni, to uključuje ifdef, ifeg,
ifdef i ifneg oblike.

DEFINICIJA PRAVILA
Pravilo se uvijek proširuje na isti način, bez obzira na formu:
immediate : immediate ; deferred
deferred
To jest, dijelovi mete i preduvjeta prošireni su odmah, a zapovijedi korištene pri konstruiranju
mete su uvijek deferirane. Ovo općenito pravilo je istinito za eksplicitna pravila, pravila o
vezama, o sufiksima i statističkim vezama, te za definicije jednostavnih preduvjeta.

449/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PISANJE PRAVILA

Pravilo se pojavljuje u makefileu i govori kad i kako prepraviti određeni file, a naziva
se metom pravila. Izlistava druge fileove koji su preduvjeta mete i naredbe koje će koristiti pri
kreiranju ili ažuriranju mete.

Red pravila nije bitan, osim odlučivanja 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 višestruke mete, samo je prva meta uzeta kao default. Postoje dvije iznimke:
meta koja počinje sa točkom nije default osim ako ne sadrži jednu ili više kosih crta `/` i meta
koja definira da pravilo veze nema učinka na default cilj.

PRIMJER PRAVILA
Ovdje je jedan primjer pravila:
foo.o : foo.c defs.h #module for t widdling the forbs
cc –c –g foo.c

Njegova je meta `foo.o`, a preduvjeta `foo.c` i `defs.h`. Ima jednu naredbu, koja je `cc –c –g
foo.c`. Naredbeni niz počinje tabom kako bi se identificirala kao naredba.

Ovo pravilo ukazuje na dvije stvari:

kako odlučiti da li je `foo.o` zastario ; zastario je ako ne postoji


kako ažururati file `foo.o` koristeći cc. Naredba ne spominje izričito `defs.h`, no
pretpostavljamo da je `foo.c` uključuje i stoga je `defs.h` dodan preduvjet.

SINTAKSA PRAVILA
Općenito, pravilo izgleda ovako:

targets : prerequisites
command

450/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

ili ovako:

targets : prerequisites ; command


command

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. Obično postoji samo jedna
meta po pravilu, no povremeno ima razloga da ih bude više.

Naredbeni nizovi započinju tab oznakom. Prva se naredba može pojaviti u nizu nakon
preduvjeta sa tab oznakom ili se može pojaviti u istom nizu sa polunizom. U oba slučaja
efekt je isti.

Budući da se simbol dolara koristi za započinjanje varijabilnih referenci, ako zaista želite
simbol dolara morate ih upisati dva, `$$`. Možete uzduž podijeliti niz umećući blackslash iza
kojeg slijedi novi red, no ovo nije obavezno, budući da make ne postavlja granice u redovima
makefilea.
Pravilo govori dvije stvari: kad je meta zastarjela i kako je ažurirati kad je potrebno.

Kriterij za zastarjelost je određeno uvjetom preduvjeta, koji sadrži imena fileova koji su
odvojeni razmakom. Zamisao je da se sadržaj mete filea temelji na informaciji u preduvjeta,
tako da ako se neki preduvjeta izmijeni, sadržaj postojeće mete više nužno 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 izgrađenih 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 počne izgrađivati metu. Drugo, unosi ovisnu vezu: ako je bilo koji preduvjet
noviji od mete, ona se smatra zastarjelom i moraš e ponovno izgraditi.

451/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Naravno, to je upravo ono što vi želite: ako je preduvjet mete ažuriran, isto se treba učiniti sa
metom.

UPORABA WILDCARD OZNAKA U NAZIVIMA


FILEOVA
Samo jedan naziv može označavati mnoge fileove koji koriste wildcard oznake. U
makeu su one `*´´,´?` i (…). Na primjer, `*.c` označava popis svih fileova čiji
nazivi završavaju sa `.c`.

Oznaka ` na početku file može također značiti da file od posebnog značaja. Ako je samo ili
iza njega slijedi crta, predstavlja vaš home direktorij. Na primjer `~/bin` prošireno je
`home/you/bin`. Ako nakon `~` slijedi riječ, nit predstavlja home direktorij korisnika
koji je nazvan po toj riječi. Na primjer, `~john/bin` proširuje 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
okruženja HOME.

TRAŽENJE DIREKTORIJA ZA PREDUVJETE


Za velike direktorije često je poželjno umetanje izvora u odvojene direktorije iz
binarnog sustava. Odlike traženja direktorija u makeu zadovoljavaju ovo automatskim
traženjem više direktorija kako bi se pronašao preduvjet. Kad raspodijelite fileove među
direktorije, ne trebate mijenjati pojedinačna pravila, samo tražite putove.

LAŽNE METE
Lažna je meta ona koja nije pravi naziv filea. To je tek naziv za neke naredbe koje se
izbacuju kad to izričito zatražite. Postoje dva razloga za korištenje lažnih meta: za
izbjegavanje sukoba sa istoimenim fileom ili kako bi se poboljšala izvedba.

Ako napišete pravilo čije naredbe neće kreirati ciljanu metu, naredba će biti izbačena
svaki put kad se meta bude prepravljala. Evo primjera:
clean:
rm*.o temp

452/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Budući da rm naredba ne stvara file nazvan `clean`, takav file vjerojatno nikad neće
postojati. Zato će rm naredba biti izbrisana svaki put kad kažete `make clean`.

Lažna će meta prestati raditi ako bilo što ikad kreira file nazvan `clean` u ovom direktoriju.
Budući da preduvjeta nema, file `clean` razmotrit će se za ažuriranje, a njegova se naredba
neće izbaciti. Kako bi se izbjegao ovaj problem, možete izričito zatražiti lažne mete koristeći
posebnu metu .PHONY.

.PHONY : clean

Kad ste ovo napravili, `make clean` će provoditi naredbe bez obzira postoji li file
nazvan `clean`. Pošto zna da lažne mete ne imenuju prave fileove koji se mogu prepraviti
iz drugih fileova, make preskače implicitno pravilo o potrazi za lažnim metama. Zato je
deklariranje mete lažnom dobra izvedba, čak i ako vas ne zabrinjava da takav file postoji.
Zato prvo morate napraviti niz koji tvrdi da je clean lažna meta, zatim napišete pravilo
ovako:

.PHONY: clean
clean:
rm*.o temp

Još jedan primjer korisnosti lažnih meta je u kombinaciji sa rekurzivnim invokacijama makea.
U ovom slučaju nakefile će često sadržavati varijablu koja izlistava broj poddirektorija koje
treba izgraditi. Jedan način na koji se to riješava je s jednim pravilom čija je naredba shell
petlja preko poddirektorija, ovako:

SUBDIRS = foo bar baz

subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) –C $$dir; \
done

453/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Doduše, postoji nekoliko problema sa ovom metodom. Prvo, otkrivena greška u pod-makeu
nije obuhvaćena ovim pravilom tako da će nastaviti graditi ostatak direktorija čak i kada se
jedan sruši. To se može preduhitriti tako da se doda shell naredba koja će primijetiti grešku i
izaći, no tada će to raditi čak i ako make pobudi –k opcija, koja je nesretna. Drugo, i možda
još važnije, ne možete oduzeti prednost paralelno izgrađenim mogućnostima makea koji
koriste ovu metodu, budući da postoji samo jedno pravilo.

Deklariranjem poddirektorija kao lažne mete uklonit ćete ove probleme:

SUBDIRS = foo bar baz


.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) –C $@
foo: baz

Ovdje smo također deklarirali da `foo` poddirektorij ne može biti izgrađen dok god `baz`
direktorij nije potpun; ovakva povezanost deklaracije je osobito važna kad se pokušava
paralelno izgrađivanje.

Lažne mete ne bi trebale biti preduvjet prave mete filea; ako je, njene naredbe se pokreću
svaki put kada make ažurira taj file. Dok god lažna meta nije preduvjet prave mete, naredbe
lažne mete će se izbacivati samo kad je lazna meta određena za cilj.

Lažne mete mogu imati preduvjete. Kad jedan direktorij sadrži višestruke programe, najviše
bi odgovaralo opisivanje svih programa u jednom makefileu `./Makefile`. Budući da će meta
prepravljana pogreškom biti prva u makefileu, ustaljeno je nazvati ovu lažnu metu `all` i
dati joj, kao preduvjeta, sve individualne programe. Na primjer:

all : prog1 prog2 prog3


.PHONY : all
prog1 : prog1.o utils.o

454/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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

PRAVILA BEZ NAREDBI I PREDUVJETA


Ako pravilo nema preduvjetA niti naredbi i meta pravila je nepostojeći file, make
zamišlja da je ova meta ažurirana svaki put kad se pravilo pokreće. Ovo znači da sve mete
koje ovise o ovoj, njihove će se naredbe uvijek pokretati.

PRAŽNJENJE META FILEOVA KAKO BI SE SNIMILI


DOGAĐAJI
Isprazni metu je mogućnost lažnih meta, obično drži naredbe za radnje koje s vremena
na vrijeme eksplicitno zatražite. Za razliku od lažnih meta, meta filea zaista može postojati,
ali sadržaj filea nije bitan i obično je prazan.

Svrha praznih meta fileova jest za snimanje, sa vremenom zadnje modifikacije, tj. kad su
pravila naredbe zadnji put izbačene. Ovakav file bi trebao imati neke preduvjete. Kad
zatražite prepravljanje praznu metu, naredbe se izbacuju ukoliko je bilo koji preduvjet češći
od mete; drugim riječima, ako se preduvjet promijenio od kad ste zadnji put prepravljali metu.
Evo primjera:

print: foo.c bar.c


lpr –p $?
touch print

POSEBNO UGRAĐENI NAZIVI META


Određeni nazivi imaju posebna značenja ako se pojavljuju kao meta.
To su: .PHONY, SUFFIXES, .DEFAULT, .PRECIOUS, .INTERMEDIATE,
.SECONDARY, .DELETE_ON_ERROR, .IGNORE, .LOW_RESOLUTION_TIME,
.SILENT, .EXPORT_ALL_VARIABLES, .NONPARALLEL.

455/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

VIŠETRUKA PRAVILA ZA JEDNU METU


Jedan file može biti meta za više pravila. Svi preduvjeti spomenuti u svim pravilima
nalaze se na jednoj listi preduvjeta za metu. Ukoliko je meta starija od bilo kojeg preduvjeta
bilo kojeg pravila, naredbe se odbacuju.

Može postojati samo niz naredbi koje se izbacuju za file. Ukoliko više od jednog pravila
izdaje naredbu za isti file, make koristi posljednji dani niz i ispisuje poruku s greškom.
Povremeno je korisno da iste mete pobuđuju različite naredbe koje su definirane u različitim
dijelovima vašeg makefilea; možete koristiti double-colon pravila.

Posebno pravilo samo sa preduvjeta može se koristiti za davanje dodatnih preduvjeta mnogim
fileovima odjednom. Na primjer, makefileovi često imaju varijablu poput objekata kojoi
sadrže popis svih kompiliranih output fileova u sustavu koji se gradi. Lak načina da se kaže
kako se svi oni moraju rekompajlirati ako se `config.h` promijeni, učinit ćete ako napišete:
objects = foo.o bar.o
foo.o : defs.h
bar.o : defs.h test.h
$(objects) : config.h

STATIČNI UZORCI PRAVILA


Ovo su pravila koja određuju višestruke mete i konstruiraju nazive preduvjeta za svaku
metu zasnovanu na njenom imenu. Općenitiji su od običnih pravila sa višestrukim metama jer
mete ne moraju imati identične preduvjete. Oni moraju biti analogni, ali ne nužno identični.

PRAVILA DVOSTRUKIH KOLONA


To su pravila napisana sa `::` umjesto `:` iza naziva meta. Kad se iste mete
pojavljuju u više od jednog pravila s njima se postupa različito od običnih pravila.

Kad se meta pojavi u višestrukim redovima, sva pravila moraju biti istoga tipa: sva uobičajena
ili sva u dvostrukoj koloni. Ako su u dvostrukoj koloni svaki je od njih neovisan o drugima.
Svaka naredba dvostruke kolone izvršeno je ako je meta starija od bilo kojih preduvjeta toga
pravila. Ako nema preduvjeta za to pravilo, njegove se naredbe uvijek izvršavaju (čak i ako

456/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

meta već postoji). Ovo može rezultirati tako da se izvrši nijedno, neka ili sva pravila
dvostrukih kolona.

Pravila dvostrukih kolona za metu izvršavaju se redom kako se pojavljuju u makefileu. Kako
god, slučajevi gdje dvostruke kolone imaju smisla su ona gdje redoslijed izvršavanja naredbi
nije bitan.

457/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KAKO KORISTITI VARIJABLE

Varijabla je naziv definiran u makefileu koji predstavlja tekstualni niz, nazvan


varijabilnom vrijednošću. Ove su vrijednosti zamjene za eksplicitne naredbe u mete,
preduvjete, naredbe i druge dijelove makefilea.

Varijable i funkcije u svim dijelovima makefilea proširuju se kad se očitaju, osim za shell
naredbe u pravilima, desnim stranama varijabilnih definicija koristeći `=` i tijela varijabilnih
definicija koja koriste define direktivu.

Varijable mogu predstavljati liste naziva fileova, mogućnosti zaobilaženja kompiliranja,


programa za pokretanje, direktorija za pretraživanje izvora fileova, direktorija za ispisivanje
outputa ili bilo što što možete zamisliti.

Naziv varijable može biti nastavak oznaka koje ne sadrže `:´,´#´,`=` ili koje vode do
praznog prostora. Kako god, nazive koji sadrže oznake koje nisu slova, brojevi i slično treba
izbjegavati, jer mogu imati posebna značenja u budućnosti. Nazivi varijabli su osjetljivi.
Nazivi `foo`, `FOO` i `Foo` odnose se na tri različite varijable. U nazivima varijabli
korištenje ovih slova je tradicionalno, no preporučamo korištenje slova donjeg tipa za
parametre kako bi se kontrolirala implicitna pravila ili parametri, koje će korisnik preskočiti
sa naredbenim opcijama.

OSNOVE VARIJABILNIH REFERENCI


Da biste zamijenili vrijednost varijable, upišite znak dolara uz ime varijable u zagradi
ovako: $(foo) ili ${foo}. To je ispravna referenca varijable foo. Poseban značaj `$`
je u tome da morate upisati `$$` kako biste dobili učinak za oznaku jednog dolara.

Varijabilne reference mogu se koristiti u bilo kojem kontekstu: metama, preduvjetima,


naredbama, većini direktiva i novim varijabilnim vrijednostima. Evo primjera za zajednički
slučaj gdje varijable sadrže sadrže nazive svih objekt fileova u programu:

objects = program.o doo.o utils.o

458/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

program : $(objects)
cc –o program $(objects)
$(objects) : defs.h

Varijabilne reference rade po strogoj tekstualnoj zamjeni. Tako da se pravilo

foo = c
prog.o : prog.$(foo)
$(foo)$(foo) -$(foo) prog.$(foo)

može primijeniti u kompiliranju C programa `prog.c`. Budući da su razmaci ispred


varijabilne vrijednosti ignorirani u varijabilnim oznakama, vrijednost fooa je precizno `c`.
(Nemojte doslovno ovako pisati svoje makefileove!)

DVA TIPA VARIJABLI


Postoje dva načina po kojima GMU make varijabla može imati vrijednost. Razlikuju
se po tome kako su definirani i u čemu djeluju kad ih se proširi.
Prvi je tip varijable rekurzivno proširena varijabla. Varijable ovog tipa definirane su po
redovima koristeći znak `=` ili po define direktivi. Vrijednost koju odredite je instalirani
verbatim. Ako sadrži reference drugim varijablama, te se reference proširuju kad god se ova
varijabla zamjenjuje.

459/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KONDICIONALNI DIJELOVI MAKEFILEA

Kondicional uzrokuje da se dio makefilea ignorira ovisno o vrijednosti varijable.


Kondicionali mogu usporediti vrijednost jedne varijable s drugom, ili vrijednost varijable s
konstantnom niti. Kondicionali kontroliraju što make zapravo vidi u makefileu, tako da se ne
mogu koristiti pri kontroli shell naredbe u vrijeme izbacivanja.
Primjer:
Libs_for_gcc = -lgnu
Normal_libs =
Foo: $(objects)
Ifeq ($(CC),gcc)
$(CC) –o foo $(objects) $(libs_for_gcc)
else
$(CC) –o foo $(objects) $(normal_libs)
endif

Kondicional slučajevi koriste tri direktive: jednu ifeg, jednu else i jednu endif.

Direktiva ifeg počinje sa kondicionalom i označava stanje. Sadrži dva argumenta odvojena
sa zarezom i okružena zagradama. Varijabilna zamjena je obavljena za oba argumenta i oni su
uspoređeni. Linije u makefileu koje slijede ifeg su pročitane ako se dva argumenta
podudaraju, inače su ignorirane.

Direktiva else uzrokuje sljedbeni niz koji se očitava ako je prethodni kondicional propao. U
primjeru iznad to znači da je druga alternativa povezivanja naredbi korištena kad god se prva
alternativa ne koristi. Imati else u kondicionalu je po izboru.

Endif direktivom kondicional završava. Svaki kondicional mora završiti sa endif. Slijedi
tekst koji ne sadrži kondicional.

460/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

SINTAKSE KONDICIONALA
Sintaksa je jednostavan kondicional bez else kako slijedi:
conditional-directice
text-if-true
endif

Text-if-true može biti bez tekstualne linije da bi se smatrao dijelom makefilea ako je stanje
istinito. Ako je stanje lažno, nikakav se tekst ne koristi.

Sintaksa conditional-directive je ista bilo da je kondicional jednostavan ili složen. Postoje


četiri različite direktive koje testiraju različita stanja. Evo njihove tabele:

ifeg (arg1, arg2)


ifeg `arg1` `arg2`
ifeg «arg1» «arg2»
ifeg «arg1» «arg2»
ifeg `arg1` `arg2`

Proširi sve varijabilnle reference u arg1 i arg2 i usporedi ih. Ako su identične text-if-true je
efektivan, u protivnom je text-if-false, ako ga ima, efektivan.

461/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

FUNKCIJE PREOBRAZBE TEKSTA

Funkcije vam dopuštaju da procesirate tekst u makefileu, da kompilirate fileove, da


njima operirate ili da koristite naredbe. Funkciju koristite u function call, gdje date naziv
funkcije i nešto teksta (argumente) da biste operirali funkcijom. Rezultat procesiranja funkcije
je zamijenjen za makefile na temelju poziva, baš kao što se zamjenjuje varijabla.

SINTAKSA FUNKCIJSKOG POZIVA


Funkcijski poziv liči na varijabilnu referencu. Izgleda ovako:

$(function arguments)
ili ovako:
${function arguments}

Ovdje je function ime funkcije; jedan od naziva s kratke liste koji su dio makea. Također
možete sastavno kreirati vlastite funkcije koristeći ugrađenu call funkciju.

Arguments su argumenti funkcije. Od funkcije su odvojeni imenom s jednim ili više razmaka i
ako postoji više od jednog argumenta, onda su odvojeni zarezom. Takav prostor i zarezi nisu
dio vrijednosti argumenta. Delimitri koje koristite kako biste okružili funkcijski poziv, mogu
se pojaviti u argumentu samo u prikladnim parovima; druga se vrsta delimitara može pojaviti
pojedinačno. Ako argument sam po sebi sadrži funkcijski poziv ili varijabilnu referencu,
najpametnije je koristiti istu vrstu delimitara za sve reference; napišite `$(subst
a,b,$(×))`, a ne `$(subst a,b,${×})`. Zato što je jasnije i zato što samo jedan
tip delimitara odgovara da bi se pronašao 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
izvršena 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 može pojaviti u tekstu prvog argumenta kako je

462/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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'.

Ovdje subs funkcija zamjenjuje svaki razmak sa zarezom, kroz vrijednost fooa i
zamjenjuje rezultat.

FUNKCIJE ZA ZAMJENU NIZA I ANALIZA


Ovdje su neke funkcije koje operiraju nizom:

$(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,

$(subst ee,EE,feet on the street)

zamjenjuje niz `fEEt on the strEEt`.

$(patsubst pattern,replacement,text)
Pronalazi razmak odvojen riječima u textu koji odgovara uzorku i zamjenjuje ih zamjenom.
Ovdje uzorak može sadržavati `%` koji ima ulogu wildcard oznake, a odgovara bilo kojem
broju bilo koje oznake unutar riječi. Ako zamjena također sadrži `%`, 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

FUNKCIJE ZA NAZIVE FILEOVA


Nekoliko ugrađenih proširenih funkcija odnosi se na razdvajanje naziva fileova ili liste
naziva fileova.
Svaka od slijedećih funkcija izvodi određenu transformaciju naziva filea. Argument finkcije
odnosi se na seriju naziva fileova, odvojenih razmakom. Svaki naziv filea u seriji mijenja se
na isti način i rezultati su prikazani sa pojedinačnim razmacima između njih.

Razlikujemo value funkciju, eval funkciju, te origin i shell funkciju.

FUNKCIJE KOJE KONTROLIRAJU MAKE


Ove funkcije kontroliraju pokretanje makea. Općenito proizvode informacije za
korisnika makefilea ili kako bi naveli make da stane ako dođe do nekakve pogreške u
okruženju.

$(error text…)

Generira kobnu pogrešku gdje je poruka text. Primijetite kako se pogreška generira svaki put
kad je ova funkcija procijenjena. Tako, ako umetnete naredbu ili doznaku na desnoj strani
rekurzivne varijable, neće se procjenjivati neko vrijeme. Text će se proširiti prije nego što se
pogreška generira. Na primjer,

Ifdef ERROR1
$(error error is $(ERROR1))
endif

će generirati fatalnu pogrešku za vrijeme čitanja makefilea ako je make varijabla ERROR1
definirana.

KAKO POKRENUTI MAKE


Makefile nam govori kako se rekompilirani program može koristiti za više slučajeva.
Najjednostavnija je uporaba rekompiliranje svakog filea koji je zastario. Obično su
makefileovi napisani tako da kad pokrenete make bez ikakvih argumenata, on radi samo to.

464/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Međutim možda želite ažurirati samo neke od svojih fileova, pa želite koristiti različite
mogućnosti kompiliranja; možda želite samo pronaći koji su fileovi zastarjeli i ne želite ih
mijenjati.
Dajući argumente dok make radi, možete učiniti bilo koju od ovih stvari i još mnoge druge.
Izlazni status makea uvijek je jedan od triju vrijednosti:
0
Izlazni status je nula ako je make uspješan.
2
Izlazni je status dva ako makenaiđe na kakve pogreške. Ispisat će poruke opisujući
određene pogreške.
1
Izlazni je status jedan ako koristite `-q' zastavicu I make zaključuje da su neke mete
zastarjele.

ARGUMENTI KOJI ODREĐUJU MAKEFILE


Makefile ćete odrediti sa `-f' or `--file' opcijom (`--makefile' također
djeluje). NA primjer, `-f altmake' upućuje na upotrebu `altmake' kao makefilea.
Ukoliko koristite `-f' zastavicu više puta I slijedite svaki `-f' sa argumentom, svi se
specificirani fileovi koriste združeno kao makefileovi.
Ako ne koristite `-f' ili `--file' zastvicu, pogrešno je pokušati `GNUmakefile', `makefile',
i `Makefile', tim slijedom, kao I uporaba prve riječi od ovo troje.

ARGUMENTI KOJI ODREĐUJU CILJEVE


Ciljevi su mete koje bi make trebao potpuno ažurirati. Drugemete su ažurirane kako se
pojavljuju kao prerekviziti ciljeva, ili prerekviziti prerekvizita ciljeva itd.
Pogreškom, cilj je prva meta u makefileu (ne brojeći mete koje započinju sa točkom).Stoga,
makefileovi se obično pišu tako da prva meta kompilira čitav program ili programe koje
opisuje. Ako prvo pravilo u makefileu ima nekoliko meta, samo prva meta u pravilu postaje
pogrešan cilj, a ne čitava lista.
Makeu možete odrediti različite ciljeve (ili cilj). Upotrebite naziv cilja kao argument. Ako
označite nekoliko ciljeva make procesira svaki od njih i to redom kojim vi želite.
Bilo se koja meta u makefileu može odrediti kao cilj (osim ako počinje sa `-' ili sadrži `=').
Mogu se označiti čak I mete koje nisu u makefileu, ukoliko make može pronaći implicitna
pravila koja govore kako ih napraviti.
Make postavlja posebnu variablu MAKECMDGOALS u listi ciljeva koju ste označili na
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

ifneq ($(MAKECMDGOALS),clean)
include $(sources:.c=.d)
endif
Uporaba određivanja 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 sadržavati nekoliko programa, sa makefileom koji
započinje ovako:
.PHONY: all
all: size nm ld ar as
Ukoliko radite na veličini programa (size), vjerojatno ćete htjeti narediti `make size`
tako da se rekompiliraju samo fileovi iz tog programa.
Još jedna uporaba određivanja cilja je da se uredi da fileovi nisu mormalno napravljeni.
Primjerice, to može biti file outputa ili verzija programa koja je kompilirana posebno za
testiranje, koje sadrži pravilo u makefileu, no nije prerekvizit neispravnog cilja.
Još jedna uporaba određivanja cilja je da se pokrenu naredbe povezane sa lažnim metama ili
praznim metama. Mnogi makefileovi sadrže lažnu metu nazvanu `clean` koja uništava sve
osim izvornog filea. Jasno, to će učiniti samo ako zatražite `make clean`. Slijedi popis tipičnih
lažnih naziva praznih meta.
`all'
`clean'
`mostlyclean'
`distclean'
`realclean'
`clobber' .
`install'
`print'
`tar'
`shar'
`dist'
`TAGS'
`check'
`test'

IZBJEGAVANJE REKOMPAJLIRANJA NEKIH FILEOVA


Ponekad možda izmijenite izvorni file ali ne želite rekompilirati sve fileove koji o njemu
ovise. Na primjer, pretpostavimo da dodate makro ili deklaraciju glavnom fileu o kojemu
mnogi drugi fileovi ovise. Make konzervativno pretpostavlja da o glavnom fileu ovisi i
rekompilacija mnogih drugih fileova, no vi znate da se oni ne trebaju rekompilirati I ne želite
trošiti vrijeme na čekanje da se svi oni kompiliraju.
Ukoliko iščekujete problem prije nego što izmijenite glavni file, možete koristiti `-t`
zastavicu- Ona govori makeu da ne pokreće naredbe unutar pravila, nego da označi ažurirane
mete mijenjajući im posljednji datum modifikacije. Slijedit ćete ovaj postupak:

466/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

1. Koristite naredbu `make' kako biste rekompilirali izvorne fileove koji zaista trebaju
rekompilaciju, uvjerivši se da su objekt fileovi ažurirani prije nego što počnete.
2. Napravite promjene u glavnim fileovima.
3. Upotrijebite naredbu `make -t' kako biste označili sve objekte do zadnje izmjene.
Slijedeći put kad budete pokretali make, promjene u glavnom fileu neće uzrokovati
nikakve rekompilacije.

Ukoliko ste već promijenili glavni file do trenutka kad neki fileovi zatrebaju rekompilaciju,
prekasno je da ovo napravite. Umjesto toga možete upotreijebiti `-o file` zastavicu, koja
specifični file označava “starim”. To znači da se file sam po sebi neće preraditi niti će se
preraditi išta drugo na njegov račun. Slijedite ovu proceduru:

1. Rekompilirajte izvorne fileove koji kompilaciju trebaju zbog razloga neovisnih o


određenom oglavnom fileu sa naredbom `make -o headerfile'. Ako je
uključeno nekoliko fileova, upotrijebite posebnu `-o` opciju za svaki glavni file.
2. Dodirnite sve objekt fileove sa `make -t'.

TESTIRANJE KOMPAJLACIJE PROGRAMA


Naravno, kad se dogodi pogreška u izvršavanju shell naredbe, make odmah odustaje
I vraća nonzero status. Dalje se ni jedna naredba ne izvršava niti za jednu metu. Pogreška
upućuje na to da se cilj ne može ispravno prepraviti I make obo ozvjesti čim sazna.
Kad kompilirate program koji ste upravo izmijenili, to nije ono što želite. Umjesto toga radije
biste da make kompilira svaki file koji može, kako bi vam pokazao što je više moguće
kompilacijskih pogrešaka.
U ovakvim prilikama trebali biste koristiti `-k' ili `--keep-going' zastavicu. Ovo govori
makeu da nastavi s razmatranjem ostalih prerekvizita, prepravlja ih ako je potrebno – prije
nego što odustane I vrati se na nonzero status.Na primjer, nakon pogreške u kompilaciji
jednog objekt filea `make -k' će nastaviti s kompiliranjem drugih objekt fileova iako već
zna da je njihovo povezivanje nemoguće. Nakon što je shell naredba propala `make -k' će
nastaviti s radom što je više moguće nakon spoznaje da ne zna kako napraviti metu ni
prerekvizit filea. Ovo će svaki put uzrokovati pogrešnu poruku, ali bez `-k` ta je pogreška
fatalna.
Uobičajeno ponašanje makea pretpostavlja da je vaša svrha namještanje ciljeva; jednom kada
make nauči da je to nemoguće, može bez problema priopćiti propast. `-k` zastavica kaže da
je prava svrha testiranje što je više moguće promjena koje nastanu u programu, možda kako bi
se otkrilo nekoliko neovisnih problema pa da ih možete ispraviti prije idućeg pokušaja
kompiliranja. Zato Emacova M-x compile naredba upućuje na `-k` zastavicu kao na
pogrešku.

467/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

ZAKLJUČAK
Kroz ovaj seminarski rad pokušao sam objasniti uporabu makea. Ovdje je neizbježan
file nazvan makefile, koji šalje naredbe makeu. Najčešće nam makefileovi pokazuju kako
kompajlirati i povezati program. Makefile također upućuje kako pokrenuti naredbe koje su
izričito tražene, kao na primjer uklanjanje određenog filea kao radnja čišćenja.

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 suvišnog gubljenja vremena. Osmišljen još u ranim 1970-ima,
make je do današnjih dana okosnica u većini programskih projekata. Sadrži bogati spektar
izbora koji vam dopušta manipulaciju višestrukim direktorijima, zatim izgradnju različitih
verzija programa, te se prilagođava vašim potrebama.

Pišući ovaj seminar ustanovio sam zašto ovaj program zauzima visoko mjesto u procesu
izgradnje softvera unatoč mnogobrojnoj mlađoj konkurenciji.

468/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Damir Jajetić, Tomislav Domanovac

CVS – SUSTAV ZA
VERZIONIRANJE

469/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

UVOD

Ovaj dokument sadrži seminarski rad na temu “CVS – sustav za verzioniranje”.


Pokušaćemo kroz njega pružiti uvid u osnovne funkcionalnosti koje nam ovaj i ovakav sustav
pruža.
U ovom uvodu biti će definirani neki pojmovi koji su bitni za daljnji sadržaj
dokumenta.
CVS je alat za upravljanje i kontrolu programskog koda. To je vrlo pojednostavljena,
no točna definicija.
Ukoliko želimo definirati preciznije, potrebno je dodati da osim same kontrole i
verzioniranja programskog koda, takvi sustavi zapravo omogućuju ozbiljan razvoj grupama
programera, i oni služe kao repozitorij svih datoteka koje su uključene u projekt na kojemu se
radi.
Najprimitivniji način upravljanja datotekama je redovno pohranjivanje u projekt
uključenih datoteka. Na taj način postoji posljednja verzija tih datoteka no to iz pogleda osobe
uključene u razvoj ostavlja otvorenim slijedeća pitanja i probleme:
• Nešto sam promijenio, odlučio vratiti nazad promjene, no nemogu pronaći
datoteku.
• U programu je neki čudnovati kod, zašto je tamo?
• Prijavljen je gubitak funkcionalnosti programa od prošlog 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 više
nema.
• Potrebno je napraviti velike izmjene u dijelu koda i paralelno ispravljati bugove u
predanim skriptama.
• Dobio sam nečiji tuđi kod na kojem pri svakom novom releasu moram raditi neke
izmjene.
• Imam dugotrajni veliki projekt, sa velikim količinama koda i datoteka i izrada
dnevnih backupa svega toga se otima kontroli. Niko ne vodi računa o ažurnosti
backupiranih podataka.

470 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

• Nemogu pratiti povijest promjena nekih datoteka.


Svaki dobar alat za upravljanje i verzioniranje programskog koda mora imati
zadovoljavajuće rješenje za svaki od ovih problema.
Developeri moraju rado koristiti taj alat, dakle nesmije im biti naporan za korištenje, i
mora se moći integrirati sa razvojnim alatima koje na projektu koristimo. Treba voditi računa
i o mrežnim mogućnostima alata, dakle pokrivene moraju biti i opcije mrežnog pristupa
takvom servisu, ponekad će razvojni timovi biti dislocirani, i treba im omogućiti pristup bez
ugrožavanja sigurnosti, a i u slučaju da nisu stalno spojeni na mrežu, mora im se omogućiti
produktivnost.
CVS je dobar odabir takvog alata. Kroz ovaj seminarski rad pokušati ćemo pružiti
uvid u njegove glavne funkcionalnosti.
Generalno se za CVS može reći da je lagan za uporabu. Novo sučelje ili par novih
komandi za naučiti. Naravno da postoje i kompliciraniji dijelovi ali oni mogu biti “zakopani”
u perl skriptama da bi se omogućilo lakše korištenje. Može raditi na više datoteka odjednom,
fleksibilan je (misleći pritom otvorenost prema razvojnim okruženjima).
Vrlo je bitna karakteristika i njegova cijena. CVS nije skup, plaća se zapravo samo
znanje instalacije i održavanja, a raditi će dobro i pouzdano čak i pod većim opterećenjem
ukoliko je dobro postavljen i instaliran.

471 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

CVS model

Cvs model nije zaključaj – izmijeni – otključaj model.


To znači da ne ohrabruje pristup po kojem programer uzima datoteku zaključava ju
onemogućavajući drugima pristup, mijenja ju i zatim izmijenjenu vraća u stanje raspoloživosti
za druge.
Takav model, zaključavanja datoteka na kojima se radi, može biti vrlo nepopularan u
razvojnom okružju u kojem developeri nemogu međusobno brzo komunicirati, jer stvara
velike probleme ukoliko neki član razvojnog tima zaboravi otključati datoteku, nego npr ode
na godišnji odmor ostavljajući zaključane neke datoteke na kojima je radio izmjene. To može
dovesti do rušenja atmosfere u razvojnom timu, pa ako situacija eskalira i do prijetnji te
fizičkih obračuna.
CVS model je kopiraj – izmijeni – spoji model.
Model radi na slijedeći način: 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 također mogu raditi na svojim kopijama te iste datoteke), nakon završetka
rada na datoteci on tu datoteku izmjenjenu vraća nazad u CVS zajedno sa dnevnikom
promjena koje je na njoj učinio, 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 magičnim procesom zanavlja i njihove radne verzije, i tako to ide u tom
neprekidnom krugu čineći developerski život punim uzbuđenja i iznenađenja svojim te tuđim
postignućima.
Naravno to sve zvuči 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 slijedeću situaciju: developer A iz CVS sistema kopira (glavne radne datotečne
strukture, repozitorija) svoju radnu verziju opsjednut raznim idejama o poboljšanjima 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 započinje
odmah, jer developer A već pomamljeno radi izmjene, koje oduševljeno prijavljuje u
repozitorij kao novu verziju, pa zatim odmah nastavlja dalje i radi daljnje izmjene. Prođu tako
dani, developer A iscrpljeno u repozitorij prijavljuje 6. izmjenu i odlazi na zasluženi
počinak. U to vrijeme developer B primjećuje da je prije nekoliko dana planirao nešto raditi te

472 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

se svladavajući gađenje, napokon odlučuje malo provršljati po kodu, pri tom ni ne


pomišljajući da obnovi svoju kopiju računajući s tim da naravno nitko nije radio izmjene po
datoteci ako nije ni on, te načini i sam neke izmjene u kodu. Nakon testiranja developer B
odlučuje prijaviti svoju datoteku u repozitorij. U tom trenutku dogoditi će se slijedeće, kako je
datoteka na kojoj B prijavljuje izmjene u međuvremenu mijenjana od ambicioznog
developera A CVS će B-a obavijestiti o tome da se datoteka na kojoj je činio izmjene u
međuvremenu mijenjana te da ju mora obnoviti prije prijavljivanja. Iznerviran tuđom
brzopletošću B obnavlja svoju datoteku i ukoliko se njegov rad na datoteci ne odnosi na kod
mijenjan od Developera A, prijavljivanje izmjena će proći u najboljem redu, i B će napokon
zasluženo odahnuti, shrvan svim tim stresom.
Međutim, ukoliko se rad Developera B odnosi na isti dio koda kao i onaj Developera A, B-ovi
problemi tek nastaju jer je došlo do konflikta. CVS taj konflikt developeru prijavljuje i
označava dijelove koda na koji se konflikt odnosi oznakama. Sada developer B mora riješiti
taj konflikt kako bi prijavio svoje izmjene. Tu bilo kakva asistencija CVS više nije moguća,
budući da on upozorava na nastale konflikte a na developerima je da ih riješe. Budući se ovaj
rad ne bavi sociološko-motivacijskim aspektom developerskog rada prepustićemo
developerima iz prethodnog primjera da sami riješe konflikt, za koji su ionako sami krivi.

473 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Upravljanje izmjenama - verzioniranje

Kako bi CVS učinkovito upravljao izmjenama, tj. vodio evidenciju izmjenjenih


datoteka, repozitorij mora sadržavati sve prijave datoteka od početka projekta. Na taj način
moguće je povijesno pratiti izmjene na datotekama, i općenito razvijanje projekta, i na
temelju toga sagledavati u kojem se smjeru projekt kretao. Također bitna je i mogućnost
povratka na starije verzije ukoliko se nešto krivo projektiralo.
CVS evidenciju promjena radi pri svakom pohranjivanju prijava pomoću zapisivanja
diff-a.
UNIX diff naredbom uspoređujemo dvije datoteke i na standardni izlaz ispisujemo
samo one linije koje su različite. Također diff program može se koristiti i za uspoređivanje
sadržaja direktorija, tj. prikazivanje razlika između uspoređenih direktorija.
Primjer:
diff email email2
2a3,4
> ADSL_ZA_DZABE@zg.t-com.hr
> Zekorog@zg.tel.hr

Izlaz nam pokazuje, liniju po liniju, razliku između datoteka email i addresses.
Kako bi te dvije datoteke bile identično potrebno je dodati (a) liniju 3 i 4 (3,4) iz datoteke
addresses (>) poslije linije 2 u datoteku email.
Pokazaćemo i sadržaj datoteka korištenih u primjeru kako bi cijeli primjer bio dodatno
pojašnjen. Linije su numerirane kako bi se lakše popratio ovaj primjer:

email email2
1 udrin@zg.tel.hr 1 udrin@zg.tel.hr
2 udrin@zg.htnet.hr 2 udrin@zg.htnet.hr
3 aleksandra@zg.hinet.hr 3 ADSL_ZA_DZABE@zg.t-com.hr
4 oksi@zg.htnet.hr 4 Zekorog@zg. t-com.hr
5 aleksandra@zg.hinet.hr
6 oksi@zg.htnet.hr

474 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PREGLED POJMOVA

Neke od ovih pojmova ili njihove sinonime smo koristili do sada, no važno je prije
daljnjih opisa pojmove još jednom navesti i objasniti, budući će se ti pojmovi koristiti u
slijedećim 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 dohvaća. Kao što je već ranije spomenuto, kada
developer završi sa svojim izmjenama na datoteci potrebno je upotrijebiti
commit i update naredbe kako bi se takva prerađena datoteka objavila u CVS
sistemu, primjenjujući vlastite izmjene na datoteci i ujedno dobivajući na uvid
izmjene koje su činili druge osobe uključene na projekt
• Commit – slanje promjena iz vlastite radne kopije u centralni repozitorij.
Naziva se još i check in.
• Conflict – situacija u kojoj dva developera pokušavaju 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 riješiti.
• Log message – komentar koji se dodaje promjenama koje se commit-a, a koji
mora sadržavati opis promjena. Pregledavanjem postojećih komentara mora se
moći dobiti sažeti uvid u stanje projekta i što se na projektu do sada događalo.
• 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 omogućuje primjenjivanje tuđih dorada neke datoteke na
vlastitu radnu kopiju te iste datoteke. Također ta akcija će pokazati dali vaša
radna kopija ima nekih izmjena koje još nisu commit-ane. Ukratko update drži
vašu radnu kopiju ažurnom 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
nešto radi ili planira raditi.

475 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KAKO RADI CVS

Pristup repozitoriju i definiranje radnog okružja

Pristup repozitoriju najčešće se ostvaruje mrežnim putem, no moguće je repozitorij


držati i lokalno na stroju.
Naredbom

mojStroj$ cvs -d /usr/local/cvs

postavlja se lokacija CVS repozitorija na vlastitom stroju.


Mrežni pristup stroju na kojem se nalazi CVS repozitorij (zvati ćemo ga CVS server)
moguće je ostvariti na nekoliko načina.
Spomenuti ćemo metodu pristupa pserver (password-authenticated server):

mojStroj$ cvs -d :pserver:jrandom@cvs.com:/usr/local/cvs login


(Prijava se vrši na jrandom@cvs.com)
CVS password:
mojStroj$

Putanja do repozitorija iza -d parametra govori CVS-u da koristi pserver metodu


pristupa sa korisničkim imenom jrandom na server cvs.com, čiji se CVS repozitorij nalazi u
/usr/local/cvs. Naredba login vas autorizira za rad sa repozitorijem nakon prijave korisničkim
imenom i zaporkom.
Sa lokalne mašine dovoljno se prijaviti samo jednom na CVS server. Nakon uspješne
autorizacije CVS pohranjuje lozinku u home direktorij u datoteci .cvspass.
Svaki put kada se kontaktira repozitorij pserver metodom ta datoteka se provjerava. Naravno
moguće je cvs login pokretati svaki put, a potrebno je pokretati svaki puta kada se lozinka
mijenja.
Spomenuti ćemo ovdje i spajanje na CVS server sa windows-ima pogonjene mašine.
Budući windowsi nemaju home direktorij izveden na isti način kao UNIX, CVS nezna gdje da
stavi .cvspass datoteku. Potrebno je dakle podesiti globalnu varijablu HOME;

476 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KREIRANJE NOVOG PROJEKTA

Kreiranje novog projekta u CVS repozitoriju radi se CVS naredbom:

mojStroj$ cvs import

CVS radi import svega u direktorijskom stablu, od zadanog direktorija prema niže.
Dakle prije importa potrebno se pozicionirati u najviši direktorij svog projekta.

mojStroj$ cd myproj
mojStroj$ ls
README.txt a-subdir/ b-subdir/ hello.c
mojStroj$

Sintaksa import naredbe je:

mojStroj$ cvs import -m "log msg" projname vendortag releasetag


173_XC02.p65 9/26/01, 9:01 AM 29

Parametar -m(message) služi kratkom opisu import procedure. To je ujedno i prvi log
message na projektu. Od tog trenutka i svaki commit će imati svoj kratki opis. Upravo zbog
toga što je akcije u repozitoriju potrebno opisivati radi praćenja projekta te su poruke
obavezne.
Argument projname predstavlja ime projekta. Pod tim imenom će se projektu u
repozitoriju pristupati.
Argumente vendortag i releasetag sada nećemo objašnjavati(služe za katalogizaciju
CVS repozitorija), koristiti ćemo korisničko ime i start kao vrijednosti za njih.
Pokretanje import-a:

mojStroj$ cvs import -m "Inicijalni import u CVS" myproj jrandom start


N myproj/hello.c
N myproj/README.txt

478 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 primjećujemo da CVS ispred svake datoteke stavlja jedno slovo. U
ovom slučaju 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

CHECK OUT RADNE KOPIJE

Postupak check outa nije nezamislivo kompliciran, dokazaćemo primjerom:

mojStroj$ cvs checkout myproj


cvs checkout: Updating myproj
U myproj/README.txt
U myproj/hello.c
cvs checkout: Updating myproj/a-subdir
U myproj/a-subdir/whatever.c
cvs checkout: Updating myproj/a-subdir/subsubdir
U myproj/a-subdir/subsubdir/fish.c
cvs checkout: Updating myproj/b-subdir
U myproj/b-subdir/random.c
mojStroj$ ls
myproj/ was_myproj/
mojStroj$ cd myproj
mojStroj$ ls
CVS/ README.txt a-subdir/ b-subdir/ hello.c
mojStroj$

Valja primijetiti da se od nekuda pojavio i direktorij CVS, nema mjesta panici, uloga
tog poddirektorija je da pohranjuje podatke o verzioniranju datoteka.
Pogledajmo što sve tamo ima:

mojStroj$ cd CVS
mojStroj$ ls
Entries Repository Root
mojStroj$ cat Root
/usr/local/cvs
mojStroj$ cat Repository
myproj
mojStroj$

480 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dakle imamo datoteku Root koji pokazuje gdje se repozitorij nalazi i imamo datoteku
Repository koja pokazuje na projekt u repozitoriju (u našem slučaju myproj).

Datoteka Entries sadrži podatke po pojedinim datotekama unutar projekta.


Svaka linija Entries datoteke sadrži 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

MIJENJANJE DATOTEKE I UOČAVANJE IZMJENA NA


PROJEKTU

Zahtjevnim programerskim zahvatom u datoteku hello.c dodati ćemo jednu liniju koda
koja ispisuje «Goodbye, world!».
Usporedimo sada našu lokalnu kopiju sa kopijom koja se nalazi u repozitoriju.

mojStroj$ cvs update


cvs update: Updating .
M hello.c
cvs update: Updating a-subdir
173_XC02.p65 9/26/01, 9:01 AM 34
An Overview of CVS 35
cvs update: Updating a-subdir/subsubdir
cvs update: Updating b-subdir

Veliko slovo M pokraj hello.c znači da je datoteka mijenjana od poslijednjeg check


out-a i da izmjenjena nije commit-ana u repozitorij.
Pogledajmo što nam naš prijatelj diff ima za reći. Ovaj puta prišapnućemo mu i
parametar –Q kako nebi inzistirao da nam govori u kojem direktoriju radi diff kao i parametar
–c kako bi nam pokazao kontekstualne promjene u datoteci.

mojStroj$ cvs -Q diff -c


Index: hello.c
==================================================================
RCS file: /usr/local/cvs/myproj/hello.c,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 hello.c
*** hello.c 2001/04/18 18:18:22 1.1.1.1
--- hello.c 2001/04/19 02:17:07
***************
*** 4,7 ****
--- 4,8 --

482 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

main ()
{
printf ("Hello, world!\n");
+ printf ("Goodbye, world!\n");
}

Ovdje je dakle situacija prilično jasna. Nova linija je dodana u datoteku (+ označava
dodanu liniju).
Važno je primijetiti kako CVS ima implicitne (podrazumijevane) argumente. Do sada
smo pokretali CVS naredbu iz naredbenog retka bez da napišemo na koju datoteku se odnosi.

mojStroj$ cvs diff

Također i:

mojStroj$ cvs update

CVS automatski primjenjuje te naredbe za sve datoteke i poddirektorije niže


direktorija u kojemu se nalazimo. Naravno moguće je i eksplicitno navoditi imena datoteka
kada želimo izbjeći primjenu CVS naredbi na sadržaj direktorija u kojemu se nalazimo.

483 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

COMMIT-ANJE (STARI HRVATSKI INFORMATIČKI


POJAM ZA SLANJE PROMJENA U REPOZITORIJ)

Naredba commit poslati će izmjene koje smo učinili u repozitorij. Kako smo već
spomenuli a rado ćemo i ponoviti, ukoliko se ne navede ime datoteke poslane će biti sve
izmjene na svim datotekama koje smo učinili u direktoriju ili niže.
Da vidimo:

mojStroj$ cvs commit -m "ispisasmo i Goodbye" hello.c


Checking in hello.c;
/usr/local/cvs/myproj/hello.c,v <-- hello.c
new revision: 1.2; previous revision: 1.1
done
mojStroj$

Primjećujemo da se oznaka verzije uvećala za 1.


Svaka datoteka na projektu ima svoju oznaku verzije. Kada se datoteka commit-a,
zadnja znamenka u oznaci verzije uvećava se za 1, a mi naravno na taj način uviđamo koje se
datoteke češće mijenjaju.

484 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Konflikti – detekcija i rješavanje

Otkrivanje konflikata je jednostavno. Kada se pokrene update, CVS javlja ukoliko je


došlo do konflikta. Da bi konflikt detektirali i rješili te na taj način dokazali istinitost ovih
tvrdnji moramo ga i izazvati. Jer kao što je poznato, konflikti nikada ne nastaju sami od sebe.
Zato ćemo izmijeniti datoteku hello.c i ubaciti u nju redak:

printf ("izazivanje vraga\n");

na istom mjestu gdje je Developer B commit-ao izmjenu:

printf ("redak između hello i goodbye\n");

U tome trenutku status naše kopije datoteke hello.c je slijedeći


mojStroj$ cvs status hello.c
==================================================================
File: hello.c Status: Needs Merge
Working revision: 1.2 Mon Apr 19 02:17:07 2001
Repository revision: 1.3 /usr/local/cvs/myproj/hello.c,v
Sticky Tag: (none)
Sticky Date: (none)
Sticky Options: (none)
mojStroj$

znači postoje razlike i u repozitoriju i u našoj radnoj kopiji, i te razlike je potrebno


spojiti(merđati, merge-ati). Učinimo li update vidjeti ćemo:
mojStroj$ cvs update hello.c
RCS file: /usr/local/cvs/myproj/hello.c,v
retrieving revision 1.2
retrieving revision 1.3
Merging differences between 1.2 and 1.3 into hello.c
rcsmerge: warning: conflicts during merge

485 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

cvs update: conflicts found in hello.c


C hello.c
mojStroj$

Aha. Veliko slovo C ispred imena datoteke znači da iako je merge prošao, konflikt
postoji. Sadržaj 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 slijedećem 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 rješava na isti način kako je i izazvan. Na datoteci se izvrše potrebne


izmjene, maknu se >>>> oznake i datoteka se commit-a.

486 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PREGLEDAVANJE IZMJENA ( - Tko ih je zašto 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 proučavati svaki diff. Pregledavanje poruka o izmjenama(log message-
a) trebalo bi nam te informacije pružiti:
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 može se brzo i kvalitetno steći
uvid u dosadašnji rad na projektu.

488 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

JOŠ NEKE CVS OPERACIJE...

Kako bi u cjelosti priveli ovo poglavlje kraju, valja nam spomenuti i slijedeće CVS
operacije koliko god one trivijalne bile.
Dodavanje datoteka u projekt radi se u dva koraka, prvo se izvrši naredba add a zatim
se napravi commit:
mojStroj$ cvs add novi.c
cvs add: scheduling file 'novi.c' for addition
cvs add: use 'cvs commit' to add this file permanently
mojStroj$ cvs ci -m "Dodo novi.c" novi.c
RCS file: /usr/local/cvs/myproj/novi.c,v
done
Checking in novi.c;
/usr/local/cvs/myproj/novi.c,v <— novi.c
initial revision: 1.1
done
mojStroj$

Dodavanje direktorija još je jednostavnije, jer nije potrebno poslije add naredbe raditi
commit.
Ovdje je važno napomenuti da se dodavanje binary datoteka radi nešto drukčije.
Naime kako nebi došlo do problema sa konverzijama (oznaka kraja reda npr.) potrebno je add
naredbu raditi sa parametrom –kb:

mojStroj$ cvs add -kb filename

Izbijanje datoteka iz projekta začudo, vrlo je slično dodavanju datoteka. No ovdje


valja razmišljati unaprijed, jer potrebno je prvo datoteku izbiti iz radne kopije projekta.
mojStroj$ rm novi.c
mojStroj$ cvs remove novi.c
cvs remove: scheduling 'novi.c' for removal
cvs remove: use 'cvs commit' to remove this file permanently
mojStroj$ cvs ci -m "mako sam novi.c" novi.c

489 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 računa da su direktoriji prazni (postupak je naravno isti
kao kod izbijanja datoteka).

490 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Vraćanje na staru verziju

Kako smo već ranije zaključili i u razvoju software-a, kao uostalom i u svemu
ostalom u životu stvari jednostavno krenu krivim putem. Ne kaže se uzalud da je put do pakla
popločan dobrim namjerama. No oni sretnici koji krivim putem krenu, a ipak im je pružena
prilika za popravak, svakako bi voljeli da nemoraju ponovno sve od početka, već bi rado
pokušali izmijeniti neslavan kraj, nastavljanjem od točke u kojoj misle da su pogrešno
skrenuli.
CVS dakle svom korisniku u nevolji, pruža mogućnosti dohvaćanja zadnje "dobre"
verzije u kojoj se projekt nalazio.
Tu mogućnost pruža kroz vremensku (vrijeme commit-anja) ili povijesnu (oznaka zadnje
snimke -snapshota)
Datumsko dohvaćanje radi se proslijeđivanjem parametra D update naredbi:
mojStroj$ cvs -q update -D "2001-04-19"
U hello.c
U a-subdir/subsubdir/fish.c
U b-subdir/random.c
mojStroj$

Sada je dohvaćena najviša verzija svake datoteke u projektu sa zadanim datumom,


dakle datoteke u našoj radnoj kopiji biti će vraćene na prijašnju verziju.
Često nam točka na koju se želimo vratiti neće biti datum, već zadnja stabilna verzija.
Označavanjem datoteka na projektu tag naredbom, dajemo oznaku jednoj fazi života
projekta. Važno nam je stanje u kojem se u tom trenutku projekt nalazio.
Postavljanje tag-a prilično je jednostavno:
mojStroj$ cvs -q tag Testiran_Isporucen_011204
T README.txt
T hello.c
T a-subdir/whatever.c
T a-subdir/subsubdir/fish.c
T b-subdir/random.c
mojStroj$

491 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Tom naredbom označili smo trenutnu snimku stanja našeg projekta sa imenom
"Testiran_Isporucen_011204".
Označavanjem datoteka na projektu tag naredbom, dajemo oznaku jednoj fazi života
projekta. Važno nam je stanje u kojem se u tom trenutku projekt nalazio.
Slijedeće slike dobro pokazuju kako tag označava datoteke u određenom trenutku bez
obzira kakvu povijest verzija svaka datoteka zasebno ima.
Vraćanje verzije koju smo označili kao vrijednu vraćanja, tj. točku u kojoj vjerujemo
da imamo dobro stanje projekta radi se na slijedeći način:
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 našeg projekta vraćena je na verziju “Testiran_Isporucen_011204”.

492 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 slijedeći sadržaj

checkoutlist config,v history notify taginfo,v


checkoutlist,v cvswrappers loginfo notify,v verifymsg
commitinfo cvswrappers,v loginfo,v rcsinfo verifymsg,v
commitinfo,v editinfo modules rcsinfo,v
config editinfo,v modules,v taginfo

Te datoteke služe za administraciju repozitorija. Trenutno nam je cilj da upogonimo


repozitorij, a značenje pojedinih datoteka će biti objašnjene kasnije.
Da bi korisnici mogli koristiti repozitorij, moraju imati privilegiju za pisanje. Da bi to
omogućili preporučljivo je da se kreira korisnička grupa cvs, a da se onim korisnicima koji
trebaju raditi sa repozitorijem pridodjeli grupa CVS.
U većim projektima korisnici imaju potrebu pristupati repozitoriju sa udaljenih
lokacija. U takvim slučajevima potrebno je kreirati "Password Authenticating Server". Kada
korisnici pristupaju serveru, šalju zahtjeve određenom portu. Internet deamon kada dobije
zahtjev na taj port spaja CVS server i klijenta.
Da bi to omogućili u /etc/services datoteci potrebno je pridružiti odabrani port servisu:

cvspserver 2401/tcp

493 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Nakon toga je u /etc/inetd.conf datoteci potrebno definirati što je zapravo servis koji smo
pridružili 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 slijedeći red nastavak prethodnog, a ne nova naredba)

Novi servis će biti aktivan nakon što se ponovo pokrene internet deamon a korisnici će moći
pristupati sa naredbom:

cvs -d :pserver:nekilogin@cvsprimjer.com:/usr/local/repozitorij login

nakon toga će se tražiti da unese svoju lozinku na tom serveru. Lozinka koja se unosi je
lozinka za "shell account" tj. sistemska lozinka. Da bi to bilo moguće u datoteci
CVSROOT/config parametar SystemAuth mora biti podešen na "yes".
Podešavanje parametara i izmjena datoteka u CVSROOT direktoriju će biti objašnjeni nešto
kasnije.

Ukoliko se ne želi koristiti ta lozinka, CVS omogućava da se za logiranje na CVS


server koristi posebna lozinka. Da bi to bilo moguće u datoteci CVSROOT/passwd u
repozitoriju (dakle u našem slučaju /usr/local/repozitorij/CVSROOT/passwd) je potrebno
unijeti lozinke u slijedećem formatu;

<ime>:<"kriptirana" lozinka>

primjer:

nekilogin:aSa3jreTzMheS
nekidrugilogin:eFa5jzrLu7hea

494 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Kada se korisnik prijavi na ovaj način 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 korišten za rad sa CVS serverom i koja prava će biti
dodjeljena.
Isto tako je moguće jednom sistemskom loginu dodjeliti više 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 možemo iskoristiti i ukoliko želimo na jednostavan način korisnicima
koji rade na jednom projektu zabraniti da mjenjaju dokumente drugog projekta, a istovremeno
im zabranimo korištenje sistemskog logina.

Da bi omogućili dodatnu kontrolu prava pisanje i čitanja, u CVSROOT direktorij


možemo 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 nečiji login nalazi u datoteci readers tada će taj korisnik imati privilegije
samo za čitanje, pa makar se nalazio i u datoteci writers. Ukoliko se nečiji login nalazi u
datoteci writers tada svi korisnici čiji se login nalazi u toj datoteci imaju prava za čitanje i
pisanje. Međutim 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 možemo raditi pozitivnu, odnosnu negativnu selekciju, ili pak i pozitivne i
negativne, ukoliko se odlučimo na kreiranje obije datoteke.

495 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dodavanje projekta i sadržaj repozitorija

Kreirajmo neki direktorij koji će predstavljati naš projekt. Neka to bude npr. ~/projekt
i u njemu kreirajmo 2 datoteke hellocvs.c i read.me. Taj projekt ćemo sada dodati u
repozitorij. Potrebno je ući u direktorij projekt i izvršiti naredbu

cvs import -m "dodavanje projekta u repozitorij" moj_projekt cvsuser start

u repozitoriju je sada nastao novi direktorij, nalazi se i direktorij moj_projekt. U direktoriju


moj_projekt nalaze se datoteke iz projekta s time što imaju sufiks v, hellocvs.c.v i read.me.v.
U tim dokumentima su spremljeni i dokumenti i izmjene dokumenata. Dakle dokument
hellocvs.c neće za svaku verziju dokumenta imati vlastitu datoteku u repozitoriju već će sve
verzije biti sadržane u istoj datoteci hellocvs.c.v.
Primjer datoteke u kojoj je u verziji 1.1 pisalo hello world
a u verziji 1.2 primjer cvs izmjene.

U repozitoriju će datoteka izgledati ovako:

head 1.2;
access;
symbols
c:1.1.1.1 b:1.1.1;
locks; strict;
comment @# @;

1.2
date 2004.12.19.21.22.06; author cvsuser4; state Exp;
branches;
next 1.1;

1.1
date 2004.12.12.18.37.53; author cvsuser4; state Exp;

496 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

branches
1.1.1.1;
next ;

1.1.1.1
date 2004.12.12.18.37.53; author cvsuser4; state Exp;
branches;
next ;

desc
@@

1.2
log
@izmjena dokumenta
@
text
@primjer cvs izmjene
@

1.1
log
@Initial revision
@
text
@d1 1
a1 1
hello world
@

497 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

1.1.1.1
log
@
@
text
@@

Ukoliko neki dokument obrišemo iz projekta tada taj projekt neće biti izbrisan iz
repozitorija, jer ukoliko netko želi staru verziju projekta taj dokument mora biti dostupan.
Taj dokument će biti premješten u Attic direktorij, kojeg će kreirati ukoliko ne postoji unutar
projekta u repozitoriju.
Brisanje dokumenta naravno, radimo pomoću CVS alata, nikakve izmjene ne radimo direktno
u repozitorij direktoriju.
CVSROOT direktorij nije dio niti jednog projekta već služi za administraciju
repozitorija. Međutim ukoliko želimo mjenjati dokumente unutar njega to činimo kao i sa bilo
kojim drugim projektom, pomoću alata za rad sa repozitorijem. Dakle potrebno je napraviti
check out, zatim izmjenu na lokalnoj kopiji, a zatim check in.

498 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Podešavanje ponašanja repozitorija

Promjena ponašanja repozitorija se radi izmjenom nad slijedećim datotekama:

config

U datoteci config možemo podesiti 3 parametra:

• SystemAuth ako podesimo na no korisnici se neće moći logirati ukoliko ne postoji lozinka
definirana u CVSROOT/passwd. Ako se podesi na yes tada će CVS ukoliko ne nađe
lozinku u navedenoj datoteci, lozinku potražiti u sistemskim lozinkama.
• TopLevelAdmin ako se podesi na yes tada će se u lokalnoj kopiji projekta pojavljivati
CVS direktorij. Tu mogućnost iskorištavamo ukoliko korisnici imaju potrebu raditi na
više 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

Između imena opcije, znaka jednakosti i ključne riječi yes ili no ne smije stajati razmak.
Ukoliko neka opcija nije navedena ili nema ključnu riječ yes ili no tada će se repozitorij
ponašati kao da je navedena opcija no. Ukoliko imamo potrebu stavljati komentar unutar
configuracijske datoteke tada redove sa komentarima treba označiti sa početnim znakom #.

Primjer datoteke config:

SystemAuth=yes
TopLevelAdmin=no
PreservePermissions=no

499 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

modules

U datoteci modules možemo grupirati pojedine datoteke unutar projekta u direktorije i


datotekama pridjeljivati pomoćna radna imena.
To nam omogučuje da projekt podjelimo u zasebne cjeline, čime omogučavamo efikasniji rad.

Datoteka je zapisana u formatu:

ime_datoteke ime_direktorija

ukoliko želimo datoteku pridružiti direktoriju ili u formatu

proizvoljno_ime_aliasa -a naredbe_ili_imena_koje_alias_zamjenjuje

ukoliko želimo definirati alias.


Alias je riječ koja zamjenjuje niz riječi, i ukoliko u komandnoj liniji upišemo riječ koju smo
definirali kao alias u datoteci modules, tada će se upisana naredba ponašati kao da smo
umjesto aliasa upisali zadani niz riječi.

commitinfo

U datoteci commitinfo definiramo dodatne događaje u pre-commit fazi. Ukoliko se u datoteci


koju commit-amo nađe sadržaj koji zadovoljava uvjet zadan regular expressionom, tada se
pokreće program. Taj program može biti slanje emaila administratoru, kopiranje, premještanje
nekog sadržaja ili bilo kakav drugi program.

Programu možemo prosljediti i atribute datoteke i to sa ključnim riječima:

%s - ime datoteke
%V - verzija prije commita
%v - verzija poslije commita

Datoteka je zapisana u formatu:

500 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

regular_expression program_koji_se_pokrece_u_slucaju_zadovoljenja

loginfo

Ova datoteka se ponaša isto kao i datoteka commitinfo s tom razlikom što se program ne okida
u slučaju da je regular expression zadovoljen u datoteci koju commit-amo, već u komentaru
(log message) koji pišemo prilikom commit-a.

taginfo

Ova datoteka se ponaša isto kao i datoteka commitinfo s tom razlikom što se program ne okida
u slučaju da je regular expression zadovoljen u datoteci koju commit-amo, već u imenu
"taga" prilikom commita.

verifymsg i rcsinfo

Datoteka verifymsg sadrži naredbe koje se izvršavaju prilikom svakog commit-a. Najčešće 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 ključnu riječ ALL.

501 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

cvswrappers

U ovoj datoteci se može definirati posebno ponašanje datoteka s obziro na njihovo ime.
S obzirom na ograničenu mogućnost ove datoteke, najčešće se koristi da se definira koje
datoteke će se korisititi kao binarne.
Npr:

*.gif -k 'b'

checkoutlist

U ovoj datoteci možemo definirati dodatne administrativne datoteke koje želimo kontrolirati
putem verzioniranja, a nisu standardno isporučene.
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

ALATI SA GRAFIČKIM SUČELJEM I CVS

Kao što smo vidjeli u prethodnim poglavljima, rad sa CVS-om iz komandne linije nije
baš intuitivan i zahtjeva znanje i razumjevanje rada CVS-a.
Iz tog razloga su nastala grafička sučelja koja pojednostavljuju rad. Međutim većina
developera koji rade sa CVS-om koriste isključivo check-in/check-out mogućnosti CVS-a i ne
žele instalirani alat koji bi zamjenjivao 2 naredbe, već si najčešće sami napišu skriptu u tu
svrhu.
To je razlog zbog čega grafička sučelja za rad CVS-om do sada nisu postigla veliku
popularnost.
Grafička sučelja predstavljaju sučelje na CVS komandni klijent, koji se nalazi instaliran na
računalu.
Dakle kada mi u grafičkom sučelju odaberemo projekt moj_projekt u repozitoriju i
odaberemo "check out", tada taj alat neće stvarno sam napraviti check out u repozitoriju, već
će samo u novom procesu pokrenuti naredbu

cvs checkout moj_projekt

Velika prednost takvog načina je da eventualne pogreške u takvim alatima neće utjecati na
konzistenciju repozitorija.
Neka grafička sučelja ipak i sama za neke svrhe gledaju u repozitorij, ali se uglavnom
ograničavaju na čitanje.

Većina sučelja sadrži samo osnovne opcije CVS-a, dok za sada niti jednim grafičkim
sučeljem ne možemo u potpunosti zamjeniti sve opcije CVS-a, međutim najbolja sučelja
omogućuju preglednije praćenje verzija modula i druge mogućnosti koje nisu dostupne iz
komandne linije.

503 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

504 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Pregled grafičkih sučelja

CERVISIA

Ovaj alat je namjenjen za KDE sučelje i u mnogim instalacijama linuxa se automatski instalira
sa KDE sučeljem.
Cervisia je najcjelovitije CVS grafičko sučelje i podržava mnoge mogućnosti osim osnovnih
opcija check-in, check-out, add, remove ....

Cervisia omogućava napredni pregled datoteka u raznim bojama ovisno o statusu, grafičku
usporedbu datoteka, grafički prikaz datoteka i grana te upravljanje njima.
Cervisiu je moguće pokrenuti i na sučelju koje nije KDE, međutim u praksi se često javljaju
problemi, pa se u takvim slučajevima najčešće poseže za nekim drugim CVS sučeljem.

505 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

TKcvs

Ovo Tcl/Tk bazirano CVS grafičko sučelje je vrlo popularno, najviše zahvaljujući izvrsnom
diff alatu unutar sučelja i mogućnosti instalacije na Windows, Linux i MacOSX platforme.
Poput Cervisie, osim osnovnih ima i brojne napredne mogućnosti i spada u red
najkvalitetnijih CVS grafičkih sučelja.
Za izvršavanje je potrebno imati Tcl/Tk runtime.

Primjeri baratanja granama i diff alata uTKcvs-u u različitim "Window managerima"

506 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

LinCVS

Prednost ovog alata je mogućnost spajanja na CVS server na više načina od ostalih
sučelja (local/nfs, pserver, ssh, ssh-agent, proxy).
Iako sadrži mnoge napredne mogučnosti, ovaj alat nije na razini prethodna dva alata.

507 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Ostala sučelja

Uz navedena mogu se pronaći i druga sučelja koja se ne ističu posebnim mogućnostima pa


ćemo ih samo nabrojati:
gCVS, MacCVS, WinCVS, Pharmacy, JCVS, JavaCVS, MacCVSClient, MacCVS pro,
smartCVS, TortoiseCVS, Igloo, CVSGrab, VisualCVS

508 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Ivan Podhraški

IDE

509 /1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

UVOD

U ovom seminaru prezentirat ću nekoliko selekcija unutar Integrirane

Razvojne Okoline (IDE)

Linux je nešto poput raja za programere. Zapravo to je težak programerski

jezik, koji spada pod ovaj besplatan operativni sistem.

Pa ipak , problem sa mnogim jezicima je njihovo zagonetno funkcioniranje, odnosno

komplicirano korištenje.

Na primjer , Visual Basic programeri koji su naviknuti na grafički podržano

sučelje, događa im se da više puta odskače ta naredba od crte prevodioca (command line

compiler).

Zahvalan broj koji se stalno povećava je broj grafičkih okolina, koji čini korištenje software

lakim poput dječje igre.

510/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Invazija

Za IDE test uzeo sam primjer Anjute , u tekućoj beta inačici KDevelop

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 može besplatno koristiti za privatne potrebe.

Funkcionalno i korisničko sučelje od svih prisutnih ovdje oslanja se na Windows aplikacije.

Koncept poslužitelja 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 korištenje knjižnice i dokumentacija.

Neki IDE traže dozvole upravljanja za pojedini plan i knjižnice 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 prilagođen GNU komandnim linijama alata.

Moraju biti definirani kao centralni , grafički popraćeni proizvodi.

Za one koji prelaze sa Microsofta i Borlanda, odnosno sa njihove razvojne okoline pod

Windows operativnim sistemom nedostajat će im integrirani dijalog editori.

Također postoji tekući IDE za ovaj software i ako nije instaliran na računalo

može se kasnije instalirati što nas košta naše dragocjeno vrijeme. Tako dobijemo npr.

prikazivanje svih razvojnih okolina , sa izuzetkom od Kylix , koji može usmjeriti stvaranje

pojedinih stranica , na primjer rpm oblik zapisa , što je naravno dostojno svake pohvale.

Usprkos mogućnosti naš test kandidat ima u rutini , razlikovanje sve četiri aplikacije.

Sada ću prezentirati najzatupljeniji IDE.

511/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

• IDE

Anjuta 0.1.8

Anjuta dolazi pod GPL razvojnom okolinom. U svojoj tekućoj inačici je u beta

faza i stoga nije još potpuno pročišćen. Unatoč što je Anjuta najmanje prisutna, ali ipak već

sada obećava..

Anjuta , u svojoj tekućoj inačici , cilja na razvoj Gtk-a , koji je temeljen na GNOME -

aplikaciji. Stoga nije iznenađenje da je bio oformljen na ovaj bazi.

Anjuta ne daje izravnu podršku aplikacijama koje koriste Qt ili KDE. Sva pomoć je potpuno

prilagođena Gtk-u i Gnome-u. Pa ipak ukoliko ih savjesno zanemarite nećete imati problema

stvarajući programe temeljene na QT-u.

Ovaj je duži i nespretniji put , i jednostavniji za Qt ili KDE razvijen od strane korisnika

KDevelop ili KDE Studia.

Gtk I Qt su dvije knjižnice koje programer može iskoristiti unutar njihovih aplikacija.

Oni opskrbljuju grafičke objekte npr. menije. U tom slučaju rad sa Windowsima je olakšan za

programere. Gtk dolazi pod GPL , i Qt je na isti način raspoloživ pod ovom licencom.

Anjuta razumije programiranje u jeziku C i C ++.

Kompatibilnost sa drugim jezicima kao što je Java na primjer , je u planirajućem stadiju ili je

već djelomično gotov. U stvaranju novih programa , pomoćnik pomaže korisniku ,vodeći ga

kroz nekoliko jednostavnih koraka do željenog rezultata. (U mojem testu naprimjer, u samo

šest klikova mišem, stvorio sam kostur za novu aplikaciju.

512/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

slika : ANJUTA POMOĆNIK

Anjuta nesvjesno pohranjuje sve projekte u “projekt mapu” , a taj odredišni direktorij se može

prema želji promijeniti u postavkama.

Broj oformljenih kartoteka ne može biti jednostavan “Hello World” program.

U C-u je potrebna minimum jedna, ali se najčešće koriste dvije kartoteke “make” kartoteka

za kompajlirajući napredak i drugi u kojem se nalazi izvorni kod.).

Pod standardnim postavkama Anjuta stvara tri mape koji vodi sa 64 kartoteke ukupno.

Preporučljivo je da Anjutin glavni prozor ne prekriva cijeli zaslon. Razlog

tome je da softver ispisuje poruke i dodatne važne dijaloge u Windows pozadini, pa bi u

protivnom bile prekrivene..

Editor je vrlo koristan te se njime vrlo lako služimo za obradu izvornog koda.

513/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Pritiskom na Alt + Enter vrlo lako može biti aktiviran.

Anjuta može otvoriti većinu različitih oblik zapisa , kao što je Java kod ili

Latex kartoteka. Upravo zato jer postoji gomila oblika zapisa , razvojna okolina izgrađena je

u prigodnim grafičkim prijedlošcima. Također iznenađuje sposobnost za unašanje funkcija i

klasa, te za unašanje simbola lijevo od koda sa + i - tipkama.

Anjuta ima lak pristup programu za pronalaženje pogrešaka Gdb , a to je

standardan program za otkrivanje grešaka.

Za stvaranje aplikacije pomoću grafičkog sučelja, na osnovi Gtk , može se koristiti vanjski

program Glade. Ograničen je na kratak opis za većinu važnijih meni opcije.

Anjuta ima vanjski pristup za dokumentaciju.

514/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KDevelop 2.0.2

U pokušaju kopiranja KDevelop’s rpm zapisa na moje test računalo sa

SuSE - Linux , dobio sam više nego što sam očekivao. Upozorio nas je na više od 20

deinstaliranih paketa.

Većina kartoteka upućivala je na Docbook sistem dokumentiranja.

Upravo to osigurava KDevelop pomoć pri svim funkcijama.

Ako paket odbija biti instaliran , znači da razvojna okolina nesvjesno

iskorištava Yast2. Oprez! Oni koji se lobiraju neće 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 okruženja. Odmah, kako slijedi, otvara se grafičko okruženje -Qt.

Ovaj softver je stvorio Trolltech , proizvođač Qt-a. U usporedbi s Anjutom, više je baziran na

Windows modelu. Također je omogućen pristup vrlo detaljnoj pomoći , što upotpunjuje

programski jezik sa C++. Vanjski pristup je omogućen za dokumentaciju Qt I KDE klasa..

Editor prozor je smješten sa desne strane, što je vrlo praktično kod editiranja izvornog koda,

te sadrži prozore za prikaz drugih dokumenata.

Upravo zbog toga ovaj prozor može biti nezavisno smješten. Na dnu je smješten statusni

prozor, na kojem se ispisuju različite poruke upućene korisniku.

Ustvari KDevelop vrlo jako naglašava sastavljanje u cjelinu. Upravo zbog toga ne bi trebalo

biti iznenađenja, jer svi podaci se očitavaju iz KDE projekata te se postiže isti cilj.

Primjećuje se da se korijeni Kdevelopa nalaze u KDE projektima. Unatoč mnogobrojnim

KDE i Qt varijacijama programa, , razvojna okolina nažalost pruža jedinu vrstu aplikacije, na

osnovi GNOME knjižnice.

515/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

U usporedbi sa Anjutom, KDevelop je idealan za stvaranje KDE, Qt, C ili C ++ programe.

Srećom , pomoćnik nudi mnogobrojne mogućnosti , kao što je naprimjer promjena postavki u

inačici uprava alata CVS.

Ovo omogućuje da nekoliko ljudi radi na istom projektu. KDevelop i Kylix su jedini

programi prisutni ovdje , što omogućuju rad tima na jednom projektu.

Razdijeljen od datoteke sa projektima, pomoćnik može stvoriti dokumentaciju za pojedini

program

Kada su svi razvojni paketi instalirani, softver može izraditi cijeli nacrt za

upravljanje. Pravedan poput Anjute , KDevelop ne ograničava broj novostvorenih fileova.

Integrirani preglednik u većini slučajeva svoj posao obavlja uspješno.

To omogućuje da sve klase koje su korištene u projektu budu lako vidljive i modificirane.

Pomoćnik ponekad može preuzeti stvaranje novih klasa tako da generira dijelove koda i

pristupnih fileova.

Metode i atributi tada mogu biti dodane ili izbrisane korištenjem prigodnog dijalog prozora

Kada to radimo, ponekad nam se čini da je desni klik na mišu nalik čarobnom štapiću.

Atributi koji se ručno unašaju u kod , su automatski transformirani u adrese, nakon što prođu

proceduru. Grafičko sučelje je u većini slučajeva vrlo korisno.

Sve u svemu Kdevelop sadrži mnogo korisnih funkcija , koje su nažalost u startu sakrivene od

korisnika

Vrijeme koje treba premosnici da prebaci podatke između konzole za poruke i nekog

drugog statusnog prozora može biti vrlo sporo, te se na to trebamo priviknuti.

Ova procedura je pa ipak u prednosti jer jasno i točno sortira poruke prema tipu.

516/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KDE Studio Gold u inačici 3.0

KDE Studio je razvijen od strane “the Kompany”, te je dostupan u dvije inačice. KDE Studio

( izdan pod GPL ) koji je slobodan i u izvornoj inačici koja čini komercijalni KDE Studio

Gold. Osnovna razlika između ove dvije inačice je u broju omogućenih mogućnosti.

Posvetit ću se testnoj verziji KDE Studia Gold, koja se može besplatno presnimiti sa

stranice proizvođača. Internet. Iako pruža sve opcije, vrijeme korištenja strogo je ograničeno

na 15 minuta . Cijela inačica dostupna je za približno 25 $. Izravno nakon pokretanja,

korisniku pomoćnik pomaže 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 pomoću njega određuje podgrupu. To znači da projekt

može biti novi program ili sastavni dio knjižnice.

Kada stvaramo novi projekt, ubrzo postaje jasno da KDE Studio daje naglasak na C i C++

razvoj, koristeći Qt ili KDE osnovu. Ovaj IDE ne nudi izbor stvaranja GNOME aplikacije,

što ostavlja mogućnost stvaranja projekta ručno, odnosno bez pomoći asistenta.

U usporedbi sa konkurencijom, KDE Studio kreira samo jednu kopiju najvažnijih podataka.

Neki govore da je čak i previše ekonomičan jer kao izvor programiranja koristi funkcije koje

moraju biti stvorene od korisnika. Aplikacija jedino nudi predložak za KDE ili Qt program.

KDE Studio nudi stablo predočeno 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 mogućnost uvođenja funkcija i klasa. KDE Studio ne

postiže djelovanje KDevelopa, odnosno u jednu ruku postiže, jer ima preglednik klasa.

Također nudi grafičko sučelje, koje mora biti dodatno pozvano sa menija. Unatoč svemu

izgleda pomalo nejasno.

517/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Apsolutno nema pomoćnih mehanizama u stvaranju klasa, poput onih integriranih u

KDevelopu. Nažalost malen je broj ostalih zanimljivih stvari koje se mogu pronaći u KDE

Studio Gold 3.0, osim u "debug" i "compiler" opcijama.

518/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Kylix 2 Open Edition

Kylix 2 se izdvaja od "kalupa" na mnogo načina. Jedan od najvažnijih je u svakom pogledu

razrađen Prevodioc Borland, koji ima mnogu iskustva u radu sa različitim razvojnim

okolinama na Windows operativnim sistemima. U drugu ruku ovo je komercijalan proizvod.

Borland pruža mogućnost snimanja besplatne verzije sa Interneta.

Kako i ime govori, samo slobodna inačica dopušta kreiranje projekata pod GNU licencom.

Svi ostali koji žele dodatne opcije moraju kupiti, odnosno licencirati software po cijeni od

325 eura na službenoj Borland stranici. Također postoji i licenca za tvrtke koja nudi još više

funkcija, te je za nju potrebno izdvojiti čak 2585 eura.

Besplatna inačica je prvenstveno namijenjena privatnim korisnicima. Sve verzije Kylix

softwarea mogu se pronaći na službenim stranicama. Kylix donosi konverzaciju sa Delphi-

em, popularnim Windows sučeljem..Kao što je Microsoft VisualBasic u Windowsima, ovo je

kompletna razvojna okolina koja dolazi iz Borlanda.

Programi koji su napisani u Delphiu, Kylix može iskoristiti u oba jezika, Pascal i knjižnice

oformljene pomoću Borlanda. Kućne aplikacije na ovaj način mogu biti brzo i lako

oformljene, ali sve ovisi o znanju korisnika i instaliranim knjižnicama.. Borlandu je glavni cilj

napraviti aplikaciju u Delphiu, a da također radi pod Linuxom, te obrnuto.

U tu svrhu , Borland ne koristi za prijenos samo CLX knjižnice u Linux , nego je napravio

prevodioc pa je i IDE raspoloživ pod Linuxom.

Nakon pokretanja , puna inačica zahtjeva unošenje registracijskog koda. Ako slučajno

izgubimo kod, možemo ga preuzeti besplatno sa http:/register.borland.com . Ako je

ulaz odobren, uvodna slika nas obavještava da smo Delphi korisnik.. Razvojna okolina vrlo

nas podsjeća na Windows operativni sustav.

Delphi korisnici nisi jedni kojima će se svidjeti rad kod kuće. Zanimljivo je to, što proizvođač

mnogo godina radi na ovom proizvodu.

519/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Izravno nakon početka , očekuje nas prazan projekt , koji je smješten u praznom prozoru, a

oboje su smješteni u glavnom prozoru.

Ovaj prostor može biti iskorišten za liste, nešto poput opcija u programima za obradu

fotografija.

Meni predstavlja sve raspolagajuće elemente, odnosno opcije. Ovaj prozor je obično

smješten sa lijeve strane. Za vrijeme kada korisnik stvara grafičko sučelje , Kylix za to

vrijeme generira pripadajući 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 mišem.

Kylix je jedini program, prezentiran u ovom radu, koji podržava grupni rad.

520/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Kratka usporedba programskih jezika

ANJUTA

Anjuta će osigurati jednaku funkcionalnost i korisničko sučelje kao C i C++. Vrlo nalikuje

Windows korisničkom sučelju, te je radna površina vrlo fleksibilna.

slika : ANJUTA

521/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

ARRIBA

Osigurava jednaku funkcionalnost i korisničko sučelje kao C ++, podržava C i C ++

aplikacije, ali također kao Anjuta ne može otkriti C ++ . Pruža podršku za mnogo

programskih jezika.

o C- FORGE

C - Forge je Power PC razvoj okolina sa podrškom za mnoge jezike, C++ i vrlo popularnu

Javu.

slika : C-FORGE OPCIJE

522/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

• KYLIX

Kylix je Power PC razvojna okolina sa podrškom za C i C++, te Sadrži vlastite prevodioce i

grafički IDE, te program za pronalaženje pogrešaka . Pruža podršku za baze podataka i XML

Java , i FORTRAN.

slika : KYLIX

523/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KDE STUDIO GOLD

KDE Studio Gold ( Kompany ) također osigurava jednaku funkcionalnost i korisničko


sučelje kao C ++, te pruža podršku za C i C ++. Ima vrlo fleksibilno korisničko sučelje.

slika : KDE STUDIO GOLD

524/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Visual SlickEdit

Osigurava jednaku funkcionalnost i korisničko sučelje kao C ++. Pruža podršku za mnoge

jezike te među ostalim i FTP.

Koristi se za otkrivanje pogrešaka u Javi.

slika : SLICK EDIT LOGO

slika : VISUAL SLICK EDIT

525/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

• ZAKLJUČAK

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 nažalost

sam sebe onesposobljuje.

Za programere koji prelaze sa Delphia , najviše se preporučuje Kylix.

Programeri koji su gradili svoje znanje u Visual Basicu pod Windowsima , ipak preporučujem

nešto sasvim drugo.

Za one koji još uvijek ne žele ulaziti u opširnost i dubinu C-a i C ++ , bilo bi najbolje da rade

u Kylixu..

Navest ću još nekoliko savjeta za programere početnike.

Ako pišete neki mali programski kod, ne trebate se opterećivati sa radom na nekim moćnim

alatima, jer to je slično kao da gađate vrapca topom.

Zato je preporučljivo da svi korisnici koji prelaze sa Windows operativnih sustava koriste

Kylix, jer je on upravo tome namijenjen.

526/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Maja Žugaj, Željko Šafar i Damir Šćuric

ECLIPSE

527/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

ŠTO JE ECLIPSE?
Eclipse je open source razvojni projekt koji pruža 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 različitih proizvođača prema
svojim potrebama i to na način kojega se ni sami proizvođači nisu dosjetili. Zadatak Eclipse
Project-a jest prilagoditi i razviti Eclipse Platform potprojekt i srodne alate da ispunjavaju
potrebe korisnika i proizvođača programskih alata.

Što je Eclipse Tools Project?


Eclipse Tools Project predstavlja ključnu točku za graditelje raznih programskih alata,
točku koja omogućava stvaranje najboljih alata za Eclipse Platform. Misija Eclipse Tools
Project-a jest stvarati široku paletu alata za Eclipse Platform. Tools Project omogućava
jedinstvenu koordinaciju razvoja open source alata; time smanjuje preklapanje i dupliciranje,
povećava djeljivost i stvaranje zajedničkih komponenti i promiče glatko međudjelovanje
različitih tipova alata. Tools Project sastoji se od potprojekata koji predlažu, biraju i razvijaju
proizvođači alata i Tools Project PMC.

Što je Eclipse Technology Project?


Zadatak Eclipse Technology Project-a jest pružati novu mogućnost kreatorima open
source alata, istraživačima, akademicima i edukatorima za sudjelovanje u trajnom razvoju
Eclipse-a. Projekt je organiziran u 3 povezane podgrupe: Istraživanje, Razvoj i Edukacija.
Istraživački projekti razmatraju probleme i pitanja vezana uz istraživanje u Eclipse - srodnim
područjima, kao što su: programski jezici, alati i razvojno okruženje. Projekti Razvoja su
mali, neformalno strukturirani projekti koji dodaju nove mogućnosti softverskoj bazi Eclipse-
a. Edukacijski projekti usmjereni su na razvoj edukacijskih materijala, nastavnih pomagala i
drugih nastavnih materijala.

528/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Što je Eclipse Platform?


Eclipse Platform je otvoreni produžni IDE (Integrated Development Enviroment) za
bilo što, ali i ni za što određeno. Eclipse Platform predstavlja temelje za gradnju i rad
integriranih alata za razvoj softvera. Eclipse Platform daje slobodu proizvođačima alata da
nezavisno razvijaju alate koje mogu kombinirati sa alatima drugih – i to toliko jednostavno da
nitko ne može primijetiti gdje jedan alat završava, a drugi počinje.

Š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 - Plug-
in development environment).

Svi dijelovi zajedno stvaraju bogato razvojno okruženje koje programeru omogućava
učinkovito razvijanje alata koji se glatko uklapaju u Eclipse Platform.

Kako je Eclipse SDK licenciran?


Eclipse SDK sastoji se od softvera koji je proizveo Eclipse Project u kombinaciji sa
softverom nekih drugih open source projekata. Softver koji proizvodi Eclipse Project
dostupan je prema Common Public License. Dijelovi drugih projekata dostupni su prema
vlastitim licencama.

Razvoj poslovnih aplikacija pomoću Eclipse

Općenito govoreći, razvoj svakog softvera lakši je kada se koristi IDE (integrirano
razvojno okruženje). Kada se govori o razvoju poslovnih aplikacija, programer obično
razmišlja o korištenju IDE-a kako bi olakšao razvoj aplikacije. S obzirom na to da su zahtjevi
različiti od aplikacije do aplikacije, nije uvijek moguće pronaći odgovarajući IDE koji se
uklapa u okruženje. Često je potreban framework za razvoj IDE-a kako bi se ovaj problem
riješio. Srećom, tu je Eclipse (open source platforma) koja nudi baš takav framework.

Poslovne perspektive

Eclipse platforma predstavlja framework za priključne IDE komponente. Izravne


prednosti priključnih IDE komponenti jesu:

529/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Korisnici mogu učitati neke komponente kada su im potrebne i ukloniti ih kada im


prestanu biti potrebne. Kod većine komercijalnih IDE-a to nije moguće.
Nezavisni prodavači 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 zajedničkih komponenti: na primjer, prodavač koji ima
specifični UML editor za određeni posao, može ga razviti i integrirati u već obogaćenu
Eclipse razvojnu platformu.

Podrška

Kao i kod svih dobrih javno dostupnih projekata, newsgrupe, mailing liste i članci
programera cijelog svijeta podržavaju Eclipse. Za gotovo svaku komponentu Eclipse postoji
newsgrupa i mailing lista. Komercijalni priključci drugih prodavača nude podršku za
licencirane korisnike. Dodatno, sve priključke prati korisnička dokumentacija, koja je
dostupna i preko IDE-a.
Eclipse projekt podržavaju i najpoznatija imena industrije, na primjer: Borland,
Ericsson, Fujitsu, Hitachi, Hewlett-Packard, IBM, RedHat, SAP i Telelogic.

Poslovne mogućnosti

Eclipse podržava poslovni razvoj svojom javno dostupnom razvojnom platformom,


jasnom dokumentacijom i iznimnim profesionalnim članstvom. Stvara nove priključke za
postojeće popularne proizvode i nove linije proizvoda koji će iskoristiti najnovije tehnološke
trendove u razvoju poslovnih aplikacija. Na primjer, myeclipse je specijalizirana verzija
Eclipse s priključcima koji olakšavaju 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 također nudi Repository Provider
API koji omogućava priključak drugim programerima repositora. Neke od generičkih
funkcija koje omogućava CVS priključak jesu:

530/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

• U Eclipse radnom prostoru testirati modul kao projekt


• Provjeravati promijenjene datoteke
• Dodati nove datoteke u repozitorij
• Prepoznati i riješiti konflikte

Uobičajeni priključci

Eclipse pruža okvir (priključno razvojno okruženje) za stvaranje novih priključaka


obogaćenih dodatnim svojstvima. Zapravo, svi alati Eclipse platforme mogu se interpretirati
kao priključci i produžeci; ne postoji nešto kao ‘ugrađeni’ Eclipse.

531/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

PDE (Plug-in Development Environment)

PDE (Plug-in Development Environment) je set alata koji omogućuju Eclipse


developerima razvoj, testiranje, debuggiranje, izradu i primjenu Eclipse plug-inova, pri radu u
Eclipse radnom okruženju.
Eclipse možemo shvatiti kao softver koji možemo slagati prema svojim potrebama
koristeći plug-inove, te bi glavno pravilo kod pisanja novih plug-inova trebala biti mogućnost
njihove nadopune novima.
Eclipse također osigurava relativno jednostavan način pisanja plug-inova s pomoću
PDE-a, koji se smatra temeljem Eclipse platforme. Tako svaki plug-in pridonosi
funkcionalnosti Eclipsea, te se kao takav uključuje u rad kada je to potrebno.
Svaki plug-in nalazi se u direktoriju eclipse/plugins (sl.1) koji sadrži razne datoteke
kao što su plugin.xml (opisuje sadržaj runtimea Eclipsea), JavaTM code library, ikone,
properties datoteke i sl.
Sam proces pisanja plug-ina počinje 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 ugrađen u radno okružje
Eclipsea, te nudi razne editore, wizarde itd. kojima korisnici mogu pristupiti.

sl. 1 direktorij eclipse/plugins

532/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Konfiguracija PDE-a

Tijekom samog izvođenja mnogi plug-inovi zahtijevaju korištenje nekih drugih plug-
inova kako bi ispravno radili.
Za vrijeme razvoja plug-ina sve biblioteke morale bi biti u build pathu kako bi se kod
kompajlirao bez pogrešaka.
Da bi PDE pružio razvojno okružje koje je identično okružju runtimea u koji će plug-
in biti ugrađen, PDE mora specificirati Target Platform.
Specifikacijom target platforme PDE skenira i izlistava sve plug-inove koji su
pronađeni na toj lokaciji. Samo oni koje je eksplicitno naveo korisnik grade target platform
(sl. 2) i mogu se koristiti u radnom okružju plug-ina, dok su svi ostali zanemareni.

sl. 2 Preferences – Target Platform

Kreiranje novog plug-in projekta

533/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Projekt mora sadržavati manifest datoteku (opisuje sadržaj plug-ina) i build.properties


datoteku (sadrži informacije koje služe kao vodič kroz proces builda).
Za kreiranje novog plug-in projekta PDE nam nudi wizard New Plug-in Project (sl.3)
koji možemo naći pod kategorijom Plug-in Development / New Project.
Ovaj wizard ne samo da kreira novi projekt, nego i developeru daje mogućnost brzog
starta tako što kreira plug-in datoteke i prema potrebi Java kod.

sl. 3 New Plug-in Project Wizard


Većina plug-inova namijenjena je tomu da sadrži pokretačke Java kodove; plug-in
mora specificirati izvorišni direktorij koji će sadržavati plug-in kod za vrijeme razvoja i
biblioteku gdje će kompajlirani kod biti zapakiran.
PDE tada mapira ime biblioteke u izvorišni direktorij i sprema te informacije u plug-
in build.properties datoteku, tako da se ona može kasnije opet koristiti tijekom build procesa.

534/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Također se može specificirati i output direktorij gdje Java kompajler može spremati
svoje class kompajlirane datoteke projekta - dok Java kod ne sadrže svi plug-inovi (npr.
dokumentacijski plug-inovi).
Tijekom procesa izrade plug-ina developerima, pogotovo početnicima 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 sadržaj od tih datoteka bazirano na
podacima unesenim u wizard.

535/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

sl. 5 prikaz generiranog blank-plugin project-a

Editiranje plug-in manifest datoteke

Manifest opisuje sadržaj plug-ina u Eclipse runtimeu.


Sadrži 4 glavna dijela:
1. dependencies section - sadrži sve plug-inove potrebne plug-inu da se
kompajlira i sve extension points kojima se koristi
2. an extension section - deklarira sve funkcionalnosti koje plug-in pruža
platformi
3. a runtime section - deklarira biblioteke gdje su plug-in kodovi upakirani.
4. an extension points section - deklarira nove function points definirane od
plug-ina koje drugi plug-inovi mogu proširivati.

Dependencies

Lista potrebnih plug-inova određuje libraries koji će biti na plug-in runtime class
pathu. Nakon spremanja manifest datoteke, PDE automatski obnavlja class path projekta
tako da sve promjene utječu na dependency listu, ako takva postoji.
Lista potrebnih plug-inova ne bi trebala sadržavati neiskorištene stavke. Takvu stavku
je lako uočiti zato što se tijekom development vremena plug-in kod se neće htjeti kompajlirati
u workspace.

EXTRANEOUS stavke teže je uočiti jer su benigne u development vremenu. Mogu


usporiti class load u runtimeu kao extra libraries u plug-inu jer se nepotrebno pretražuje
classpath.

536/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Prema tome, PDE nudi Find Unused Dependencies (sl.6) mogućnost koja traži
stavke koje su EXTRANEOUS te nudi mogućnost njihova micanja.

sl.6 Find Unused Dependencies

Extensions

Plug-in može pridonijeti samoj platformi tako što dodaje extension pointove
deklarirane od drugih plug-inova. Extension deklaracija mora slijediti shemu definiranu od
extension pointova.
Shema može biti jednostavna ili komplicirana onoliko koliko autor želi.
Dodajući nove ekstenzije u extensions page, manifest editora uključuje kreiranje
ugniježđenih elemenata koristeći se context menuom i setiranje vrijednosti atributa za te
elemente u Properties pogledu.

PDE koristi gramatiku extension točke da ispuni context menu s ispravnim nazivima
elemenata te nadograđuje property pogled sa legalnim atributima odabranog elementa.
Menu i elementi menua mogu biti dodani u radno okružje kontribucijom na
org.eclipse.ui.actionsets extensions points.

537/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Vršni 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

sl. 7 extenzije

Menu element specificira label menija onakav kakav će se pojaviti u radnom okružju.
Element 'separator' kreira menu separator koji također služi kao grupa u koju će menu item
biti dodan. I na kraju, 'action' element specificira stvarni menu item, koristeći se menuom
identifikatora i separatorovim imenom 'menubarpath' (atribut indicira slot gdje je item
smješten).
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Runtime

Tip biblioteke, vidljivost i sadržaj mogu se namjestiti u Runtime pageu (sl. 8) manifest
editora.

sl. 8 Runtime page


Library type igra važnu ulogu u runtimeu. Ako je biblioteka deklarirana da sadrži i
kod i resurse, pristup resursu ili class datoteci iz takve biblioteke rezultira aktivacijom plug-
ina, dok pristup resursu iz biblioteke koji je deklariran tako da sadrži samo JAR library nije
još kreiran. Library content sekcija izlistava izvorišne 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Extension points

Definiranje novih extension-pointova zahtijeva pisanje sheme koju svi klijenti


extension pointa moraju slijediti da bi se točno procesirali u runtimeu. PDE nudi editor za
kompoziciju takve sheme. Ugrađeni plug-inovi kao što je ovaj Hello World ne zahtijevaju
extension pointove.

Testiranje plug-ina

PDE nudi također i launcher u svojoj platformi koji omogućuje test i debuggiranje
plug-inova.
Runtime workbench pregledava ponašanje plug-inova u okružju u kojem će kasnije
biti implementirani.
Izlazni direktorij plug-in projekta smješten je u runtime classpath plug-ina. To
omogućuje class loaderu da uvijek bude u mogućnosti locirati i učitati najnovije class
datoteke plug-ina. Sve ostale execution opcije i postavke nalaze se u samoj launch
konfiguraciji (JRE, VM argumenti…).
Launcher (sl. 9) također može kreirati više različitih konfiguracija kako bi testirao (sl.
10) plug-inove pod drukčijim uvjetima.

sl. 9 Launcher

541/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

sl. 10 test

Exportiranje plug-ina u zip-file

Zadnje što je potrebno napraviti u izradi plug-ina jest zapakirati plug-in u format koji
će se moći lako implementirati u svaki Eclipse bazirani produkt.
Sam proces pakiranja plug-in projekta vode build.properties konfiguracijske datoteke.
Ova je datoteka strukturirana kao set ključnih vrijednosti (određuje koje je datoteke potrebno
uključiti, a koje isključiti iz zapakiranog plug-ina).
Dva se ključa i koriste pri izradi Hello_world plug-ina: source<library> i bin.includes.
Kako bi se omogućio export i pakiranje plug-ina, brine se još jedan wizard, a to je Deployable
Plug-ins and Fragments.(sl. 11)

sl. 11 Deployable Plug-ins and Fragments wizard

542/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Zip-file koji je izgeneriran jednostavno mora biti otpakiran u instalacijski direktorij


(sl. 12) bilo kojeg Eclipse-baziranog okružja te tako postaje dio produkta.

sl. 12 instalacijski direktorij

Zaključak

Čini se da plug-inovi čine centralnu stanicu arhitekture Eclipsea, dok druge


komponente kao što su fragment featurei i updatei imaju važnu ulogu u razvoju Eclipse
produkata.

543/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

ECLIPSE PLATFORM - tehnički pregled

Eclipse Platform dizajniran je i građen za ispunjavanje sljedećih zahtjeva:


• podrška konstruiranju različitih alata za razvoj aplikacija
• podrška širokom spektru proizvođača programskih alata, uključujući nezavisne
softverske prodavače
• podrška alatima za manipulaciju raznih tipova sadržaja (npr. HTML, Java, C,
JSP, EJB, XML i GIF)
• omogućavanje savršene integracije alata – u različite sadržajne tipove i preko
njih
• podrška razvojnim okolinama GUI i non-GUI baziranih aplikacija
® TM
• izvođenje u raznim operacijskim sustavima, uključujući Windows i Linux
• naglasak na popularizaciji Java programskog jezika za pisanje alata.
Glavna uloga Eclipse Platforma jest opskrbljivanje proizvođača programskih alata
mehanizmima, ali i pravilima kojih se potrebno držati 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

NewTool
Workbench Help

JFace

SWT
NewTool

Team
Workspace

NewTool

Platform Runtime

sl. 13 glavne komponente

544/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Platform Runtime i plug-in arhitektura

Plug-in je najmanja jedinica Eclipse Platforma koja može biti razvijena i isporučena
zasebno. Obično je mali alat napisan kao pojedinačni plug-in, dok kompleksni alati imaju
svoju funkcionalnost razdijeljenu na nekoliko plug-inova. S iznimkom male jezgre poznate
kao Platform Runtime, sve funkcionalnosti Eclipse Platforma locirane su u plug-inovima.

Plug-inovi su kodirani u Javi. Tipični plug-in sastoji se od Java koda u JAR biblioteci,
nekih read-only datoteka i drugih resursa poput slika, web templatea, kataloga poruka itd.
Neki plug-inovi uopće ne sadrže kod. Jedan takav primjer jest plug-in koji sudjeluje u online
pomoći u formi HTML stranica. Plug-in kodna biblioteka i read-only sadržaj locirani su
zajedno u direktoriju u datotečnom sistemu ili u baznom URL serveru. Tu je također i
mehanizam koji dopušta plug-inu da bude sintetiziran iz nekoliko odvojenih fragmenata,
svaki u svom vlastitom direktoriju ili URL-u. Ovo je mehanizam koji se koristi kako bi
isporučio različite jezične pakete za internacionalne plug-inove.

Svaki plug-in ima manifest datoteku koji deklarira njegovu mogućnost povezivanja s
drugim plug-inovima. Model povezanosti 'jednostavan' je: plug-in sadrži stanovit broj
imenovanih nadoveznih točaka (produžetaka, extension pointsa) i stanovit broj nadovezivanja
na jednu ili više točaka drugih plug-inova.

Plug-in nadovezne točke mogu se 'oslanjati' na druge plug-inove. Npr. workbench


plug-in deklarira nadoveznu točku za korisničke preference. Svaki plug-in može ponuditi
svoje korisničke preference definirajući nadovezivanje na tu točku.
Nadovezna točka može imati odgovarajuće API sučelje. Drugi plug-inovi pridonose
implementaciji tog sučelja, preko produžetka do te nadovezne točke. Svaki je plug-in
slobodan definirati novu nadoveznu točku i omogućiti upotrebu novog API-ja za druge plug-
inove.

Pri startanju, Platform Runtime otkriva raspoloživ set plug-inova, čita njihove
manifest datoteke i gradi in-memory plug-in registry. Platform spaja nadovezne točke prema
imenu s njihovim odgovarajućim priključnim točkama. Svaki problem, kao što je npr.
nadovezivanje na nepostojeću točku, detektira se i logira. Rezultirajući plug-in registry
dostupan je preko Platform API-ja. Plug-in se ne može dodati nakon startanja.

545/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Plug-in manifest datoteka sadrži XML. Nadovezna točka može deklarirati dodatne
specijalne XML tipove elemenata na koje bi se nadovezala. Ovo plug-inovima omogućuje
povezivanja kojima mogu kolati najrazličitije informacije. Štoviše, objavljene informacije
dostupne su iz plug-in registryja, bez aktivacije sudjelujućeg plug-ina ili loadanja bilo kakvog
koda. Ova je osobina ključna za podržavanje velike baze instaliranih plug-inova od kojih su
samo neki potrebni u bilo kojem danom korisničkom session-u. Dok plug-inov kod nije
loadan, njegovo zauzeće memorije i djelovanje na vrijeme start-upa jest zanemarivo.
Korištenjem XML baziranih manifesta olakšano je pisanje alata koji podržavaju kreiranje
plug-inova. Plug-in razvojna okolina (PDE), koja je uključena 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 priključenim na
njegove 'spojne' točke. Npr. plug-in koji sadrži referencijalnu korisničku ekstenziju može
saznati sve sadržane korisničke preference i pristupiti njihovim imenima te složiti preference
dijalog. To može biti napravljeno samo upotrebom informacija iz registryja, bez potrebe
aktiviranja bilo kojeg sudjelujućeg plug-in.
Sudjelujući plug-in bit će aktiviran tek kada korisnik izabere preferencu s liste.
Aktiviranje plug-inova na ovaj način ne događa se automatski; postoji određen broj API
metoda koje služe isključivo za aktivaciju plug-ina. Jednom aktiviran, plug-in ostaje aktivan
sve dok se Platform ne isključi. Svaki plug-in opremljen je poddirektorijem u koji pohranjuje
podatke specifične za njega; ovaj mehanizam omogućuje plug-inovima da prenose važna
stanja između izvođenja.

Plaform Runtime zahtijeva specijalni produžetak 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.
Određivanjem seta dostupnih plug-inova unaprijed i podržavajući značajnu razmjenu
informacija između plug-inova bez potrebe da ih se aktivira, Platform može opskrbiti svaki
plug-in bogatim izvorom bitnih informacija o kontekstu u kojem djeluje. Njegov kontekst ne
može se mijenjati tijekom izvođenja Platforma, zato nema potrebe za kompleksnim
događajima koji bi izvještavali kada se kontekst mijenja. Duga start-up sekvenca izbjegnuta
je, to je glavni način izbjegavanja bug-ova zbog nepredviđenog redoslijeda aktivacije plug-
inova.

546/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Eclipse Platform izvodi se s pomoću običnog poziva standardne Java virtualne


mašine. Svakom plug-inu dodijeljen je njegov Java class loader koji je izravno odgovoran za
loadanje svoje klase. Svaki plug-in izričito naglašava svoju ovisnost o drugim plug-inovima,
od kojih očekuje da imaju direktan pristup klasama. Plug-in kontrolira vidljivost public klasa i
upletanje u njihove biblioteke. Ova informacija sadržana 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 preskočiti plug-in
workbencha, i druge plug-inove koji ovise o njemu.

Eclipse Platform update manager downloada i instalira nove mogućnosti ili


naprednije verzije postojećih mogućnosti. Update manager konstruira novu konfiguraciju
dostupnih plug-inova koji će se upotrijebiti sljedeći put kada Platform bude pokrenut. Ako se
rezultat unapređivanja ili instaliranja pokaže kao nezadovoljavajući, korisnik se može vratiti
na ranije korištenu konfiguraciju.
Eclipse Platform Runtime također osigurava mehanizam za dinamična proširenja
objekata. Klasa koja implementira "prilagodljivo" sučelje deklarira svoju instancu otvorenom
ponašanjima treće strane. Prilagodljiva instanca može 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 može
dodati ponašanje postojećim tipovima (i klasama i interfaceima) prilagodljivih. Više strana
može neovisno nadovezati isti prilagodljivi objekt, svaki iz različitih razloga. Mehanizam
koristi samo Java tip prilagodljivog objekta (ne povećava potrošnju memorije). Bilo koji plug-
in može iskoristiti ovaj mehanizam za dodavanje ponašanja postojećim prilagodljivim
objektima i definiranje novih tipova prilagodljivih objekta za druge plug-inove i moguće
ekstenzije.

Workspace

547/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Različiti alati uključeni u Eclipse Platform rade po regularnim datotekama u


korisničkom workspaceu. Workspace sadrži jedan ili više top-level projekata, gdje se svaki
projekt mapira na odgovarajući direktorij koji je specificirao korisnik, u datotečnom sustavu.
Različiti projekti u workspacea mogu se mapirati u različite direktorije ili driveove, iako se,
po defaultu, svi projekti mapiraju u srodne poddirektorije u jedinom direktoriju workspacea.
Svaki projekt sadržava 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 proširiti svoje djelovanje.
Kako bi se minimizirao rizik od slučajnog gubljenja datoteka, niže rangirani history
mehanizam workspacea prati prethodni sadržaj bilo koje datoteke koja je promijenjena ili
izbrisana integriranim alatima. Korisnik kontrolira rukovođenje historyjem s pomoću
prostorno i vremenski baziranih preferenca.
Workspace sadrži marker mehanizam za resurse, koji bilježi događaje. Markeri se
upotrebljavaju za snimanje različitih bilježaka kao što su compiler error messages, "to-do"
lista, bookmarks, search hits i debugger breakpoints. Plug-inovi mogu predočiti nove
podtipove markera i kontrolirati pohranjivanje između izvođenja.
Platform osigurava generalni mehanizam koji dopušta alatu da prati promjene u
resursima workspace-a. Registriranjem resource change listenera, alatu je zajamčeno
primanje naknadne obavijesti o svim manipulacijama resursa, brisanju ili promjeni u sadržaju
datoteka. Platform odgađa obavijest o događaju do završetka seta manipulacija resursima.
Izvještaj o događaju ima formu stabla promjena koje opisuje efekt čitavog seta operacija.
Promjene resursa također sadrže informacije o promjenama markera.
Alati poput kompajlera i linkera moraju obraditi koordiniranu analizu tisuća zasebnih
datoteka. Platform nudi inkrementalni project-builder. Uvod u inkrementalni build jest
upravo korištenje gore navedenog stabla promjena resursa tj. razlika od zadnjeg buildanja.
Platform omogućuje više različitih inkrementalnih projekt-buildera koji mogu biti
registrirani na istim projektima. Mogući workspace auto-build automatski okida potrebne
build-ove nakon svake modifikacije resursa.

Workbench i UI Toolkit

548/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Eclipse Platform UI sagrađen je oko workbencha koji omogućava cjelokupnu


strukturu i predstavlja nadogradiv UI za korisnika. Workbench API i implementacija
sagrađeni su od dva programska alata:
• SWT – widget set i grafička biblioteka integrirana window sistemom, ali OS-
neovisnim API-jem.
• JFace – UI toolkit implementiran upotrebom SWT koji pojednostavnjuje
uobičajene UI programske zadatke.

SWT (Standard Widget Toolkit)

SWT nudi uobičajeni OS-neovisni API za widget-e i grafiku, implementiran na način


da dopušta tijesnu integraciju s osnovnim window-baziranim sistemom. Cijeli Eclipse
Platform UI i alat koji se uključuje u njega, koriste se SWT-om za prezentaciju informacija
korisniku.
Glavna stvar u dizajnu widget toolkit-a jest tenzija između prenosivog programskog
alata i window-baziranog sistema integriranja. Java AWT nudi low-level widgets kao što su
liste, tekstualna polja i buttoni, ali ne i high-level widgets kao što su stabla ili rich tekst.
Graditi UI upotrebljavajući samo AWT znači programirati na najmanje uobičajenom
denominatoru od svih OS window sistema. Java Swing programski alat rješava ovaj problem
emuliranjem widgets kao stabla, liste i rich teksta. Swing također omogućuje izgled i osjećaj
emulator sloja koji pokušava stvoriti aplikaciju koja izgleda poput osnovnog window-
baziranog sistema. Ipak, stalno oponašanje widgetsa zaostaje za izgledom i osjećajem
prvotnog widgetsa i korisnikova interakcija s emuliranim widgetsom obično je dovoljno
različita da bude zamjetljiva, stvarajući teškoće u izgradnji aplikacija koje uspoređuju head-
on s shrink-wrapped aplikacijama razvijenim specijalno za određeni window sistem.
SWT rješava ovu stvar definirajući uobičajeni API koji je dostupan preko
mnogobrojnih window-podržanih sistema. Za svaki različiti window-bazirani sistem SWT
implementacija osigurava pogodnu simulaciju. Uobičajeni niskorazinski widgets kao što su
liste, tekstualna polja i buttoni ugrađeni su standardno svugdje. Ali neki generalno korisni
više-razinski widgetsi prema potrebi mogu biti proslijeđeni na neki window sistem. Npr. SWT
toolbar widget implementiran je kao toolbar widget u Windowsima i kao emulirani widget u
®
Motifu .

549/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Uska integracija s osnovnim window-baziranim sistemom nije striktno stvar izgleda i


osjećaja. SWT je također u interakciji s desktop obilježjima, kao što je "drag and drop" i
može upotrebljavati komponente razvijene s OS komponentnim modelima, kao Windows
®
ActiveX kontrole.
Ova strategija uvelike pojednostavnjuje implementaciju, ispravljanje pogrešaka i
održavanje SWT zato što dopušta svim interesantnim razvojnim programima da se izvršavaju
u Javi. Naravno, ovo nije direktna briga za tipične 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 uobičajenih 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 uobičajenih komponenti UI toolkita, imidž i font registryja, okvira
dijaloga, preferenca, wizarda i izvještaja o napredovanju za dugotrajne operacije. Dva njegova
najinteresantnija obilježja su actions i viewers.
Akcijski mehanizam dopušta korisničkim komandama da budu definirane nezavisno
od njihovih točnih pozicija u UI-u. Akcija predstavlja komandu koja može 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 dopušta istoj akciji da bude
korištena na više mjesta u UI-ju, što znači da je lako mijenjati gdje je akcija prisutna u UI-u
bez potrebe mijenjanja koda za samu akciju.
Vieweri su model-bazirani adapteri za određene SWT widgetse. Vieweri upravljaju
uobičajenim ponašanjem i osiguravaju višerazinsku semantiku od one dostupne sa SWT
widgets-a. Standardni Vieweri za liste, stabla i tablične podrške populariziraju viewer
elementima iz klijentske domene i drže 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 očekivani content viewer i kako da updateaa promjene domene u
odgovarajuće promjene viewera. Label provider zna kako da proizvede specifični 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 obaviješteni o

550/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

izboru i događajima u području elemenata domene kojima se opskrbljuje Viewer. Viewerova


implementacija rukuje mapiranjem između elemenata domene i SWT widgetsa,
prilagođavajući se za filtrirani view na elemente i resortiranje potrebnog. Standardni viewer za
podržavanje tekst-uobičajenih 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 tražene od SWT uređenog tekst
widgeta. Više viewera može biti otvoreno u istom modelu ili dokumentu; svi su ažurirani
automatski kada se model ili dokument promijeni u bilo kojem od njih.

Workbench

Za razliku od SWT i JFace, koji su glavni sadržaj UI toolkit-a, Workbench osigurava


UI osobnost Eclipse Platforma i opskrbljuje strukture u kojima alati surađuju s korisnikom.
Zbog ove centralne i ključne 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 korištenjem i SWT-a i Jface-a. Java AWT i
Swings nisu korišteni.
Paradigma Eclipse Platform UI temelji se na editorima, viewerima i perspektivama. S
korisnikove točke gledišta, prozor workbench-a vizualno se sastoji od viewera i editora.
Perspektive se manifestiraju u selekciji i obradi editora i viewera vidljivih na ekranu.
Editori dopuštaju korisniku da otvori, obradi i spremi objekte. Oni slijede otvori-
spremi-zatvori životni krug, vrlo slično alatima baziranim na datotečnom sustavu, ali mnogo
tjesnije integriranim u workbenchu. Kada je aktivan, editor može izvoditi akciju menuom
workbencha i tool bara. Platform osigurava standardni editor za tekstualne resurse; više
specijalizirani editori su osigurani drugim plug-inovima.
Vieweri nude informacije o nekim objektima na kojima korisnik radi u workbenchu.
Viewer može asistirati editoru dobavljanjem informacija o dokumentima koji se uređuju. Npr.
standardni pripadajući view pokazuje osobine objekta izabranog u drugom view-u. Vieweri
imaju jednostavniji životni krug nego editori: modifikacije učinjene 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Prozor workbencha ima više odvojenih perspektiva, od kojih je samo jedna vidljiva u
danom trenutku. Svaka perspektiva ima svoje vlastite viewere i editore koji su uređeni (tiled,
stacked ili detached) za prezentaciju na ekranu (neki, prema potrebi, mogu biti skriveni).
Nekoliko različitih tipova viewera i editora mogu u perspektivi biti istodobno otvoreni.
Perspektiva kontrolira inicijalnu poglednu vidljivost, layout i akcijsku vidljivost. Korisnik
može brzo mijenjati perspektivu kako bi izvodio različite zadatke i može lako presložiti i
prilagoditi perspektivu kako bi bolje odgovarala određenom zadatku. Platform osigurava
standardnu perspektivu za općenite 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
načinima. Glavne produžne točke dopuštaju alatima da povećaju workbench:
• Dodaju novi tip editora.
• Dodaju novi tip pogleda.
• Dodaju nove perspektive, koje aranžiraju stare i nove viewe kako bi odgovarali
novom korisnikovu zadatku.
Platformovi standardni vieweri i editori prisutni su koristeći se ovim mehanizmom.

Alati također mogu povećati postojeće editore, viewere i perspektive:


• Dodaju nove sekcije na postojeće pogledne lokalne menije i tool bare.
• Dodaju nove akcije meniju workbencha i alatnom baru kad postojeći editor
postane aktivan.
• Dodaju nove akcije "pop-up" sadržavajućem meniju postojećeg viewa ili
editora.
• Dodaju nove viewere, akcijske setove i prečace u postojećoj perspektivi.

Platform se brine za sve aspekte workbench prozora i upravljanje perspektivom.


Editori i vieweri se automatski instaliraju u slučaju potrebe i odbacuju kad više nisu potrebni.
Prikazani labeli i ikone sadržane u alatima izlistane su u plug-in manifestu tako da workbench
može kreirati menije i alatne barove bez potrebe aktiviranja sudjelujućih plug-inova.
Workbench ne aktivira plug-in dok korisnik ne pokuša iskoristiti funkcionalnost koju taj
plug-in pruža.
Jednom kada editor ili pogled postanu aktivna strana perspektive, mogu se koristiti
uslugama workbencha za lociranje aktivacije i selekcije.

552/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

UI Integracije

Alati koji su napisani u Javi s pomoću Platform API-ja postižu najviši 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 podložnog datotečnog sistema. Njihove integracije su zato vrlo
slabe, pogotovo na UI razini. U nekim okolinama Eclipse Platform također podržava ovakve
vrste integracije:
• Workbench ima ugrađenu podršku za umetanje bilo kakvog OLE dokumenta
kao editora (samo u Windowsima). Ova opcija omogućuje tijesnu UI
integraciju.
• Plug-inov alat može implementirati kontejner koji premošćuje Eclipse
Platform API s ActiveX kontrolom kako bi bila upotrijebljena u editoru,
Vieweru, dijalogu ili wizardu (samo u Windowsima). SWT omogućuje
potrebnu niskorazinsku podršku. Ova opcija omogućuje tijesnu UI integraciju.
• Plug-inov alat može upotrebljavati AWT ili Swing za otvaranje zasebnog
prozora. Ova opcija omogućuje slabu UI integraciju, ali dopušta usku
integraciju ispod UI

Timska podrška

Eclipse Platform dopušta projektu u workspace-u da bude smješten ispod verzije i u


® TM
2.1 izdanju (ožujak 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.

Pomoć

553/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Mehanizam za pomoć Eclipse Platforma dopušta alatu da definira i donosi


dokumentaciju u jednoj ili više online knjiga. Npr. alat obično donosi dokumentaciju
stiliziranu za pomoć u obliku vodiča za korisnike i API dokumentaciju (ako je ima) u
zasebnom programskom vodiču.

Sadržaj je dodan u HTML datoteke. Objekti koji uređuju sirovi sadržaj u online knjige
koristeći pogodne navigacijske strukture izraženi su zasebno u XML datotekama. Ovo
odvajanje dopušta prije postojećoj HTML dokumentaciji da bude inkorporirana direktno u
online knjige bez potrebe za editiranjem ili njezinim prepravljanjem.

Dodana navigacijska struktura predstavlja sadržaj knjiga kao stablo tema. Svaka tema,
uključujući i nelistovne teme, može imati link na stranicu golog sadržaja. Obična knjiga može
imati višestruke alternativne liste top-level tema, dopuštajući nekima ili svim informacijama
da budu prisutne u totalno različitim organizacijama; npr. organiziranim prema zadacima ili
alatima.

XML navigacijska datoteka i HTML sadržajna datoteka su pohranjeni u plug-inovu


root direktoriju ili poddirektoriju. Mali alati obično 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 korisnički server dopušta Platformu razrješavanje specijalnih inter-
plug-in linkova i ekstrakiranje HTML stranice iz ZIP arhiva.

Kada se organizira sistem za pomoć, potpuno tematsko stablo moguće 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ć dopušta alatu dodavanje i sirovog sadržaja i tematskog seta, kako bi
indicirao gdje treba umetnuti svoju temu u već postojeće tematsko stablo kao predefiniranu
točku za umetanje.

Epilog

Ukratko, Eclipse Platform opskrbljuje jezgru generičkih building blokova i API-ja


kao što su workspace i workbench, i ostale različite točke ekstenzija preko kojih nove

554/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

funkcionalnosti mogu biti integrirane. Kroz te ekstenzije, alati pisani kao zasebni plug-inovi
mogu proširiti Eclipse Platform. Korisniku je predstavljen IDE sa specijaliziranim setom
dostupnih alatnih plug-inova.
Ipak, ovo zapravo nije kraj priče nego njezin početak. Alati u pravilu definiraju nove
točke ekstenzija i svoje vlastite API-je i tako služe kao temelji i integracijske točke za nove,
nadolazeće alate.

555/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Goran Jurišić

PIPE I FIFO

556/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

UKRATKO O PROCESIMA

Najkraća definicija procesa bi bila: proces je instanca programa koji se trenutno izvodi.
Svaka instanca ima svoj memorijski prostor i stanje izvođenja.
Proces mora imati svoj ID (identifikacijski broj) u obliku nenegativnog integer-a tako
da operacijski sustav može razlikovati procese, alocirati i upravljati sa sistemskim resursima
koji su potrebni za izvođenje pojedinog procesa. Naravno, svaki process ID je jedinstven. Isto
tako, svaki proces ima i svoje tzv. file descriptor-e.
*proces ID 0 je najčešće sistemski proces koji se zove swapper i dio je kernela
*proces ID 1 je init proces i pokreće ga kernel na kraju bootstrap procedure; podiže ga
UNIX sistem nakon učitavanja kernela; init čita inicijalizacijske datoteke dovodi sustav u
potrebno stanje

UNIX je višeprogramski sustav koji može pokretati više procesa istodobno.


Proces u UNIX-u pokreće jedan program i ima inicijalno jedan upravljački thread.
UNIX podržava 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 pomoću 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 događaju na jednom od ta
dva procesa vidljive na onom drugom.

getpid i getppid sistemski pozivi vraćaju 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Primjer 1.
#include<stdio.h>
#include<unistd.h> /*definira fork() i pid_t*/

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 više puta, javlja se različit 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.

Stvaranje procesa

Kao što smo već spomenuli, proces može stvoriti novi proces putem sistemskog poziva
fork. Proces koji poziva postaje na taj način 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.

Primjer 2.
#include<unisth.h>

pid_t fork( void );

558/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Povratna vrijednost funkcije fork je važna karakteristika koja omogućava parent i child
procesima da se međusobno razlikuju. Funkcija fork vraća 0 child-u te vraća child process ID
parent procesu. U slučaju neuspjeha fork vraća -1 i ne stvara child process. Zvuči zbunjujuće?
Evo primjera koji će pomoći.

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 izvršava sa jednom x varijablom. Nakon fork-a, dva
nezavisna procesa se izvršavaju, svaki sa svojom kopijom x varijable. Budući da se parent i
child procesi izvršavaju 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, izvršavaju iste instrukcije jer u kodu nismo
testirali povratnu vrijednost funkcije fork. Primjer 4. demonstrira kako testirati povratnu
vrijednost funkcije fork.

559/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

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
izvršava drugu printf naredbu. Child proces ima vrijednost varijable childpid 0 i izvršava prvu
printf naredbu.

Zar bi moglo ići 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

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) /*sta je tocno napravio child process?*/


{
/*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: /*fork() je uspio, sad smo unutar PARENT procesa*/
wait (&child_status); /*cekaj dok ne zavrsi child process*/
}
/* ovdje mozemo dodati parent kod … */

*wait() sistemski poziv čeka dok child process ne završi, i sprema njegov izlazni status
u varijablu
*perror ispisuje poruku o grešci temeljenu na errno varijabli
Funkcija fork() kopira i dio memorije poznat kao «U Area» (User Area). Taj dio
memorije sadrži između ostalog, file descriptors tablicu procesa. To znači da nakon povratka
iz fork() poziva, child proces nasljeđuje sve file-ove koji su otvoreni u parent procesu.
Isto tako, file-ovi koji su otvoreni nakon fork() poziva, se ne dijele između parent i child
procesa. Ako jedan proces zatvori zajednički file, on je i dalje otvoren u drugom procesu.

561/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

KOMUNIKACIJA MEĐU PROCESIMA


(IPC – INTERPROCESS COMMUNICATION)

Očita je potreba za komunikacijom među procesima u svrhu razmjene i kontroliranja


podataka. IPC (Interprocess Comunication) predstavlja transfer podataka među procesima.
Postoje razni načini komunikacije poput:
dijeljena memorija - omogućava procesima komunikaciju pišući i čitajući na
određenu memorijsku lokaciju
mapirana memorija - slična dijeljenoj, ali se ne koristi memorijskom
adresom nego određenim file-om
socket-i - omogućavaju komunikaciju među procesima koji se mogu nalaziti
čak i na različitim računalima
pipe – omogućava sekvencijalnu komunikaciju srodnih procesa
FIFO – radi na sličnom principu kao i pipe, s razlikom što omogućava
povezivanje procesa različitih parent-a
semafori – omogućavaju sinkronizaciju procesa
signali – kratke poruke kojima je omogućeno slanje zahtjeva za prekid
procesa

562/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Na slici 1. vidi se podjela mehanizama IPC-a.

MEHANIZMI
IPC-a

Za procese na Za procese na
istom host-u odvojenim host-
ovima

Za razmjenu
Mrežni mehanizmi
podataka Za sinkronizaciju

semaphores
Remote procedure
call (RPC)

signals
Transport lazer
interface (TLI)

pipes
sockets

message queues

shared memory

files

Slika 1.

563/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

PIPE (ILI CJEVOVOD)

Pipe je komunikacijski kanal između dva procesa. Putem njega dva procesa mogu
izmjenjivati podatke i to half-duplex načinu rada. To znači da u jednom trenutku samo jedan
proces može slati, a drugi primati podatke.
shell komande mogu se međusobno povezati tako da izlaz jednog procesa bude direktan
ulaz u drugi proces. Upotreba sa naredbom shell izgleda ovako:

naredba1 | naredba2

Prema slici 2. vidljivo je što se točno događa.

Uzmimo, kao primjer, da želimo ispisati imena file-ova u direktoriju koristeći naredbu
ls | lpr.
Tada shell stvara proces ls i odvojeni proces lpr, povezujući ih sa dva pipe-a. Proces ls
piše podatke u pipe, a proces lpr čita podatke iz pipe-a.
Tok podataka ima samo jedan smjer, od ls prema lpr.

Slika 2.

*pipe-ovi koriste međuspremnike (buffer cashe) veličine jednog bloka (obično 512
bajtova)

564/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Kako to funkcionira “u pozadini”?

Općenito se procesi povezuju pipe-om na sljedeći način:


napraviti cjevovod
napraviti proces child koji će čitati
u child-u zatvoriti kraj pipe-a na kojeg se piše (dodati druge stvari ako je
potrebno, što se razlikuje od slučaja do slučaja)
izvršiti program za child koji čita
u parent-u zatvoriti kraj pipe-a s kojeg se čita (dodati druge stari ako je
potrebno, kao i u child procesu)
ako child treba pisati u pipe, stvoriti proces i izvršiti program
ako parent treba pisati, neka piše

Glavni nedostatak komunikacije među procesima posredstvom pipe-a je da procesi


moraju biti povezani (srodni; roditelj – dijete). Pipe se ne može kreirati nakon što su procesi
već stvoreni, jer proces koji stvara cjevovod ne može prenijeti tzv. file descriptor-e drugom
procesu.

Cjevovod stvaramo pozivom pipe(). Odnosno:

Int pipe(int fildes[2])

Pipe vraća 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 uspješno izvršeno, pipe vraća 0; ako nije pipe vraća -1 i postavlja errno.
Program može pristupiti pipe-u samo putem file descriptor-a. Zbog toga pipe može
koristiti samo onaj proces koji ga je stvorio i potomak koji je naslijedio descriptor-e putem
fork-a.

565/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Kada process pozove read() iz pipe-a, read() odmah vraća ako pipe nije prazan. Ako je
pipe prazan, read() čeka dok se nešto ne upiše u pipe toliko dugo koliko proces “drži” pipe
otvoren za pisanje.
Budući da slika govori više nego 1000 riječi…..
Ovako to izgleda kad su oba kraja pipe-a otvorena za oba procesa ( pipe(p) ):

Parent Child
p[1] p[1]
write( ) write( )

pipe
read( ) read( )
p[0] p[0]

A ovako izgleda kada je sve spremno za transfer podataka:

Parent Child
p[1]
write( )

pipe

read( )
p[0]

566/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Grafički prikaz uspostavljanja komunikacije uz pomoć pipe-a

KORAK 1. proces A stvara pipe


i dobiva dva file descriptor-a A

pipe
KORAK 2. process A stvara dva child
A Procesa B i C. B i C nasljeđuju descriptor-e.

B C

KORAK 3.
A
Svaki proces zatvara onaj
Dio pipe-a koji mu ne treba.

B C

KORAK 4. Proces B može pisati,


a proces C može čitati iz pipe-a.
A

B C
write() read()

567/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

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; /*podaci primljeni od parent-a*/
int rc; /*povratna vrijednost od read()*/

close(data_pipe[1]); /*prvo zatvaramo write dio pipea*/

/*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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

/*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) /*u slucaju neuspjeha obavijesti o gresci I izađi*/
{
perror(“Parent“);
close(data_pip[1]);
exit(1);
}
}

/*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; /*pid child procesa*/
int rc; /*za spremanje povratnih vrijednosti*/

/*prvo stvorimo pipe*/


rc = pipe(data_pipe);
if (rc == -1)
{
perror(“pipe”);
exit(1);

569/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

pid = fork();

switch (pid)
{
case -1: /*fork nije uspio*/
perror(“fork”);
exit(1);
case 0: /*unutar child procesa*/
do_child(data_pipe);
default: /*unutar parent procesa*/
do parent(data_pipe);
}

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 greške tako da sprema broj greške u globalnu varijablu
errno (sys/errno.h); perror(string) – traži broj greške koja se dogodila te piše na standard error
poslani string i ispisuje opisnu poruku o grešci

Postoji još jedan način na koji možemo stvoriti pipe; putem tzv. formatted pipeing-a.

Sintaksa je sljedeća:

FILE *popen(char *command, char *type)

570/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Na taj način otvaramo pipe za I/O gdje je command proces koji će se povezati sa
pozivajućim procesom i na taj način stvoriti pipe.

type je ili “r” - za čitanje, ili “w” - za pisanje.

Pipe koji smo stvorili na ovaj način bi uvijek trebali zatvoriti sa pclose(FILE
*stream). Za komunikaciju sa pipe-om koristimo fprintf() i fscanf().

*u C-u postoje dvije klase funkcija koje se bave datotečnom 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
pridružuje njezin nenegativni i u tom procesu jedinstveni broj koji jednoznačno 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 greške (FILE* ekvivalent – stderr)

Još malo detalja o pipe-ovima

U radu s pipe-ovima često je potrebno duplicirati postojeće file descriptor-e (da bi se


pipe povezao na standardni ulaz ili izlaz, da bi se descriptor-i za standardni ulaz i izlaz mogli
spremiti i vratiti nakon zatvaranja cjevovoda...). Za dupliciranje file descriptor-a služi
sistemski poziv dup.

Int dup(int fd);

Poziv dup kopira postojeći file descriptor datoteke fd i vraća novi file descriptor ili -1 u
slučaju greške. Poziv ne uspijeva, na primjer ako fd nije otvoren ili je već otvoren
maksimalan broj file descriptor-a (obično 20). Novi file descriptor ima drugačiji broj od
originalnog. Pravilo je da se kod otvaranja bilo kojeg novog file descriptor-a uzima najmanji

571/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

slobodni broj. Najmanji brojevi 0, 1 i 2 su descriptor-i standardnog ulaza, standardnog izlaza i


standardnog izlaza za greške.

Koristeći to pravilo, kraj pipe-a iz kojeg se može čitati se povezuje na standardni ulaz
na sljedeći način:
zatvori se descriptor datoteke 0 i duplicira se descriptor kraja za čitanje pipe-
a
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 više
nije potreban)

572/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

NAMED PIPES (IMENOVANI CJEVOVODI - FIFO)

Do sada smo koristili tzv. unnamed pipe(neimenovani cjevovod). Njegovo glavno


ograničenje je da putem njega mogu komunicirati samo srodni procesi. Ako želimo omogućiti
komunikaciju između dva procesa koji nisu srodni, moramo koristiti named pipe (imenovani
cjevovod). Postoji kao posebna datoteka (stalna, ne privremena kao u “običnom” pipe-u)
unutar datotečnog sustava. Otvaranjem te datoteke za čitanje, proces dobiva pristup
“čitajućem kraju” pipe-a. Otvaranjem te datoteke za pisanje, proces dobiva pristup “pisajućem
kraju” pipe-a.
Dakle,ako process otvori tu datoteku za čitanje, ona je blokirana sve dok je drugi
proces ne otvori za pisanje. Isto tako vrijedi i obrnuto.
Imenovani cjevovod prenosi podatke po principu prvi unutra – prvi van, pa se često
naziva i FIFO (First In First Out). Za razliku od običnog pipe-a on omogućuje povezivanje
procesa različitih “predaka”.

FIFO možemo koristiti na dva načina:


1. sa mknod naredbom iz shell-a.
2. sistemskim pozivom mknod() ili funkcijom mkfifo()

Što se prvog načina tiče, ako želimo stvoriti imenovani cjevovod koji bi nazvali recimo
prvi_fifo, to bi učinili ovako:

mknod prvi_fifo p

Kao što se vidi, imenovani cjevovodi imaju ime (“prvi_fifo”) te su označeni kao
posebna vrsta datoteke (oznaka p – pipe).
Drugi način na koji možemo napraviti FIFO je uz pomoć mknod() sistemskim pozivom.

Int mknod(char *path, int mode, int dev);

Tu se stvara nova datoteka čiji put (uključujući ime) je path.


Tako stvoreni imenovani cjevovod možemo otvoriti naredbom:

573/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Int open(char *path, int flags [, int mode] );

Do sada nismo koristili flags koji je kombinacija zastavica definiranih u <fcntl.h>.


Najčešće korištene su:

O_RDONLY – otvori za čitanje

O_WRONLY – otvori za pisanje


O_RDWR – otvori za čitanje I pisanje

O_NDELAY – utječe na postupak otvaranja I kasniji rad sa read I write – ako se


operacija ne može obaviti bez čekanja , nema čekanja nego se vraća greška

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 sadržaj se briše

O_EXCL – ne dozvoljava korištenje postojeće datoteke ako je postavljeno


O_CREAT

FIFO možemo stvoriti i pozivom mkfifo() funkcije.

#include<sys/stat.h>

int mkfifo(const char *path, mode_t mode);

574/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Funkcija mkfifo() također stvara novu datoteku čiji put je path (path i ime datoteke),
dok mode argument specificira dozvole .
U slučaju uspjeha, mkfifo vraća 0, a u slučaju neuspjeha vraća -1 i postavlja errno.

Otvaranje imenovanog cjevovoda se radi pomoću, već spomenutog, open() sistemskog


poziva ili koristeći fopen() standardnu C funkciju. U slučaju uspjeha dobivamo file descriptor
(u slučaju open(), ili FILE pointer u slučaju fopen()), kojeg možemo koristiti za ili pisanje ili
čitanje. Zatvaranje fifo-a radimo pomoću close() a brisanje pomoću 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 omogućava procesima da se sinkroniziraju prije nego
počne prenošenje 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

{
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 događa u primjeru 7.? Prvo se stvara imenovani cjevovod iz path-a određenog
preko komandne linije. Zatim se fork-a child.
Child proces piše u imenovani cjevovod, a parent čita šta je napisano. U primjeru je
uključena provjera greške.
Dalji rad sa imenovanim cjevovodima je isti kao i sa običnim cjevovodima.

DODATAK A

576/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb PIPE i FIFO

Funkcije za dobivanje identifikatora procesa:

funkcija Opis
Pid_t getpid(void) Process ID
Pid_t getppid(void) Parent process ID
Pid_t getuid(void) Effective user ID
Pid_t geteuid(void) Real group ID
Pid_t getgid(void) Effective group ID
Pid_t getegid(void)

DODATAK B

Dijeljenje datoteka između procesa

Parent i child dijele


isti file offset
(isti file table entry)

file table
Parent proc.table entry v-node table
file status flags v-node information
fd flags ptr
f d 0: current file offset i-node information
f d 1: v-node ptr
f d 2: current file size

... file status flags


v-node information
current file offset
i-node information
v-node ptr
Child proc.table entry current file size
fd flags ptr
file status flags
f d 0: v-node information
f d 1: current file offset
i-node information
f d 2:
v-node ptr
... current file size

577/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Krasnodar Krajnik

fork

578/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sadržaj

UVOD

Sistemski pozivi i C bibliotečne funkcije (System Calls and


Library Functions)

Svaki operacijski sustav osigurava točno određeni broj pristupnih točkaka (service
points) koje omogućavaju programu da zatraži neku uslugu od kernela (dohvaćanje datoteke s
diska, kreiranje procesa, alociranje memorije, sistemsko vrijeme i dr.). Skup tih pristupnih
točaka, odn. usluga koje je moguće zatražiti od kernela zovu se sistemski pozivi (system
calls).
U UNIX-u, sučelje (interface) tih pristupnih točaka odn. sistemskih poziva je
dokumentirano i definirano u C jeziku1. Dakle, u UNIX-u za svaki sistemski poziv postoji
ekvivalent - C bibliotečna funkcija istog imena. Pozivom takve funkcije u C programu poziva
se izvršavanje odgovarajućeg sistemskog poziva kernela. To se izvodi na način da C funkcija,
uz. ev. podešavanje i pripremu parametara, postavlja određene vrijednosti u registre, a zatim
izvršava instrukciju softverskog prekida (software interrupt) nakon čega kernel izvršava
zadani sistemski poziv. Na koji način kernel ostvaruje neku uslugu (sistemski poziv) ovisno je
o implementaciji OS-a i korisnik (bio to korisnik za terminalom ili C programer) na ponašanje
sistemskog poziva ne može utjecati.
S druge strane, većina C funkcija nije sinonim jednog sistemskog poziva već za svoje
izvršavanje koristi ili nijedan (npr. strcpy(),strlen()) ili više poziva (npr. system()).
S točke gledišta programera nema razlike između prvih funkcija koje su slike odn. ekvivalenti
sistemskih poziva i drugih koje koriste ili nijedan ili više poziva. Obje skupine služe za razvoj
aplikacijskih programa. Broj, ponašanje i funkcionalnost funkcija u svakoj takvoj biblioteci
moguće je mijenjati po potrebi, ali broj i ponašanje sistemskih poziva u UNIX-u unaprijed je
utvrđen implementacijom i ne može se mijenjati.

1
Kod Windowsa npr. to nije tako;. skup svojih sistemskih poziva Windowsi ne dokumentiraju i ne definiraju
kao skup C bibliotečnih funkcija. Umjesto toga, Windowsi koriste Windows API biblioteku koja predstavlja
dodatnu razinu, sučelje između aplikacije i operacijskog sustava. Korisnički program poziva API funkcije, a API
funkcije izvršavaju sistemske pozive. S jedne strane, dakle, nema načina da korisnički program direktno izvrši
sistemski poziv. S druge strane, moguće je mijenjati implementaciju OS-a odn. sistemskih poziva sve dok
izmjenjena implementacija ostaje kompatibilna s API.jem.

579/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sadržaj

C bibliotečne 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
objašnjavanje tih poziva, dalje u ovom tekstu će se terminološki naglašavati razlika između
onoga što zapravo predstavlja takva funkcija, sistemski poziv, i svih ostalih funkcija koje to
nisu.
Svi primjeri u ovom radu kompajlirani su pomoću gcc 3.3.2 kompajlera i testirani na
distribuciji Mandrake10 LINUX-a.

580/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

PROCESI U UNIX-U

Proces je instanca programa u izvršavanju. Program se izvodi unutar procesa. Također,


program tijekom izvođenja može 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 sadržan PID je
pid_t deklariran u <sys/types.h> ( u današnjim sustavima obično 32-bitni unsigned int).

Proces čiji PID=0 je obično 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 sljedeći 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


/etc/init Proces 1: pokreće predefinirane servise, kreira
User mode
procese za login
proces. Servisi (procesi) koje fork
exec
login terminal
pokreće init definirani su u /etc/getty /etc/getty
exec

konfiguracijskoj datoteci /bin/login /bin/login provjera passworda


exec
/etc/init (starije verzije user2 shell shell shell user1

UNIX-a) i /sbin/init ili


/etc/inittab. (novije verzije).
Init je korisnički proces sa
superuser privilegijama koji
Slika1. hijerarhija procesa u UNIX-u
nikada ne umire.

pregled aktivnih procesa


Popis svih procesa koji su trenutno pokrenuti u sustavu dostupan je naredbom 'ps'.

Primjer ispisa: [user@localhost user]$ ps


PID TTY TIME CMD
5687 pts1 00:00:00 bash
5808 pts1 00:00:00 ps

581
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

Moguće je pokrenuti naredbu 'ps' s različitim opcijama čime utječemo na izbor procesa i
odabir informacija o procesu; selekcija po PID-u, terminalu, korisniku koji je vlasnik procesa,
vrijeme startanja procesa itd. (man starnice sadrže detalje o opcijama).

Primjer punog ispisa svih procesa: [user@localhost user]$ ps -A -f


UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:19 ? 00:00:03 init [5]
root 2 1 0 12:19 ? 00:00:00 [ksoftirqd/0]
...
root 5 1 0 12:19 ? 00:00:00 [kapmd]
...
daemon 1559 1 0 12:20 ? 00:00:00 /usr/sbin/atd
user 5687 5686 0 13:35 pts1 00:00:00 /bin/bash
user 5840 5687 0 13:58 pts1 00:00:00 ps -A -f

PID - PID procesa


PPID - PID parent procesa
C - stanje procesa ( R(runnable) – pokrenut=1, T (stopped) – prekinut=0,
S(sleeping) - privremeno na 'spavanju', <20s, I(idle) - na 'spavanju' >20s)
STIME - vrijeme pokretanja procesa
TTY - ime kontrolnog terminala iz kojega je proces pokrenut
TIME - ukupno utrošeno vrijeme izvršavanja
CMD - naredba (proces) koja je pokrenula proces

fork

U UNIX-u, kreiranje novog procesa izvodi se izvršavanjem sistemskog poziva fork. Svaki
UNIX proces kreiran je fork-om i to je jedini način za kreiranje procesa. Jedine iznimke od
toga odnose se na spomenute procese kreirane od strane sistema u toku izvođenja bootstrap
procedure.
Proces koji poziva fork naziva se parent (roditeljski) proces. Uspješnim izvođenjem
poziva fork, nastaje druga (gotovo) identična memorijska kopija programa koji je izvšio fork
poziv. Ta druga memorijska kopija parenta naziva se child (dijete). Nakon poziva fork obje
kopije, i parent i child, nastavljaju izvođenje kao samostalni procesi.
Ono osnovno što razlikuje parenta i childa, dakle ono po čemu možemo kontrolirati koji
dio koda identične memorijske kopije će izvršavati parent a koji dio će izvršavati child, jest
povratna vrijednost koju vraca fork.

fork je deklariran kao

582
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

#include <sys/types.h> // sadrži deklaraciju pid_t tipa podataka


#include <unistd.h> // sadrži deklaraciju forka i ostalih funkcija za rad s procesima
pid_t fork(void);

Parent procesu fork kao povratnu vrijednost vraća PID childa. Child procesu fork kao
povratnu vrijednost vraća 0, U slucaju greške, fork kao povratnu vrijednost vraća -1.
Neuspjeli poziv fork-a može se dogoditi zbog sljedećeg:
- nedostatak memorije za kreiranje novog procesa
- u sistemu je pokrenuto previše procesa (ovo obično znači da nešto nije u redu sa sistemom)
- ukupan broj procesa koje je real user pokrenuo prekoračuje dozvoljeni limit (limit se može
podesiti)
(dodatno - vidi poglavlje vfork i copy-on-write)

Dva su osnovna načina kako se upotrebljava fork:


• kada se proces želi duplicirati tako da parent i child izvršavaju različite dijelove koda
istog programa. Ovo je tipično za mrežne servere - parent proces čeka na zahtjev
klijenta. Kada zahtjev stigne parent forka childa koji će opslužiti zahtjev. Parent
nakon fork-a nastavlja s osluškivanjem novih zahtjeva. U ovoj koncepciji se i dio
osnovnog koda koji se odnosi na upravljanje serverom i dio koda koji se odnosi na
opsluživanje pojedinog klijenta nalaze unutar istog programa, na jednom mjestu.
• kada proces želi pokrenuti izvršavanje nekog drugog programa. U ovom slučaju fork
upotrebljavamo za kreiranje novog procesa, a zatim unutar tog procesa pokrećemo
neki drugi program. Ovo je tipično za shell programe. U tom slučaju nakon forka
izvršava se sistemski poziv execve koji služi za pokretanje programa..
Ova podjela ne mijenja ništa u načinu rada forka, jednostavno se odnosi na činjenicu da je u
drugom slučaju potrebno izvršiti fork prije nego što se izvrši execve budući da sam execve sam
za sebe nema previše smisla. Pojednostavljeno, ili koristimo samo fork ili koristimo
kombinaciju fork-execve.

583
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

1 - fork() 2 -alocate
kernel
proces structure

6 - set proc. struct.

kernel stack / u area kernel stack / u area

4 - set pid=0
Stack Stack
3 - copy

Heap Heap
... ...
pid_t pid; pid_t pid;
Data Data
... ...

Text Text
5 - shared
... ...
pid = fork() pid = fork()
if (pid == 0) if (pid == 0)
{ 7 - run {
... ...
} }
else if (pid >0) else if (pid >0)
{ {
... ...
} }

parent child

Slika2. okvirni princip rada forka


'u area' je dio adresnog prostora procesa koji se nalazi iznad stack segmenta i tipično je mapiran na fiksne
adrese. 'u area' sadrži kontrolne podatke koji operacijskom sustavu služe da osigura pravilno izvođenje s
obzirom na proces-specifične karakteristike: PCB (PCB process kontrol Block) u kome se čuva stanje
registara procesora između promjene konteksta (context switching) , pravi i efektivni UID, varijable
okruženja, tablicu file deskriptora i dr.
Struktura procesa unutar kernela služi samom kernelu za postizanje funkcionalnosti i pouzdanosti sistema u
cjelini i za svaki proces sadrži: stanje procesa, pokazivač na 'u area-u', proces GID, prioritet izvršavanja,
informacije o upravljanju memorijom

Primjer1 ilustrira upotrebu forka kada parent i child izvršavaju 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

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
slučajnu vrijednost. Ono što se zapravo događa pozivom fork možemo zamisliti kao sljedeće:
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 moguće je samo mapirati, a ne i kopirati. U svakom slučaju, stvara
se nova kopija adresnog prostora koji će postati adresni prostor child procesa. Time dobivamo
dva identična 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 vraćen PID child
procesa. Ta će se povratna vrijednost pridružiti fork_return varijabli parenta. Dakle, samo
parent proces zaista izvodi fork.
Nakon toga će i parent i child, sa različitim vrijednostima fork_return varijabli, nastaviti
izvršavanje kao odvojeni procesi na prvoj instrukciji koja slijedi fork. U našem primjeru to
znači: za parent - pridruživanje povratne vrijednosti, a za child - na if naredbi kojom se
ispituje sadržaj varijable fork_return2. Dakle, ako je fork uspio, parent proces izvršit ć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 vraća PID
procesa iz kojega je pozvan te pozivom pid_t getppid() koji, slično, vraća PID parent procesa.

2 Takav slijed događanja prisutan je u Linuxu (Mandrake 10).

585
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

Sistemski poziv wait objasnit ćemo kasnije.


Prethodni program daje sljedeći 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 našeg parenta.
Njegov PID je 12111.
Također, iz ispisa programa se može primjetiti da je prvo bio izvršen dio koda koji je izvodio
child proces, a zatim dio koji je izvršio parent. Da li je to uvijek tako i postoji li pravilo koje
određuje redoslijed?
Unix (točnije scheduler) upravlja parentom i childom kao sa samostalnim procesima. Nema
garancije koji od njih će prvi nastaviti izvršavanje niti koliko će se dugo izvršavati prije nego
što ga scheduler prekine i dodijeli procesorsko vrijeme nekom drugom procesu. Točnije, ne
možemo znati koliki će dio koda izvršiti jedan proces prije nego što drugi završi s
izvršavanjem. (možemo ev. specificirati prioritet procesa, ali ni to ne daje nikakve garancije)

U našem 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
omogućila da dohvati PID nekog svog child procesa. U tom smislu fork je jedini način za to.
U slučaju da parent kreira jednog ili više child procesa s kojima kasnije ima namjeru
manipulirati ili komunicirati trebao bi čuvati povratne vrijednosti forka.

586
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

odnos parent – child

U smislu identifikaije procesa PID je osnovno po čemu razlikujemo parenta od childa. Ako
parent i child gledamo kao samostalne procese onda se stvarna razlika svodi se na pitanje:
koje osobine child pruzima od parenta, a koje postaju njegove vlastite.
Child od parenta nasljeđuje sljedeća svojstva:
- identifikaciju stvarnog i efektivnog usera koji je pokrenuo proces (real/effective/saved
UIDs and GIDs)
- data, heap, stack segmente
- varijable okruženja
- područje dijeljene memorije (attached shared memory segments )
- otvoreni file deskriptori
- zastavica koja određuje ponašanje deskriptora prilikom izvršavanja exec poziva
(close-on-exec flags)
- prioritet izvršavanja procesa unutar sistema (nice value)
- broj trenutne sesije (session ID)
- trenutni radni direktorij (current working directory)
- root direktorij (root directory)
- maska koja se upotrebljabva pri kreiranju datoteka (file mode creation mask (umask))
- limite za resurse (resource limits)
- kontrolni terminal iz kojega je proces pokrenut (controlling terminal)
Jedinstveno za child što ga razlikuje od parenta je:
• process ID
• parent PID
• child ima vlastitu kopiju file deskriptora. Svaki file deskriptor childa dijeli zajednički
file-pointer s korespondiranim file deskriptorom parent procesa
• objekti međuprocesne sinkronizacije (process, text, data and other memory locks) nisu
nasljeđeni - ovo zapravo osigurava ispravnu međuprocesnu komunikaciju(
osigurava prevenciju od deadlock-a i sl..)
• struktura tms nije nasljeđena (ova struktura pridjeljena je svakom procesu i sadrži
podatke o potrošnji vremena procesora za proces i njegove child procese –
posebno potrošnja u user, a posebno u kernel prostoru)
• reinicijaliziraju se limiti resursa (ovo se odnosi na potrošnju CPU-a, max. veličine data
segmenta(ukljućujući heap), stacka, max. broj datoteka koje proces može otvoriti,
max. broj procesa koje proces dalje može kreirati itd.)
• child ne nasljeđuje skup definiranih/tekućih signala koje je definirao parent
• child ne nasljeđuje timere koje je definirao parent
• operacije asinkronog ulaza i izlaza se ne nasljeđuju

Ovo je okvirni popis. Postoje detalji koji se razlikuju ovisno o implemetaciji određene verzije
Unixa/Linuxa tako da prethodno treba ipak uzeti s rezervom.

587
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

Nakon poziva fork parent i child nastavljaju izvršavanje kao samostalni procesi. To je točno u
smislu da i jedan i drugi mogu izvršavati bilo kakav kod potpuno neovisno jedan o drugom i
naknadno redefinirati određena svojstva koja su nasljeđena pozivom fork. Međutim, sama
koncepcija nasljeđivanja određenih 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. Dapače, ako pogledamo svojstva koja child
nasljeđuje od parenta možemo vidjeti da su ona očekivana i intuitivno poželjna; ako se
program izvršava u svom radnom direktoriju poželjno je da to bude radni direktorij
novokreiranog childa; također je normalno da korisnik koji je 'vlasnik' programa bude
'vlasnik' i pokrenutog child processa itd. S druge strane, ono što child ne nasljeđuje zapravo je
prevencija od neželjenih situacija. Npr. nasljeđivanje objekta sinkronizacije kao što je mutex
proizvodilo bi prije zbrku nego što bi predstavljalo poželjno ponašanje. Zamislimo samo da
svaki child nasljedi zaključani mutex. Ili, ako parent proces definira proceduru za upravljanje
nekim signalom (signal handler), to tipično nije ono kako bi i child reagirao na određeni
signal. Na kraju krajeva, child i parent izvršavaju različite dijelove koda, rade različiti posao.

588
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

fork i execve

U primjeru1 forkom je kreiran child proces koji je izvršavao dio koda unutar istog programa
kao i parent. Drugi način upotrebe forka jest kreiranje childa i zatim pokretanje nekog drugog
programa unutar tog child procesa. Takvu mogućnost ostvarujemo kombinacijom forka i
sistemskog poziva execve.
Kada proces izvrši sistemski poziv execve adresni prostor procesa se 'reinicijalizira' odn.
prekriva adresnim prostorom programa koji će se unutar njega pokrenuti. Novi program
počinje izvršavanje od svoje main funkcije. Proces ID programa koji nastavlja s izvođenjem
ostaje isti budući da se ne kreira novi proces. Execve zamijenjuje resurse trenutnog procesa
(text, data, heap, stack segmente) sa novim programom učitanim sa diska. Novopokrenuti
program preuzima određena 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.
Zašto nam je takva mogućnost pokretanja programa unutar postojećeg procesa uopće
potrebna? Ilustrirajmo to na primjeru UNIX shella. Neprihvatljivo bi bilo ako bi sva
funkcionalnost shella bila ograničena na ono sto sam program shella, odn. njegov kod, može
učiniti. Ono što je snaga shella jest upravo njegova mogućnost da pokrene izvođenje nekog
drugog programa. Način na koji to zapravo radi jest forkanje novog procesa (novog shella) i
izvođenje 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 - je ime programa kojeg pokrećemo
argv [] - predstavlja listu argumenata prilikom pokretanja; lista argumenata je niz
stringova koji mora biti zaključen nul pokazivačem
envp[] - predstavlja listu varijabli okruženja; lista varijabli je niz stringova oblika
"NAME=value" koji također mora biti zaključen nul pokazivačem
U slučaju greške execve vraća -1. Međutim, u slučaju da uspije - ne vraća ništa! 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 neće biti izvršena niti

589
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

jedna linija koda koja ev. slijedi. Tako, u slučaju 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); // execute 'ls' in function


execve("/bin/date",0,0); // execute 'date' here
printf ("done with main program\n");
return 0;
}

Funkciji exec_program prosljeđujemo ime programa koji želimo izvršiti, listu argumenata
kojima pokrećemo program (arg[0] je ovdje također ime programa) i listu varijabli okruženja.
U main programu prvo pokrećemo 'ls' program za koji smo prije definirali listu argumeata.
Taj program pokrenećemo u novom procesu. Ako pokretanje uspije program će se izvršiti, a
nakon toga proces će regularno završiti s izvršavanjem ('ls' je jedino što će se izvršiti unutar
tog procesa). Zatim u main funkciji pokrećemo 'date' program.
Ispis programa je ovakav:
total 132
drwxrwxr-x 4 user user 4096 Pro 3 12:33 .
drwxrwxr-x 3 user user 4096 Pro 3 01:55 ..
drwxrwxr-x 2 user user 4096 Pro 3 12:33 .deps
drwxrwxr-x 2 user user 4096 Pro 3 01:55 .libs
-rw-rw-r-- 1 user user 9719 Pro 3 01:55 Makefile
-rwxrwxr-x 1 user user 50660 Pro 3 12:33 primjer2

590
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

-rw-rw-r-- 1 user user 47208 Pro 3 12:33 primjer2.o


Fri Dec 3 12:33:47 CET 2004
Press Enter to continue!

Iz ispisa se može primjetiti da se linija nakon pokretanja 'date' programa nije izvršila. 'date' je
nakon uspješnog poziva execve prepisao adresni prostor procesa programa primjer2.o.
Povratna vrijednost koju je terminal dobio je ona koju je vratio 'date'.

Postoji više funkcija (skupina exec) koje služe za pokretanje programa. U mnogim
implementacijama UNIX-a, samo je jedna iz te skupine exec funkcija, obično execve, ona koja
predstavlja ekvivalent odn. direktan poziv stvarnom sistemskom pozivu. Prostalih pet su
bibliotečne funkcije koje prije poziva execve obave još poneko podešavanje vezano uz
argumente, putanju do izvršne datoteke i sl.
S obzirom na način pozivanja i karakteristike razlikujemo:
• funkcije koje sadrže slovo 'p' u imenu (execvp i execlp) primaju ime programa i traže
program s tim imenom u trenutnom path-u; funkcijama koje ne sadrže slovo 'p'
potrebno je proslijediti puni path programa koji se želi pokrenuti
• funkcije koje sadrže slovo 'v' u imenu (execv, execvp i execve) za program koji se
pokreće prihvaćaju listu argumenata kao NULL-terminirani niz pokazivača na
string. Funkcije koje sadrže slovo 'l' (execl, execlp i execle) prihvaćaju listu
argumenata kao var-args mehanizam korišten u C jeziku
• funkcije koje sadrže slovo e u imenu (execve i execle) prihvaćaju dodatni argument, niz
varijabli okruženja u obliku NULL-terminiranog niza pokazivaća 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 izvršavanja exec poziva. U suprotnom
(podrazumijevano stanje), deskriptor ostaje otvoren.

591
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

funcija system

#include <stdlib.h>
int system(const char *command);
Upotreba standardne C bibliotečne funkcije system je jednostavan način za pokretanje
izvršavanja nekog programa. Međutim, system funkcija zapravo izvodi kreiranje procesa
(fork) u kojem se zatim pokreće Bourne shell (execve) i kojem se na izvršavanje predaje
argument 'command'.
Kao povratnu vrijednost funkcija vraća exit status shell komande. Ukoliko shell ne može biti
pokrenut vraća vrijednost 127, a u slučaju neke druge greške -1 (npr greška forka).

Sistem funkcija nije zadovoljavajuće rješenje za opću upotrebu budući da se oslanja na


postojanje Bourne shell-a u sustavu. U mnogim implementacijama /bin/sh pokazuje na
različite verzije bash-a. Pokretanje programa s root privilegijama pomoću system funkcije
može uzrokovati drukčiji rezultat na različitim UNIX/Linux implementacijama. Zato je
prporučljivo korištenje fork i execve sistemskih poziva u svrhu pokretanja procesa.

592
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

vfork i copy-on-write tehnika

Spomenuli smo da kreiranje procesa pozivom fork znači kreiranje 'gotovo' identične kopije
adresnog prostora tog istog procesa. Kao produkt ove operacije dobili smo dva procesa od
kojih svaki izvršava različite dijelove istog programa ili još gore, u slučaju izvršavanja
kombinacije fork-execve - jedno bespotrebno kopiranje adresnog prostora.. Očito je da, sa
stanovišta performansi i zauzimanja sistemskih resursa, to nije optimalno riješenje (u velikoj
većini slučajeva). Srećom, dosljedno kopiranje adresnog prostora prilikom kreiranja procesa
dolazi kao jedino rješenje tek u starijim implementacijama UNIX-a.

Vfork

vfork sistemski poziv se prvotno pojavljuje u inačici 3.0 BSD-a. Predstavljen je prvenstveno
kao zamjena za fork u slučajevima kada je potrebno izvršiti 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 sljedećeg: 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 izvrši sistemski poziv
execve. Nakon toga parent proces nastavlja s izvođenjem.
Ovo znači da vforkani child proces ne smije neočekivano promijeniti vrijednosti varijabli
parent procesa. Štoviše, child proces ne smije izaći (return) iz funkcije koja sadrži vfork (u
kojem je child kreiran) i ne smije završiti pozivom exit. Ako child želi izaći, trebao bi pozvati
_exit. (Ovo se također odnosi i na obični fork. Kasnije ćemo objasniti zašto je to tako.)

Druga bitna razlika u odnosu na fork je u tome što vfork garantira da će child proces prvi
nastaviti izvođenje, sve dok ne pozove execve ili exit. Nakon što child pozove bilo koju od ove
dvije funkcije, daljnje izvođenje nastavlja parent.
U smislu ovoga što smo naveli vfork je trebao predstavljati optimiziranu verziju forka naročito
u sustavima koji nemaju implementiranu copy-on-write tehniku. Međutim, vfork je sa sobom
donio previše popratnih problema; od zahtjeva da ne smije mijenjati ništa u adresnom

593
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

prostoru parenta (a koristio je i parentov stack), ograničenja s obzirom na način prekida


izvršavanja, do najvažnijeg - ponašanje u slučaju neuspjelog execve poziva bilo je
nedefinirano. Zbog toga, različite implementacije podržavale su ga ili nisu na različite načine.
I sam BSD već ga je u verziji BSD 4.4 podržavao tek kao sinonim forka. Danas se upotreba
vforka više ne preporučuje osim u posebnim slučajevima i za potrebe kompatibilnosti.

copy-on-write tehnika

U Linux-u i novijim verzijama Unix-a poboljšanje performansi rada s memorijom koji se


naračito očituje prilikom kreiranja procesa ostvareno je korištenjem 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 računala.
Osnovna pretpostavka na kojoj se zasniva princip ovakvog upravljanja memorijom je taj da
dva ili više procesa mogu u svom adresnom prostoru istovremeno imati mapirane iste (dijele
ih) fizičke stranice sve dok nad tim stranicama vrše samo operacije čitanja. Nakon što proces
pokuša pisati u stranicu koja predstavlja dijeljeni dio memorije, memory manager (dio kernela
zadužen za upravljanje memorijom) razumije da se radi o pokušaju pisanja u copy-on-write
stranicu. Umjesto da generira pogrešku 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 pokuša izvršiti instrukciju pisanja.
Za izvršavanje forka to znači da se 'skupa' operacija prvotnog kopiranja svodi samo na
kopiranje tablice stranica adresnog prostora, a ne i sadržaja čitavog adresnog prostora.

Također, ovo bitno smanjuje mogućnost neuspjelog poziva forka jer su u ovom slučaju
memorijski zahtjevi znatno manji.

594
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

završetak izvršavanja procesa

Postoje tri načina da proces normalno završi.


• izvršavanje return naredbe iz main funkcije
• poziv exit funkcije. Ova funkcija definirana je ANSI C standardom i uključuje
pozivanje svih registriranih exit handlera i zatvaranje svih I/O tokova. Budući da
ANSI C ne specificira pojedinosti o file deskriptorima, istovremenom izvođenju
više procesa/theadova unutar jednog programa i ostalim pojedinostima ovisnim o
implementaciji OS-a, definicija ove funkcije je općenito nekompletna za UNIX
• poziv _exit funkcije - ova funkcija se poziva exit funkcijom i uvažava specifičnosti
UNIX-a kao OS-a. Funkcija _exit specificirana je POSIX standardom
Dva načina da proces abnormalno završi su:
• poziv abort -ovo je poseban slučaj sljedećeg slučaja budući da ovaj poziv generira
SIGABRT signal
• primanje signala od strane kernela, nekog drugog procesa ili samog sebe(poziv abort)

Informacije o tome kako je proces završio dostupne su u slučaju exit i _exit funkcija kao exit
status, odn argumenat prosljeđen prilikom poziva funkcije. U slučaju abnormalne terminacije
kernel generira termination status kojim pokušava prikazati razlog abnormalnog prekida
izvršavanja.
Parent proces može dohvatiti informacije o načinu na koji je child prekinuo izvođenje
pomoću wait i waitpid sistemskih poziva

Zašto koristiti _exit radije nego exit kao naredbu za završetak izvođenja childa?
Osnovna razlika između exit i _exit je u tome što prva obavlja čišćenja vezana uz bibliotečne
funkcije u user-modu (I/O) i zatim poziva korisnički definirane funkcije čišćenja. Druga
obavlja čišćenja samo od strane kernela za dati proces.
U dijelu koda koji se odnosi na kreiranje, izvođenje i završetak child procesa stoga je u
normalnim okolnostima neispravno korištenje poziva exit. To na primjer, može dovesti do
dvostrukog ispražnjavanja spremnika standarnog ulaza (stdio buffer) i brisanje privremenih
datoteka. U C++ kodu ovakva situacija postaje još gora zato jer se destruktori statičkih
objekata mogu izvršiti na pogrešan način. (Postoje određeni slučajevi, npr. deamon procesi, u
kojima bi zapravo parent trebao biti taj koji će izvšiti sistemski poziv _exit umjesto childa,

595
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

Bazično pravilo u gomili uobičajnih slučajeva jest da je sistemski poziv exit potrebno izvršiti
samo jednom unutar funkcije main().
U slučaju upotrebe poziva vfork, upotreba exit-a još je opasnija zbog toga što može utjecati na
stanje parent procesa.

zombie procesi

Budući da je struktura procesa stablastog tipa i postoji parent-child odnos koji proizlazi iz
koncepta nasljeđivanja svojstava - redoslijed kojim parent i njegovi child procesi završavaju s
izvođenjem nije nebitan.
Kada proces završi s izvršavanjem kernel dostavlja njegov exit odn. termination status parent
procesu. Ukoliko parent izvrši forkanje childa i child završi s izvođenjem prije parenta, kernel
još uvijek čuva informacije o exit statusu childa - za slučaj da parent zatreba te informacije.
Ovakva mogućnost je poželjna, a često i nužna.
Da bi parent mogao dobiti takvu informaciju, potrebno je da izvrši wait sistemski poziv nakon
što je izvršio fork. Ovaj poziv uzrokuje da parent zaustavi izvođenje sve dok njegov child na
završi. Nakon što child završi i izvrši se obrada wait poziva odn. dohvaćanje exit statusa,
kernel može odbaciti informacije vezane uz childa. Odstupanje od ovakvog redoslijeda
uzrokuje nastanak nepoželjnih zombie i orphan procesa.
Ako child završi s izvođenjem prije nego što se uopće poćinje čekati na njega, on postaje
zombie. Ako se nikada nije niti čekalo na završetak njegovog izvođenja, također postaje
zombie.
Premda se takav child proces više ne izvršava, i dalje zauzima mjesto (entry) u tablici procesa
(ili u novijim implementacijama samo inf. o exit statusu).. Ovo nije dobro zato jer tablica
procesa sadrži fiksan broj redaka (entryja) i moguće je da postane prepunjena. Također,
postoji limit broja procesa koje jedan korisnik može pokrenuti. Ovo je jedan od razloga zašto
je dobro uvijek provjeriti da li je sam fork uspješno izvršen.
Ako parent završi s izvođenjem prije nego što završi child, child proces biva posvojen od
strane nekog drugog procesa, obično init procesa. Takav child naziva se orphan. Za njega će
init pozvati wait odn. obaviti poslove čišćenja koje je trebao obaviti parent. (Kada init to ne bi
učinio ponovno bi se pojavila mogućnost da child završi kao zombie i do daljnjega 'visi' u
sustavu.)

596
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

Kako izbjeći nastanak zombie-a? Potrebno je osigurati da parent proces izvrši poziv wait (ili
waitpid, wait3 ili sl.) za svaki child proces koji kreira. Također, na nekim sistemima moguće je
specificirati da parent nije zainteresiran za exit status childa.
Druga mogućnost je da parent izvrši dvostruko forkanje childa s time jedan child proces
završava s izvođenjem odmah po pokretanju. Ovo će uzrokovati da proces 'unuk' bude
proglašen kao 'siroće', dijete bez roditelja, što će uzrokovati da init proces obavi sva potrebna
čišćenja.

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){ // if fork fail
printf("Can't fork\n"); _exit(-1);
}
else if (fork_return == 0){
printf("child is running \n"); // child code (return quickly)
}
else{ // parent code
printf("parent is running\n");
sleep(1); // give child time to finish
system("ps N -r -H"); // see if we have a zombie
wait(&exit_state);
system("ps N -r -H"); // 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 završi 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 izvršenog poziva wait, child više ne postoji u sistemu.
(naredba 'ps N -r' prikazuje samo procese čije stanje trenutno nije Runnable)

child is running
parent is running
PID TTY STAT TIME COMMAND

597
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

11027 pts1 S 0:00 /bin/sh -c ./primjer_zombie ;


11028 pts1 S 0:00 ./primjer_zombie
11029 pts1 Z 0:00 [primjer_zombie] <defunct>
11030 pts1 R 0:00 ps N -r -H
2245 pts0 S 0:00 /bin/bash
PID TTY STAT TIME COMMAND
11027 pts1 S 0:00 /bin/sh -c ./primjer_zombie ;
11028 pts1 S 0:00 ./primjer_zombie
11031 pts1 R 0:00 ps N -r -H
2245 pts0 S 0:00 /bin/bash
Press Enter to continue!

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 završi neki child proces
- dok trenutni proces ne dobije signal za vlastito terminiranje
- trenutni proces ne dobije signal za izvršavanje procedure nekog svog signal-handlera
Ako je child proces već završio (već se nalazi u stanju zombie) poziv odmah završava i svi
sistemski resursi koje je child zauzimao se oslobađaju.

waitpid može čekati na završetak točno specificiranog childa i dodatno posjeduje opcije
kojima je moguće definirati različite načine na koji će se izvršiti.
pid argument može imati jednu od sljedećih vrijednosti:
pid == -1 - čeka na bilo koji child proces ( waitpid (-1, &status, 0) = ekvivalent običnom
wait pozivu)
pid > 0 - čeka na child čiji PID = pid
pid == 0 - čeka na bilo koji child čiji process group ID je jednak onom u kojem se izvodi
sam proces

598
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

pid <= -1 - čeka na bilo koji child čiji process group ID je jednak apsolutnoj vrijednosti
od pid
Važna razlika u odnosu na wait odnosi se na argument options; za vrijednost WNOHANG
waitpid ne blokira proces nego dozvoljava trenutnom procesu nastavak izvođenja čak i ako
nije završio child koji se u waitpid specificirao. Ako je argument options=0, waitpid blokira
proces.
Uz wait i waitpid u pojedinim implementacijama postoje i proširenja. Npr. BSD 4.3 donosi
dva nova poziva, wait3 i wait4. Prednost ovih dvaju poziva je što omogućavaju prenošrnje
dodatnih informacija o korištenim 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");
}

3
U Linux-u (Mandrake10) ove i dodatne opcije je dostupne su pozivom waitpid (man stranice sadrže detaljnije
upute)

599
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

U parent dijelu koda pozivamo waitpid s opcijom WNOHANG iako je očito da se child
procesi izvršavaju. To znači da će parent nastaviti izvođenje, a child procesi koji završe prije
sljedećeg wait/waitpid poziva postat će zombi procesi.
Drugi poziv waitpid na kraju programa pobrinuo se za čišćenje. Ovdje je kao treći argument
waitpid pozivu prosljeđena 0 što znači 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 našem
slučaju se to ne događa jer su svi child procesi već završili.
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 STAT TIME COMMAND


5105 pts1 S 0:00 /bin/sh -c ./primjer4_waitpid ; echo "Press
Enter to
5106 pts1 R 0:00 ./primjer4_waitpid
5107 pts1 S 0:00 ./primjer4_waitpid
5108 pts1 S 0:00 ./primjer4_waitpid
5109 pts1 S 0:00 ./primjer4_waitpid
5110 pts1 R 0:00 ps N -r -H
2198 pts0 S 0:00 /bin/bash
PID TTY STAT TIME COMMAND
5105 pts1 S 0:00 /bin/sh -c ./primjer4_waitpid ; echo "Press
Enter to
5106 pts1 S 0:00 ./primjer4_waitpid
5107 pts1 Z 0:00 [primjer4_waitpi] <defunct>
5108 pts1 Z 0:00 [primjer4_waitpi] <defunct>
5109 pts1 Z 0:00 [primjer4_waitpi] <defunct>
5111 pts1 R 0:00 ps N -r -H
2198 pts0 S 0:00 /bin/bash
waiting for child 0
waiting for child 1
waiting for child 2
PID TTY STAT TIME COMMAND
5105 pts1 S 0:00 /bin/sh -c ./primjer4_waitpid ; echo "Press
Enter to
5106 pts1 R 0:00 ./primjer4_waitpid
5112 pts1 R 0:00 ps N -r -H
2198 pts0 S 0:00 /bin/bash
Press Enter to continue!

600
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

sprečavanje nastanka zombie procesa rukovanjem signalima

Signali predstavljaju mehanizam za komunikaciju i manipulaciju među procesima. Signal je


poruka upućena procesu. Za slanje signala koristi se sistemski poziv kill. Nakon što primi
signal proces može učiniti jedno od sljedećeg: podrazumijevani odgovor na signal, ignoriranje
signala ili odgovor na signal pokretanjem odgovarajuće procedure (signal handler).
Rukovanje signalima je asinkrono; nakon što primi signal proces prekida trenutno izvođenje i
prelazi na obradu primljenog signala. Signal-handler se izvršava do kraja, a zatim slijedi
povratak na mjesto izvođenja prije poziva signal-handlera.
Sigaction i signal sistemski pozivi služi za postavljanje akcije koja će se izvršiti s obzirom na
pojedini očekivani signal.
Također, pomoću poziva sigaction, sigprocmask i sigsuspend moguće je kreirati masku kojom
se definira upravljanje onim signalima koji pristignu u trenutku kada se već vrši obrada nekog
signala.

Proces može biti privremeno zaustavljen signalom SIGSTOP. Da bi nastavio izvođenje mora
primiti signal SIGCONT.
Proces može završiti kao odgovor na signal. Npr. SIGINIT signal šalje se procesu nakon što
korisnik utipka Ctrl+C u terminalu. SIGTERM signal šalje se naredbom kill. Sistemskim
pozivom abort, proces sam sebi šalje SIGABRT signal. Najmoćniji signal za prekid
izvršavanaja je SIGKILL koji uzrokuje trenutno prekidanje izvođenja i ne može se blokirati
ili handlati na drugi način.

Sistemski poziv kill definiran je kao:


#include <signal.h>
int kill(pid_t pid, int sig); - pid je PID procesa kojem se upućuje signal, a sig broj signala.
Npr. želimo li ubiti child proces čiji PID je child_pid, mogli bismo to uraditi na sljedeći način:
kill (child_pid, SIGTERM);

Kada proces prekine s izvođenjem, na normalan ili abnormalan način, kernel šalje njegovom
parent procesu SIGCHLD signal. Parent može ignorirati ovaj signal (podrazumijevano) ili
odgovoriti na njega izvršavanjem određenog signal handlera. Handler je moguće definirati na
sljedeći način:

601
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

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 odgovarajuće podešenom sigaction strukturom možemo kontrolirati ponašanje procesa


nakon primitka SIGCHLD signala:
act.sa_handler = SIG_DFL - podrazumijevani odgovor na signal
act.sa_handler = SIG_IGN - signal se ignorira
act.sa_flags is SA_NOCLDSTOP - kada se child privremeno zaustavlja (SIGSTOP,
SIGTSTP, SIGTTIN or SIGTTOU) signal SIGCHLD
neće biti generiran
act.sa_flags is SA_NOCLDWAIT - child procesi se nakon završetka neće pretvoriti u
zombie procese

Primjer5 pokazuje kako se redefinicijom signal-handlera može spriječiti 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

printf("I'm the parent. Just create child No. %d \n\n",i);


}
}
printf("\n\nI'm the parent. Just create all childs \n ");
system("ps N -r -H"); // see that both parent and childs are running
sleep(3); // give childs time to finish
printf("\n\nI'm the parent. My childs all finished \n ");
system("ps N -r -H"); // see that now childs are not zombies
}

SIGCHLD je signal za kojeg smo redefinirali akciju. Sigaction strukturom definira se handler
koji će se izvršiti kao odgovor na signal. Ovdje smo prosljeđivanjem SIG_IGN poručili
kernelu da nas ne zanima kada i kako su child procesi završili (samim time niti njihov exit
status). Tako, nakon što child završi s izvođenjem kernel će odbaciti sve informacije vezane
uz child procese koji zato neće postajati zombie procesi. Ovime smo omogućili neovisno
izvođenje 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

rukovanje povratnim vrijednostima pomoću signala

Child vraća status code vrijednost preko pokazivača na integer. Preko tog pokazivača moguće
je dohvatiti informacije o načinu na koji je proces završio s izvođenjem.
Pomoću WIFEXITED makroa može se ustanoviti da li je child završio normalno (izlaskom iz
main funkcije ili upotrebom funkcija exit odn. _exit). WEXITSTATUS makro dohvaća exit
code child procesa.
Pomoću WIFSIGNALED makroa može se ustanoviti da li je child terminiran signalom.
WTERMSIG vraća oznaku signala.
Primjer6 pokazuje kako rukovati proizvoljnim brojem child procesa koji se proizvoljno dugo
izvršavaju. Primjer je napravljen tako da child procesi s neparnim PID-om završavaju
izvođenje pozivom funkcije exit i kao povratnu vrijednost vraćaju broj sekundi koliko su se
bili prisutni u sistemu (spavali). Parni child procesi se terminiraju signalom.
U postavljenom signal-handleru ispituje se način na koji je child završio izvođenje.

// primjer6 - rukovanje povratnim vrijednostima pomocu signala


#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define CHILDS 5
int childs=0; // number of active childs

void sigchld_handler(int signum) { // signal handler


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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

int i, sleep_sec;
struct sigaction act;
srand((unsigned int)time(0));

memset(&act,0,sizeof(sigaction));
act.sa_handler=sigchld_handler; // set function to be a handler
i=sigaction (SIGCHLD, &act, 0); // set handler to handle SIGCHLD signal

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 završetak izvođenja
svih child procesa.
Evo i ispisa koji ovaj primjer daje. Naravno, budući da se u primjeru koriste random
vrijednosti ispis će za svako pokretanje programa biti različit.

I'm child No.0, my PID is 5869, im going to sleep for 3 sec


I'm child No.1, my PID is 5870, im going to sleep for 6 sec
I'm child No.2, my PID is 5871, im going to sleep for 8 sec
I'm child No.3, my PID is 5872, im going to sleep for 7 sec
I'm child No.4, my PID is 5873, im going to sleep for 0 sec

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

finished child with pid = 5873, has returned 0


finished child with pid = 5869, has returned 3
finished child with pid = 5870, terminetad by signal no. 9
finished child with pid = 5872, terminetad by signal no. 9
finished child with pid = 5871, 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 događa prilikom izvršavanja forka važno je da se
linija
sleep_sec=rand()%10;
nalazi u dijelu koda kojeg izvršava parent. Ako ovu liniju stavimo u dio koda koji izvodi child
proces svi child procesi 'spavat' će jednako dugo.

komunikacija između parenta i childa

Komunikacija među procesima je posebna tema. Zato ovdje slijede tek dva vrlo jednostavna
primjera koja se odnose na specifičnost odnosa parent-child.

Komunikacija između parenta i child moguća je kroz bilo koji standardni oblik međuprocesne
komunikacije: pipe, sockets, poruke (message queues), dijeljena memorija (shared memory).
Uz to, child proces može sa parentom (kao sto smo vidjeli u prethodnim primjerima)
komunicirati preko argumenta funkcije exit.
Međutim, upravo karakteristika forka da se svi deskriptori otvoreni od strane parenta kopiraju
u child daje velike mogućnosti za komunikaciju pomoću pipe-a.

pipe je mehanizam jednosmjerne komunikacije prema kojem jedan proces piše na jedan kraj,
a drugi čita s drugog kraja pipe-a. Zasniva se na sekvencijalnom pisanju na jednom i
sekvencijalnom čitanju na drugom kraju po principu FIFO ( first-in first-out). Mehanizam
pipe-a ne dozvoljava proizvoljno pozicioniranje unutar pipe-a.

Sistemski poziv pipe

606
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

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 lučaju da se deskriptori uspiju kreirati povratna vrijednost je
0, a uslučaju greške -1 i postavljena globalna varijabla errno. Ovi deskriptori vidljivi su samo
unutar parent procesa i svih child procesa naknadno nastalih forkanjem.

Dva su uobičajna načina upravljanja deskriptorima nakon forkanja:


• parent čeka na završetak izvođenja childa. U tom slučaju offset (pozicija) u svakom od
deskriptora u koji je child pisao/čitao bit će valjano ažuriran
• da se izbjegne interferencija, nakon forkanja parent i child zasebno zatvaraju sve
deskriptore koji im nisu potrebni

close(pipefd) - briše deskriptor pipefd i zatvara file na koji se deskriptor


odnosi ako je to posljedni deskriptor koji upućuje na file
newpipefd = dup(pipefd) - duplicira pipefd na najniže slobodno mjesto: newpipefd.
dup2(pipefd,newpipefd) - zatvara newpipefd ako je različit od pipefd, a zatim duplicira
pipefd na mjesto newpipefd
U sljedećem primjeru kreira se child proces koji koristeći pipe prosljeđuje parent-u rezultat
izvršavanja 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

Ispis je:
The date is Tue Dec 7 14:58:19 CET 2004
Press Enter to continue!

U primjeru8 između parenta i childa postoji dvosmjerna komunikacija. Parent i child koriste
streamove koji se kreiraju na osnovu deskriptora. Parent prima string s konzole, prosljeđuje
ga childu na obradu. a child nakon obrade vraća rezultat.
U <stdio.h> deklarirana je funkcija
FILE* fdopen (int flides, const char *mode)
koja povezuje stream s postojećim 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

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 }
}

Ispis iz programa je:

programski alati na unix računalima


parent write to pipe - programski alati na unix računalima
child read from pipe - programski alati na unix računalima

child write to pipe - PROGRAMSKI ALATI NA UNIX RAčUNALIMA


parent read from pipe - PROGRAMSKI ALATI NA UNIX RAčUNALIMA

Press Enter to continue!

609
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Procesi i upravljanje procesima

VEDRAN DEDUŠ
VANJA HARAMBAŠA

PROCESI I UPRAVLJANJE
PROCESIMA

610
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Procesi u UNIXU

Glavnim konceptom u svakom operacijskom sustavu smatramo proces, kao apstrakciju


izvršavanja programa. Sve ostalo ovisno je o ovom konceptu i zbog toga je važno shvatiti što
je proces.

Sva moderna računala, i moderni OS-ovi mogu raditi više stvari odjednom. Dok
izvršava neki korisnikov program, računalo u isto vrijeme može čitati i pisati po disku,
zaslonu ili printeru. Također može izršavati tren jedan, tren drugi program, puštajući svakog
od njih da radi nekoliko desetinki, ili stotinki sekundi. Preciznije rečeno u bilo kojem trenutku
procesor vrti samo jedan program, ali vrlo brzo prebacuje izvršavanje programa sa procesora i
vraća ga u stanje čekanja. Ponekad opisujući gornju stvar govorimo o pseudo-paralelizmu
kako bi naglasili pravi hardverski paralelizam na višeprocesorksim sustavima.

SLIKA 1.1

Razlika između procesa i programa je jedva zamjetna, ali jako bitna. Da bi lakše
razumjeli razliku, napravimo jednu analogiju. Zamislimo kuhara koji peče rođendarsku tortu
svojoj kćeri. On ima recept i kuhinju opremljenu sa svim sastojcima: brašnom, jajima i sl.

U računalnom svijetu takav kuhar bio bi procesor, a recept bio program, dok bi
sastojci bili ulazni podaci. Zamislimo sad da kuharova kćer utrči u kuhinju plačući jer ju je
ubola pčela. Kuhar tada zapamti gdje je stao u svom receptu, i pruži pomoć svojoj kćeri.

611/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Gledano u računalnom svijetu vidimo da je procesor bio prebačen sa jednog procesa na proces
višeg prioriteta, od kojih svaki ima različiti program. Nakon pružene pomoći kuhar će
nastaviti točno od mjeswta gdje je stao.

Ključna ideja je da je proces aktivnost neke vrste. On ima program, ulaz, izlaz i stanje.
Pojedini procesor može dijeliti nekoliko procesa, zajedno sa nekim algoritmom
raspoređivanja rada tih procesa na tom procesoru.

Procesi i njihovo raspoređivanje

Proces (eng. Process), nekad nazivan i zadatak (eng. Task), je instanca programa koji
se
izvršava. Sukladno tome, da bi se stvorio proces potrebno je pokrenuti program.
Pokretanje aplikacije s medija za pohranu podataka stvara proces. Na jednoprocesorskom
računalnom sustavu sama središnja procesorska jedinica (eng. Central Processing Unit, CPU)
se dijeli među procesima tako što procesi dobivaju vrijeme za izvršavanje na procesorskoj
jedinici.

Kao i sve ostalo, proces je unutar operativnog sustava – OS, predstavljen kao
podatkovna struktura. Podatkovna struktura procesa sadrži skup vrijednosti za sve
promijenljive registre središnje procesorske jedinice, predstavljajuci tako trenutno stanje
izvršenja pripadajućeg procesa. Preciznije rečeno, sastoji se od tri dijela: segmenta instrukcija,
segmenta korisničkih podataka i segmenta sustavnih podataka. Ponekad se naziva i „okolina
izvršavanja“. Nabrojat ćemo i opisati svojstva jednog procesa.

Svojstva procesa

• Proces izvršava pripadajuci programski kod koji može doci iz različitih izvora
tj. Različitih datoteka.
• Pri izvržavanju proces dobiva ograničena prava s kojima raspolaže i u okviru kojih se
i izvršava. Sam operativni sustav može pokrenuti proces s apsolutnim pravima gdje on
dobiva potpunu slobodu pri izvršavanju.

612/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

• Dio operativnog sustava, zvan raspoređivac (eng. Scheduler), dijeli vrijeme središnje
procesorske jedinice svakom procesu koliko mu pripada.
• Proces zahtjeva memoriju za svoju podatkovnu strukturu. Svakom procesu se
prilikom izvršavanja dodijeli slobodna memorija. U praksi, taj memorijski prostor ne
mora biti ulančano nanizan.
• Proces ima mogućnost pristupa datotečnom sustavu, a takve aktivnosti se moraju
pomno pratiti kako bi bio zadovoljen nivo sigurnosti te da se otvorene datoteke
pravilno zatvore kada proces završi.
• Kod svakog procesa nužna je identifikacija prema konvenciji operativnog sustava
Prednosti procesa su njegova zaštićena podatkovna stuktura (od pristupa drugog procesa).
Proces je moguće stvoriti (pokretanjem programa iz ljuske operativnog sustava ili iz
aplikacije), on može završiti, te su moguća „prebacivanja“ s procesa na proces u toku
izvršavanja. Kao što je rečeno, o njihovom „prebacivanju“ se brine dio operativnog ustava –
raspoređivač. Postoji nekoliko tehnika raspoređivanja procesa koje on može koristiti, a ovisi o
operativnom sustavu.

Kada proces dobiva teoretski neprekidno procesorsko vrijeme u trenutku kada dođe na
red zaizvršavanje, operativni sustav koristi tehniku raspoređivanja „Prvi dolazeci – prvi
poslužen“ ili FCFS (eng. First Come-First Served). Tehniku je jednostavno implementirati, ali
zato je siromašna mogućnostima. Bolja tehnika je gdje se svaki proces razlomi u vremenske
isječke (eng. Quantum) za izvršavanje koji međusobno razmjenjuju procesorsko vrijeme
prilikom kojeg se izvršavaju. Ona se naziva metoda „vremenskih isječaka“ (eng. Time
slicing) iliti RR (eng. Round Robin) i omogućava optimiziranije raspoređivanje procesa,
pogotovo onih koji kraće traju, naspram FCFS tehnike.
Drugačije optimizirane i kompleksnije tehnike su „slijedi najkraći proces“ ili SPN
(eng. Shortest Process Next), „zamjenski SPN“ iliti PSPN (eng. Preemtive Shortest Process
Next), HPRN (eng. Highest Penalty Ration Next), „višerazinski FB“ (eng. FeedBack),
„sebični RR“ iliti SRR (eng. Selfish Round Robin) i druge. U praksi, moguće je u operativni
sustav implementirati mješavinu navedenih tehnika.

Tim tehnikama se ne dobiva samo simulacija istovremenog izvršavanja više procesa


na jedno-procesorskom računalu, već se optimizira izvrdavanje korisničkih aplikacija i samog
operativnog sustava. Međutim, na višeprocesorskom računalnom sustavu (sa više središnjih
procesorskih jedinica), procesi se u stvarnom vremenu izvršavaju istovremeno i to onoliko

613/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

njih koliko ima procesorskih jedinica (dvije, četiri ili više). U praksi, svaka središnja
procesorska jedinica jednog višeprocesorskog sustava pojedinačno također koristi ranije
navedene metode.

Navedene metode možemo podijeliti na one koji podržavaju „zamjenu“ (eng.


Preemption) procesa i one koje rade s „nezamjenskim“ (eng. Non-preemptive) procesima.
„Zamjenske metode“ omogučuju da se nad jednom središnjom procesorskom jediniciom
naizmjence izmjenjuju procesi, pod određenim uvjetima, a prije nego što je pojedini završio
sa svojim radom (simulacija višeprocesorske okoline). Prema tome, imamo slijedeću podjelu
raspoređivačkih 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 izvršavanja. Što
se trajanja tiče, samo stvaranje procesa smatra se „skupom“, dok se prebacivanje procesa
„relativno skupom“ operacijom. To su i nedostaci rada s procesima.

Također, u praksi je moguce u višedretvenoj okolini izvršavanje i „nezamjenjivih“


(eng. Non-preemtive) dretvi, ali takvi algoritmi su orijentirani prema izvršavanju jedne dretve
(po procesoru) – omogucujuci time izvršavanje dretvi jedne za drugom bez mogućnosti
zamjenjivanja. Tada je briga o sinkronizaciji svedena na minimum. Algoritmi koji se koriste u
tu svrhu su „prvi dolazeći – prvi poslužen“ (FCFS), „slijedi najkraći proces“ (SPN), te „sustav
prioriteta“.

Na UNIX/Linux operativnom sustavu, proces koji je nastao kao instanca programa


zapisanog na mediju za pohranu podataka, može stvarati druge procese – njegovu „djecu“ ili
podprocese.Da bi to napravio, proces „roditelj“ se koristi sustavskim pozivom fork kojim
stvara novi proces s nasljeđenom većinom sustavnih svojstva „roditelja“:

int fork(void) ;

614/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 dođe do
greške, vraćena vrijednost je -1 i ne dolazi do stvaranja procesa „dijete“. Poziv fork nema
nikakvih argumenata i programer ne može biti odgovoran za grešku. Ona može biti rezultat
nemogućnosti jezgre operativnog sustava da stvori novi proces („dijete“) zbog nedostatka
nekog od potrebnih sredstava.

Kao što je rečeno, proces „dijete“ nasljeđuje većinu svojstava iz segmenta sustavskih
podataka kao što su trenutni direktorij, prioritet ili identifikacijski broj korisnika. Manje je
atributa koji se ne nasljeđuju:

• Osobni brojevi procesa „djeteta“ i „roditelja“ su različiti. To su u biti različiti


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 položaja u datotekama (eng. File pointer). Ako jedan proces
namjesti kazaljku položaja na određeno mjesto u datoteci, drugi proces ce također
č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 može inicijalizirati stvaranjem nove instance programa s medija za


pohranu podataka (poziv exec) ili izvođenjem posebnog dijela već instanciranog programa,
dok istovremeno proces „roditelj“ može čekati da „dijete“ završi svoj zadatak i/ili raditi nešto
drugo.Poziv sustavu exit pokrece završetak izvršavanja procesa pozivatelja. Prije samog
završetka, uredno se zatvaraju sve otvorene datoteke. Poziv ne vraća nikakvu vrijednost jer
iza njega nema nastavka procesa. Za status se obično stavlja 0 ako proces normalno završava,
a 1 inače.

Void exit(int status);

615/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

„Roditelj“ procesa koji završava pozivom exit prima njegov status preko sustavskog
poziva wait:

int wait(int *statusp) ;

Poziv wait čeka da neki od procesa „djece“ završi (ili bude zaustavljen za vrijeme
čekanja), s tim da mu se ne govori koji proces da čeka. Funkcija vraća identifikacijski broj
procesa „djeteta“ koji je završio i sprema njegov 16-bitni status u cijeli broj na koji pokazuje
statusp, osim kada je taj argument NULL. U tom slučaju se status završenog procesa gubi. U
slučaju pogreške (kada nema „djece“ ili je čekanje prekinuto primitkom nekog prekidnog
signala) rezultat je 1.

Proces može završiti na tri načina i to: pozivom exit, primitkom signala ili padom
cijelokupnog sustava (gašenje računala, nestanak struje i drugo). Logično, samo kod prva dva
načina možemo saznati način završetka 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 izvršavanja procesa „roditelja“ – čekanje na zavšetak „djeteta“
wait(NULL);

Možemo pokrenuti i nekoliko procesa da rade istovremeno. Kada želimo pokrenuti


npr. 5 podprocesa, to možemo uraditi na sljedeći način:

N = 5;
for (i = 0; i < N; i++)
{

616/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 završiti zadatak istovremeno. Poseban je


slučaj kada proces „roditelj“ završi prije svog procesa „djeteta“. Tada se „djetetu“ dodjeljuje
novi „roditelj“ –proces init s identifikacijskim brojem 1. Proces init je važan prilikom
pokretanja sustava. U radu sustava većinom izvodi poziv wait kako bi postao „roditelj djeci
bez roditelja“ kada oni završe. Drugi poseban slučaj je kada proces „dijete“ završti zadatak,
no proces „roditelj“ ga ne čeka s wait pozivom. Tada proces „dijete“ postaje tzv. Proces
„zombi“ (eng. Zombie). Kao i inače kad završi neki proces, otpuštaju mu se njegovi segmenti
u radnom spremniku, no u ovom slučaju 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 završi, a nije pozvao wait, proces „zombi“ dobiva ranije spomenuti
init proces kao „roditelja“ koji će ga pokupiti za wait pozivom.

617/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PRIORITETI

Priotiteti procesa kreću se u rasponu od -20 do 20. -20 predstavlja najviši prioritet
izvođenja procesa, a 20 najniži. Korisnik može procesima kojih je on vlasnik prilikom
njihovog pokretanja smanjiti prioritet naredbom nice. Sintaksa naredbe nice je slijedeća:

nice –broj naredba

gdje je broj relativni prioritet koji se želi postići, dok naredba predstavlja proces koji ćemo
pokrenuti. Tako npr. Možemo u pozadini (operator &) pokrenuti naredbu sleep koja će
završiti nakon 50 sekundi.

$ nice -15 sleep 50 &

Gornjom smo naredbom procesu sleep smanjili relativni prioritet na 15. Naredbom
ps –l moguće 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.

Uobičajeno je da proces prilikom pokretanja dobiva relativni prioritet 0. Samo


superkorisnik (root) može procesu povećati prioritet. Isprobati naredbu (biti logiran kao root):

# nice –10 sleep 50 &

Vidimo da je ovu naredbu moguæe izvršiti jedino ako smo logirani kao root. Uočite
da je ovdje riječ o negativnom nice broju (-10), dakle povećavamo relativni prioritet procesa.
Ukoliko želimo već aktivnom procesu promijeniti prioritet, koristimo naredbu renice:

$ renice 7 432

618/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

gdje je 432 PID (process ID), a 7 konačni prioritet dotičnog procesa. PID je broj koji je
ispisan na ekranu nakon pokretanja procesa. Naravno, može ga se doznati i korištenjem
naredbe ps l.

STANJA PROCESA

SLIKA 1.2

Svaki proces se može naći u jednom od 3 stanja:

1. Izvršava se (preciznije koristi CPU u tom trenutku)


2. Spreman je (izvršiv (runnable) , privremeno zaustavljen jer neki drugi proces koristi
procesor)
3. Blokiran (ne može nastaviti izvršavanje dok se ne dogodi vanjski uvjet)

Moguće promjene stanja: 1 -> 2, 2 -> 1, 1 -> 3 i 3 -> 2

619/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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. Korisnički zahtjev za kreiranje procesa.
4. Pokretanje neke skripte.

Kada se pokreće operacijski sustav, obično 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 može biti kreiran od nekog drugog procesa u bilo koje vrijeme. Npr. ako
treba dohvatiti veliki broj podataka preko mreže kako bi se sekvencijalno s njima nešto
računalo, uobičajeno je da se kreira novi proces koji bi dohvaćao te podatke preko mreže i
spremao ih u nekakvu zajedničku memoriju, dok bi prvi proces uzimao te podatke i računao s
njima. Posebno će doći do ubrzanja kod višeprocesorskih sustava kad bi se svaki od tih
procesa odvijao na različitim procesorima.

U nekom interaktivnom sustavu korisnik može startati program tipkajući naredbu ili
klikom na ikonu. I jednim i drugim načinom starta se novi proces u kojem se izvršava
odabrani program.

Zadnji slučaj kad se proces kreira je npr. pokretanje neke skripte. Korisnik može poslati
sustavu nekakav zathjev ili skriptu (može i preko 'udaljenih poziva'), nakon čega će
operacijski sustav, kad odluči da ima dovoljno resursa za pokretanje idućeg posla, kreirati
novi proces i unutar njega pokrenuti posao iz reda zahtjeva.

620/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Tehnički gledano, u svim ovim slučajevima, neki postojeći 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 okruženju (enviroment strings) i iste otvorene fileove.
Obično proces dijete sa sistemskim pozivom execve ili nekim sličnim poziva neki novi
program. Npr. kada korisnik u komandnoj ljusci utipka npr. sort, ljuska sa forkom klonira
proces i u procesu dijetetu izvrši sort. Razlog ovog postupka u 2 koraka je da bi se djetetu
omogućila manipulacija sa file deskriptorima nakon fork-a, a prije izvršavanja nekog drugog
programa, kako bi se mogle izvršiti 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 nešto 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 različiti od početka.

Primjer 1: simuliranje komandne ljuske:

U pseudo-jeziku opis ljuske bi mogli dati na ovaj način:

ponavljaj{

ispiši_ prompt;

učitaj_naredbu(N, P);

kreiraj_novi_proces();

roditelj: čekaj dok proces dijete ne završi;

dijete: pokreni naredbu N sa parametrima P;

621/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Primjer 2: specifičnost fork naredbe pod Unixom; primjer da procesi imaju različite adresne
prostore.

ZAVRŠETAK PROCESA

1. Normalni završetak (dobrovoljno)

2. Završetak zbog greške (Error exit) (dobrovoljno)

3. Nepopravljiva greška (Fatal error) (prisilno)

4. Završen (ubijen) od strane nekog drugog procesa (prisilno)

TERMINACIJA CHILD PROCESA

Nakon kreiranja childa,postoje dvije mogućnosti:parent proces završava prije


childa,ili child završava prije parenta.Prilikom završetka child procesa,parent procesu je
poslan signal,koji obavještava parent proces o unistenju child procesa.Tada je child potpuno
uklonjen iz sustava.

Stanje između child-ovog završetka i prije nego sto to parent primi na znanje se
naziva “zombie”.Ako postoji pogreška u kodiranju parent procesa,child ostaje u “zombie”
stanju zauvijek.

Moguće ga je uočit pokretanjem “ps” naredbe.Prepoznaje se po stringu “<defunct>”


.Obavještavanje procesa o uništenju 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 izvršavanjem.Upotreba
signala(SIGCHLD ili SIGCLD) je učinkovitija od uporabe wait sistemskog poziva.

622/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

MEĐUPROCESNA KOMUNIKACIJA (INTER-PROCESS


COMMUNICATION)

IPC ili Inter-Process Communication je komunikacija,razmjenom podataka ili


kontrolnih informacija,između procesa unutar višezadaćnog operativnog sustava ili među više
umreženih računala.

Osnovne metode međuprocesne komunikacije na UNIX računalima su:

-Pipes
-Signali
-Message queues
-Semafori
-Dijeljena memorija
-Sockets

Message queues,semafori i dijeljena memorija su metode koje izvorno potječu od Unix


System V release 4,pa se zbog toga nazivaju i System V IPC.

PIPE

Pipe (anonymous pipe ili unnamed FIFO) je jedan od načina preko kojeg procesi
mogu međusobno komunicirat.Pipe je jednosmjerni mehanizam koji omogućuje razmjenu
niza bajtova između dva povezana procesa.Pipe može biti korišten za prenošenje podataka ili
za sinkronizaciju između oba procesa.Moguća je i komunikacija u dva smjera,te su u tom
slučaju potrebna dva pipe-a.Poredak u kojem su bajtovi zapisani na pipe je identičan 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 međusobno komunicirati preko tog pipe-a.

Pipe() je sistemski poziv kojim se stvara read-write pipe koji služi za ostvarivanje
komunikacije među procesima.Poziv uzima za argument polje od dva integera koji će biti

623/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

korišteni za čuvanje dva file descriptora.Prvi integer koristimo za čitanje s pipe-a,a drugi za
pisanje na pipe.

Primjer korištenja funkcije:

int pipes[2]; /* first, define an array to store the two file descriptors */
int rc = pipe(pipes); /* now, create the pipe */
if (rc = = -1) { /* pipe() failed */
perror("pipe");
exit(1);
}

Ako pipe() sistemski poziv uspije,pipe će biti kreiran.Pipes[0] će sadržavati broj


njegovog file descriptora za čitanje,a pipes[1] će sadržavati broj njegovog file descriptora za
pisanje.
Nakon poziva fork() funkcije,te kreiranja child procesa,polje pipes[] je identično
unutar parenta i unutar child-a,te zbog toga oboje sadrže file descriptor pipe-a.

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).Loša strana upotrebe dvaju pipe-ova je u tome što mogu
uzrokovat stanje poznato pod nazivom “deadlock”.

624/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Deadlock- stanje u kojem grupa od dva ili više procesa čeka da se oslobode resursi
koji su trenutno zauzeti od jednog ili više procesa unutar iste grupe,ili čekaju na neki događaj
za koji postoji pretpostavka da bi trebao biti poslan od nekog drugog procesa unutar grupe.

Dvije su moguće situacije koje mogu uzrokovati deadlock:

• Oba pipe-a su prazna i oba procesa pokušavaju č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 ograničene veličine.Kad proces zapisuje na pipe,podaci su


smješteni na buffer tog pipe-a,sve dok nisu pročitani od drugog procesa.Ako je buffer
pun,write() sistemski poziv se blokira sve dok se ne oslobodi mjesta na bufferu.Jedini način
da se oslobodi mjesto na bufferu je da drugi proces pročita 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.

NAMED PIPE (FIFO)

Named pipes koristimo ukoliko želimo postići da dva nepovezana procesa


međusobno komuniciraju putem pipe-a.Named pipe (named FIFO ili samo FIFO – First
In,First Out) je pipe,tj. datoteka unutar datotečnog sustava koja služi za prijenos podataka
između nepovezanih procesa.Proces može takvu datoteku otvoriti da bi iz nje čitao ili u nju
pisao.Otvaranjem datoteke za čitanje proces dobija pristup na kraj pipe-a za
čitanje.Otvaranjem datoteke za pisanje,proces dobija pristup kraju pipe-a za pisanje.Ako
proces otvori datoteku za čitanje,blokiran je sve dok drugi proces ne otvori tu datoteku za
pisanje i obrnuto.
Sistemski pozivi kojima se kreira named pipe su mknod() ili mkfifo().Analogno
tome,naredbama mknod i mkfifo se iz shell-a može kreirat named pipe.

Npr.

625/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

mknod prog_pipe p -kreiramo named pipe naziva prog_pipe

Kreirani named pipe,kao i svaka druga datoteka unutar datotečkog sustava posjeduje
access permission koji definira korisnike koji mogu otvoriti named pipe,za čitanje ili
pisanje,ili oboje.
Izvršavanjem 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 izvršava isto kao i otvaranje bilo koje druge datoteke
unutar datotečnog sustava,koristeći sistemski poziv open() ili koristeći standardnu C funkciju
fopen().Ako je poziv uspješan,vraćen je file descriptor(u slučaju open() )ili “FILE” pointer (u
slučaju fopen() ).Njih se može koristit ili za čitanje ili za pisanje,ovisno o parametrima
proslijeđenima sistemskom pozivu open() ili funkciji fopen().

Čitanje i pisanje s named pipe-a je slično kao i čitanje i pisanje u datoteku.Postoje dvije
glavne razlike:

- Named pipe ne može biti istovremeno otvoren i za čitanje i za pisanje.Proces koji otvara
named pipe mora izabrati jedan od ta dva načina(ili čitanje ili pisanje) i pridržavat 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 obične datoteke.Kad proces
pokušava zapisivati na named pipe koji nema procesa koji ga čita,zapisivanje nije
moguće,tj. Proces koji pokušava zapisivati se blokira sve dok drugi proces ponovo ne
otvori named pipe.

SOCKETS

Socket je dvosmjerni način komunikacije između procesa na istom računalu ili


između procesa koji se izvršavaju na različitim računalima.Socket postoji unutar

626/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 među procesima na jednom računalu.Postoji sličnost 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 mrežnim protokolom.Kada se
koriste kao stream socketi,Unix domain socketi pokazuju veliku sličnost named pipe-u,ali s
velikom prednošću-uspostavljanje svake nove veze sa socket-om rezultira stvaranjem novog
komunikacijskog kanala.

SYSTEM V IPC

System V IPC je skup međuprocesnih komunikacijskih metoda koje originalno


potječu od Unix System V release 4 verzije unix operativnog sustava.Te metode uključuje
message queues (za slanje i primanje poruka),dijeljenu memoriju (dopušta da više procesa
dijeli iste podatke unutar memorije) i semafore (sinkronizacijski mehanizam potreban da bi se
uskladio pristup više procesa pojedinim resursima).Svaki System V IPC resurs je upravljan od
sustava,te za razliku od unnamed pipe-a,može postojati i ako ga je proces koji ga je stvorio
uništen.Svaki resurs unutar System V IPC može biti public ili private.Ako je private,to znači
da mu može pristupiti samo proces koji ga je stvorio ili njegov child.Ako je public,može mu
potencijalno pristupiti bilo koji proces unutar sustava,osim u slučaju ako to nije dozvoljeno
permission modom.System V IPC resursi mogu biti zaštićeni pristupnim permission
modom,veoma slično kao i datoteke i direktoriji unutar datotečnog 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
različito postavljeni za vlasnika resursa,za korisnike iz vlasnikove grupe i za sve
ostale.Također,permissioni mogu biti određeni za čitanje ili za pisanje.
Permissione definira struktura “ipc_perm”:

627/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

struct ipc_perm
{
key_t key; /* key identifying the resource */
ushort uid; /* owner effective user ID and effective group ID */
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.Može imati 6 različitih vrijednosti:
0400
– vlasnik može čitati iz resursa
0200
– vlasnik može pisati u resurs
0040
-grupa koja je vlasnik može čitati iz resursa
0020
-grupa koja je vlasnik može pisati u resurs
0004
-bilo koji drugi korisnik može čitati iz resursa
0002
-bilo koji drugi korisnik može pisati u resurs
seq – sadrži interne informacije o resursu.

628/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Za upravljanje SysV IPC resursima se koriste : ipcs i ipcrm.

ipcs – provjerava upotrebu postojećih 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 odgovarajuća dozvola.

SYNOPSIS

ipcrm [-q msqid] [-m shmid] [-s semid] [-Q msgkey] [-M shmkey] [-S
semkey] ...

MESSAGE QUEUES

Message queue je niz u koji poruka može biti smještena. Poruka je sastavljena od
tipa poruke(identifikacijski broj) i podataka.Message queue može biti private ili public.Ako je
private,može mu pristupiti samo proces koji ga je stvorio ili child od toga procesa.Ako je
public,može mu pristupit bilo koji proces kojem je poznat queue key.Nekoliko različitih
procesa može zapisivat poruke u message queue ili čitat poruke iz niza.Poruke mogu biti
iščitavane po identifikacijskom broju,pa prema tome ne moraju biti čitane u FIFO poretku,kao
što je slučaj sa pipe-om.

Message queue kreiramo sistemskim pozivom msgget().Msgget() prima dva


parametra:queue key i flags.

Key može biti:

IPC PRIVATE - stvara private message queue

629/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

pozitivni integer - stvara message queue koji je dosutpan svima(public)

Drugi parametar sadrži flag-ove koji kontroliraju procesiranje sistemskog


poziva.Može sadržavati flag-ove poput IPC_CREAT ili IPC_EXCL.Devet najnižih bitova su
korišteni 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 treći se ignorira.

Primjer koda koji kreira privatni message queue:

#include <stdio.h> /* standard I/O routines. */


#include <sys/types.h> /* standard system data types. */
#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 slijedeće parametre:

1. int msqid- id message queu-a,vraćena vrijednost od msgget() sistemskog poziva

2. struct msgbuf* msg – pointer za inicijalizaciju message strukture

3. int msgsz- veličina podatkovnog dijela poruke izražena u bajtovima

• int msgflg – flag-ovi koji određuju kako poslat message.Može biti logički ili IPC NOWAIT

630/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Poruke čitamo iz message queua upotrebom sistemskog poziva msgrcv().

Msgrcv() uzima slijedeće parametre:

1. int msqid – id message queu-a,vraćena od msgget() sistemskog poziva

• struct msgbuf* msg – pointer na msgbuf strukturu

• int msgsz -veličina najveće poruke koju želimo primiti

• int msgtyp -tip poruke koju želimo čitati-može biti jedna od slijedećih:

-0

-pozitivni integer

-negativni integer

int msgflg -kombinacija bilo koje od slijedećih vrijednosti:

-IPC NOWAIT
-MSG EXCEPT
-MSG NOERROR

631/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

SEMFORI (Semaphores)

Semafor je objekt koji ima funkciju brojača.Služi za sinkronizaciju pristupa dijeljenim


resursima kojima pristupa više procesa.Najčešće se koriste kao lock-mehanizam koji
spriječava proces da pristupi određenom 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 može sadržavati samo jedan semafor.Skup semafora može sadržavati od
jednog semafora pa nadalje,sve do predefiniranog limita.Operativni sustav osigurava da u
jednom trenutku samo jedan proces može 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 povećava
vrijednost varijable semval za 1.Operacija P smanjuje vrijednost varijable semval za
1.Rezultat smanjivanja vrijednosti varijable semval ne može biti negativan.Smanjivanje je
moguće obavljati sve dok je rezultat nenegativan.V i P operacije su atomarne-ukoliko više
procesa izvršava operacije nad istim semaforom,svaka operacija je završena prije nego druga
započne s izvršavanjem.Ne može doći do preplitanja među procesima u trenutku dok jedan
proces obavlja operaciju nad semaforom.

Unutar Unix sustava semafor izvršava dvije operacije pod nazivom wait i signal.
Na primjer uzmimo da imamo semafor čiji je brojač postavljen na 1.Samo jedan proces može
izvršiti operaciju wait-nazovimo ga proces A.Proces A izvršavajući operaciju wait smanjuje
vrijednost brojača za jedan te ulazi u dijeljeni resurs.Kad proces A uđe u dijeljeni resurs
vrijednosr brojača je jednaka 0.Proces A izvršava instrukcije nad dijeljenim resursom.Svaki
drugi proces koji za to vrijeme pokuša pristupit resursu,stavlja se u red čekanja.Proces A
napušta resurs i izvršava operaciju signal.Ako postoji proces u redu čekanja,brojač ostaje
jedak 0.Slijedeći proces iz reda čekanja ulazi u dijeljeni resurs i započinje s izvršavanjem.Svi
ostali procesi ostaju u redu čekanja.Ukoliko ne postoje procesi koji čekaju na pristup
dijeljenom resursu,brojač se povećava za 1 i time se omogućuje slijedećem procesu(u nekom
budućem trenutku kad će neki proces pristupat resursu) da uđe u taj resurs.

632/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Kreiranje semafora

Kreiranje semafora je omogućeno 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.


nsmes -broj semafora unutar seta
semflg -permissioni na semaforu

SIGNALI

Signali su softwarski generirani prekidi,poslani procesu prilikom nekog


događaja.Većina signala je asinkrona.Sinkroni signali mogu biti generirani prilikom pogreške
u programu (SIGFPE i SIGSEGV).Signali mogu procesu biti poslani od aplikacije ili iz
kernela OS-a (npr. prilikom greške na sabirnici ili izvođenja nedopuštene instrukcije).
Svaki signal ima jedno od podrazumijevanih djelovanja koja spadaju u jednu od slijedećih
kategorija:

1. Signal je odbačen nakon primanja


2. Proces je uništen nakon što je signal primljen
3. Datoteka jezgre je zapisana,a zatim je proces uništen
4. Nakon primanja signala proces je zaustavljen

Većina signala može biti ignorirana ili blokirana.Jedna od iznimki je KILL signal
koji ne može biti ignoriran.

633/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PROGRAMI ZA UPRAVLJANJE PROCESIMA

PS

ps daje pregled procesa koji se trenutno izvršavaju na sustavu.


Primjer ispis-a “ps -el” naredbe:

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD


4 S 0 1 0 0 75 0 - 342 schedu ? 00:00:04 init
1 S 0 2 1 0 75 0 - 0 contex ? 00:00:00 keventd
1 S 0 3 1 0 75 0 - 0 schedu ? 00:00:00 kapmd
1 S 0 4 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd_C
1 S 0 9 1 0 85 0 - 0 bdflus ? 00:00:00 bdflush
1 S 0 5 1 0 75 0 - 0 schedu ? 00:00:00 kswapd
1 S 0 6 1 0 75 0 - 0 schedu ? 00:00:00 kscand/DMA
1 S 0 7 1 0 75 0 - 0 schedu ? 00:00:00 kscand/Norm
1 S 0 8 1 0 75 0 - 0 schedu ? 00:00:00 kscand/High
1 S 0 10 1 0 75 0 - 0 schedu ? 00:00:00 kupdated
1 S 0 11 1 0 85 0 - 0 md_thr ? 00:00:00 mdrecoveryd
1 S 0 15 1 0 75 0 - 0 end ? 00:00:00 kjournald
1 S 0 73 1 0 75 0 - 0 end ? 00:00:00 khubd
1 S 0 3056 1 0 75 0 - 360 schedu ? 00:00:00 syslogd
5 S 0 3060 1 0 75 0 - 342 do_sys ? 00:00:00 klogd
5 S 32 3078 1 0 75 0 - 385 schedu ? 00:00:00 portmap
5 S 29 3097 1 0 85 0 - 381 schedu ? 00:00:00 rpc.statd
5 S 0 3164 1 0 84 0 - 341 schedu ? 00:00:00 apmd
5 S 0 3202 1 0 85 0 - 876 schedu ? 00:00:00 sshd
5 S 0 3216 1 0 75 0 - 506 schedu ? 00:00:00 xinetd
5 S 0 3236 1 0 75 0 - 1477 schedu ? 00:00:00 sendmail
1 S 51 3245 1 0 85 0 - 1428 pause ? 00:00:00 sendmail
1 S 0 3264 1 0 75 0 - 354 schedu ? 00:00:00 crond
5 S 0 3275 1 0 75 0 - 1875 schedu ? 00:00:00 cupsd
5 S 43 3335 1 0 75 0 - 1290 schedu ? 00:00:00 xfs
1 S 0 3344 1 0 99 19 - 350 rt_sig ? 00:00:00 anacron
1 S 2 3353 1 0 75 0 - 352 schedu ? 00:00:00 atd
4 S 0 3361 1 0 82 0 - 338 schedu tty1 00:00:00 mingetty
4 S 0 3362 1 0 82 0 - 338 schedu tty2 00:00:00 mingetty
4 S 0 3363 1 0 82 0 - 338 schedu tty3 00:00:00 mingetty
4 S 0 3364 1 0 82 0 - 338 schedu tty4 00:00:00 mingetty
4 S 0 3365 1 0 82 0 - 338 schedu tty5 00:00:00 mingetty
4 S 0 3366 1 0 82 0 - 338 schedu tty6 00:00:00 mingetty
4 S 0 3367 1 0 75 0 - 3528 schedu ? 00:00:00 gdm-binary

634/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

5 S 0 3410 3367 0 75 0 - 3811 wait4 ? 00:00:00 gdm-binary


5 S 0 3744 1 0 75 0 - 352 schedu ? 00:00:00 gpm
4 S 0 4270 3410 4 75 0 - 16038 schedu ? 00:01:10 X
4 S 0 4279 3410 0 75 0 - 4623 schedu ? 00:00:00 gnome-sessi
1 S 0 4337 4279 0 75 0 - 783 schedu ? 00:00:00 ssh-agent
0 S 0 4348 1 0 75 0 - 2806 schedu ? 00:00:00 gconfd-2
0 S 0 4350 1 0 75 0 - 1533 schedu ? 00:00:00 bonobo-acti
0 S 0 4352 1 0 75 0 - 3209 schedu ? 00:00:01 metacity
4 S 0 4355 1 0 75 0 - 4288 schedu ? 00:00:00 gnome-setti
4 R 0 4361 3216 0 75 0 - 663 - ? 00:00:00 fam
4 S 0 4368 1 0 75 0 - 5535 schedu ? 00:00:03 gnome-panel
4 S 0 4370 1 0 75 0 - 19369 schedu ? 00:00:04 nautilus
0 S 0 4372 1 0 75 0 - 4057 schedu ? 00:00:00 magicdev
0 S 0 4374 1 0 75 0 - 4156 schedu ? 00:00:00 eggcups
0 S 0 4376 1 0 75 0 - 2899 schedu ? 00:00:00 pam-panel-i
0 S 0 4378 1 0 75 0 - 6061 schedu ? 00:00:00 rhn-applet-
0 S 0 4379 4376 0 75 0 - 352 schedu ? 00:00:00 pam_timesta
0 S 0 4381 1 0 75 0 - 4209 schedu ? 00:00:00 notificatio
0 S 0 4726 1 0 75 0 - 5003 schedu ? 00:00:00 gnome-termi
4 S 0 4727 4726 0 83 0 - 463 schedu ? 00:00:00 gnome-pty-h
0 S 0 4728 4726 0 75 0 - 1078 wait4 pts/0 00:00:00 bash
0 R 0 5294 4728 0 81 0 - 790 - pts/0 00:00:00 ps

F – Flag.Pokazuje vrijednost flag bitova za proces.

S – Označava stanje procesa.Dvije najčešče 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- Iskorištenje procesora.

PRI – Prioritet procesa.

635/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

NI - Nice vrijednost.Koristi se pri računanju prioriteta.

ADDR - Memorijska adresa procesa

SZ - Ukupna veličina procesa unutar virtualne memorije.

WCHAN - Događaj na koji proces čeka.

TTY – Terminal dodijeljen procesu.”?” je prikazan kad ne postoji terminal.

TIME – Ukupno vrijeme izvršavanja procesa.

CMD – Naredba koja je pokrenula proces.

636/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KILL

kill-uništava proces

SYNOPSIS
kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]

Kill šalje određeni signal specificiranom procesu.Ukoliko nijedan signal nije


određen,šalje se TERM signal.Root može uništiti skoro bilo koji proces na sustavu.Nije
moguće poslati signal init procesu,jer nema ugrađen signal handler.Da uništimo proces koji je
u našem vlasništvu proslijeđujemo 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 find / -name .login &
martyp $

U primjeru je najprije izvršena ps naredba da bi se izlistali svi procesi čiji je vlasnik


martyp,zatim je izvršeno uništavanje procesa te provjera da je proces nestao s popisa.

637/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Krunoslav Zeman

Signali

638/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

UVOD

Signali su softverski prekidi koji se dostavljaju procesima. Svi procesi koji se izvršavaju
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 može biti
proizveden od same jezgre, proces ga može poslati sam sebi ili drugom procesu, ili ga može
poslati korisnik. Signali su klasični primjer nesinkronih događaja, jer se mogu pojaviti u bilo
koje vrijeme u procesu.

639/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

PROCESI

Proces je program koji je trenutno u izvršavanju. Svaki proces zauzima određene sistemske
resurse, kao što si memorija i procesorsko vrijeme. Kernel pruža korisnicima iluziju
konkurentnog izvršavanja više procesa u isto vrijeme raspoređivanjem tih resursa među
procesima koji su spremni za izvršavanje.
Proces se izvršava ili u korisničkom ili u kernel modu. U korisničkom modu instrukcije se
izvršavaju u neprivilegiranom modu hardvera. Kada proces zatraži od kernela da izvrši neki
sistemski poziv, instrukcije se vrše u privilegiranom, ali kernelom ograničenom i
kontroliranom modu. Ovako su aplikacije odvojene od hardvera.
Kernel razlikuje procese prema njihovom proces identifier (PID) broju. Korisnici mogu
kreirati procese, kontrolirati izvršavanje procesa i primiti obavjest kada se status izvršavanja
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 izvršavanjem instrukcije koja slijedi poslije pozivanja fork-a, s tim što
postoji jedna razlika, djetetu fork vraća vrijednost nula, a roditelju vraća vrijednost PID-a
djeteta.(koji je različit od nule).
Obično nakon pozivanja fork-a jedan od ova dva procesa poziva sistemski poziv execve,
kojim se vrši prepisivanje postojeće memorijske slike procesa novom, koja sw čita iz
binarnog faila, poslje čega počinje izvršavanje novog programa.
Proces može završiti svoje izvođenje pozivanjem sistemskog poziva exit. Ako je njegov
roditelj pozvao sistemski poziv wait, PID djeteta se signalom šalje roditelju tako da on
možeznati koje je djete završilo s izvršavanjem. Ako se proces dijete sruši sistem simulira exit
sistemski poziv i obavještava roditelja. Prilikom izlaženja, proces dijete postaje zombi proces,
koji se ne izvršava, ali postoji u memoriji, kako bi roditelj mogao, koristeći wait4 sistemski
poziv, da dobije više informacija o djetetovom izvršavanju.

640/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Multiprogramiranje

-predstavlja iluziju paralelnog izvršavanja više procesa ili programa. Kernel to omogućava
pomoću smjenjivanja kontksta procesa (context switching) . Kontekst procesa obuhvaća sve
informacije koje kernel koristi za izvršavanje procesa (PID,prioritet,stanje
izvršavanja,data,stack i text segmente,stanje signala,akcije signala,akcije na
signale,tajmere,dekriptore...). Kernel odlučuje koji će se proces sljedeći izvršavati, to se
naziva scheduling – vremensko planiranje.

Scheduling

– Zadatak kernela je da isplanira i zakaže izvršavanje procesa tako da svi procesi mogu
zauzeti podjednako resursa. Programi se ocjenjuju prema količini računanja i količini I/O koje
izvršavaju i na osnovu toga im se određuje prioritet. On se u FreeBSD-u izrčunava svake
sekunde, na osnovu količine računanja u prethodnom periodu, količine memorije koju
zauzima, ukupne zauzetosti resursa sistema i vrijednosti nice koju ima svaki proces i koja
označava poželjni prioritet. Svi procesi naizmjenično dobivaju određeni vremenski period
izvršavanja. U FreeBSD-u ovaj period je 0,1 sekunda, poslje čega kernel prelazi na
izvršavanje procesa sa najvišim prioritetom.
Procesi koji čekaju da se I/O operacija završi imaju veći prioritet izvršavanja, jer se izvršavaju
u kernel-modu. Nasuprot tome, procesima koji su zahtjevaju dosta računanja (procesorskog
vremana) prioritet im se smanjuje, kako ne bi zauzeli kompletan procesor i zaustavili
izvršavaje ostalih procesa. Na ovaj način 4.4BSD kernel daje prednost interaktivnim
programima (kakvi su npr. text editori) nad dugotrajnijim batch-type procesima koji
zahtjevaju dosta procesorskog vremena i koji zagušuju sistem.

641/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Ogrančenje resursa

Kernel podržava ograničavanje količine resursa koji su dostupni pojedinim procesima. Ova
ograničenja mogu biti: maksimalno CPU vrijeme koje proces može zauzeti, količina
memorije koju može alocirati, veličina i broj fajlova koje proces može kreirati, broj
simultanih procesa koje korisnik može pokrenuti i dr.
Za svako ograničenje postoje soft i hard limit. Kada proces pređe soft limit sitže mu signal
koji obično rezultira prekidanjem izvršavanja procesa, ali proces može i ignorirati ovaj signal
i pokušati osloboditi resurse. Ukoliko to ne napravi sljedeći pokušaj alociranja još resursa
neće uspjeti.
Hard limit se ne može prekoračiti. Svi korisnici mogu svojim procesima smanjiti hard limit, a
jedino superuser ga može povećati.

Sistemski procesi

Svi procesi u 4.4BSD-u (i naravno u FreeBSD-u) potiču od jednog procesa kojeg pokreće
kernel. Proolikom pokretanja sistema kreiraju se tri procesa i oni uvijek postoje i izvršavaju
se. Procesi swapper i pagedaemon su procesi koji se izvršavaju u kernel modu. Swapper (PID
0) je odgovoran za vremensko planiranje premještanja 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 izvršava u korisničkom modu, van kernela i koji je odgovoran za administrativne zadatke,
kao što je pokretanje drugih procesa
(po jedan getty proces u svaki terminal mašine) zatvaranje procesa prilikom gašenja sistema
(ulaskom u beskonačnu petlju ili resetiranjem sistema).

642/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Identifikatori korisnika

-Važna odgovornost operativnog sistema je da pruži mehanizam za kontrolu i ograničenje


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 označavaju GID (group identifier) brojem. Jednom korisniku koji se naziva superuser
dostupne su sve operacije kernela, dok su mnoge od njih nedostupne običnim korisnicima.
Svakom procesu su pripisani UID i GID korisnka koji ga je pokrenuo, tako da obični korisnici
mogu slati signale svojim procesima. Svaki fail ima pristupne dozvole za vlasnika faila,grupu
korisnika kojoj pripada vlasnik i ostale korisnike. Ove dozvole uključuju čitanje,prepravljanje
i izvršavanje faila. Ovako se osigurava kontrola pristupa failovima.
U unix sistemima postoje setuid i setgid programi kioji omogučuju da korisnik kontrolirano
izvrši neke operacije koje mu nisu dozvoljene. Ovakvi programi moraju biti veoma pažljivo
napisani kako ne bi došlo 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 može napraviti novu grupu. Procesi unutar jedne
grupe mogu međusobno 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. Više procesa se spajaju pajpovima, a signali se mogu slati sviim procesima tog
posla odjednom.

643/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

SIGNALI

Signali su kratke poruke kojima je omogučeno slanje zahtjeva za prekid određenom


procesu. Signali se mogu razmjenjivati između dvaju procesa (jedan šalje signal drugom)
ili sama jezgra operacijskog sustava (kernel) može slati signal određenom procesu. Popis
signala može se naći u /usr/include/asm/signal.h header datoteci sustava.

Popis signala

#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23

644/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO

Vidi se da svaki signal ima svoje ime i broj koji ga predstavlja. Funkcije većine navedenih
signala su unaprijed dodijeljene. Tako npr. signal KILL (broj 9) uzrokuje završetak procesa
kojemu je namijenjen. Kažemo da smo proces 'ubili' signalom KILL. Signalima STOP i
CONT može se zaustaviti pa nastaviti izvođenje procesa. No, ima i signala kojima funkciju
određuje korisnik (programer). To su signali USR1 i USR2. Ponekad se može dogoditi da

je isti signal predstavljen drugim brojem na drugom UNIX sustavu. Zbog toga je
preporučljivo koristiti imena signala, a ne njihove brojeve. Isto tako, nisu baš svi signali
definirani na svim UNIX sustavima.
Slanje signala vrši 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 ugrađena naredba istog naziva (koja se i zasniva na istoimenom pozivu sustava):
kill. Ona služi za slanje signala određenom procesu iz komandne linije.
Naredbom kill –l dobiva se popis svih signala.
.

Uvjeti koji mogu izazvati generiranje signala

645/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Od strane terminala generirani signali se pojavljuju kad korisnik pritisne određene tipke (ili
određenu kombinaciju tipki). Npr. : obično CTRL+C generira signal za kraj izvršavanja
pojedinog programa
Greške (iznimke, exceptions) također mogu generirati signal, npr. dijeljenje sa nulom,
pogrešna memorijska referenca i slično.
kill funkcija, odnosno kill naredba na UNIX-u šalje signal nekom drugom procesu ili grupi
procesa.
Softverski uvjeti generiraju signal kad se dogodi nešto čega bi proces trebao biti svjestan, npr.
kada sat alarma postavljen od strane procesa istekne.

Signal može 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 sadrži nikakve informacije i može
biti poslan samo određenom procesu ili procesima. Signali se nikada ne koriste za normalnu
komunikaciju, nego samo za posebne događaje.

Kada se signal genrira on postaje neriješen (u toku, eng. pending) i takav ostaje neko kratko
vrijeme dok ne bude dostavljen procesu kojem je namijenjen. Međutim, moguće je da je takav
signal trenutno blokiran od strane sustava, pa može ostati neriješen proizvoljno dugo, tj. sve
do onog trenutka dok ta vrsta
signala ne bude deblokirana. Jednom deblokiran dostavlja se odmah. Postoje tri stvari koje
proces može reći jezgri što da ućini s dostavljenim signalom:

1. Ignorirati signal.
Ovo radi za većinu signala osim za dva signala koja nikad ne mogu biti ignorirana: SIGKILL
i SIGSTOP. Razlog zašto ova 2 signala ne mogu biti ignorirana leži u činjenici da superuseru
mora biti omogućena opcija sigurnog zaustavljanja ili ubijanja procesa. Također ako
ignoriramo neke signale koji su generirani usljed hardverdske pogreške ponašanje procesa
nije definirano.

2. Uhvatiti signal.

646/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Da bi ovo uradili, jezgri treba reći da pri pojavi signala pozove neku određenu funkciju u
kojoj možemo uraditi prouizvoljnu akciju.

3. Pustiti da se dogodi defaulana akcija.


Svaki signal ima svoju defaultnu akciju. Većinom je ta akcija prekidanje rada procesa.

647/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Vrste signala:

Različiti operativni sustavi definiraju različite signale. Svaki signal ima ime. Imena svih
signala počinju sa SIG, a popis svih signala u pojedinom operativnom sustavu može se nači u
datoteci signal.h. Imena signala su pozitivne cjelobrojne konstante.
ANSI C standard specificira sljedećih 6 signala: SIGINT, SIGILL , SIGFPE,
SIGSEGV, SIGTERM, SIGABRT..

Vrste signala
Moderne implementacije UNIX-a definiraju oko tridesetak signala. Ovdje je pregled samo
najznačajnijih.

SIGINT
šalje se svakom procesu za koji je to kontrolni terminal u trenutku kada je pritisnuta tipka za
prekid (standardno DEL, najčešće izmijenjeno u Ctrl-C).

SIGQUIT
Slično kao SIGINT, ali se odnosi na tipku za kraj izvršavanja (standardno Ctrl-\, najčešće
izmijenjeno u Ctrl-X).

SIGKILL
Jedini siguran način uništavanja procesa je da mu se pošalje ovaj signal, jer ne može biti
ignoriran niti uhvaćen.

SIGALARM
šalje se kada istekne traženo vrijeme čekanja procesa.

SIGTERM
Ovo je standardni signal za uništavanje procesa. Koristi se i kod isključivanja da ubije sve
aktivne procese. Očekuje se da će proces koji ga primi uredno spremiti aktualno stanje prije
završetka.
sigset i njemu bliski sistemski pozivi
void (* sigset(int sig, void (* func)())() ;

648/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

specificira šta se dešava prilikom primitka određenog signala. sig je broj signala. Drugi
argument je kazaljka na funkciju i može biti:
SIG_DFL. U ovom slučaju postavlja se automatska reakcija na signal. Za večinu
signala to znači uništavanje procesa.
SIG_IGN. Ovime se postavlja da signal bude ignoriran. Signal SIGKILL se ne može
ignorirati.
SIG_HOLD. Signal se prihvaća ali ne obrađuje i obradit će se onda kada se definicija
ponašanja za taj signal promijeni. Može se čuvati samo po jedan signal svake vrste.
SIGFPE Signal koji se događa zbog aritmetičke pogreške (dijeljenje s nulom,
floating point overflow ili underflow)
SIGUSR1 i SIGUSR2 signali slobodni u korisničke svrhe

649/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Rukovanje signalima

Funkcija kojom možemo promijenit defaultno ponašanje 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 objašnjenja:

signal() je sistemski poziv koji vraća adresu funkcije koja kao argumnet uzima int i ne vraća
nikakvu vrijednost . Znaći signal vraća sljedeće: void (*)(int).
signal() vraća prethodno asociranu funkciju za obradu prekida.
signal() kao argumente uzima sljedeće:
Prvi parametar tipa int je broj signala. Obično 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 vraća ništa. U slučaju 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 slučaju uspjeha signal će vratiti adresu funkcije koja je prethodno služila za obradu prekida,
inače vratiti će konstantu SIG_ERR.

Primjer: hvatanje signala za kraj programa, primjer za hvatanje aritmetičkih pogrešaka,


primjer sa funkcijom alarm, primjer sa dva procesa i signalima.

Funkcija signal ima određene 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 poželjno na neko vrijeme

650/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

blokirati mogućnost dostavljanja signala što je zahtjevalo malo drugačiju implementaciju


signala.

Svaki proces ima signalnu masku koja definira skup signala trenutno blokiranih od strane
procesa. Možemo to predočiti na način da svaki bit sadrži predstavlja pojedini signal S
obzirom da broj signala može biti veći nego cijeli broj POSIX.1 definira novi tip sigset_t koji
sadržava skup signala.

Funkcije za manipulacije skupom signala

int sigemptyset(sigset_t *set);


int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
sve vraćaju 0 ako je OK, -1 u slučaju greške

int sigismember(const sigset_t *set, int signo);


vraća 1 ako je istina , 0 inače

int sigprocmask(int how, const sigset_t *set, sigset_t *set);


vraća 0 ako je OK, -1 u slučaju greške

651/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Signalna maska

sigproc mask ispituje ili postavlja (ili oboje) signalnu masku. Ako je oset nenull pointer,
trenutna signalna maska se vraća preko oset. Ako je set ne-null pointer tada how određuje
kako je će se signlna maska modificirati.

Mogućnosti su:

SIG_BLOCK
Nova signlna maska za proces je unija trenutne signalne maske i skupa signala definiranog sa
set, tj. set sadrži signale koje želimo blokirati.

SIG_UNBLOCK
Nova signlna maska je presjek trenutne signalne maske i skupa signala definiranog sa set, tj.
set sadrži signale koje želimo deblokirati

SIG_SETMASK
Postavlja se nova signalna maska.

U slučaju da je set null pointer, signalna maska se ne mijenja i vrijednost od how je


zanemariva.

int sigfillset(sigset_t *set);


vraća 0 ako je OK, -1 u slučaju greške

Služi za dobivanje skupa signala koji su blokirani i čekaju dostavljanje.

int sigaction(int signo, const struct sigaction *act,struct sigaction *oldact);


vraća 0 ako je OK, -1 u slučaju greške

652/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Ova funkcija nasljeđuje funkciju signal i služi 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); vraća -1 i postvlja errno na EINTR

Signalna maska procesa se postavlja na sigmask i proces se zaustavlja dok se ne pojavi signal
(malo neprecizno reèeno: unlock and pause)

653/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Prekidi i signali

SIGNALI
Jezgra može poslati procesu signal. Taj signal može biti proizveden od same jezgre, proces ga
može poslati sam sebi ili drugom procesu, ili ga može poslati korisnik.

Primjer signala koji potiče od jezgre je signal koji je poslan kada proces pokuša 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 uništava procese, a šalje ga
proces koji želi uništiti svoju "porodicu" procesa. Tipični korisnikov signal je prekidni signal.
Standardno je postavljeno da se taj signal generira tipkom DEL, međutim, večina korisnika to
mijenja u Ctrl-C (stty intr ^C).

Postoji tridesetak različitih signala (u različitim verzijama UNIX-a može ih biti manje ili
više). Za večinu signala (izuzetak je SIGKILL i još neki) proces može kontrolirati što se
dešava nakon što primi neki signal. Može prihvatiti ugrađenu akciju što (za večinu signala)
rezultira uništavanjem procesa, može ga ignorirati ili može uhvatiti signal i izvesti određenu
funkciju. Tip signala (cijeli broj) se prenosi u funkciju kao jedini argument i funkcija ne može
otkriti izvor signala. Nakon povratka iz funkcije proces može nastaviti od mjesta prekida.

Značenje signala za procese je analogno značenje prekidnih signala na razini procesora.


Signal može biti poslan u bilo kojem trenutku, ali ne mora biti primljen i ne mora nitko
reagirati na signal. Ne sadrže nikakve informacije i može biti

poslan samo određenom procesu ili procesima. Nikada se ne koriste za normalnu


komunikaciju, nego samo za posebne događaje.

Kazaljka na funkciju. Ovime se označava da po primitku signala treba pozvati funkciju. Ne


može se upotrijebiti za SIGKILL. Funkciji će biti predan jedan cjelobrojni argument - vrsta
signala.

654/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Prototip je nešto teže razumijeti jer je jedan od argumenata kazaljka na funkciju, a i sama
funkcija kao rezultat vraća kazaljku na funkciju - prethodnu definiciju ponašanja za zadani
signal. To se može koristiti ako kasnije treba vratiti prijašnje stanje.

Nakon povratka iz funkcije za obradu signala, proces nastavlja s radom od mjesta na kojem je
prekinut primitkom signala. Međutim, ako je signal prihvaćen za vrijeme čekanja na izvršenje
poziva read, write, open, ioctl, wait, ili pause oni će biti prekinuti uz postavljanje greške
EINTR u errno (ne odnosi se na pristup običnim datotekama).

Neposredno pred poziv funkcije za obradu signala func, ponašanje kod prijema dotičnog
signala se mijenja u SIG_HOLD. Na povratku iz te funkcije restaurira se func kao funkcija za
obradu signala i otpušta eventualno pristigli signal. To se može obaviti i prije završetka same
funkcije, pozivom sigrelse, što onda omogučava prijem novog signala prije nego što je
prethodni obrađen.

int sighold(int sig) ;


int sigrelse(int sig) ;
Ovo su pozivi za manipulaciju sa signalima. sig je signal.

sighold i sigrelse se koriste za zaštitu kritičnih odsječaka u programu. sighold je analogan


podizanju prioriteta i zadržavanju signala dok se prioritet ne spusti sa sigrelse. sigrelse
obnavlja akciju procesa prethodno specificiranu u sigset, te otpušta ranije primljeni i zadržani
signal.

655/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Ostali pozivi za manipulaciju signalima

Iako su ranije opisani pozivi, slijedi opis još nekoliko važnijih funkcija i sistemskih poziva
povezanih sa signalima:

int pause(void) ;
zaustavlja proces do dolaska nekog signala. To ne može biti neki od signala koji se ignoriraju.
Također, ako signal izazove prekid procesa, pause ne može ništa vratiti. Tek ako funkcija za
hvatanje signala vraća nešto, pause se vraća s rezultatom -1 i errno postavljenim na EINTR.

unsigned alarm(unsigned secs) ;


postavlja sat na vrijednost secs što predstavlja broj sekunda, a vraća vrijednost na koju je
prethodno bio postavljen. Svaki proces ima sat spremljen u segmentu sistemskih podataka.
Kada istekne postavljeno vrijeme šalje se signal SIGALRM.

unsigned sleep(unsigned secs) ;


alarm i pauseu kombinaciji formiraju standardnu funkciju sleep. Prvo se postavlja alarm na
traženo vrijeme u sekundama, a zatim poziva pause da čeka prijem signala. Međutim, sleep
može trajati i kraće od zadanog vremena jer pause ne čeka samo SIGALRM nego bilo koji
signal. Također, sleep se brine o ranije postavljenim alarmima pa može završiti ranije ili će po
svom završetku restaurirati

od prije postojeći alarm. U svakom slučaju, sleep kao rezultat vraća "neprospavano" vrijeme
(koliko je proces ranije probuđen zbog drugih signala). To vrijeme se onda može nadoknaditi
dodatnim spavanjem.

int kill(int pid, int sig) ;


šalje signal procesu. pid je ID broj procesa koji prima signal, a sig je broj signala. Ako je pid
jednak 0, signal se šalje svim procesima koji su istoj grupi kao i proces koji šalje signal. To se
obično upotrebljava kod komande kill, čime se uništavaju svi procesi koji se izvode u
pozadini, bez obzira na njihov ID.

656/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

U večini slučajeva kill se koristi za uništavanje procesa (od tuda dolazi ime) ili za testiranje
ponašanja kod greške simuliranjem signala. Najčešće se koristi kao komanda, a ne kao poziv
u programu.

void (* signal(int sig, void (* func)())() ;


specificira šta se dešava prilikom primitka određenog signala, slično kao i sigset. signal je
stariji i razlikuje se po tome što ne poznaje SIG_HOLD. Također, ponašanje na ulasku u
funkciju za obradu signala čini ga manje upotrebljivim od sigset.

Neposredno pred poziv funkcije za obradu signala, ponašanje kod prijema dotičnog signala se
mijenja u SIG_DFL. To znači da će slijedeći signal istog tipa ubiti proces. Ovo ponašanje se
može promijeniti unutar same funkcije za obradu

signala, ali uvijek postoji interval (koji kod većeg opterećenja može biti i prilično dugačak)
unutar kojeg prijem signala može ubiti proces.

UNIX ne dozvoljava pojedinom korisniku izravno korištenje prekida procesora. Zato prekide
treba simulirati koristeći signale koje jezgra operacijskog sustava šalje procesima.

657/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

OPIS STANDARDNIH SIGNALA

Linux podupire standardne signale nabrojene ispod,nekoliko signalnih brojeva su zavisni o


arhitekturi,što je istaknuto u stupcu value. U stupcu value gdje postoje tri vrijednosti, prva je
uobičajeno koja vrijedi za alpha and sparc, srednja za i386,ppc and sh, i zadnja vrijednost je
za mips. «-» označava da je signal odsutan za odgovarajuću arhitekturu.
U stupcu Action mogu se pojaviti čeriti vrijednosti, a njihovo značenje je:
Term-defoltna akcija za terminiranje procesa
Ing –defoltna akcija za ignoriranje signala
Core-defoltna akcija za ignoriranje signala i odvacivanje jezgre
Stop-defoltna akcija za zaustavljanje procesa

658/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

POSIX.1 standard
Signal Value Action Coment
SIGINT 2 TERM Prekid s tipkovnice
SIGQUIT 3 CORE Quit s tipkovnice
SIGILL 4 CORE Ilegalna instrukcija
SIGABRT 6 CORE Prekid
SIGFPE 8 CORE Iznimka pomičnog
zareza
SIGKILL 9 TERM Kill signal
SIGSEGV 11 CORE Pogrešna referenca
memorije
SIGPIPE 13 TERM Pisanje
SIGALRM 14 TERM Vremenski signal za
alarm
SIGTERM 15 TERM Signal prekida
SIGUSR1 30,10,16 TERM Samodefinirajući 1
SIGUSR2 31,12,17 TERM Samodefinirajući 2
SIGCHLD 20,17,18 IGN Zaustavljanje ili
prekidanje djeteta
SIGCON 19,18,25 Nastavi ako
zaustavljeno
SIGSTOP 17,19,23 STOP Zaustavi prces
SIGTSTP 18,20,24 STOP
SIGTTIN 21,21,26 STOP tty unos za
pozadinske procese
SIGTTOU 22,22,27 STOP Tty izlaz za
pozadinske procese

659/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Sljedeći signali ne nalaze se u POSIX.1 standardu ali su opisani u SUSv2 i SUSv3 / POSIX
1003.1-2001

Signal Value Action Coment


SIGPROF 27,27,29 TERM Profiling timer
expired
SIGSYS 12,-,12 CORE Loši argument u
rutinu
SIGTRAP 5 CORE Breakpoint zamka
SIGURG 16,23,21 ING Urgent condition on
socket
SIGVTALRM 26,26,28 TERM Virtual alarm sat
SIGXCPU 24,24,30 CORE CPU time limit
exceeded
SIGXZSZ 25,25,31 CORE File size limit
exceeded
SIGEMT 7,-,7 TERM Stack greška na
coprocesoru
SIGIO 23,29,22 TERM I/O omogućen
SIGCLD -,-,18 IGN Sinonim za
SIGCHLD
SIGPWR 29,30,19 TERM Power failure
SIGINFO 29,-,- Sinonim za
SIGPWR
SIGLOST -,-,- TERM File lock lost
SIGWINCH 28,28,20 IGN Window resize
signal
SIGUNUSED -,31,- TERM Nekorišteni signal

660/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

ZAKLJUČAK

LINUX implementira signale koristeći signale pohranjene u task_struct za procese. Broj


podržanih signala je ograničen veličinom riječi procesora. Tako da procesor koji radi
veličinom riječi od 32 bita može imati 32 signala, dok 64 bitni procesori mogu raditi sa do 64
signala (Alpha AXP)

661/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Igor Čopec

FORK PROCESI

662/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

FORK PROCESI

Svi procesi su stvoreni od strane drugog procesa (parent - roditeljskog procesa), no


počnimo ispočetka, tj. od samog kernela. Nakon što se kernel učitao i pokrenuo svoje
podatkovne strukture, on traži sve priključene uređaje na mašini. U tom trenutku operativni
sustav nije u stanju raditi ništa, osim što nudi servise novonastalim procesima. Ali kako se
stvaraju procesi ? Svaki proces na UNIX operativnom računalu se stvara od stane drugog već
postojećeg procesa koji izvodi fork operaciju. Fork operacija stvara potpuno novi proces koji
sadrži 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 identičan majčinskom procesu, i
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 majčinski proces, na
kod kojeg sad koristi novonastali proces. Kada je novonastali proces napravljen, izvršiti ć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 računalu, i iz njega se kreiraju svi ostali procesi.
Uvijek ima PID (proces ID) 1, što znači da je majčinski proces. Njega je kreirao sami kernel
operativnog sustava i on je jedini proces na računalu koji nema majčinski proces. init je
proces koji je odgovoran za pokretanje svih ostalih servisa na UNIX računalu. Servisi koje
pokreće su definirani u njegovoj konfiguracijskoj datoteci / etc / inittab.

663/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

Majčinski proces (PID=1)


Init proces (PID=1)

Novonastali proces (PID=0)

664/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

SVOJSTVA PROCESA - PROCES UID I GID

- Kako bi operativni sustav znao što pojedini proces smije raditi a što ne, on mora
pohraniti informaciju o tome tko posjeduje pojedini proces (UID i GID).
- UNIX operativni sustav pohranjuje dva tipa UID i dva tipa GID informacija.
a) pravi UID i pravi GID
- pravi procesov UID i GID će biti isti kao UID i GID od korisnika koji je pokrenuo
proces, pa će stoga svaki proces koji pokrenete imati vaš UID i GID
- pravi i stvarni procesov UID i GID služe za potrebe brojanja pristupa procesu

b) efektivni UID i GID


- efektivni ili učinkoviti UID i GID se upotrebljavaju da bi se ustanovilo koje operacije
može dotični proces izvoditi, tj. koje dozvole (permission-e) ima
- najčešće je efektivni UID i GID jednak stvarnom UID-u i GID-u, no upotrebom
specijalnih dozvola (permission-a) pristupa datotekama, moguće je promijeniti efektivni UID
i GID

665/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

ODREĐIVANJE INFORMACIJE O
TRENUTNIM PROCESIMA

Kako shell ljuska operativnog sustava izvršava naredbe?


- svaki puta kada se izda naredba u shell-u, UNIX stvara novi proces i suspendira
trenutni proces sve dok novonastali proces nije gotov(osim u slučaju pozadinskih procesa)
- kao što smo i rekli, svaki proces je označen svojim PID-om(procesov identifikacijski
broj), koji mu je dodijeljen pri njegovom stvaranju, pa zato kada se želimo obratiti pojedinom
procesu obraćamo mu se preko njegovog identifikacijskog broja
redoslijed:
1) čeka na korisnika da izda naredbu
2) izvrši određeni broj radnji ako naredba sadrži bilo kakve specijalne znakove
3) nađe izvršnu (''executable'') datoteku za dotičnu naredbu, a u slučaju da ju ne nađe,
generira pogrešku
4) napravi se novi child proces (tj. izvrši se fork operacija nad procesom), koji će
izvršiti naredbu
5) čeka dok se naredba ne izvrši (child proces se terminira) i vraća se na početak

primjer iz konzole - stanja procesa:


upišemo li naredbu ‘ps –x’ u konzoli trebali bismo dobiti popis trenutno aktivnih
procesa i njihove podatke
PID TT STAT TIME COMMAND
6799 co IW 0:01 -csh[rich] (csh)
6823 co IW 0:00 /bin/sh /usr/bin/X11/startx
6829 co IW 0:00 xinit /usr/lib/X11/xinit/xinitrc --
6830 co S 0:12 X :0
6836 co I 0:01 twm
6837 co I 0:01 xclock -geometry 50x50-1+1
6841 p0 I 0:01 -sh[rich on xterm] (csh)
6840 p1 I 0:01 -sh[rich on xterm] (csh)
6842 p2 S 0:01 -sh[rich on login] (csh)
6847 p2 R 0:00 ps -x

666/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

PID procesov identifikacijski broj


TT kontrolni terminal procesa
STAT procesovo radno stanje
TIME količina procesorovog vremena koju je dotični process uspio pribaviti
COMMAND ime naredbe koja je pokrenula process

TT kolumna daje imena terminala, koji se mogu saznati pomoću naredbe WHO
STAT (State of job) kolumna može biti predstavljena sa četiri znaka !
R(runnable process) proces koji je moguće 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

primjer programa:

/**************************************************************/
/* */
/* kratki program o procesu (funkciji) fork() */
/* */
/**************************************************************/

#include <stdio.h>

/***************************************************************/

ChildProcess() //globalna funkcija - definirana izvan main-a

{ int i;

for (i = 0; i < 10; i++)


{
printf ("%d...\n",i);

667/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

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 majčinskom
//ili novonastalom procesu

pid = getpid();//funkcija getpid() vraća 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

RAD PROCESA U POZADINI

Pretpostavimo da želimo pokrenuti neki proces ali ne želimo čekati da se on izvrši,


nego želimo u međuvremenu izvršavati i druge naredbe u shell-u! Mogli bismo to izvesti tako
da izvršimo naredbu i kažemo joj da se izvršava u pozadini. Postoje dva načina za napraviti
da se proces odvija u pozadini:
- (1) prvi je da se pri izvršavanju procesa, sami proces deklarira kao pozadinski proces
pomoću znaka ampersand ('&'). Pretpostavimo da imamo program koji je velik, tj. program
koji će se jako dugo izvršavati. Mogli bismo ga pokrenuti u pozadini ovako

cc longtimer.c &
pa će shell kompajlirati dotični proces u pozadini omogućavajući mi davanje daljnjih
naredbi.

- (2) drugi način slanja procesa u pozadinu je pomoću naredbe 'bg'


ako smo pokrenuli proces i zaboravili ga poslati u pozadinu, prvo ga stopiramo (control-
z) a zatim ga pošaljemo u pozadinu naredbom 'bg'.

669/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

UNIŠTAVANJE PROCESA

Proces možemo uništiti korištenjem naredbe 'kill' . Jednostavno nađemo procesov PID
(na primjer korištenjem naredbe 'ps'), a potom ga uništimo ovako:

kill -9 pid
Ako proces trenutno radi u konzoli, tj. nije u pozadini možemo ga jednostavno uništiti
ovako
control-C

670/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Fork procesi

ZAKLJUČAK (i moji komentari)

Evo ovo je bio kratak seminar o fork procesima, jednom od glavnih aduta UNIX
operativnog sustava koji osigurava njegovu sigurnost i stabilnost. Upravo zbog ovakvih
rješenja je UNIX nenadmašiv u stabilnosti i zbog toga se koristi za posluživanje kompleksnih
i vrlo zahtjevnih informacijskih sustava, jednostavno nema mu premca. Izabrao sam ovo
područje jer mislim da je najkompliciranije krenuti raditi u konzoli a dok ne znaš njezine
potencijale i mogućnosti, jer se upravo u konzoli može apsolutno sve, a dok u bilo kakvom
grafičkom sučelju su stvari okljaštrene i apsolutan pristup je ograničen u svakom pogledu!
Nadam se da će ovaj seminar pomoći shvatiti kako rade procesi . UNIX rules...

671/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

Matija Čupen

SOCKETS
UNIX DOMAIN, NETWORK

672/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

PREGLED TCP/IP PROTOKOLA

TCP/IP i Internet
1969. godine ARPA, Advanced Research Projects Agency, osnovala je istraživački i
izvedbeni projekt izrade eksperimentalne “packet-switching” mreže. Mreža, nazvana
ARPAnet, bila je napravljena zbog proučavanja tehnika slanja robusnih i pouzdanih podataka.
Mnoge tehnike modernih podatkovnih komunikacija razvijene su sa ARPAnet
eksperimentalnom mrežom.
Eksperimentalna mreža bila je toliko uspješna da su je mnoge organizacije, povezane na
nju, počele koristiti za svakodnevnu komunikaciju. 1975. godine ARPAnet je iz
eksperimentalne postala vrlo razvijena “operativna” mreža i odgovornost administriranja je
preuzela DCA (Defense Communications Agency) kasnije promijenila ime u DISA (Defense
Information System Agency).
TCP/IP protokoli usvojeni su kao vojni standardi (MIL STD) 1983. godine, i svi
“hostovi” spojeni na mrežu bili su primorani prijeći na nove protokole. Da bi olakšala
prijelaz, DARPA4, je zatražila Bolta, Beraneka i Newmana (BBN) da implementiraju TCP/IP
protokole u Berkley (BSD) Unixu. Tako je započeo brak Unixa i TCP/IP-a.
Kako je sa vremenom prihvaćen TCP/IP standard, termin Internet se počeo koristiti u
svakodnevnoj upotrebi. 1983. ARPAnet se podijelila na MILNET i novu manju ARPAnet.
Internet termin se koristio za cjelokupnu mrežu: MILNET plus ARPAnet.
Počevši od 1983. godine i konstantno rastući jedna stvar je ostala konstanta: Internet je
napravljen na TCP/IP protokolu.

Podatkovni komunikacijski modeli

Arhitektonski model razvijen od International Standards Organization (ISO) je


konstantno korišten za opisivanje strukture i funkcije podatkovnih komunikacijskih protokola.
Ovaj model, nazvan Open System Interconnect (OSI) Reference model, predstavlja osnovnu
referencu za promatranje komunikacija. Termini definirani ovim modelom su vrlo razumljivi i

4
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 istraživanja ostala je ista

673/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

naveliko korišteni u komunikacijskoj organizaciji da je nemoguće govoriti o podatkovnoj


komunikaciji bez korištenja OSI terminologije.
OSI model sadrži 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 mreže. Slika 1.1. prikazuje svaki sloj sa imenom i
sadrži kratki funkcionalan opis. Gledajući 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 korištene od bilo kojeg broja protokola. Dalje, svaki sloj može
sadržavati više protokola gdje svaki provodi uslugu odgovarajući funkciji sloja. Na primjer,
file-transfer protokol i elektronička pošta oboje provode korisničke usluge i oboje su dio
aplikacijskog sloja (Application Layer).

674/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

Arhitektura TCP/IP protokola

Generalno gledajući TCP/IP protokol sastavljen je od manje slojeva nego sedam


korištenih u OSI modelu. Mnogi opisi TCP/IP definiraju tri do pet funkcionalnih slojeva
arhitekture protokola. Četvero-slojni model prikazan na slici 1.2. baziran je na tri sloja
(Application, Host-to-host, Network Access) sa dodatnim internet slojem.

Isto kao i u OSI modelu, podaci se šalju prema dolje niz stack kada su poslani na mrežu
i gore uz stack kada su primljeni sa mreže. Struktura TCP/IP-a izgleda na način da se podaci
šalju niz protokol stack iz aplikacijskog sloja sve do fizičke mreže. Svaki sloj u stacku dodaje
kontrolnu informaciju da bi potvrdili sigurnu dostavu. Ova kontrolna informacija naziva se
zaglavlje (header) jer je postavljen na početak podataka koji se trebaju poslati. Svaki sloj
tretira sve informacije koje primi iz sloja iznad kao podatke i stavlja svoje zaglavlje na
početak informacije. Kada su podaci primljeni, događa se suprotno, svaki sloj “skida“ svoje
zaglavlje prije nego šalje podatke sloju iznad. Slika 1.3.

slika 1.3.

675/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

NETWORKING

Uvod

Linux kernel podržava mnogo različitih mrežnih arhitektura (TCP/IP je samo jedna od
njih), sa nekoliko implementiranih alternativnih algoritama za razvrstavanje mrežnih paketa,
uključujući i programe koji olakšavaju sistemskim administratorima “postaviti” router,
gateway, firewall, pa čak i jednostavan World Wide Web server, direktno na nivou kernela.
Trenutni kôd, inspiriran sa originalnom Berkley Unix implementacijom, je Net-4. Kako
i samo ime govori, ovo je četvrta glavna verzija Linux networkinga. Slično kao i VFS, kôd
koristi objekte za provedbu sukladnog interfacea do velikog broja dostupnih arhitektura.
Suprotno od VFS-a, networking kôd je organiziran u slojeve (layers), gdje svaki od njih ima
vrlo dobro definiran interface. Pošto podaci poslani mrežom nisu ponovo upotrebljivi, nema
potreba za spremanjem u cache. Potrebom za što većom isplativošću, Linux izbjegava
kopiranje podataka unutar slojeva. Originalni podaci su spremljeni u memory buffer, koji je
dovoljno velik da sadrži informacije potrebne svakom sloju.

Mrežne arhitekture

Mrežna arhitektura opisuje kako je pojedina kompjuterska mreža napravljena.


Arhitektura definira grupu slojeva gdje bi svaki trebao imati vrlo dobro definiranu namjenu.
Programi u svakom sloju komuniciraju koristeći razmjenjive skupove pravila i konvencija
(tzv. protokol).
Generalno gledajući, Linux podržava veliki broj različitih mrežnih arhitektura. Neke od
njih su:
name mrežna arhitektura i/ili protokol
PF_APPLETALK Appletalk
PF_BLUETOOTH Bluetooth
PF_BRIDGE Multiprotocol bridge
PF_DECnet DECnet
PF_INET IPS’s IPv4 protocol

676/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

PF_INET6 IPS’s IPv6 protocol


PF_IPX Novell IPX
Unix domain socket (local
PF_LOCAL, PF_UNIX
communication)
IPS’s IPv4/IPv6 protocol low-level
PF_PACKET
access
PF_X.25 X25

IPS (Internet Protocol Suite) je mrežna arhitektura Interneta, ponekad nazvana TCP/IP
mrežna arhitektura zbog glavnih protokola.

Mrežna kartica

Mrežna kartica (NIC - Network interface card) je specijalna izlazno/ulazna jedinica koja
plasira izlazne podatke do umreženog računalnog sistema i prima pakete od istih sistema u
memoriju kernela.
Počevši sa BSD-om, svi Unix sistemi dodjeljuju različito ime za svaku mrežnu karticu
instaliranu na računalu; npr. prva mrežna kartica dobiva ime eth0. Umjesto korištenja
filesistema, sistemski administrator mora postaviti vezu između imena i mrežne adrese. BSD
Unix je predstavio novu grupu sistemskih poziva koji su postali standard programiranja
modela za mrežne uređaje.

BSD sockets

Generalno gledajući, svaki operacijski sustav mora definirati odgovarajući Application


Programming Interface (API) između korisničkog moda programa i “mrežnog kôda”. Linux
mrežni API je baziran na BSD socketima. Predstavljeni su u Berkley UNIX 4.1cBSD i
dostupni su u gotovo svakom operacijskom sustavu sličnom Unixu.
Socket je dvosmjerna komunikacijska jedinica koja može biti korištena za
komuniciranje sa drugim procesima na istom računalu ili sa procesom pokrenutim na drugom
računalu. Internet programi kao Telnet, rlogin, talk ili World Wide Web koriste sockete.

677/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

Socket je komunikacija između tzv. ulaznih vrata i krajnje točke kanala koji povezuje dva
procesa. Podaci se pošalju na “ulazna vrata” i nakon nekog vremena pojave se na drugoj
strani (izlazu). Komunikacijski procesi mogu biti na različitim računalima. Mrežni kôd
Kernela prosljeđuje podatke između krajnjih točaka.
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
uključen u polju u.socket_i sockfs inode-a.

metode BSD socket objekta


metoda opis
release zatvara socket
bind dodjeljuje lokalnu adresu (ime)
connect uspostavlja vezu (TCP) ili dodjeljuje remote adress (UDP)
socketpair kreira par socketa za dvosmjernu razmjenu podataka
accept čeka zahtjev za spajanje
getname vraća lokalnu adresu
ioctl implementira ioctl()komande
listen inicijalizira socket da prihvati zahtjev za spajanjem
shutdown zatvara pola ili obje polovice full-duplex veze
setsockopt postavlja vrijednosti socket flagovima
getsockopt uzima vrijednosti socket flagova
sendmsg šalje paket socketu
recvmsg prima podatak od socketa
mmap file memory-mapping (ne koriste mrežni socketi)
kopira podatke direktno iz/prema fajlu (sendfile() sistemski
sendpage
poziv)

678/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

INET sockets

INET socketi su strukture podataka tipa struct sock. Svaki BSD socket koji pripada IPS
mrežnoj arhitekturi sadrži adrese INET socketa u sk polju socket objekta.
INET socketi su potrebni jer socket objekti (opisujući BSD sockete) uključuju samo
polja koja su značajna za sve mrežne arhitekture. Ali, kernel mora također zapamtiti i
nekoliko drugih informacija za svaki socket bilo koje mrežne 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 također definira neke metode specifične tipu transporta protokola
(TCP ili UDP). Metode spremljene u strukturi podataka tipa proto:

metode INET socket objekta


metoda opis
close close the socket
connect uspostavlja vezu ili dodjeljuje remote adress
disconnect prekida uspostavljenu vezu
accept čeka zahtjev za spajanje
ioct1 implementira ioctl()komande
init INET socket objekt konstruktor
destroy INET socket objekt destruktor
shutdown zatvara pola ili obje polovice full-duplex veze
setsockopt postavlja vrijednosti socket flagovima
getsockopt uzima vrijednosti socket flagova
sendmsg šalje paket socketu
recvmsg prima podatak od socketa
bind dodjeljuje lokalnu adresu (ime)
backlog_rcv funkcija pozvana kada prima paket
hash doda INET socket per-protocol hash tablici
unhash makne INET socket iz per-protocol hash tablice
get_port dodjeljuje broj porta INET socketu

679/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

sock objekt sadrži otprilike 80 polja od kojih su mnoga pokazivači na druge objekte,
tablice, metode ili druge strukture podataka.

Koncepti socketa

Kada kreiramo socket moramo definirati tri parametra:


način komuniciranja (communication style)
namespace
protokol.

Communication style
Način 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 određuje kako su ti paketi podržani i kako su adresirani
od pošiljaoca do primatelja.
- Connection style garantira isporuku svih paketa po redu kako su poslani. Ako su paketi
izgubljeni ili je promijenjen redoslijed zbog problema na mreži, primatelj automatski zahtjeva
njihovo ponovno slanje od pošiljaoca. Connection-style socket je kao telefonski poziv: Adresa
pošiljaoca i primaoca je fiksna na početku komunikacije kada je veza uspostavljena.
- Datagram style ne garantira isporuku ili redoslijed dolaska paketa. Paketi mogu biti
izgubljeni ili promijenjenog redoslijeda zbog problema na mreži. Svaki paket mora biti
označen sa svojom destinacijom i nije zagarantirano da će biti isporučen. Sistem garantira
samo “najbolju volju”, tako paketi mogu nestati ili stići u krivom redoslijedu kako su poslani.
Datagram-style sockets ponašaju se više kao slanje pisma poštom: Pošiljatelj specificira
adresu primaoca za svaku individualnu poruku.

Namespace
Socket namespace određuje kako su zapisane adrese socketa. Adresa socketa određuje
jedan kraj “veze” socketa. Na primjer, adrese socketa u “local namespaceu” su obična imena
datoteka. U “Internet namespaceu” adresa socketa je sastavljena od Internet adrese (također

680/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

znane kao Internet Protocol adress ili IP address) hosta spojenog na mrežu i broj porta. Broj
porta raspoznaje višestruke sockete na istom hostu.

Protokol
Protokol specificira kako su poslani podaci. Neki protokoli su TCP/IP, AppleTalk
mrežni protokol i UNIX lokalni komunikacijski protokol. Nisu sve kombinacije stilova,
namespacea i protokola podržane.

Socket buffer

Svaki pojedini paket poslan kroz mrežnu jedinicu sastoji se od nekoliko dijelova
informacije. Svima osim payloada, podaci čije je slanje prouzročeno kreiranjem samoga
paketa, svi slojevi mreže, počevši od data link sloja i završavajući na transportnom sloju,
dodaju neke kontrolne informacije. Format paketa kontroliranih od mrežne kartice su
prikazani na slici.

Cijeli paket je napravljen različitim funkcijama u nekoliko dijelova. Na primjer,


UDP/TCP zaglavlje i IP zaglavlje su sastavljeni od funkcija zavisno transportnom i mrežnom
sloju IPS arhitekture, dok su zaglavlje hardvera i trailera, napisani odgovarajućom metodom
specificiranom mrežnom karticom.
Mrežni kôd Linuxa sadrži svaki paket u velikom memorijskom području nazvanom
socket buffer. Svaki socket buffer je definiran sa strukturom podatka tipa sk_buff koja
sadrži, uz mnoge druge stvari, pokazivače na slijedeće strukture podataka:
socket buffer
payload – podaci korisnika (unutar socket buffera)
the data link trailer (unutar socket buffera)
INET socketi (sock object)

681/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

descriptor zaglavlja transportnog sloja


descriptor zaglavlja mrežnog sloja
descriptor of the data link layer header
the destination cache cache entry (dest_entry object)

Struktura podataka sk_buff sadrži mnoga druga polja, kao ”identifikator” mrežnog
protokola korišten za slanje podataka (checksum field) i vrijeme dolaska primljenih paketa.
Kao glavno pravilo, kernel izbjegava kopiranje podataka ali jednostavno prosljeđuje
sk_buff descriptor pointer svakom mrežnom sloju. Na primjer, kada priprema paket za slanje,
transportni sloj počinje kopirati payload iz user mode buffera na višu poziciju socket buffera;
tada transportni sloj dodaje svoje TCP ili UDP zaglavlje prije payloada. Nakon toga, kontrola
se šalje mrežnom sloju, koji prima socket buffer descriptor i dodaje IP zaglavlje prije
transportnog zaglavlja. Konačno, 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 – uništava socket
- connect – kreira vezu između dva socketa
- bind – imenuje server socket sa adresom
- listen – konfigurira socket da zapamti uvjete
- accept – prihvaća vezu i kreira novi socket za spajanje

Kreiranje i uništenje socketa


socket i close funkcije kreiraju i uništavaju sockete. Kada kreiramo socket,
specificiramo tri parametra: namespace, communication style i protocol. Za namespace
parametar koristimo konstante koje počinju sa PF_ (protocol families). Na primjer,
PF_LOCAL ili PF_UNIX određuju lokalni namespace, dok PF_INET određuje Internet
namespace. Za communication style parametar koristimo konstante koje počinju sa SOCK_.

682/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

Za connection-style sockete koristimo SOCK_STREAM a za datagram-style sockete


koristimo SOCK_DGRAM.
Treći parametar, protokol, određuje low-level mehanizme za slanje i primanje podataka.
Svaki protokol je validan za određenu namespace-style kombinaciju. Zato jer je uglavnom
jedan protokol najbolji za svaki takav par, definirajući 0 je uglavnom ispravan protokol. Ako
socket uspije, vraća file descriptor za socket. Možemo čitati iz ili pisati u socket koristeći
read, write. Kada završimo sa socketom zovemo close da ga uklonimo.

Connect
Da bi ostvario vezu između dva socketa, klijent zove connect, određujući 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. Treći argument je dužina, 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, dodijelivši mu adresu


na njegov socket, postavljajući poziv na listen koji omogućuje veze do socketa, postavljajući
pozive na accept dolazećim vezama, i na kraju zatvarajući socket. Podaci nisu čitani i pisani
direktno preko server socketa. Umjesto toga program svaki puta prima novu vezu; Linux
kreira zasebne sockete za korištenje prijenosa podataka preko te veze.
U ovom odlomku ćemo pokazati bind, listen and accept. Adresa mora biti dodijeljena
socketu servera koristeći bind ako je klijent mora pronaći. Prvi argument bind metode je
socket file descriptor. Drugi argument je pokazivač na adresnu strukturu socketa. Treći
argument je dužina adresne strukture, u byte-ovima. Kada je adresa dodijeljena connection-
style socketu, mora pozvati listen čime će pokazati da je server. Prvi argument listen metode
je socket file descriptor. Drugi argument određuje koliko je prihvaćenih veza u ”redu”
(queue). Ako je ”red” pun, dodatna spajanje biti će odbijena. To ne ograničava ukupan broj
veza koje server može obraditi. Ograničava jedino broj klijenata koji se pokušavaju spojiti a
nisu još bili prihvaćeni.

683/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

Server prihvaća zahtjev za spajanjem od klijenta pokrećući accept. Prvi argument


accept metode je socket file descriptor. Drugi argument pokazuje na adresnu strukturu
socketa koja je napunjena klijentovim adresama socketa. Treći argument je dužina, u byte-
ovima, adresne strukture socketa. Server može koristiti klijentovu adresu da utvrdi hoće li
stvarno komunicirati sa klijentom. Poziv za prihvaćanje kreira novi socket za komunikaciju sa
klijentom i vraća odgovarajući 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 možemo čitati podatke ali ne i ih maknuti iz ulaznog ”reda”.

Lokalni socketi

Proces spajanja socketa na istom računalu može 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 korištene samo kod kreiranja
veza.
Ime socketima je specificirano u struct sockaddr_un. Moramo postaviti sun_family
polje u AF_LOCAL, određujući da je ovo lokalni namespace. Polje sun_path određuje ime
datoteke za korištenje i može biti, najviše, 108 byte-ova dugačko. Bilo koje ime može biti
korišteno, 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
različita računala mogu dijeliti iste file-sisteme, samo procesi pokrenuti na istom računalu
mogu komunicirati sa lokalnim namespace socketima.
Jedini dozvoljeni protokol za lokalni namespace je 0.
Zbog toga što postoji u file-sistemu, lokalni socket se može izlistati kao i datoteka. Na
primjer:
%ls –l /tmp/socket
srwxrwx—x 1 user group 0 Nov 13 18:18 /tmp/socket

684/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

Primjer korištenja lokalnog namespace socketa

U ovom primjeru server program kreira lokalni namespace socket; “listens for
connection on it”. Kada primi vezu, čita tekstualne poruke i ispisuje ih sve dok se veza ne
zatvori. Ako je jedna od poruka “quit” server program gasi socket i završava sa radom.
Program uzima “path” do socketa kao argument iz komandne linije.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

/* Čite text it socketa i printa van. Nastavlja sve dok se socket


ne zatvori. Vraća nonZero ako klijent pošalje ”quit” */
int server (int client_socket)
{
while (1) {
int length;
char* text;

/* Prvo, čita dužinu textualne poruke iz socketa. Ako čitanje vrati


zero, klijent zatvara connection */
if (read (client_socket, &length, sizeof (length)) == 0)
return 0;
/* Alocira buffer za čuvanje texta */
text = (char*) malloc (length);
/* Čita text i printa ga */
read (client_socket, text, length);
printf ("%s\n", text);
/* Oslobađa buffer */
free (text);

685/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

/* Ako klijent pošalje 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 prihvaća spajanja. Server radi sa svakim klijentom.


Nastavlja sve dok klijent ne pošalje ”quit” poruku */
do {
struct sockaddr_un client_name;
socklen_t client_name_len;
int client_socket_fd;

/* Prihvaća 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

/* 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 između dva procesa na istom


računalu. Internet-domain sockets, na drugoj strani, mogu se koristiti za spajanje procesa na
različitim umreženim računalima.
Proces spajanja socketa preko Interneta koristi internet namespace prezentirano sa
PF_INET. Najčešći protokoli su TCP/IP. Internet protokol (IP), low-level protokol, pokreće
pakete kroz Internet, razdvajajući i sastavljajući pakete, ako je potrebno. On garantira samo
“best-effort” dostavljanje, tako da paketi mogu nestati ili promijeniti redoslijed tijekom
transporta. Svako participirajuće računalo je specificirano koristeći 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 između kompjutera i garantira da su podaci preneseni pouzdano i pravilnim
redom.
Internet socket adrese sadrže dva dijela: “stroj” i broj porta. Ova informacija je
pospremljena u struct sockaddr_in varijablu. Postavimo sin_family polje u AF_INET da
pokažemo da je ovo Internet namespace adresa. sin_addr polje sadrži internet adrese željenog
nam računala kao 32-bitni integer IP broj. Broj porta određuje računalu drugačije sockete.
Različita računala spremaju vrijednosti u različitom redoslijedu byte-ova. Zbog toga
koristimo htons da konvertiramo broj porta prema mrežnom redoslijedu byte-ova.

687/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

#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 pokušava 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

{
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Sockets, unix domain, network

Parovi socketa

Kao što smo prije vidjeli, pipe funkcija kreira dva file descriptora za početak i za kraj
pipe-a. Pipe-ovi su ograničeni jer file descriptori moraju biti korišteni kao povezani procesi i
jer je veza nedirektna. socketpair funkcija kreira dva file descriptora za dva spojena socketa
na istom računalu. Ovi file descriptori omogućavaju dvosmjernu komunikaciju između
povezanih procesa. Njihova tri parametra su jednaka kao i kod poziva socket: određuju
domenu, stil spajana i protokol. Zadnji parametar je niz dva integera, koji se puni sa file
descriptorima od dva socketa, slično pipe.
Kada zovemo socketpair, moramo specificirati PF_LOCAL kao domenu.

690/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb TCP/IP

Saša Dragić

TCP/IP

691/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

UVOD

Kratka povijest TCP/IP-a

TCP/IP je u zadnjih 10-tak godina postao gotovo standard za prijenos podataka


mrezom. To se najvećim dijelom desilo rastom i popularizacijom Interneta, te zbog potrebe za
komunikacijom između različitih računala koja koriste različite operativne sustave. Npr. u
zadnje vrijeme većina mobilnih telefona ima implementiran TCP/IP stack.

Kasnih 60-tih američko ministarstvo obrane (DOD) došlo je do zaključka da ima


problema s prenošenjem podataka između odjela (osoblje, istraživački laboratoriji,
sveučilišta...) jer je svatko koristio drugi računalni sustav i različitu topologiju mreže te
različite mrežne protokole.

Problem međusobne komunikacije su dodijelili agenciji za napredna istraživanja


(ARPA). ARPA je u suradnji sa sveučilištima i proizvođačima računala došla do protokola od
kojih se razvio TCP/IP.

Open System Interconnection (OSI) model

Zbog već spomenute problematike u komunikaciji između različitih računala i


operativnih sustava 1977 Međunarodna organizacija za standardizaciju (ISO) izradila je OSI
model.
OSI model ne specificira protokol već sluzi samo da bi po njemu mogli napraviti
protokol, tj. vise protokola koji koriste jedan drugi za prijenos.

692/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

OSI model je podijeljen na 7 dijelova:

Iz ove podjele, vidi se da je OSI model tako zamišljen da svaka razina koristi svoj
protokol kojeg možemo proizvoljno zamijeniti a da razine, tj. protokoli iznad dalje rade bez
problema. Npr. ethernet kao fizički layer može koristiti BNC ili UTP ili recimo radio valove,
dok IP može koristiti ethernet, ppp, token ring...

693/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

TCP/IP PROTOKOL

DARPA (TCP/IP) model

Dizajneri TCP/IP protokola odlučili su pojednostavniti OSI model kako bi poboljšali


performanse i olakšali implementaciju. Ovaj model je sličan ISO OSI modelu ali ima samo 4
razine. Slika ispod pokazuje korelacije između razina:

Network Interface

Network interface sluzi za fizički prijenos podataka između računala i uglavnom je


implementiran u hardwareu. Npr. ethernet, token ring...

Kratak opis etherneta:


Ethernet je postao gotovo standard za lokalno umrežavanje. Postoji vise standarda, od
kojih ću navesti češće korištene:

694/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

• 10baseT – koristi UTP kabel


• 100baseT – koristi UTP kabel
• 10/100baseT – koristi UTP kabel i ima mogućnost automatskog prepoznavanja brzine
veze, najčešće korištena
• Gigabit ethernet (1000baseX) – postoji vise verzija, koristi ili optički ili UTP kabel

Ethernet koristi 2 protokola paralelno MAC i LLC. MAC se brine za fizičko adresiranje
dok LLC obavlja nešto malo vise funkcije vezane uz adresiranje na samom uređaju.

Svaka proizvedena mrežna kartica ima jedinstvenu MAC adresu (djelomično ju je


moguće softwareski mijenjati).

Internet protocol (IP)

Internet protocol (IP) se koristi za bespojnu komunikaciju između računala i kao sto se
vidi iz dijagrama gore, za prijenos ga koriste TCP i UDP. On je odgovoran za pravilno
adresiranje računala i prosljeđivanje paketa, ali ne garantira njihovo dospijeće. IP također
poruke može razbiti na manje pakete te ih sastaviti na odredištu s tim da svaki dio može

695/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

krenuti drugim putem kroz mrežu. Ako paketi ne stignu pravim redoslijedom IP ce ih sastaviti
u ispravan paket.

IP datagram:

IP header:

696/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Version
o 4 bita, verzija ip headera, trenutno se koristi verzija 4. Sljedeća verzija je
IPv6, koja se zasad koristi samo eksperimentalno.
IP Header length
o 4 bita, govori koliko je 32-bitnih rijeci ip header dugačak.
Type of service
o 8 bitova, govori o kvaliteti veze
Total length
o 2 bytea, označava ukupnu duljinu IP paketa
Identification
o 2 bytea, koristi se za da bi identificirali specifični datagram između
pošiljatelja i primatelja. Za svaki sljedeći IP paket vrijednost se
inkrementira.
Flags
o 3 bita, označavaju da li je paket pogodan za fragmentaciju, te da li je
fragmentiran
Fragment offset
o 13 bitova, označava mjesto gdje se fragment nalazi u cijeloj poruci
(potrebno za sastavljanje poruke)
Time to live
o 1 byte, označava preko koliko prijelaza paket može proći dok se ne
odbaci. Svaki IP router prilikom prosljeđivanja paketa dekrementira
njegovu vrijednost, a ako je 0, paket se dalje ne prosljeđuje.
Protocol
o 1 byte, označava koji protokol se nalazi iznad, tj. čiji paket IP paket
sadrži

Protokoli:
1 ICMP
2 IGMP
4 IP in IP encapsulation
6 TCP

697/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

17 UDP
41 IPv6
47 Generic Routing Encapsulation (GRE)
50 IP Security Encapsulating Security Payload (ESP)
51 IP Security Authentication Header (AH)
89 OSPF

Header checksum
o 2 bytea, osigurava integritet headera
Source address
o 4 bytea, označava adresu pošiljatelja poruke
Destination address
o 4 bytea, označava adresu primatelja poruke
Options and Padding
o dodatne opcije i dopuna paketa da bi njegova veličina bila djeljiva sa 32

Transport layer

Trasnportna razina je zadužena za dostavljanje paketa i osiguravanje njegovog


integriteta. Najviše se koriste TCP i UDP.

TCP protokol:
TCP je obostrani spojni protokol koji spaja 2 računala (TCP konekcija može biti i
unutar jednog računala, mnoge aplikacije komuniciraju na taj način, npr. X window system),
te osigurava da paketi na odrediste dođu traženim redoslijedom.

TCP uspostavlja i održava konekciju transparentno korisniku. Objašnjenje samog


protokola uspostavljanja, održavanja i prekida komunikacije preopširno za ovaj dokument.

698/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

o 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 početnog okteta segmenta
Acknowledgment numberpolje od 4 bytea, broj slijedećeg okteta korisnikove
poruke, ujedno i kumulativna potvrda
Data Offset
o polje od 4 bytea, označava početak podataka u paketu, ujedno označava
veličinu TCP headera
Reserved
o 6 bitova rezerviranih za buduću uporabu, postavljeno na 0
Flags
o 6 bitova koje označavaju TCP flagove: URG, ACK,PSH, RST, SYN, FIN
Window
o polje od 2 bytea, govori koliko velik buffer pošiljatelj poruke ima za primanje
poruka. TCP/IP stack drugog sudionika treba slati pakete velike maksimalno
do veličine prozora. Ako je poslana 0, poruke se dalje ne šalju, sve dok se ne
pošalje nova poruka sa vrijednosti većom 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 Network News Transfer Protocol (NNTP)
20 FTP Server (data channel)
21 FTP Server (control channel)
23 Telnet Server
25 Simple Mail Transfer Protocol (SMTP)
69 Trivial File Transfer Protocol (TFTP)
80 Hypertext Transfer Protocol (HTTP; Web server)
139 NetBIOS Session Service

700/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

339 Lightweight Directory Access Protocol (LDAP)


445 Direct-Hosted Server Message Block (SMB)

UDP protokol:
UDP je bespojni protokol gdje nemamo informaciju da li je paket stigao ili nije. UDP
samo prosljeđuje pakete protokolu iznad koji se mora brinuti za njihovo pravilno tumačenje.
Kako nema overheada i odmah prosljeđuje 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 može biti 0
Destination port
o polje od 2 bytea koje definira port na koji stiže UDP poruka, tj. definira koja
aplikacija na application layeru prima poruku, zajedno sa ip adresom iz ip
headera jedinstveno označava kojem processu tj. aplikaciji je poruka poslana

701/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Length
o polje od 2 bytea koje označava duljinu. Minimalna duljina je 8 byte-ova a
teoretska maksimalna 65,515 (duljina ip paketa minus headeri). Prava
maksimalna duljina je ograničena MTU-om linka preko kojeg se prenose
paketi. Ovo polje je redundantno zato sto se duljina paketa uvijek može
izračunati iz duljine IP paketa.
Checksum
o polje od 2 bytea koje osigurava integritet podataka

Poznatiji UDP portovi:


53 DNS
67 BOOTP client (Dynamic Host Configuration Protocol [DHCP])
68 BOOTP server (DHCP)
69 TFTP
137 NetBIOS Name Service
138 NetBIOS Datagram Service
161 Simple Network Management Protocol (SNMP)
445 Direct hosting of Server Message Block (SMB) datagrams over TCP/IP
520 RIP
1812, 1813 Remote Authentication Dial-In User Service (RADIUS)

Application layer

Application razina definira protokol koji korisnik koristi da bi razmjenjivao njemu


suvisle informacije. Npr. poslao mail, pogledao sadržaj neke web stranice, udaljeno se spojio
na drugo računalo...
Primjeri application protokola: Telnet, FTP, SMTP, NFS, DNS, HTTP

702/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

IP ADRESSING, SUBNETS AND ROUTING

IP adresiranje

IP protokol zahtjeva da svako računalo, točnije mrežni interface, na mreži ima


jedinstvenu IP adresu. IP adresa se sastoji od 4 bytea, a mi ju pišemo dekadski, svaki byte
posebno odvojeno točkama. Prvi dio IP adrese je mrežna adresa, a drugi dio je adresa
računala, a odnos između njihovih duljina ovisi o klasi mreže i subnet masci sto ce biti
objašnjeno poslije.

Klase IP adresa:
IP adrese su podijeljene u klase, ovisno o primjeni i veličini organizacije kojoj se
dodjeljuju. Najčešće korištene su A, B i C. Ovim klasama su definirane duljine mrežne adrese
i duljine adrese računala. Klasa A koristi prvih 8 bitova za adresiranje mreže, a zadnjih 24 za
adresiranje računala i dodjeljuje se uglavnom ogromnim organizacijama. Klasa B koristi 16
bitova za adresu mreže i 16 bitova za adresu računala i dodjeljuje se uglavnom velikim
organizacijama i tvrtkama (ISP-ovi i slično), trenutno tih adresa najviše nedostaje. Klasa C
koristi 24 bita za adresu mreže, a 8 za adresu računala. Dodjeljuje se većini organizacija i
tvrtki. Ukoliko postoji potreba za vise od 254 ali znatno manja od 65.534 računala, 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 računala postavimo na 0, dobili smo adresu mreže, a
ako ih sve postavimo na 1 dobili smo brodcast adresu.

Npr.

703/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

199.10.2.0 – adresa mreže


199.10.2.255 – brodcast adresa mreže
199.10.2.4– jedno računalo na mreži

Loopback adrese:
Za testiranje i mrežnu komunikaciju između aplikacija na istom računalu koristi se
specijalna loopback mrežna adresa:

127.0.0.0

Bilo koja regularna adresa na toj mreži je adresa samog računala, najčešće se koristi:

127.0.0.1

Privatne IP adrese:
Za mreže koje se ne planiraju spajati na internet, ili se planiraju spajati na internet
pomoću jednog gatewaya koji koristi NAT (Network Adress Translation, poznato još kao i IP
Masquarade, IP adresa se u tom slučaju maskira IP adresom gatewaya) predviđene su privatne
IP adrese. Zapravo, za lokalnu mrežu možemo koristiti bilo koje adrese, ali bolje je koristiti
privatne da ne bi imali problema sa slučajnim 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Subnets and subnet masks

Kako zbog fizičkih problema ne možemo spojiti mnogo računala na istu mrežu
(nemogućnost hardwareske izvedbe, patile bi performanse) velike mreže dijelimo na
subnetove (podmreže) pomoću subnet maski. pomoću subnet maske određujemo (neovisno o
klasi mreže) koji dio adrese router smatra za mrežnu, a koji dio za adresu računala, tj. prema
njoj zna koje adrese routa prema van, a koje zadržava na lokalnoj mreži.

Subnet maska je jednake veličine kao IP adresa, znaci 32 bita. Adresa mreže je
označena sa bitom 1, a adresa računala sa bitom 0, tako da ako recimo klasu B hoćemo
podijeliti na 256 adresa dobijemo subnet masku 255.255.255.0.

Kako smo došli 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Primjer 2:

Ako od adrese računala u klasi C uzmemo 3 bita možemo kreirati 8 mreža 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 mreža sa sljedećim 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 fizički nije moguće napraviti jednu veliku mrežu na koju ce se spojiti sva
računala, koriste se routeri. Router je uređaj koji ovisno o svojoj routing tablici pakete sa
jednog mrežnog interfacea prosljeđuje na drugi interface. Zapravo većina operativnih sustava
unutar samog tcp/ip stacka ima implementirana osnovnu verziju routera kojeg onda

706/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

konfiguriramo tako da mu upišemo adresu gatewaya (routera). U tom slučaju sve pakete za
koje se računalo 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 mrežama uglavnom postoji vise putova od jednog do drugog mjesta, tj. ip adrese,
routeri tu uglavnom koriste neki od protokola za dinamičko routanje.

Primjer routing tablice na Linux računalu:

Kernel IP routing table


Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0

Primjer routing tablice na windows XP računalu:

==============================================================
=============
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 (3C905B-
TX)
==============================================================
=============
==============================================================
=============
Active Routes:
Network Destination Netmask Gateway Interface Metric

707/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

0.0.0.0 0.0.0.0 141.29.127.254 141.29.127.160 20


127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
141.29.127.0 255.255.255.0 141.29.127.160 141.29.127.160 20
141.29.127.160 255.255.255.255 127.0.0.1 127.0.0.1 20
141.29.255.255 255.255.255.255 141.29.127.160 141.29.127.160 20
192.168.0.0 255.255.255.0 192.168.0.1 192.168.0.1 20
192.168.0.1 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.0.255 255.255.255.255 192.168.0.1 192.168.0.1 20
192.168.61.0 255.255.255.0 192.168.61.1 192.168.61.1 20
192.168.61.1 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.61.255 255.255.255.255 192.168.61.1 192.168.61.1 20
192.168.132.0 255.255.255.0 192.168.132.1 192.168.132.1 20
192.168.132.1 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.132.255 255.255.255.255 192.168.132.1 192.168.132.1 20
224.0.0.0 240.0.0.0 141.29.127.160 141.29.127.160 20
224.0.0.0 240.0.0.0 192.168.0.1 192.168.0.1 20
224.0.0.0 240.0.0.0 192.168.61.1 192.168.61.1 20
224.0.0.0 240.0.0.0 192.168.132.1 192.168.132.1 20
255.255.255.255 255.255.255.255 141.29.127.160 141.29.127.160 1
255.255.255.255 255.255.255.255 192.168.0.1 192.168.0.1 1
255.255.255.255 255.255.255.255 192.168.61.1 192.168.61.1 1
255.255.255.255 255.255.255.255 192.168.132.1 192.168.132.1 1
Default Gateway: 141.29.127.254
==============================================================
=============
Persistent Routes:
None

708/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

OSNOVE PROGRAMIRANJA TCP/IP-A NA UNIXU

Uvod

Ovdje ćemo objasniti osnovne sistemske funkcije za rad sa socketima na Unixu, te


pokazati primjer TCP klijenta i servera i program za slanje, te primanje UDP paketa.

Sistemske funkcije za rad sa socketima

• socket
Socket je komunikacijski kanal. Kada se 2 procesa spoje preko socketa, koriste njegov
descriptor za čitanje i pisanje. Socket sistemski poziv uzima sljedeće argumente:

int domain
int type
int protocol

Postoji vise domena za sockete, a one su definirane u /usr/include/sys/socket.h.

AF_UNIX—UNIX internal protocols


AF_INET—ARPA Internet protocols (most frequently used option)
AF_ISO—International Standards Organization protocols
AF_NS—Xerox Network System protocols

Gotovo uvijek ćemo koristiti AF_INET protokol. Postoji vise tipova socketa:

SOCK_STREAM—Provides a reliable, sequenced, two-way connection (most


frequently
used option)
SOCK_DGRAM—Connectionless and unreliable connection
SOCK_RAW—Used for internal network protocols (superuser only)

709/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

SOCK_SEQPACKET—Only used in AF_NS protocol


SOCK_RDM—Not implemented

Gotovo uvijek ćemo koristiti SOCK_STREAM tip socketa. Treći 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

• listen
Nakon smo socket kreirali i vezali uz proces, proces serverskog tipa može pozvati listen
funkciju da čeka na nadolazeće socket konekcije. Argumenti su:

int socket
int input_queue_size

Prvi argument je socket deskriptor koji nam je vratio socket, drugi je veličina queua, tj.
koliko konekcija može čekati u redu. Ako ćemo koristiti fork da bi obrađivali svaku konekciju
u posebnom procesu broj ne mora biti velik, ali za jednostavnije servere lakše je postaviti
vrijednost na nešto veću i obrađivati 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ć djelomično
objasnili i još ćemo objasniti u primjeru.

• recv
Recv koristimo za prihvaćanje poruka sa socketa kojeg smo već spojili. Postoje još
recvfrom i recvmsg ali oni se koriste za prihvaćanje poruka koje nisu spojno orijentirane pa ih
za sad nećemo spominjati.
Argumenti su:

int socket
void * buf
int buf_len
unsigned int flags

711/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Socket, deskriptor spojenog socketa. Buf je pointer na komad memorije gdje ćemo
spremiti podatke. Drugi argument govori koliko je velik alociran komad memorije. A treći su
zastavice koje kombiniramo sa |.

MSG_OOB—Process out-of-band data (useful for handling high priority control


messages), usually zero is used for normal (not out of band) behavior
MSG_PEEK—Peek at an incoming message without reading it
MSG_WAITALL—Wait 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. Treći argument govori koliko je velika poruka koju treba poslati. Četvrti
parametar je uvijek 0 u slijedećim primjerima, ali može biti (iako se koristi jako rijetko):

MSG_OOB—Process 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_DONTROUTE—Do not use routing

Primjer TCP servera

Server iz primjera kreira jedan stalni socket za čekanje na zahtjeve, a kad se klijent
spoji, otvara se privremeni socket. Svaki put kad se klijent spoji novi privremeni socket se
otvara.

712/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 = accept(sock_descriptor, (struct sockaddr *)&pin,
&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.

713/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Primjer TCP klijenta

Klijent otvara privremeni socket, pošalje jednu poruku serveru i čeka na jednu poruku
nazad.

int socket_descriptor;
struct sockaddr_in pin;
struct hostent *server_host_name;

server_host_name = gethostbyname(“127.0.0.1”);

bzero(&pin, sizeof(pin));

pin.sin_family = AF_INET;
pin.sin_addr.s_addr = htonl(INADDR_ANY);
pin.sin_addr.s_addr = ((struct in_addr *)(server_host_name->h_addr))->s_addr;
pin.sin_port = htons(port);

socket_descriptor = socket(AF_INET, SOCK_STREAM, 0);

connect(socket_descriptor, (void *)&pin, sizeof(pin));

send(socket_descriptor, “test data”,

strlen(“test data”) + 1, 0);

recv(socket_descriptor, buf, 8192, 0);

close(socket_descriptor);

714/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Primjer programa za slanje UDP paketa

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

int port = 6789;


void main() {

int socket_descriptor; int iter = 0;


int process;
char buf[80]; // for sending messages
struct sockaddr_in address;

// Here, we use SOCK_DGRAM (for UDP) instead of SOCK_STREAM (TCP):


socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0);

memset(&address, 0, sizeof(address));

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(“127.0.0.1”); // local computer
address.sin_port = htons(port);

process = 1; // flag for breaking out the do-while loop

do {
sprintf(buf,”data packet with ID %d\n”, iter);
if (iter >20) {
sprintf(buf, “stop\n”);
process = 0;
}

715/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

sendto(socket_descriptor, buf,
sizeof(buf), 0, (struct sockaddr *)&address, sizeof(address));
iter++;
} while (process);
}

Primjer programa za primanje UDP paketa

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

char * host_name = “127.0.0.1”; // local host

void main() {

int sin_len;
int port = 8080;
char message[256];
int socket_descriptor;
struct sockaddr_in sin;
struct hostent *server_host_name;
server_host_name = gethostbyname(“127.0.0.1”);

bzero(&sin, sizeof(sin));

sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(port);

716/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

// 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Ivan Brčić i Neven Kmetić

TCP/IP API

718/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Uvod

Pregled TCP/IP protokola


TCP/IP i Internet

1969. godine ARPA, Advanced Research Projects Agency, osnovala je istraživčki i


izvedbeni projek izrade eksperimentalne “packet-switching” mreže. Mreža, nazvana
ARPAnet, bila je napravljena zbog proučavanja tehnika slanja robusnih i pouzdanih podataka.
Mnoge tehnike modernih podatkovnih komunikacija razvijene su sa ARPAnet
eksperimentalnom mrežom.
Eksperimentalna mreža bila je toliko uspješna da su je mnoge organizacije, povezane
na nju, počele koristiti za svakodnevnu komunikaciju. 1975. godine ARPAnet je iz
eksperimentalne postala vrlo razvijena “operativna” mreža i odgovornost administriranja je
preuzela DCA (Defense Communications Agency) koja je kasnije promijenila ime u DISA
(Defense Information System Agency).
TCP/IP protokol usvojen je kao vojni standard (MIL STD) 1983. godine, i svi
“hostovi” spojeni na mrežu bili su primorani prijeći na novi protokol. Da bi olakšala prijelaz,
DARPA5, je zatražila Bolta, Beraneka i Newmana (BBN) da implementiraju TCP/IP protokol
u Berkley (BSD) Unixu. Tako je započeao brak Unixa i TCP/IP-a.
Kako je s vremenom prihvaćen TCP/IP standard, termin Internet se počeo koristiti u
svakodnevnoj uporabi. 1983. ARPAnet se podijelila na MILNET i novu manju ARPAnet.
Internet termin se koristio za cijelokupnu mrežu: MILNET plus ARPAnet.

Podatkovni komunikacijski modeli


Arhitektonski model razvijen od International Standards Organization (ISO) je
konstantno korišten za opisivanje strukture i funkcije podatkovnih komunikacijskih protokola.
Ovaj model, nazvan Open System Interconnect (OSI) Reference model, predstavlja osnovnu
referencu za promatranje komunikacija. Termini definirani ovim modelom su vrlo razumljivi i
naveliko korišteni u komunikacijskoj organizaciji pa je nemoguće govoriti o podatkovnoj
komunikaciji bez korištenja OSI terminologije.

5
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 istraživanja ostala je ista

719/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

OSI model sadrži 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 mreže. Slika 1.1. prikazuje svaki sloj s imenom i sadrži kratak opis.
Gledajući sliku, protokoli su kao “blokovi” stavljeni jedan na drugi. Zbog toga se struktura
često naziva stack ili protocol stack.

7. Aplikacijski sloj (APPLICATION)


Mrežne primjene poput SMTP, HTTP, FTP i sl.
6. Prezentacijski sloj (PRESENTATION)
Formatiranje podataka i zaštita
5. Sjednički sloj (SESSION)
Uspostavljanje i održavanje sesija
4. Prijenosni sloj (TRANSPORT)
Osiguranje prijenosa s kraja na kraj
3. Mrežni sloj (NETWORK)
Isporuka jedinica informacije, uključujući usmjeravanje (routing)
2. Podatkovni sloj (DATA LINK)
Prijenos jedinica informacije s provjerom greške
1. Fizički sloj (PHYSICAL)
Prijenos binarnih podataka kroz medij
Slika - OSI model

Sloj ne definira jedinstven protokol. Svaki sloj definira podatkovne komunikacijske


funkcije koje mogu biti korištene od bilo kojeg broja protokola. Dalje, svaki sloj može
sadržavati više protokola gdje svaki provodi uslugu odgovarajući funkciji sloja. Na primjer,
protokol za prijenos podataka (FTP) i elektronička pošta (SMTP) provode korisnkičke usluge
i dio su aplikacijskog sloja (Application Layer).

Arhitektura TCP/IP protokola

Generalno gledajući TCP/IP protokol je sastavljen od manjeg broja slojeva od onih


korištenih u OSI modelu. Mnogi opisi TCP/IP definiraju sa tri do pet funkcionalnih slojeva
arhitekture protokola. Četvero-slojni model prikazan na slici 1.2. (pokazuje korelaciju između
OSI i TCP/IP modela). TCP/IP model je baziran na tri sloja (aplikacijski, prijenosni i mrežni)
i dodatnim internet slojem.

720/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

OSI Model

Application

Presentation

Session TCP/IP Model

Transport Application

Network Transport

Data link Internet

Physical Network interface


Slika - Usporedba OSI i TCP/IP modela

Isto kao i u OSI modelu, podaci se šalju prema dolje niz stack, kada su poslani na
mrežu, i gore uz stack, kada su primljeni sa mreže. Podaci se u TCP/IP-u šalju niz protokol
stack iz aplikacijskog sloja sve do fizičke mreže. Svaki sloj u stacku dodaje kontrolnu
informaciju da bi potvrdio sigurnu dostavu. Ova kontrolna informacija naziva se zaglavlje
(header) jer je postavljen na početak podatka koji se treba poslati. Svaki sloj tretira sve
informacije koje primi iz sloja iznad kao podatke i stavlja svoje zaglavlje na početak
informacije. Kada su podaci primljeni, događa se suprotno, svaki sloj “skida“ svoje zaglavlje
prije nego pošalje podatke sloju iznad.

User Application byte


data stream

TCP TCP
header segment

IP IP
header datagram

Network Network-level
header packet
Slika - Prolaz podataka kroz slojeve

721/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Networking na Linuxu

Linux kernel podržava mnogo različitih mrežnih arhitektura (TCP/IP je samo jedna od
njih), s nekoliko implementiranih alternativnih algoritama za razvrstavanje mrežnih paketa,
uključujući i programe koji olakšavaju sistemskim administratorima “postaviti” router,
gateway, firewall, pa čak i jednostavan World Wide Web server, direktno na nivou kernela.
Trenutni kôd Net-4 je inspiriran orginalnom Berkley Unix implementacijom. Kako i
samo ime govori, ovo je četvrta verzija Linux networkinga. Networking kôd je organiziran u
slojeve (layers), gdje svaki od njih ima vrlo dobro definiran interface. Pošto podaci poslani
mrežom 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 sadrži informacije potrebne svakom sloju.

Mrežne arhitekture

Mrežna arhitektura opisuje kako je pojedina računalna mreža napravljena. Arhitektura


definira grupu slojeva gdje bi svaki trebao imati vrlo dobro definiranu namjenu. Programi u
svakom sloju komuniciraju koristeći razmjenjive skupove pravila i konvencija (tzv. protokol).
Generalno gledajući, Linux podržava veliki broj različitih mrežnih arhitektura.
Neke od njih su:
name mrežna arhitektura i/ili protokol
PF_APPLETALK Appletalk
PF_BLUETOOTH Bluetooth
PF_BRIDGE Multiprotocol bridge
PF_DECnet DECnet
PF_INET IPS’s IPv4 protocol
PF_INET6 IPS’s IPv6 protocol
PF_IPX Novell IPX
PF_LOCAL, PF_UNIX Unix domain socket (local communication)
PF_PACKET IPS’s IPv4/IPv6 protocol low-level access
PF_X.25 X25
Tablica - Podržane arhitekture pod Linux-om

IPS (Internet Protocol Suite) je mrežna arhitektura Interneta, ponekad nazvana TCP/IP
mrežna arhitektura zbog glavnih protokola.

722/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Kratak opis etherneta


Ethernet je postao gotovo standard za lokalno umrežavanje. Postoji više standarda, a neki
od njih su:
• 10baseT – koristi UTP kabel
• 100baseT – koristi UTP kabel
• 100baseFX – koristi optički kabel
• Gigabit ethernet (1000baseX) – postoji više verzija
o 1000baseTX – koristi UTP kabel
o 1000baseSX, 1000baseLX – koriste optički 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 MAC sublayer

Slika - Data link sloj Ethernet protokola

Podjelu je napravio Institute of Electrical and Electronics Engineers (IEEE). Logical


Link Control (LLC) upravlja komunikacijom između mrežnih uređaja unutar jednog mrežnog
spoja. LLC je definiran IEEE 802.2 specifikacijom te podržava spojne i bespojne servise.
Media Access Control (MAC) upravlja pristupom mediju za prijenos podataka. IEEE MAC
specifikacija definira jedinstvene MAC adrese tako da su mrežni uređaji jednoznačno
identificirani na mreži. Svaka proizvedena mrežna kartica ima jedinstvenu MAC adresu koju
je, djelomično, moguće softverski mijenjati.
Kada MAC sloj primi transmit-frame zahtjev za pripadajućom adresom i podacima iz
LLC sloja, MAC počinje slati sekvencu (paket) na mrežu prebacivanjem LLC podataka u
MAC frame buffer.
Svaka mrežna kartica prije slanja paketa na mrežu provjerava da li može poslati paket
na mrežu ili treba čekati da se medij oslobodi. Protokol kojim se to obavlja se naziva Carrier
Sense, Multiple Access with Collision Detection (CSMA/CD).

723/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Internet protocol (IP)

Internet protocol (IP) se koristi za bespojnu komunikaciju između računala, a za prijenos ga


koriste TCP i UDP. On je odgovoran za pravilno adresiranje računala i prosljeđivanje paketa,
ali ne garantira njihovo dospjeće. IP može razbiti poruke na manje pakete te ih sastaviti na
odredištu s time da svaki dio može krenuti drugim putem kroz mrežu. Ako paketi ne stignu
pravim redosljedom IP protokol će ih sastaviti u ispravan paket.

Network Network
interface IP header IP payload interface
header trailer

IP datagram

Network-level packet
Slika - IP datagram

Bit: 0 4 8 16 19 31

Version IHL Type of service Total length

Identification Flags Fragment offset

Time to live Protocol Header checksum

Source address
20 byte

Destination address

Options + Padding
Slika - IPv4 header

Version 4 bit Verzija ip headera, trenutno se koristi verzija 4. Slijedeća


verzija je Ipv6, koja se za sada koristi samo eksperimentalno
IP Header length 4 bit Dužina IP headera (broj 32-bitnih riječi)
Type of service 8 bit Kvaliteta veze
Total length 2 byte Ukupna duljina IP paketa
Identification 2 byte Identifikaciju specifičnog datagrama između pošiljatelja i
primetelja. Za svaki sljedeći IP pakeet vrijednost se
inkrementira
Flags 3 bit Da li je paket pogodan za fragmentaciju, te da li je
fragmentiran

724/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Fragment offset 13 bit Mjesto gdje se fragment nalazi u cijeloj poruci (potrebno za
sastavljanje poruke)
Time to live 1 byte Vrijeme života paketa, tj. Preko koliko prijelaza paket može
proći dok se ne odbaci. Svaki IP router prilikom
prosljeđivanja paketa dekrementira njegovu vrijednost, a ako
je 0, paket se dalje ne prosljeđuje
Protocol 1 byte Koji protokol se nalazi iznad, tj. Čiji paket IP paket sadrži
Header checksum 2 byte Osigurava integritet headera
Source address 4 byte Adresa pošiljatelja poruke
Destination address 4 byte Adresa primatelja poruke
Options and Dodatne opcije i dopuna paketa da bi njegova veličina bila
Padding djeljiva sa 32
Tablica - Opis IPv4 header-a

IPv6 header:
Bit: 0 4 8 16 24 31

Version Priority Flow label

Payload length Next header Hop limit

Source address

Destination address
40 byte

Slika - IPv6 header

725/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

TCP protokol

TCP je obostrani spojni protokol koji spaja 2 računala, te osigurava da paketi dolaze na
odredište traženim redoslijedom. TCP koneckija može biti i unutar jednog računala (mnoge
aplikacije komuniciraju na taj način, npr. X window system).

Network Network
interface IP header TCP header Segment interface
header trailer

TCP segment

IP datagram

Network-level packet
Slika - TCP segment

Bit: 0 4 10 16 31

Source port Destination port

Sequence number

Acknowledgment number
Header lenght Unused Flags Window
20 byte

Checksum Urgent pointer

Options + Padding
Slika - TCP header

Source port 2 byte Socket s kojeg se šalje TCP segment, tj. Definira koja aplikacija na
application layeru šalje segment, source socket zajedno s IP adresom
jedinstveno definira mjesto sa kojeg je segment poslan
Destination port 2 byte Socket na koji se šalje TCP segment, tj. Definira koja aplikacija na
application layeru prima segment, source socket zajedno s IP adresom
jedinstveno definira mjesto sa kojeg je segment poslan
Sequence number 4 byte Redni broj početnog okteta segmenta
Acknowledgment 4 byte Broj slijedećeg okteta korisnikove poruke, ujedno i kumulativna potvrda
number
Data offset 4 byte Početak podataka u paketu, ujedno označava veličinu TCP headera
Reserved 6 bit Rezervirano za buduću uporabu (postavljeno na 0)
Flags 6 bit URG, ACK, PSH, RST, SYN, FIN flagovi
Window 2 byte Veličina buffera pošiljatelja poruke koji služi za primanje poruka.

726/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

TCP/IP stack drugog sudionika treba slati pakete velike maksimalno do


veličine prozora. Ako je poslana 0, poruke se dalje ne šalju, sve dok se ne
pošalje nova poruka sa vrijednošću većom od 0.
Urgent pointer 2 byte Lokacija hitnih podataka u segmentu
Options Proizvoljne opcije koje se dodaju TCP headeru u paketima od 4 bytea
Tablica - Opis TCP header-a

20 FTP-data
21 FTP – File Transfer Protocol
22 SSH – Secure Shell
23 Telnet
25 SMTP – Simple Mail Transfer Protocol
80 HTTP – Hypertext Transfer Protocol
110 POP3 – Post Office Protocol version 3
119 NNTP – Network News Transfer Protocol
143 IMAP – Internet Message Access Protocol
194 IRC – Internet Relay Chat
389 LDAP – Lightweight Directory Access Protocol
Tablica - Poznatiji TCP portovi

727/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

UDP protokol

UDP je bespojni protokol gdje nemamo informaciju da li je paket stigao ili nije. UDP samo
prosljeđuje pakete protokolu iznad koji se mora brinuti za njihovo pravilno tumačenje. Kako
nema overheada i odmah prosljeđuje pakete, znatno je brži od TCP-a.

Network Network
interface IP header UDP header Message interface
header trailer

UDP message

IP datagram

Network-level packet
Slika - UDP datagram

Bit: 0 16 31

Source port Destination port


8 byte

Segment length Checksum


Slika - UDP header

Source port 2 byte Port sa kojeg se šalje UDP poruka, tj. definira koja aplikacija na
application layeru šalje poruku, polje je opcionalno te ako se ne koristi
može biti 0
Destination port 2 byte Port na koji stiže UDP poruka, tj. definira koja aplikacija na application
layeru prima poruku, zajedno s IP adresom iz IP headera jedinstveno
označava kojem procesu tj. aplikaciji je poruka poslana
Length 2 byte Minimalna duljina je 8 byte-ova a teoretska maksimalna 65,515 (duljina
ip paketa minus headeri). Prava maksimalna duljina je ograničena MTU-
om linka preko kojeg se prenose paketi. Ovo polje je redudantno zato što
se duljina paketa uvijek može izračunati iz duljine IP paketa
Checksum 2 byte Polje koje osigurava integritet podataka
Tablica - Opis UDP header-a

Poznatiji UDP portovi:


53 DNS – Domain Name System
67 BOOTP client
68 BOOTP server (DHCP) – Dynamic Host Configuration Protocol

728/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

69 TFTP – Trivial File Transfer Protocol


137 NetBIOS Name Service
138 NetBIOS Datagram Service
161 SNMP – Simple Network Management Protocol
119 NNTP – Network News Transfer Protocol
520 RIP – Routing Information Protocol
1812, 1813 RADIUS – Remote Authentication Dial-In User Service
Tablica - Poznatiji UDP portovi

UDP (User data protocol) je niži nivo protokola od TCP-a. UDP ne garantira dostavu paketa
na odredište. Također UDP ne garantira dostavu paketa u originalnom poretku, odnosno u
onom poretku kojim su bili poslani. Korištenjem UDP socket-a naši programi mogu postati
znatno složeniji 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 fizičkom 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 narušavanja integriteta sistema
- svaki izgubljeni paket se nemora ponovno slati
Najveća prednost UDP protokola nad TCP-om je ta što je puno brži, 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 sadržaj neke web
stranice, udaljeno se spojio na drugo računalo i sl.
Primjeri su Telnet, FTP, SMTP, NFS, DNS, HTTP i sl.

729/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

IP adresiranje, stvaranje podmreža i usmjeravanje


IP adresiranje
IP protokol zahtjeva da svako računalo, točnije mrežni interface, na mreži ima
jedinstvenu IP adresu. IP adresa se sastoji od 4 bytea, a mi je pisemo dekatski, svaki byte
posebno odvojeno točkama. Prvi dio IP adrese je mrežna adresa, a drugi dio je adresa
računala, a odnos između njihovih duljina ovisi o klasi mreže i subnet maski.

Klase IP adresa
IP adrese su podjeljene u klase, ovisno o primjeni i veličini organizacije kojoj se
dodjeljuju. Najčešće korištene su A, B i C. Ovim klasama su definirane duljine mrežne adrese
i duljine adrese računala. Klasa A koristi prvih 8 bitova za adresiranje mreže (od kojih je
MSB (most significant bit) postavljen na 0), a zadnjih 24 za adresiranje računala i dodjeljuje
se uglavnom ogromnim organizacijama. Klasa B koristi 16 bitova za adresu mreže (MS bitovi
postavljeni na 10) i 16 bitova za adresu računala i dodjeljuje se uglavnom velikim
organizacijama i tvrtkama (ISP-ovi i slično). Klasa C koristi 24 bita za adresu mreže (MS
bitovi postavljeni na 110), a 8 za adresu računala. Dodjeljuje se većini organizacija i tvrtki.
Ukoliko postoji potreba za više od 254 ali znatno manja od 65.534 računala, bolje je zakupiti
više adresa klase C nego jednu B jer time štedimo adrese. Klasa D ima 4 najznačajnija bita
postavljena na 1110, dok klasa E 4 najznačajnija 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 računala postavimo na 0, dobili smo adresu mreže, a ako ih
sve postavimo na 1 dobili smo broadcast adresu.

Npr.
199.10.2.0 – adresa mreže
199.10.2.255 – broadcast adresa mreže

730/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

199.10.2.4– jedno od racunala na mreži

Loopback adrese
Za testiranje i mrežnu komunikaciju između aplikacija na istom računalu koristi se
specijalna loopback mrežna adresa 127.0.0.0.
Bilo koja regularna adresa na toj mreži je adresa samog računala, najčešće se koristi
127.0.0.1.

Privatne IP adrese
Za mreže koje se ne planiraju spajati na internet, ili se planiraju spajati na internet
pomoću jednog gatewaya koji koristi NAT (Network Adress Translation, poznato jos kao i IP
Masquarade, IP adresa se u tom slućaju maskira IP adresom gatewaya) predviđene su privatne
IP adrese. Zapravo, za lokalnu mrežu mozemo koristiti bilo koje adrese, ali bolje je koristiti
privatne da ne bi imali problema sa slučajnim routanjem tih paketa prema van, dok se privatne
IP adrese teoretski ne routaju na Internetu.

Za svaku klasu imamo set privatnih mrežnih adresa:


A 10.0.0.0
B 172.16.0.0 - 172.31.0.0
C 192.168.0.0 - 192.168.255.0

Podmreže i mrežne maske


Pošto na istu mrežu nije moguće spojiti mnogo računala (nemogućnost hardverske
izvedbe, loše performanse) velike mreže dijelimo na podmreže (subnet) pomoću subnet
maski. Pomoću subnet maske određujemo (neovisno o klasi mreže) koji dio adrese usmjerivač
(router) smatra za mrežnu, a koji dio za adresu računala, tj. prema njoj zna koje adrese
usmjerava prema van, a koje zadržava na lokalnoj mreži.

Subnet maska je jednake velčcine kao IP adresa, tj. 32 bita. Adresa mreže je označena sa
bitom 1, a adresa računala sa bitom 0, tako da ako recimo klasu B želimo podijeliti na 256
mreža dobijemo subnet masku 255.255.255.0.

Kako smo došli do toga:

731/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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 mreža C klase, subnet maska će sad izgledati ovako:
11111111.11111111.11111111.00000000 ili 255.255.255.0

Primjer 2:
Ako od adrese računala u klasi C uzmemo 3 bita možemo kreirati 8 mreža 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 mreža sa slijedećim adresama:
Network Hosts Broadcast address
192.168.1.0 192.168.1.1 – 192.168.1.30 192.168.1.31
192.168.1.32 192.168.1.33 – 192.168.1.62 192.168.1.63
192.168.1.64 192.168.1.65 – 192.168.1.94 192.168.1.95
192.168.1.96 192.168.1.97 – 192.168.1.126 192.168.1.127
192.168.1.128 192.168.1.129 – 192.168.1.158 192.168.1.159
192.168.1.160 192.168.1.161 – 192.168.1.190 192.168.1.191
192.168.1.192 192.168.1.193 – 192.168.1.222 192.168.1.223
192.168.1.224 192.168.1.225 – 192.168.1.254 192.168.1.255

732/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Usmjeravanje (Routing)
Kako fizički nije moguće napraviti jednu veliku mrežu na koju će se spojiti sva
računala, koriste se usmjerivači (router). Usmjerivač je uređjaj koji ovisno o svojoj routing
tablici pakete sa jednog mrežnog sučelja proslijeđuje na drugo sučelje. Zapravo većina
operativih sustava unutar samog TCP/IP stacka ima implementiranu osnovnu verziju
usmjerivača kojeg onda konfiguriramo tako da mu upišemo adresu gatewaya (routera). U tom
slučaju sve pakete za koje računalo ne zna gdje bi poslalo šalje na gateway. Napredniji
operativni sustavi (svi UNIXoidi, noviji Windowsi) imaju integriran pravi usmjerivač. Kako
na velikim mrežama postoji više puteva od jednog do drugog mjesta, tj. više IP adresa,
usmjerivači tu uglavnom koriste neki od protokola za dinamičko usmjeravanje (rutanje).

Primjer routing tablice na Linux racunalu:


user@localhost:/$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
user@localhost:/$

733/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Primjer routing tablice na Windows XP računalu:


C:\>route print
===========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x10003 ...00 50 ba b9 03 54 ...... Realtek RTL8139 Family PCI Fast Ethernet NIC
===========================================================================
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 10.0.0.1 10.0.0.11 20
10.0.0.0 255.255.255.0 10.0.0.11 10.0.0.11 20
10.0.0.11 255.255.255.255 127.0.0.1 127.0.0.1 20
10.255.255.255 255.255.255.255 10.0.0.11 10.0.0.11 20
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
224.0.0.0 240.0.0.0 10.0.0.11 10.0.0.11 20
255.255.255.255 255.255.255.255 10.0.0.11 10.0.0.11 1
Default Gateway: 10.0.0.1
===========================================================================
Persistent Routes:
None
C:\>

734/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Mrežno programiranje

Mrežno programiranje obuhvaća pisanje programa koji komuniciraju sa drugim


programima preko računalne mreže. Jedan program se uobičajeno naziva klijent, a drugi
server.
Primjer klijent-server komunikacije je Web browser kao klijent i Web server kao server.

Većina mrežnih aplikacija se može podijeliti u dvije skupine: klijent i server.

komunikacijski link
klijent server

Slika - Mrežna aplikacija: klijent i server

Klijenti (klijents) uobičajeno komuniciraju sa jednim serverom u isto vrijeme, premda


koristimo Web browser kao primjer, možemo komunicirati sa više različitih servera. Sa
serverske strane, sasvim je uobičajeno da server u jednom trenutku ima uspostavljenu vezu
(komunicira) sa više različitih klijenata.

klijent

...
klijent server

...
klijent

735/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Slika - Upravljanje servera sa više klijenata istovremeno

Klijent – server mogu se nalaziti u istoj lokalnoj mreži, na primjer Ethernet, ali također mogu
biti i u različitim mrežama, što je u većini situacija slučaj, povezanim preko wide area
network-a (WAN) koristeći routere.

Slike prikazuju klijent – server vezu unutar iste mreže i klijent – server vezu kada se nalaze u
različitim mrežama.

application protocol
user Web Web
process klijent server application layer

TCP protocol

TCP TCP transport layer


protocol
stack
within
kernel
IP protocol

IP IP network layer

Ethernet protocol
Ethernet Ethernet
driver driver datalink layer
actual flow between klijent and

Ethernet

Slika - klijent i server u istom Ethernet, komuniciraju koristeći TCP

Bitno je napomenuti, iako izgleda da klijent i server komuniciraju koristeći application layer,
transport layer komunicira koristeći TCP itd., da u stvarnosti to nije tako, već se sve spušta na
najnižu razinu, a zatim se vrši prijenos podataka od najniže razine do odgovarajuće razine.

736/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

klijent server
application application

host with host with


TCP/IP TCP/IP

LAN LAN

router router

WAN
router router router router

Slika - klijent i server u različitim LAN mrežama povezani preko WAN-a

Uspostavljanje i raskidanje veze

Uspostavljanje veze (three – way handshake)

1. server mora biti spreman prihvatiti nadolazeću vezu. To se uobičejeno ostvaruje


pozivanjem socket, bind i listen funkcija i naziva se passive open.
2. klijent započinje aktivnim otvaranjem (active open) pozivanjem connect funkcije.
To uzrokuje da TCP klijent šalje SYN segment (koji služi za sinhronizaciju) da se
kaže serveru da je klijent inicijalizirao broj sekvence za podatke koji će se slati
preko uspostavljene veze. Uobičajeno se ne šalju podaci kada se šalje SYN: on
samo sadrži IP header, TCP header i moguće TCP opcije.
3. server mora potvrditi klijent-ov SYN, i server mora također poslati svoj SYN
sadržavajući inicijalizirani broj sekvence za podatke koje će server slati na vezu.
Server šalje svoj SYN i ACK na klijent-ov SYN u jednom segmentu.
4. klijent mora potvrditi serverov SYN

737/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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 server

socket SYN J
socket, bind,listen
connect (blocks)
accept (blocks)
(active open)
SYN K, ack J+1

connect returns ack K+1


accept returns
read (blocks)

Slika - TCP three – way handshake

Raskidanje veze

Dok je za uspostavljanje veze bila potrebna tri segmenta, za raskid veze su potrebna
četiri segmenta.

1. Jedna aplikacija prva zove close, kaže se da je kraj izvođenja active close. Ta
strana šalje FIN segment, što znači da je završeno slanje podataka.
2. Druga strana koja primi FIN izvodi passive close. Primljeni FIN je potvrđen od
TCP-a. Primitak FIN-a se također prosljeđuje aplikaciji kao end-of-file (EOF)
(nakon svakog podatka koji je možda već u redu da ju primi aplikacija), budući da
primitak FIN-a znači da aplikacija neće primit nit jedan suvišan podatak preko
veze.
3. Malo kasnije aplikacija koja primi end-of-file će zatvoriti (close) socket. To
uzrokuje da TCP pošalje FIN.
4. TCP na sistemu koji je primio taj konačni FIN (kraj sa active close) potvrđuje FIN.

738/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

klijent server

close FIN M
(active close) (passive close)
read return 0

ack M + 1
close
FIN N

ack N+1

Slika - Izmjena paketa prilikom raskida TCP veze

Socketi

Socket se definira kao jedan kraj komunikacijskog kanala. Za komunikaciju para


procesa potreban je par socketa – za svaki proces po jedan. Socket je određen IP adresom i
brojem port-a. Uglavnom socketi se koriste u klijent-server arhitekturi. Server čeka zahtjeve
klijenata tako da "sluša" na određenom portu socketa.
Serveri obično implementiraju specifične servise na određenom portu(telnet-23, ftp-
21, http-80). Svi brojevi portova ispod 1024 su uglavnom korišteni od strane poznatih
aplikacija.
Kad se klijent spoji na socket dodjeljuje mu se broj porta koji je veći od 1024 npr
1625. Kad se još jedan klijent spoji na server aplikaciju njemu se dodjeljuje broj porta veći od
1024, ali različit od 1625. Na taj način uvijek imamo jedinstveni par socketa za svaki par
klijent-server.

Dvije vrste socketa su najkorištenije:


• 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 upišete string '1,2,3' na izlazu

739/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

ćete pročitati '1,2,3'. Također sve moguće greške 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 može i ne mora stići, ne moraju stići 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 držati otvoren cijelo vrijeme nego se samo šalju paketi sa odredišnom
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, možemo doći do www stranice preko Web servera
koristeći socket za mrežnu komunikaciju. Da bi uspostavili vezu sa www serverom koristeći
Telnet program, neka je stranica na koju se spajamo www.imestranice.com, tada ćemo
prilikom spajanja navesti i port koji označava da se spajamo na www server, a on je 80. Port
80 je standardni port dodijenjen od IANA-e na kojem 'sluša' (listen) web server.

Primjer: Dohvaćanje HTML-sourca pomću 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

BSD socketi
Generalno gledajući, svaki operacijski sustav mora definirati odgovarajući Application
Programming Interface (API) između korisničkog programa i “mrežnog kôda”. Linux mrežni
API je baziran na BSD socketima. Predstavljeni su u Berkley UNIX 4.1cBSD i dostupni su u
gotovo svakom operacijskom sustavu sličnom Unixu.
Socket je dvosmjerna komunikacijska jedinica koja može biti korištena za
komuniciranje sa drugim procesima na istom računalu ili sa procesom pokrenutim na drugom
računalu. Internet programi kao Telnet, rlogin, talk ili World Wide Web koriste sockete.
Socket je komunikacija između tzv. ulaznih vrata i krajnje točke kanala koji povezuje dva
procesa. Podaci se pošalju na “ulazna vrata” i nakon nekog vremena pojave se na drugoj
strani (izlazu). Komunikacijski procesi mogu biti na različitim računalima. Mrežni kôd
Kernela prosljeđuje podatke između krajnjih točaka.
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
uključen u polju u.socket_i sockfs inode-a.

Metode BSD socket objekta


metoda opis
release zatvara socket
bind dodjeljuje lokalnu adresu (ime)
connect uspostavlja vezu (TCP) ili dodjeljuje remote adress (UDP)
socketpair kreira par socketa za dvosmjernu razmjenu podataka
accept čeka zahtjev za spajanje
getname vraća lokalnu adresu
ioctl implementira ioctl()komande
listen inicijalizira socket da prihvati zahtjev za spajanjem
shutdown zatvara pola ili obje polovice full-duplex veze
setsockopt postavlja vrijednosti socket flagovima
getsockopt uzima vrijednosti socket flagova
sendmsg šalje paket socketu
recvmsg prima podatak od socketa
mmap file memory-mapping (ne koriste mrežni socketi)
sendpage kopira podatke direktno iz/prema fajlu (sendfile() sistemski poziv)

741/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Tablica - Metode BSD socket objekta

INET socketi
INET socketi su strukture podataka tipa struct sock. Svaki BSD socket koji
pripada IPS mrežnoj arhitekturi sadrži adrese INET socketa u sk polju socket objekta.
INET socketi su potrebni jer socket objekti (opisujući BSD sockete) uključuju
samo polja koja su značajna za sve mrežne arhitekture. Ali, kernel mora također zapamtiti i
nekoliko drugih informacija za svaki socket bilo koje mrežne 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 također definira neke metode specifične tipu transporta protokola
(TCP ili UDP). Metode spremljene u strukturi podataka tipa proto:

metode INET socket objekta


metoda opis
close zatvara socket
connect uspostavlja vezu ili dodjeljuje remote adress
disconnect prekida uspostavljenu vezu
accept čeka zahtjev za spajanje
ioct1 implementira ioctl()komande
init INET socket objekt konstruktor
destroy INET socket objekt destruktor
shutdown zatvara pola ili obje polovice full-duplex veze
setsockopt postavlja vrijednosti socket flagovima
getsockopt uzima vrijednosti socket flagova
sendmsg šalje paket socketu
recvmsg prima podatak od socketa
bind dodjeljuje lokalnu adresu (ime)
backlog_rcv funkcija pozvana kada prima paket
hash doda INET socket per-protocol hash tablici
unhash makne INET socket iz per-protocol hash tablice
get_port dodjeljuje broj porta INET socketu
Tablica - Metode INET socket objekta

742/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

sock objekt sadrži otprilike 80 polja od kojih su mnoga pokazivači na druge objekte, tablice,
metode ili druge strukture podataka.

Koncepti socketa
Kada kreiramo socket moramo definirati tri parametra:
- način komuniciranja (communication style),
- namespace,
- i protokol.

Communication style
Način 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 određuje kako su ti paketi podržani i kako
su adresirani od pošiljaoca do primatelja.

- Connection style garantira isporuku svih paketa po redu kako su poslani. Ako su paketi
izgubljeni ili je promijenjen redoslijed zbog problema na mreži, primatelj automatski
zahtjeva njihovo ponovno slanje od pošiljaoca. Connection-style socket je kao telefonski
poziv: adresa pošiljatelja i primatelja je fiksna na početku komunikacije kada je veza
uspostavljena.
- Datagram style ne garantira isporuku ili redoslijed dolaska paketa. Paketi mogu biti
izgubljeni ili promijenjenog redoslijeda zbog problema na mreži. Svaki paket mora biti
označen sa svojom destinacijom i nije zagarantirano da će biti isporučen. Sustav garantira
samo “najbolju volju”, tako paketi mogu nestati ili stići u krivom redoslijedu u odnosu na
to kako su poslani. Datagram-style sockets način slanja je moguće usporediti sa slanjem
pisma poštom: pošiljatelj specificira adresu primatelja za svaku individualnu poruku.

Namespace
Socket namespace određuje kako su zapisane adrese socketa. Adresa socketa određuje
jedan kraj “veze” socketa. Na primjer, adrese socketa u “local namespaceu” su obična imena
datoteka. U “Internet namespaceu” adresa socketa je sastavljena od Internet adrese (Internet

743/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Protocol adress ili IP address) računala spojenog na mrežu i broj porta. Broj porta raspoznaje
višestruke sockete na istom računalu.

Protokol
Protocol specificira kakvim socketom se podaci prenose.
Neki protokoli su TCP/IP, primarni mrežni protokol korišten kod Interneta; Apple Talk
mrežni protokol; UNIX lokalni komunikacijski protokol.

Socket buffer
Svaki pojedini paket poslan kroz mrežnu jedinicu sastoji se od nekoliko dijelova. Svi
slojevi mreže, dodaju neke kontrolne informacije na osnovni payload, tj. podatak koji se
prenosi putem mreže. Format paketa se mijenja prolaskom kroz TCP/IP slojeve.

Cijeli paket je napravljen u nekoliko dijelova korištenjem različitih funkcija. Na


primjer, UDP/TCP zaglavlje i IP zaglavlje su sastavljeni od funkcija zavisno transportnom i
mrežnom sloju IPS arhitekture, dok su zaglavlje i trailera, napisani odgovarajućom metodom
specificiranom mrežnom karticom.
Mrežni kôd Linuxa sadrži svaki paket u velikom memorijskom području nazvanom
socket buffer. Svaki socket buffer je definiran sa strukturom podatka tipa sk_buff koja
sadrži, uz mnoge druge stvari, pokazivače na slijedeće 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 mrežnog sloja
- deskriptor data link layer zaglavlja

- the destination cache entry (dest_entry object)

744/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Struktura podataka sk_buff sadrži ”identifikator” mrežnog protokola korišten za


slanje podataka (checksum field) i vrijeme dolaska primljenih paketa.
Kernel izbjegava kopiranje podataka već jednostavno proslijeđuje sk_buff
descriptor pointer svakom mrežnom sloju. Na primjer, kada priprema paket za slanje,
transportni sloj počinje kopirati payload iz korisničkog buffera na višu poziciju socket
buffera; tada transportni sloj dodaje svoje TCP ili UDP zaglavlje prije payloada. Nakon toga,
kontrola se predaje mrežnom sloju, koji prima socket buffer descriptor i dodaje IP zaglavlje
prije transportnog zaglavlja. Konačno, data link sloj dodaje svoje zaglavlje i trailer, čime
pripremi paket za slanje.

Serveri
Životni ciklus servera ovisi o kreiranju connection-style socketa, dodjelivši mu adresu
na njegov socket, postavljajući poziv na listen koji omogućuje veze do socketa,
postavljajući pozive na accept dolazećim vezama, i na kraju zatvarajući socket. Podaci
nisu čitani i pisani direktno preko server socketa. Umjesto toga program svaki puta prima
novu vezu; Linux kreira zasebne sockete za korištenje prijenosa podataka preko te veze.
U ovom odlomku ćemo objasniti bind, listen i accept. Adresa mora biti
dodjeljena socketu servera koristeći bind tako da se klijent može spojiti na taj socket. Prvi
argument bind-a je socket file descriptor. Drugi argument je pokazivač na adresnu strukturu
socketa. Treći argument je dužina 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 određuje koliko je
prihvaćenih veza u ”redu” (queue). Ako je ”red” pun, dodatna spajanje biti će odbijena. To ne
ograničava ukupan broj veza koje server može obraditi. Ograničava jedino broj klijenata koji
se pokušavaju spojiti a nisu još bili prihvaćeni.
Server prihvaća 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. Treći argument je dužina adresne
strukture socketa u byte-ovima. Server može koristiti klijentovu adresu da utvrdi hoće li
stvarno komunicirati sa klijentom. Poziv za prihvaćanje kreira novi socket za komunikaciju sa
klijentom i vraća odgovarajući 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

koristimo recv. Koristimo iste argumente kao read, plus dodatni FLAGS argument.
Flag MSG_PEEK omogućava čitanje podataka ali ne i micanje iz ulaznog ”reda”.

Lokalni socketi
Proces spajanja socketa na istom računalu može 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 korištene samo kod
kreiranja veza.
Socketima je ime specificirano u struct sockaddr_un. Moramo postaviti
sun_family polje na AF_LOCAL, čime određujemo da se radi o lokalnom namespaceu.
Polje sun_path određuje ime datoteke koja će se koristiti i može biti, najviše, 108 byte-
ova dugačko. Može biti korišteno 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 različita računala mogu dijeliti iste file-sisteme, samo
procesi pokrenuti na istom računalu mogu komunicirati sa lokalnim namespace socketima.
Jedini dozvoljeni protokol za lokalni namespace je 0. Zbog toga što postoji u file-
sistemu, lokalni socket se može izlistati kao i datoteka. Na primjer:
$ls –l /tmp/socket

srwxrwx—x 1 user group 0 Nov 13 18:18 /tmp/socket

U dodatku C može se pogledati primjer komunikacije dva procesa preko socket-a.

746/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

IPv4 Socket adresna struktura

IPv4 socket adresna struktura, često nazivana ″Internet socket adresna struktura″, je
nazvana sockaddr_in i definirana je u <netinet/in.h> header-u.

Posix definicija strukture je slijedeća:


struct in_addr {
in_addr_t a_addr; /* 32 - bit IPv4 adress */
}; /* network byte ordered */

struct sockaddr_in {
uint8_t sin_len; /* lenght of structure (16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16-bit TCP or UDP port number */
/* network byte ordered */
struct in_addr sin_addr; /* 32-bit IPv4 adress */
/* network byte ordered */
char sin_zero[8]; /* unused */
};

Socket adresna struktura se može prosljeđivati od procesa prema kernelu, i obratno, od


kernela prema procesu. Četiri socket funkcije prosljeđuju socket adresnu strukturu od procesa
prema kernelu, a to su: bind, connect, sendto, i sendmsg. Pet funkcija kojima kernel
prosljeđuje socket adresnu strukturu su: accept, recvfrom, recvmsg, getpeername, i
getsockname.

Socket adresna struktura se uvijek šalje po referenci, kada je prosljeđujemo kao argument bilo
koje socket funkcije.
Kako bi se ostvarila generička socket adresna struktura, neovisna o protokolu bilo je potrebno
osmisliti kako će se kroz jednu funkciju slati strukture različitih protokola. U ANSI C-u
rješenje bi bilo vrlo jednostavno korištenjem void * (void pointera), koji je generički tip
pointera. Ali kako su socket funkcije rađene prije nego što je donešen ANSI C, bilo je
potrebno pronaći nekakvo rješenje, koje je izabrano 1982. godine kao generička socket
adresna struktura i koja je definirana u <sys/socket.h> header-u a izgled strukture je
slijedeći:

struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family; /* address family: AF_xxx value */
char sa_data[14]; /* protocol-specific address */
};

747/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Socket funkcije su definirane tako da uzimaju pointer na generičku strukturu, kao što je
prikazano u ANSI C prototipu funkcije za bind funkciju:

int bind (int, struct sockaddr *, socklen_t);

Ovo dređuje da za svaki poziv ove funkcije mora se cast-ati pointer socket adresne strukture
specifičnog protokola na pointer generičke 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 IPv6 Unix Datalink


sockaddr_in() sockaddr_in6() sockaddr_un() sockaddr_dl()

AF INET6 lenght AF INET6 lenght AF LINK


lenght AF INET lenght
16-bit port# 16-bit port# interface index

32-bit 32-bit type name len


IPv4 address flow label
addr len sel len

(unused)
interface name
128-bit and
IPv6 adress link-layer address
pathname
fixed lenght (16 bytes) (up to 104 bytes)

variable lenght

fixed lenght (24 bytes)

variable lenght

Slika - Usporedba različitih socket adresnih struktura

748/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Osnovne funkcije za rad sa socket-ima (System Calls)

socket - kreiranje socket-a


close - uništavanje socket-a
connect - uspostavljanje veze između dva socket-a
bind - označavanje server socket-a sa adresom
listen - konfigurira socket za prihvaćanje uvjeta
accept - prhvaća vezu i kreira novi socket za komunikaciju

Socket je predstavljen file descriptor-om.

Pregled osnovnih funkicija

socket funkcija

Za izvršavanje mrežne komunikacije, prvu stvar koju proces mora napraviti je pozvati
funkciju socket, odrediti tip komunikacijskog protokola (TCP koristeći Ipv4, UDP koristeći
Ipv6, Unix protokol, itd.).

#include <sys/socket.h>

int socket (int family, int type, int protocol);

Returns: nonnegative descriptor if OK, -1 on error

family - određuje vrstu protokola


type - tip podataka koji se prenose socket-om (tip socket-a)
protocol - protokol

Za family argument koristimo jednu od ponuđenih konstanti:

family Description
AF_INET IPv4 protocols
AF_INET6 IPv6 protocols
AF_LOCAL Unix domain protocols

749/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

AF_ROUTE Routing sockets


AF_KEY Key sockets

Tablica - Protokol family konstante za socket funkciju

Za type argument koristimo slijedeće konstante:

family Description
SOCK_STREAM stream socket
SOCK_DGRAM datagram socket
SOCK_RAW raw socket

Tablica - tip socket-a za socket funkciju

Za protocol argument koristimo nulu, osim ako ne koristimo raw socket.

Nisu podržane sve kombinacije parametara. Tablica prikazuje pregled kombinacija koje su
podržane.

AF_INET AF_INET6 AF_LOCAL AF_ROUTE AF_KEY


SOCK_STREAM TCP TCP Yes
SOCK_DGRAM UDP UDP Yes
SOCK_RAW IPv4 IPv6 Yes Yes

Tablica - Podržane kombinacije family-a i type-a za socket funkciju

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 može podržavati više adresnih porodica
i za to je korištena PF_ vrijednost za kreiranje socket-a, dok je AF_ vrijednost korištena u
socket address strukturama. Trenutno je PF_ vrijednost postavljena na AF_, ali nema
garancije da se to u budućnosti neće promijeniti.

750/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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 treći argument je pointer
na socket address strukturu i veličina te strukture.
socket address mora sadržavati 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 slučaju TCP socket-a, veza se inicijalizira u tri sinhronizacijska koraka (three – way
handshake).
Ako se veza uspostavi funkcija vraća nulu, inače ako se dogodi error ili se veza ne može
uspostaviti funkcija vraća -1.

bind funkcija

bind funkcija označava 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 određuju osnovne


informacije pojedinog protokola, a treći argument je veličina 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

listen funkcija

listen funkciju zove jedino server i izvršava dvije akcije:

1. Kada je socket kreiran pomoću socket funkcije tada je predodređen da bude


aktivan socket, to je, klijentov socket će pozvati connect. listen funkcija
pretvara nepovezan socket u pasivan socket, naznačuje da kernel mora osluškivati
ima li zahtjeva za uspostavljanjem veze i ako ima da ih poveže na taj socket. U
TCP terminima to znači prelazak socket-a iz stanja CLOSED u stanje LISTEN.
2. Drugi argument funkcije određuje maksimalan broj veza koje kernel treba poredati
za uspostavljanje vez za taj socket.

#include <sys/socket.h>

int listen (int sockfd, int backlog);

Returns: 0 if OK, -1 on error

listen funkcije se uobičejeno zove nakon oba poziva socket i bind funkcija i mora biti

pozvana prije poziva accept funkcije.


Kernel mora podržati dva reda:
1. incomplete connection queue, koji sadržava 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 sadržava ulaz za svakogklijenta sa kim je TCP
three – way handshake završen. Ovakvi socket-i su ESTABLISHED stanju.

752/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

sum of both queues


server cannot exceed backlog

accept

completed connection queue


(ESTABLISHED state)
3WHS
TCP complete

incompleted connection queue


(SYN_RCVD state)

arriving
SYN

Slika - Dva reda podržana od TCP-a za listening socket

klijent server

connect called SYN J

create entry on incomplete queue

RTT SYN K, ack J+1

RTT
connect returns ack K+1

entry moved from


incomplete queue to
completed queue,
accept can return

Slika - TCP three – way handshake i dva reda za listening socket

753/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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 4.0,
AIX 4.2, Linux 2.0.27,
backlog BSD/OS 3.0 Uware 2.1.2 HP-UX 10.30 SunOS 4.1.4 Solaris 2.5.1 Solaris 2.6
0 1 0 1 1 1 1
1 2 1 1 2 2 3
2 4 2 3 4 3 4
3 5 3 4 5 4 6
4 7 4 6 7 5 7
5 8 5 7 8 6 9
6 10 6 9 8 7 10
7 11 7 10 8 8 12
8 13 8 12 8 9 13
9 14 9 13 8 10 15
10 16 10 15 8 11 16
11 17 11 16 8 12 18
12 19 12 18 8 13 19
13 20 13 18 8 14 21
14 22 14 19 8 15 22

Tablica - Trenutni broj veza za vrijednost backlog-a

accept funkcija

accept funkcija zove TCP server, prihvaća slijedeću završenu vezu iz reda completed

connection queue. Ako je red završenih veza prazan, proces prelazi u sleep stanje (blocking
socket). Kada server prihvati novu vezu, kreira se i novi socket preko kojeg se nastavlja
komunikacija između servera i klijent-a.

#include <sys/socket.h>

int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

Returns: nonnegative descriptor if OK, -1 on error

754/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

close funkcija

close funkcija se koristi da bi se zatvorila i terminirala TCP veza.

Podrazumijevana akcija close funkcije je da označi socket kao zatvoren za dajlnju


komunikaciju. Socket deskriptor više nije valjan i ne može se koristiti kao argument funkcija
read i write. Jedina nezgodna stvar kada koristimo close funkciju je što će naša TCP veza i

dalje pokušavati (neko određeno vrijeme) poslati odnosno primiti podatke. close funkcija se
ponaša kao dekrementirajuća, dok se funkcija accept ponaša kao inkrementirajuća 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>

int close (int sockfd);


Returns: 0 if OK, -1 on error

755/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Primjer korištenja socket-a za ostvarivanje


komunikacije klijent – server

Osnovna ideja je slijedeća: server mora biti cijelo vrijeme u radu i ″osluškivati″ da li
ima clienat-a koji se žele spojiti na server (kao čovjek na informacijama, čeka da zazvoni
telefon). Ako postoji netko tko se želi spojiti na server, server mu to mora omogućiti (čovjek
na informacijama podiže slušalicu i preusmjerava poziv na odgovarajuću liniju kojom će se
vršiti komunikacija). Ako postoji još linija koje se žele spojiti, server će im to omogućiti samo
u slučaju da nisu sve linije već zauzete, to je u našem slučaju broj koji smo naveli u backlog
kod listen funkcije. Ako su sve linije zauzete i ne možemo prihvatiti niti jednu nadolazeću
vezu, tada klijent-ova strana javlja klijent-u da je server zauzet ili da se ne može spojiti na
određeni server. Klijent-ova strana može imati definirani vremenski interval u kojemu će se
klijent pokušavati spojiti na server.

Trenutno vrijeme na serveru

Jednostavni primjeri socket-klijent.c i socket-server.c pokazuju najjednostavnije


spajanje klijent-a sa serverom. Nakon spajanja, ako spajanje uspije, server šalje klijent-u
trenutno vrijeme, vrijeme kada se klijent spojio na server.
socket-klijent.c
#include <stdio.h>
#include <sys/types.h> /* osnovni sistemski tipovi podataka */
#include <sys/socket.h> /* osnovne socket definicije */
#include <netinet/in.h> /* sockaddr_in{} i druge Internet definicije */
#include <unistd.h>
#include <string.h>

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

/* spajanje klijent-a sa serverom, i to na onaj koji je određen 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;
}

Primjer - Spajanje klijent-a sa serverom

socket-server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

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;

/* označavanje da je ovo server */


if (bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) {
printf("bind() error!\n");
return 2;
}

/* osluškivanje konekcije */
if (listen(sockfd, 2) == -1) {
printf("listen() error!\n");
return 3;
}

/* prihvaćanje 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;
}

/* dohvaćanje trenutnog vremena */

757/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

tmp_time = time (NULL);


begin = ctime(&tmp_time);
strcpy(buffer, begin);

/* pošalji klijent-u vrijeme spajanja */


send(klijent, buffer, strlen(buffer), 0);

/* zatvaranje privremenog komunikacijskog socket-a */


close(klijent);

/* zatvaranje serverovog socket-a */


close(sockfd);

return 0;
}

Primjer - Jednostavan server program

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 omogućuje klijent-ima da se spoje u bilo koje vrijeme.

Prvo se pokreće 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 vršiti komunikacija. Nakon toga server klijent-u šalje svoje trenutno vrijeme i
završava sa radom. Klijent dobiva informaciju od servera i također završava sa radom.

Konkurentni server

Ako želimo da naš server program bude što sličniji pravom serveru tada bi accept funkciju
stavili u beskonačnu while petlju zajedno sa send funkcijom koja šalje klijent-u vrijeme
servera. Sada je sasvim očit 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 rješenje
ovoga problema, a to je konkurentni server, server koji može u jednom trenutku izmjenjivati
podatke sa više klijenata. Konkurentan server radi na način da svaku komunikaciju sa
pojedinim klijentom vrši u zasebnom thread-u. Pomoću 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Primjer prikazuje kako server komunicira sa više klijenata u isto vrijeme pomoću thread-ova.
server-thread.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <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;

/* oslobađamo zauzete resurse */


free(arg);

/* dohvaćanje 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 opterećujemo 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

addr_sz = sizeof(cliaddr);
printf("Server ceka na klijent-a!\n");
while (1) {
/* za svaku novu konekciju dinamički 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 prihvaćenu vezu kreiramo novi thread */


pthread_create(&tid, NULL, ThreadFun, (void *) clifd);
}

/* kraj rada servera */


close(sockfd);

return 0;
}

Primjer - Server ostvaren pomoću thread funkcije

Klijent-ov kod se nije mijenjao, on se i dalje spaja na server kao i prije promjene, samo sada
se ne može dogoditi zastoj, jer server svaku novu konekciju pokreće u zasebnom thread-u.
Sad server može biti samo zauzet ako se dosegne maksimalan broj thread-ova koje server
može opsluživati.
Kod korištenja 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 sruši, klijenti koji se obrađuju u zasebrni thred-
ovima, 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 nešto više osnovnih resursa. Za kreiranje procesa pod UNIX-om koristi se
funkcija fork().

fork i exec funkcije

Jedini način da kreirate novi proces pod UNIX-om je korištenjem fork funkcije.
Njezin prototip je vrlo jednostavan i lako za koristiti, samo je osnovno razumijevanje malo
složenije.
#include <unistd.h>

pid_t fork (void);

760/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Returns: 0 in child, process ID of child in parent, -1 on error

Ako do sada niste vidjeli ovu funkciju, najteži dio za shvatiti je da se fork funkcija poziva
jednom, a da njezin poziv izaziva vrijednosz dva puta. Vraća jednom rezultat pozivajućem
procesu (roditelju) i to ID novonastalog procesa, i jednom vraća vrijednost novonastalom
procesu (djetetu) i to vrijednost nula. Vraćena vrijednost nam ujedno služi da bi znali da li se
naš program trenutno izvršava kao roditelj ili kao dijete. Ono što je najznačajnije kada
koristimo fork funkciju je to da svi deskriptori otvoreni prije samog poziva fork funkcije su
dijeljeni između roditelja i dijeteta.
Dva tipična načina korištenja fork funkcije:
1. Proces radi vlastitu kopiju tako da jedna kopija može upravljati osnovnim
operacijama, dok druga kopija može služit kao pomoćni task za obavljanje nekih
drugih poslova.
2. Proces želi izvršavati drugi program. Jedini način za kreiranje novog procesa je
pozivanjem fork funkcije. Proces prvo poziva fork da bi kreirao vlastitu kopiju, a
tada jedna od kopija (najčešće proces djeteta) poziva exec da bi zamijenio sebe sa
novim programom. To je tipično 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[]);


All six function returns -1 on error, no return on success

761/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Kako tema ovoga seminara nije interprocesna komunikacija, već TCP/IP API i socket-i, tako
da se nećemo upuštatit u detaljna razmatranja ovih funkcija. Za detalje pogledajte neku od
odgovarajućih referenci ili man stranice.
Jedina bitna napomena, i to vrlo važna, je to da se često u ponekim knjigama spominje da
upravo ovih šest funkcija služe za kreiranje novih procesa ili pokretanje novih programa, to je
donekle točno, ali može biti vrlo krivo shvaćeno. 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 pokušava 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 <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include <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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

{
printf("bind() error!\n");
return 2;
}

/* osluškivanje konekcije */
if (listen(sockfd, 2) == -1)
{
printf("listen() error!\n");
return 3;
}

/* 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;
}

Primjer - Server ostvaren korištenjem fork funkcije

763/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Procesi vs. Thread-ova


Za neke programe je teško odlučiti kada koristiti thread-ove, a kada procese. Evo
nekoliko savjeta koji mogu olakšati taj izbor:
- svi thread-ovi u programu moraju biti pokretani unutar istog izvršnog programa.
Djetetov proces, sa druge strane, može pokretati različite izvršne programe koristeći
exec funkcije.

- "lutajući" thread-ovi mogu naškoditi drugim thread-ovima unutar istog procesa zato
što thred-ovi dijele isti virtualni memorijski prostor i druge resurse. Na primjer, jedan
thread može pisati po neautoriziranom dijelu memorije, koja je možda dostupna u
drugom thread-u unutar istog procesa. Sa druge strane "lutajući" procesi to ne mogu
zato što svaki proces ima vlastitu kopiju memorijskog prostora.

- Kopiranje memorije za novi proces je skuplja operacija, od operacije kreiranja thread-


a, zato što se kod kreiranja novog thread-a kopira manji broj potrebnih informacija
nego sto je to slučaj 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 između 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 između procesa je ponešto složenije, ali zato kod njih nema
toliko problema oko dijeljenih resursa i puno su rijeđi bugovi koji se pojavljuju kod
konkuretnosti.

764/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Dodatak A: Web server


Napravili smo jedan rudimentalni web server kako bi barem malo dočarali kako se
pomoću TCP/IP API-a izrađuju komunikacijski programi.
Ovaj web server radi po HTTP 1.1 standardu (opisanom u RFC-u 1216) na portu 8000
(tako da ga može pokrenuti i običan korisnik, a ne samo root) i isporučuje samo HTML ili
obične plain text datoteke. Ostale funkcionalnosti (isporučivanje slika i sl.) nismo stavljali jer
nije predmet ovog seminara, a samo bi otežalo razumjevanje koda.
Želite li isprobati kako ovaj server radi, kompajlirajte kod, napravite direktorij htdocs i
u njega stavite datoteku index.html. Pokrenite web server, te u web preglednik na tom istom
računalu upišite http://localhost:8000. Naravno, ako serveru pristupate sa nekog drugog
računala, tada umjesto localhost upisujete ime servera ili njegovu IP adresu. Ako je sve prošlo
kako treba, trebali bi dobiti index.html web stranicu u svom web pregledniku.

BiK Web Server:


/*bik-httpd.c*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include <sys/wait.h>

#define BUF_SIZE 16384 /* Velicina buffera */


#define SRV_NAME "BiK Web server v0.2" /* Ime servera */

/* Funkcija koja hvala 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("Child exited with signal %d and status %d\n", signum, status);
}

/* postavljanje parametara protokola HTTP 1.1 koji ce se vratiti klijentu u


* ovisnosti o statusu
*/
void parametri_odgovor(int status, char* buff)
{
char param1[BUF_SIZE/4] = {0}; /* Buffer za parametre na pocetku */
char param2[BUF_SIZE/4] = {0}; /* Buffer za parametre na kraju */
time_t tmp_time;

/* ovisno o statusu se vracaju odredjeni parametri klijentu */


switch(status)
{
case 404:
strcpy(param1,"HTTP/1.1 404 Not Found\n");
strcpy(param2,"Transfer-Encoding: chunked\n");
break;
case 200:
strcpy(param1,"HTTP/1.1 200 OK\n");
// strcat(param2, "Last-Modified: Mon, 22 Nov 2004 12:02:11 GMT\n");
strcat(param2, "Accept-Ranges: bytes\n");
strcat(param2, "Content-Length: 4096\n");
break;
default:
strcpy(param1,"HTTP/1.1 400 Bad Request\n");
strcpy(param2,"Connection: close\n");
}

strcpy(buff, param1);

765/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

/* 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

return 2;
}

/* osluskivanje konekcije */
if (listen(sockfd, 2) == -1)
{
printf("listen() error!\n");
return 3;
}

/* 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Dodatak B: Klijent – server ostvaren pomoću UDP-a i


korištenjem gethostbyname funkcije

Klijent:

/* uuc.c - UNIX UDP Client Code */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

printf("Error in recvfrom\n");
return EXIT_FAILURE;
}

printf("%s Celsius = %s Fahrenheight\n",argv[1], data);

shutdown(sockfd,2);
return EXIT_SUCCESS;
}

Server:

/* uss.c - UNIX UDP Server Code */

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>

volatile sig_atomic_t done;

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;

if(signal(SIGINT, SIG_IGN) != SIG_IGN)


{
signal(SIGINT, inthandler);
}

if(signal(SIGTERM, SIG_IGN) != SIG_IGN)


{

770/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

signal(SIGTERM, inthandler);
}

my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = INADDR_ANY;
my_addr.sin_port = htons(1092);

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Dodatak C: Local Namespace Socket


Server:

/* (socket-server.c) Local Namespace Socket Server */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

/* Čita tekst sa socket-a i ispisuje ga na standardni izlaz. Ponavljaj


* dok se socket ne zatvori. Vraća broj različit od nule ako klijent
* pošalje "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 veličine. */
text = (char*) malloc (length);
/* Čitamo tekst te ga ispisujemo. */
read (client_socket, text, length);
printf (“%s\n”, text);
/* Oslobađamo zauzete resurse. */
free (text);
/* Ako klijent pošalje "quit" poruku, završavamo */
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);

/* Označavamo da je ovo server. */


name.sun_family = AF_LOCAL;
strcpy (name.sun_path, socket_name);
bind (socket_fd, &name, SUN_LEN (&name));

/* Osluškujemo konekcije. */
listen (socket_fd, 5);

/* Uzastopno prihvaćamo konekcije.


Ponavljamo dok klijent ne pošalje "quit". */
do {
struct sockaddr_un client_name;
socklen_t client_name_len;
int client_socket_fd;
/* Prihvaćamo konekciju. */
client_socket_fd = accept (socket_fd, &client_name, &client_name_len);
/* Obrada konekcije. */
client_sent_quit_message = server (client_socket_fd);
/* Zatvaramo našu stranu konekcije. */
close (client_socket_fd);
} while (!client_sent_quit_message);

/* Brišemo socket file. */

772/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

close (socket_fd);
unlink (socket_name);

return 0;
}

Klijent:

/* (socket-client.c) Local Namespace Socket Client */

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

/* Pišemo na socket dan imenom file deskriptora SOCKET_FD. */


void write_text (int socket_fd, const char* text)
{
/* Zapisujemo broj byte-ova stringa, uklučujući
NUL-terminator. */
int length = strlen (text) + 1;
write (socket_fd, &length, sizeof (length));
/* Pišemo 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));
/* Pišemo tekst sa komandne linije na socket. */
write_text (socket_fd, message);

close (socket_fd);

return 0;
}

773/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Dodatak D: Primjer korištenja socketa pod Windows-ima

Za znatiželjne čitatelje (oni koji žele znati više) dat je jedan jednostavan primjer
komunikacije klijent – server pod windows-ima.
Server program otvara socket na portu 3490 i čeka da se netko spoji na njega. Nakon
što se neki klijent spoji na socket ispisuje se string "Hello world!" i zatvara socket.

Server:

/*
** server.c -- a stream socket server demo
*/
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MYPORT 3490 // the port users will be connecting to


#define BACKLOG 10 // how many pending connections queue will hold

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; // host byte order


my_addr.sin_port = htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(&(my_addr.sin_zero), '\0', 8); // 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Majk Jednaković

UDP
USER DATAGRAM PROTOCOL

776/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

UDP – USER DATAGRAM PROTOCOL

U OSI modelu ovaj se protokol nalazi iznad IP protokola. UDP je zamišljen s ciljem
omogućavanja prijenosa podataka i razmjene informacija u mrežama s preklapanjem paketa
(packet – switched networks ) kao što je Internet. UDP pretpostavlja da se kao protokol ispod
njega koristi IP protokol.
UDP omogućava aplikacijskim programima da međusobno razmjenjuju informacije i
poruke uz upotrebu minimalnih protokolnih mehanizama. Kako bi se omogućila
komunikacija između različitih aplikacija uvodi se pojam porta. Protokol nije konekcijski
orijentiran što znači da dostava paketa nije garantirana. Isto tako se ne provjerava dupliciranje
podataka. Isto tako nema provjere redoslijeda pristiglih podataka tako da aplikacije koje to
zahtijevaju moraju koristiti TCP protokol ( Transmission Control Protocol ).

4-slojni model prema ARPANET-u


Razvojem ARPANET-a, čiji je sponzor i inicijator bilo Ministarstvo obrane SAD-a.
(Department of Dafense - DoD), definiran je temeljni višeslojni referentni model
komunikacijskih protokola, koji je danas, upravo po svom pokrovitelju, poznat kao
DoD model.
DoD obuhvaća četiri sloja (razine) protokola, i to:
1. razina:Sloj pristupa mreži (Network Access Layer)
2. razina:Mrežni sloj (Internet Layer)
3. razina:Međuračunalni sloj (Host-to-Host Layer)
4. razina:Procesni sloj (Process Layer)

777/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

ISO OSI referentni model i Internet

Aplikacijski sloj (Application Layer) opisuje kako će stvarni posao biti određen na
izvornom i odredišnom računalu.Ovdje se odvajaju upravo one stvari koje korisnika najviše
zanimaju:
Prenošenje elektroničke pošte, prenošenje datoteka, pristup World Widw Webu.
Ovdje se izvršavaju aplikacije pojedinih mrežnih usluga.
Prezentacijski sloj (Presentation Layer) opisuje sintaksu podataka koji se prenose, te
obavlja neke predradnje za sljedeći viši sloj.Pretvara datoteke između različitog formata, brine
se o kompresiji i dekompresiji podataka, i slično. Npr. Ovaj sloj opisuje kako će broj sa
pomičnim zarezom biti prenesen na drugo računalo koje radi na drugačijim matematičkim
formatima.
Sloj sesije-sastanka ili dijaloga (Session Layer) opisuje uspostavljanje dijaloga
između ishodišnog i odredišnog računala.Zadužen je za uspostavljanje veze (konekcije) s
drugim računalom te prekidanjem uspostavljene konekcije.
Transportni sloj (Transport Layer) opisuje kvalitetu i prirodu podataka koji prenose
kroz mrežu.Npr ovaj sloj opisuje kako će biti izvršena retransmisija neispravno primljenih
paketa na odrediste.Brine se o dobrom redoslijedu pristizanja paketa na odredište.U internet
mreži to su protokoli TCP i UDP protokoli
Mrežni sloj (Network Layer) opisuje kako se niz podataka razmjenjuje između bilo
koja dva čvora mreže.Npr. ovaj sloj definira adresiranje i usmjeravanje paketa kroz Internet
mrežu.U suradnji sa slojem 2.određuje koji je put najoptimalniji za prijenos podataka do
odredišta.U Internet mreži to je IP protokol.
Sloj podatkovne veze (Data Link Layer) opisuje logičku organizaciju podatkovnih
bitova za prijenos kroz medije.Npr. ovaj sloj definira strukturu okvira i paketiranje podataka,
adresiranje paketa, metodologiju određivanja sume, i slično.
Fizički sloj (Physical Layer), opisuje fizikalne karakteristike različitih
komunikacijskih medija kroz elektroničke karakteristike signala koji « nose « podatke. (Npr.
Ethernet kablove, utičnice, završetke, naponske razine signala, modeme i modemske
standarde, i dr).
Mrežni sloj (Network Layer) opisuje kako se niz podataka razmjenjuje između bilo
koja dva čvora mreže.Npr. ovaj sloj definira adresiranje i usmjeravanje paketa kroz Internet

778/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

mrežu.U suradnji sa slojem 2.određuje koji je put najoptimalniji za prijenos podataka do


odredišta.U Internet mreži to je IP protokol.
Sloj podatkovne veze (Data Link Layer) opisuje logičku organizaciju podatkovnih
bitova za prijenos kroz medije.Npr. ovaj sloj definira strukturu okvira i paketiranje podataka,
adresiranje paketa, metodologiju određivanja sume, i slično.
Fizički sloj (Physical Layer), opisuje fizikalne karakteristike različitih
komunikacijskih medija kroz elektroničke karakteristike signala koji « nose « podatke. (Mpr.
Ethernet kablove, utičnice, završetke, naponske razine signala, modeme i modemske
standarde, i dr).

1. 2. 3. 4. 5. 6. 7.

779/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Arhitektura Protokola Interneta

Aplikacijski: Transportni:
Talnet-udaljeni terminal TCP-Transportni protokol
FTP-prijenos podataka (File Transfer Protocol) (Transmission Control Pro)
SMTP-elektronička posta(Simple Email Pro) UDP-brzi datagramski protokol
rcp-udaljeno kopiranje datoteka (remonte (User Datagram Protocol)
file copy)
rsh-udaljeno procesiranje(remonte shell) Mrežni:
rlogin-udaljeno logiranje(remonte login) IP-Internet Protokol
TFTP-trivijalni prijenos datoteka(Trivial ICMP-protokol za kontrolu
Internet File Protocol) poruka(Internet Control Massage
Pro)
HTTP-web protokol(Hipertext Transfer IGMP-(Internet Grup Mgmnt Pro)
Protocol)
ARP-adresni protokol(Addres
RTP-prijenos u realnom vremenu(Real time Rezolution Protocol)
Transfer Protocol) RARP-Rezervni adresni protokol
DHCP-protokol za dinamičku konfiguraciju (Reverse Rezolution Pro)
računala(Dinamic Host Configuration Pro) RIP-usmjerivački protokol
NTP-imenik mrežnih domena(Domain (Routing Information Pro)
Name System) BGP-Protokol rubnog mosta
SNMP-protokol za upravljanje mrežnim (Border Getway Protocol)
uređajima(Simple Network Mangement Pro) SLIP/CSLIP-serijski protokoli
(Serial line IP/Compresed SLIP)

Podatkovni i Fizički:

Ethernet, TokenRing, FDDI, ATM, ISDN....

780/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Telnet
Telnet pruža mogućnost rada na udaljenog računalu. Korisnik se s jednog računala
može logirati (prijaviti) na drugo i ponašati se kao da je točno na tipkovnici drugog računala.
Ova veza može biti stvorena u lokalnoj mreži ili između bilo koje dvije na svijetu, dokle god
korisnik ima dopuštenje ulogirati se na udaljeno računalo.
Telnet se može koristiti za rad na računalima po cijeloj zemlji. Obično se ne koristi
osim u LAN / WAN kontekstu, ali postoje računala koja dopuštaju telnet pristup kako bi
korisnici, primjerice, mogli testirati nove aplikacije ili operativni sustav.

File Transfer Protocol


FTP može datoteku na jednom računalu kopirati na drugo. Korisnik se zapravo ne logira
kao pravi korisnik na računalu kojem pristupa (kao kod telneta), nego koristi FTP program
koji se pak koristi određenim setom instrukcija kojim "razgovara" s udaljenim računalom.
Ponovo, korisnik mora imati određena dopuštenja na udaljenom računalu da bi mogao
pristupiti datotekama.
Jednom kada se uspostavi veza, FTP omogućuje kopiranje jedne ili više datoteka sa ili
na vaše računalo. Široko se koristi na Internetu, kao i na mnogim većim LAN-ovima i WAN-
ovima.

Simple Mail Transfer Protocol


Koristi se za prijenos elektroničke pošte. Transparentan je za korisnika, a "iza scene" se
spaja na udaljena računala i prenosi e-mail poruke slično poput prijenosa FTP-om. Korisnici
su rijetko uopće svjesni djelovanja SMTP-a, a sistem administratori rijetko imaju problema s
njim. Globalno praktički ne postoji sustav koji ga ne podržava.

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Domain Name System


DNS omogućava mrežnim imenima računala pretvaranje u mrežne adrese. Na primjer,
PC-u zvanom Luka ne može se pristupiti sa bilo kojeg drugog računala na mreži ukoliko ne
postoji neka metoda povezivanja računalovog imena sa mrežnom adresom. DNS obavlja ovu
konverziju, i zbog njega u naš Internet preglednik možemo napisati, npr. www.google.com a
ne 204.173.264.318.

Simple Network Management Protocol


SNMP se koristi za statusne poruke i prijavljivanje problema kroz mrežu do
administratora. Koristi User Datagram Protocol (UDP) kao transportni mehanizam. U SNMP-
u se koristimo nešto drugačijim terminima, pa umjesto klijenta i servera imamo managera i
agente (iako su to zapravo iste stvari). Agent pruža informacije o uređaju, a manager služi za
komunikaciju putem mreže sa agentima.

Network File System


Set protokola koji je razvio Sun Microsystems kako bi omogućio transparentno
pregledavanje datotečnog sustava između više računala spojenih na istu mrežu. Čest u
velikim, korporativnim okruženjima, posebno onima sa UNIX radnim stanicama.

Remote Procedure Call


Set funkcija koje omogućavaju aplikaciji da komunicira sa drugim računalom
(serverom). Koristi se za programske funkcije, povratne kodove i predefinirane varijable za
podršku distribuiranim mrežama računala.

Trivial File Transfer Protocol


Vrlo jednostavan protokol za razmjenu datoteka koji nema nikakvu sigurnosnu zaštitu.
Koristi UDP za transport podataka. Obavlja istu funkciju kao i FTP, ali kroz drugi transportni
protokol.

782/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Transmission Control Protocol


Pruža pouzdan transfer podataka. Odgovora na "slaganje" podataka prenesenih iz viših
aplikacija u standardne pakete i osigurava da se paketi prenesu kako su i poslani.

User Datagram Protocol


Nije orijentiran na povezivanje točaka (za razliku od TCP-a), jer ne pruža retransmisiju
datagrama. Dakle, jednom poslani podatak neće se provjeravati da li je stigao kako je trebao.
Nije pouzdan, ali ima posebne svrhe. Aplikacije koje koriste UDP imaju ugrađene algoritme
za provjeru prijenosa, čime se premoštavaju nedostatci standardnog UDP-a.

Internet Protocol
Brine se za prijenos paketa podataka koje je složio TCP ili UDP. Koristi set unikatnih
adresa za svaki uređaj na mreži da bi utvrdio smjer i odredište podatka.

Internet Control Message Protocol


Provjerava i generira poruke o statusu uređaja na mreži. Može se koristiti da bi se drugi
umreženi uređaji obavijestili o kvaru na jednom od njih. ICMP i IP obično "rade" zajedno

783/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

CLIENT-SERVER KOMUNIKACIJA

TCP/IP je skup protokola koji se koristi za povezivanje računala i srodnih uređaja. Iako
unutar njega postoji više protokola promatrat ćemo samo dva, TCP(Connection oriented) i
UDP (Connectionless) te ćemo pričati 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, možemo reći da je socket pristupna točka (definirana
određenim parametrima) koja služi za komunikaciju između aplikacija na različitim
računalima.

Karakteristike:
Bespojna uluga (Connectionless) – UDP protokol
osnovna jedinica prijenosa je datagram
bespojna veza
ne garantira se isporuka pojedinog datagrama, ali se također može desiti
isporuka više identičnih kopija istog datagrama
ne garantira se očuvanje redoslijeda poslanih datagrama
nema kontrole protoka
Spojna usluga:
pouzdanost: svaki niz poslanih okteta će sigurno stići na odredište, osim u
slučaju prekida veze ili neke druge greške na poslužitelju o čemu će
aplikacija pošiljatelj biti obaviještena
kontrola toka – nije moguće zagušenje primatelja od strane pošiljatelja
očuvani redoslijed isporuke

Strukture potrebne za rad sa socketima

Svaki socket je zapravo deskriptor (socket descriptor) što je cijeli broj. Osnovna
struktura koju funkcije očekuju je
----------------------------------------------------------------------------------------------------------
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx

784/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

char sa_data[14]; // 14 bytes of protocol address


};
---------------------------------------------------------------------------

međutim zbog jednostavnijeg korištenje razvijena je struktura:


----------------------------------------------------------------------------------------------------------
struct sockaddr_in {
short int sin_family; // Address family (AF_xxx)
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // postaviti na 0 sa memset
};
----------------------------------------------------------------------------------------------------------
(Napomena: sin_zero element strukture služi da bi ova struktura imala istu veličinu kao
i struktura struct_sockaddr. sockaddr_in je izvedeno zbog lakšeg rukovanja.). Pokazivač na
ovu strukturu može se castati u struct sockaddr* i obrnuto.
struct in_addr je struktura sa samo jednim članom (unsigned long s_addr).U slučaju
klijenta ovo polje sadrži adresu računala kojem se pristupa i na kojem se očekuje poslužitelj,
dok kod servera ovo polje sadrži adresu sučelja na koje se veže server. U slučaju da želimo da
server prima pakete na sva sučelja 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.

785/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Adrese koje se koriste i stavljaju unutar ove strukture su 32-bitne adrese. U slučaju da
imamo (s našeg gledišta) standardni zapis adrese (npr. 161.53.119.118) ona se mora pretvoriti
u 32-bitni broj za što možemo 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 slučaju da ove gornje funkcija ne postoje može se koristiti funkcija
inet_addr()
koja u slučaju greške vraća -1 što može biti krivo interpretirano kao (255.255.255.255)

786/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Funkcije za rad sa socketima (socket API)

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

domain predstavlja grupu komunikacijskih usluga koju želimo koristiti. (AF_INET


(IPv4) mrežni protokol, AF_INET6, AF_UNIX (cjevovod)..[1].)
type označava koji tip socketa želimo koristiti (npr. SOCK_STREAM ,
SOCK_DGRAM)
protocol označava 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 slučaju greške funkcija će vratiti -1, a inače 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 sadrži informacije o adresi i pristupnom broju
(port). Portovi ispod 1024 su rezervirani. Moguće je koristiti bilo koji broj porta do 65535 ako
već nije zauzet od strane nekog drugog programa. U slučaju da se za port ostavi 0 veže se na
bilo koji broj koji jezgra ili funkcija odredi. addrlen je veličina prethodne strukrure i može se
postaviti na sizeof(struct sockaddr).
Dok poslužitelj mora vezati socket na neki port i osluškivati, klijent se kod spojne
usluge treba konektirati na neki određeni stroj na neki određeni port i to pomoću funkcije
connect

788/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

#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 sadrži odredišnu IP adresu i odredišni port, a addrlen je veličina
prethodne strukrure i može se postaviti na sizeof(struct sockaddr).
Primijetimo da klijent ne zove bind() jer ga ne zanima lokalni port, već samo onaj
odredišni. Da bi se klijent spojio na odredišni stroj, tamo mora netko i čekati i osluškivati, za
što služi funkcija listen

int listen(int sockfd, int backlog);

sockfd je socket file deskriptor kojeg je vratio poziv funkcije socket(),a backlog je broj
dozvoljenih konekcija u redu čekanja. Konekcije se prihvaćaju funkcijom accept().

#include <sys/socket.h>

int accept(int sockfd, void *addr, int *addrlen);

sockfd je socket deskriptor od socketa na kojem se osluškuje. addr je obično 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 neće
staviti više od toliko byteova u addr. Ako stavi manje promijenit će vrijednost varijable
addrlen.
Za slanje i primanje podataka služit ć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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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 možemo učiniti pomoću close, ili ako želimo malo više
kontrole (npr. zatvoriti ga samo u jednom smjeru) shutdown

close(sockfd);
int shutdown(int sockfd, int how);

how (0-Daljnji primitak je onemogućen, 1-Daljnje slanje je onemogućeno, 2-oboje (kao


close)
Od korisnih funkcija spomenimo još dvije koje služe za dobivanje informacije o
klijentu, odnosno o vlastitom stroju.

#include <sys/socket.h>

int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);

#include <unistd.h>

int gethostname(char *hostname, size_t size);

790/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Korištenje DNS-a

Općenito je lakše pamtiti simboličko ime stroja, a ne njegovu IP adresu. Za pretvaranje


simboličkog imena u IP adresu i obrnuto mogu nam poslužiti sljedeće funkcije.
Funkcija gethostbyname vraća

#include <netdb.h>

struct hostent *gethostbyname(const char *name);


struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
#define h_addr h_addr_list[0]

Struktura struct hostent ima sljedeća polja:


h_name – službeno ime stroja
h_aliases -- NULL-terminated polje alternativnih imena.
h_addrtype – tip adrese,obično AF_INET.
h_length – Duljina adrese u byte-ovima.
h_addr_list – 0 završeno-terminated polje mrežnih adresa stroja. Adresu su u
Network Byte Order.
h_addr – prva adresa u h_addr_list.
gethostbyname() vraća pokazivač na popunjenu struct hostent, ili NULL u slučaju
greške. Kod greške se stavlja u h_errno (herror().funkcija). Neke bitnije su:
HOST_NOT_FOUND (zadano računalo ne postoji), NO_ADDRESS/NO_DATA (računalo
postoji, ali nema IP adresu), NO_RECOVERY (neoporavljiva greška), TRY_AGAIN (greška
privremenog karaktera).
Primjer: getip.c

791/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Osluškivanje na više socketa

U slučaju da želimo unutar jednog programa osluškivati na više portova očito ne može
(ne smijemo) ostati blokirani na accept. Iako je socket file deskriptor, pa možemo podesiti
(fnctl) da nije blokirajući, bolja varijanta je upotrijebiti select (vidi prethodne vježbe)

Sockets in Java Primjer: chatserver.c

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

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; # for OO version of gethostbyaddr

$PORT = 9000; # pick something not in use

$server = IO::Socket::INET->new( Proto => 'tcp',


LocalPort => $PORT,

794/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb UDP

Listen => SOMAXCONN,


Reuse => 1);

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/; # blank line
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;
}

795/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Boris Ivanišević

FILE, DIRECTORY AND


INODE PROGRAMMING

796/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

UVOD

Cilj seminarskog rada je upoznati čitatelja sa osnovama file sistema i programiranja


unutar unix okruženja.
Seminar je podijeljen na više zasebnih cjelina:
unix file sistem – gdje se obrađuje struktura unix file sistema, odnosno
objašnjava 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
najvažnije 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 zašto ž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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

UNIX FILE SISTEM

Filozofija unix file sistema

Filozofija unix file sistema je vrlo jednostavna – sve unutar njega se tretira kao file.
Koliko god ta pretpostavka izgleda jednostavno ona u sebi sadrži moć koju je teško na prvi
pogled uočiti. Ovim poglavljem ću pokušati pokazati da je to tako. Isto tako treba naglasiti da
takva pretpostavka na prvi pogled za sobom vuče niz prednosti – jednostavnost upotrebe,
jednoznačno definirani pristup svim resursima operativnog sustava.

Struktura unix file sistema

Slika 2.1.1. pokazuje karakterističnu strukturu unix file sistema. On se sastoji od 4


glavna dijela:
Boot blok Super blok Lista inodeova Data blokovi
Slika 2.1.1.

Boot blok sadrži osnovni program odnosno pokazivač na njega koji pokreće podizanje
operativnog sustava. Super blok nosi informacije o file sistemu, njegovu veličinu, listu
slobodnih inodeova, odnosno listu slobodnih data blokova (zapravo broj slobodnih blokova i
pokazivač na slijedeći slobodni blok) te flag za označavanje modifikacije super bloka. Tu je
još i polje inodeova i data blokova, gdje su inodeovi i fileovi fizički zapisani.

Što je inode

U unix file sistemu inode igra veliku ulogu. Sadržava sve relevantne informacije o
nekom file-u. Zapravo bi ga mogli shvatiti kao posrednika između operativnog sustava i
fizičkih podataka. Slika 2.3.1. pokazuje okvirnu strukturu inode-a:

798/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Tip i modovi
User i group ID
Broj hard linkova
Veličina u bajtovima
Direktni pointer 1
Direktni pointer 2
...........
Jednostruki indirektni pointer
Dvostruki indirektni pointer
Trostruki indirektni pointer
Slika 2.3.1.

Svaki inode sadrži podatke o tipu i modovima filea odnosno govori koji je file tipa
(direktorij, obični file, pipeline...) i koje su mogućnosti pristupa fileu na razini vlasnika
(ownera), grupe i ostalih korisnika. To se odnosi na postavke čitanja, pisanja odnosno
izvršavanja fajla ukoliko se on može pokrenuti. Dalje sadrži 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 veličina filea i broj hard linkova na file. I jasno,
na kraju tu su pointeri na stvarne fizičke blokove memorije i indirektni pointeri.
Indirektni pointeri služe za mogućnost adresiranja većih fajlova.

799/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Data
blokovi

Legenda
Direktni pointer

Jednostruki indirektni pointer

Dvostruki indirektni pointer

Trostruki indirektni pointer


Slika 2.3.2.

800/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Slika 2.3.2. pokazuje kako je pomoću indirektnih pointera moguće ostvariti adresiranje
većih fajlova. Važno je naglasiti da različite implementacije unixoidne arhitekture file
sistema različito tretiraju strukturu inodea na način da povećanjem ili smanjenjem broja
direktnih i indirektnih pointera dopuštaju mogućnost spremanja i manipuliranja većim ili
manjim fajlovima. To dopušta veliku fleksibilnost jer ograničenje veličine najvećeg mogućeg
filea nije dobro. Valja napomenuti da ipak veći broj pointera može stvoriti dodatni memorijski
overhead.

Vrste fileova na unixoidnom file sistemu

Postoje različite vrste fajlova radi omogućavanja različitih funkcionalnosti rada sa


fileom. Tako postoje regularni fileovi (oznaka -) koji predstavljaju obične fileove koji su ili
tekstualni ili binarni, a razlikujemo ih po tome što tekstualni nemaju oznaku x koja služi za
pokretanje fileova. Direktoriji (oznaka d) omogućuje pristup direktoriju. Dalje postoje
device fileovi, između kojih razlikujemo block (oznaka b) i character (oznaka c) device
fileove. Block device fileovi služe za komunikaciju između file sistema i hardwarea računala
te omogućuju slanje podataka između kernela i hardwarea u zadanim većim memorijskim
blokovima. Uobičajeno se koriste za referenciranje svih storage devicea (hard diskovi,
magnetni mediji, CD i DVD uređaji...).
Character device fileovi omogućavaju komunikaciju znak po znak. Koriste se za
referenciranje printera i raznih mrežnih uređaja. U nekim implementacijama unixoida se svi
device fileovi tretiraju kao block device fileovi. Za jednostavno komuniciranje koristimo
named pipes (oznaka p). Koristi se za jednosmjernu komunikaciju tipa FIFO (first in first
out) obično u situacijama gdje izlaz jedne operacije šaljemo kao ulaz drugoj (pipelining).
Za dvosmjernu komunikaciju koristimo domain sockets (oznaka s). Oni omogućavaju
slanje podataka u oba smjera između lokalnih odnosno mrežnih procesa. Symbolic odnosno
soft link (oznaka l) označava file koji sadrži pathname nekog drugog filea. Može se koristiti
za pristup fileovima nekog drugog file sistema.
U prethodnom poglavlju o inodovima spomenut je broj hard linkova. Hard i soft linkovi
su po prirodi drugačiji. Kad stvorimo neki novi hard link zapravo smo mapirali neko novo
ime filea na već postojeći inode kojem je porastao broj hard linkova za jedan. Prilikom
pokušaja brisanja filea file će se ukloniti tek ako broj hard linkova padne na nulu. Prilikom
stvaranja symbolic linka stvaramo novi inode koji pokazuje na iste fizičke podatke kao i

801/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

originalni file. Kod brisanja je bitno uvidjeti da ako izbrišemo originalni file soft link više nije
validan. Još jedna važna razlika je u tome što da bismo stvorili hard link originalni file mora
postojati dok kod symbolic linka to nije preduvjet.

Oznaka vrste filea i modovi pristupa

Svaki administrator unixoidnog file systema u sklopu instalacije podešava sistem razina
pristupa. On se temelji na stvaranju pojedinaca i grupa korisnika sa pripadajućim razinama
ovlasti. Svakom pojedincu pridružuje se userID i groupID broj koji se koristi za zaštitu
neovlaštenog pristupa fileovima. GroupID služi da bi se određenoj skupini korisnika mogle
dati unaprijed uniformirane privilegije jednom komandom. Root user odnosno administrator
računala uvijek ima 0 kao broj userIDa i groupIDa. Njemu su na raspolaganju sve ovlasti nad
svim fileovima. Navedeni podaci o korisnicima nalaze se u /etc/passwd fileu.
Slika 2.5.1. prikazuje kako izgleda karakteristična ls -l komanda.
-rw-r--r-- 1 boris 725 Jul 10 15:07
list.c
-rw-r--r-- 2 boris 512 Jun 13 16:19
stack.c
drwxr-xr-x 2 boris 512 Jun 24 00:19
blah
Slika 2.5.1.

Za ovo poglavlje je bitna prva kolona. Ona sadržava informacije o vrsti filea (prvi znak)
i kontrole pristupa fileu. Dalje idu oznake pristupa fileu ownera (vlasnika), grupe, i ostalih
korisnika. Svakom su pridodjeljena tri znaka. Prvi od tri znaka označava mogućnost čitanja
(read) filea (oznaka r). Drugi označava mogućnost modifikacije (write, oznaka w), dok
zadnji znak daje pravo izvršavanja (execution) filea. Kod sva tri znaka oznaka – znači
zabranu određene operacije pojedinom korisniku.

802/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Root i ostali direktoriji

Slika 2.6.1. prikazuje hijerarhiju direktorija na unixoidnom file sistemu.

bin boot dev etc home lib sbin tmp usr


Slika 2.6.1.

Bitno je naglasiti da je ishodište svih direktorija root direktorij (oznaka /). Stoga kad
smo na nekoj poziciji unutar stabla direktorija možemo promatrati svoju poziciju s obzirom
na direktorij u kojem jesmo (relative path) i poziciju s obzirom na root direktorij (absolute
path).
Pojedini važni direktoriji su:
bin - komande dostupne svima u obliku izvršnih 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 dinamičkih biblioteka
sbin – specijalne komande
tmp – skladište privremenih fileova
usr – sve povezano sa pojedinim korisnikom (dodatne komande, man
stranice, headeri, standardne biblioteke)

803/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

KOMANDE NA UNIXOIDNOM
OPERATIVNOM SUSTAVU

man
Najvažnija komanda. Služi za prikazivanje manual stranica određene komande.
Izgled: man command
Primjer: man cp – daje manual stranice o komandi cp

Komande za manipulaciju fileovima

cp
Koristi se za kopiranje filea.
Izgled: cp source destination
Primjer: cp bla.c blah – kopira file bla.c u direktorij blah

mv
Koristi se za pomicanje filea.
Izgled: mv source destination
Primjer: mv bla.c .. – pomiče file bla.c u parent direktorij

rm
Koristi se za brisanje filea.
Izgled: rm file
Primjer: rm bla.c – briše file bla.c

more
Koristi se za ispis filea u konzolnoj liniji.
Izgled: more file
Primjer: more blabla.h – ispisuje sadržaj filea blabla.h

804/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

lpr
Koristi se za ispis filea na printer.
Izgled: lpr file
Primjer: lpr blablah.h – printa sadržaj filea blabla.h

Komande za manipulaciju direktorijima

Bitno je naglasiti da:


/ označava root direktorij
. označava trenutni direktorij
.. označava parent direktorij

cd
Koristi se za mijenjanje pozicije.
Izgled: cd direktorij
Primjer: cd hmda – ulazak u direktorij hmda

pwd
Koristi se za ispis trenutne pozicije.
Izgled: pwd

ls
Koristi se za ispis svih fileova unutar trenutnog direktorija.
Izgled1: ls – daje samo listu imena fileova
Izgled2: ls -l - daje više informacija o fileovima

mkdir
Koristi se za stvaranje novog direktorija.
Izgled: mkdir direktorij
Primjer: mkdir mhm – stvara novi direktorij mhm

805/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

rmdir
Koristi se za brisanje direktorija.
Izgled: rmdir direktorij
Primjer: rmdir mhm – briše direktorij mhm

Komande za manipulaciju ovlastima nad fileom/direktorijem

chmod
Koristi se za promijene postavki pristupa fileu. Može se koristiti na više načina
međutim ovdje ću opisati po meni možda najjednostavniju primjenu koja koristi oktalno
kodiranje. Slika 3.3.1. pokazuje primjer kodiranja.

d r w x _ _ x _ w x

1 1 1 0 0 1 0 1 1

7 1 3
Slika 3.3.1.

Izgled: chmod oktalni kod file


Primjer: chmod 644 bumbar.h – file bumbar.h dobiva ovlasti rw-r--r--

806/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

PROGRAMIRANJE U UNIXU

Unix i C

Teško je uopće zamisliti kakvo bi bilo stanje u računalnom svijetu da je unix bio bez C
programskog jezika i da je C bio bez unixa. Zapravo popularnost unixa i ostalih sličnih
operativnih sustava se isto tako duguje C-u. Mase programera napravilo je svoje prve korake
pisajući C instrukcije na unixu. Današnji C, kojeg još i nazivaju moderni asembler, zbog
efikasnosti, jednostavnosti i povezanosti sa unixom je vjerojatno najviše upotrebljavan
programski jezik na unix platformi (uz veliku upotrebu i nekih ostalih programskih jezika
perl, awk...)

Manipuliranje unix fileovima i direktorijima u programskom


jeziku C

Sve što nam treba da bismo počeli stvarati programe je par važnih stvari. Koristit ćemo
definicije struktura podataka i funkcija iz unistd.h filea koji sadrži standardne unix definicije,
zatim dirent.h koji nam treba zbog manipulacije direktorijima, te sys/stat.h koji dozvoljava
pregled svih stvari vezanih uz file.
U našem radu koristit ćemo gcc C kompajler koji se nameće kao standardan, kvalitetan i
besplatan.

Make alat

I još na kraju, prije programiranja, bitno je spomenuti još jednu stvar koja nam iz dana u
dan može olakšati 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
izvršne fileove. Međutim taj posao bi postao ogroman kada bismo morali istu stvar raditi za
mnogo fileova. Zato nam je ponuđen alat koji omogućuje unaprijed zadano ponašanje svih

807/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

fileova od source koda do izvršnog 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 slijedeći
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 izvršit će se brisanje
fileova komandom rm. Make file pokrećemo naredbom make koja će naći u trenutnom
direktoriju Makefile i pokrenuti ga. Naredba make clean će pokrenuti čišćenje fileova
odnosno pokretanje naredbe rm.
Pomoću Makea je moguće raditi svašta, moguće je koristiti varijable unutar njega,
uglavnom s njim radimo proces kompajliranja i linkanja automatiziranim od početka do kraja.

808/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Tipovi podataka

Za potrebe programiranja dostupni su nam tipovi podataka u unix okruženju. Oni su


definirani u <sys/types.h> datoteci. To su:
blkcnt_t /* int - koristi se za označavanje broja blokova */
blksize_t /* int - koristi se za označavanje veličine blokova */
dev_t /* int - koristi se za označavanje device IDa */
gid_t /* int - koristi se za označavanje group IDa */
ino_t /* unsigned int - koristi se za označavanje broja inodea
mode_t /* int - koristi se za označavanje modova filea*/
nlink_t /* int - koristi se za označavanje broja linkova */
off_t /* int - koristi se za označavanje veličine filea */
uid_t /* int - koristi se za označavanje user IDa */

Izabrane funkcije

Od mnogih funkcija koje su definirane u raznim unix header fileovima izdvojit ćemo
one koji omogućuju operacije sa fileovima i direktorijima.
int symlink(const char *path1, const char *path2); /* <unistd.h> */
int unlink(const char *path); /* <unistd.h> */
int mkdir(const char *path, mode_t mode); /* <sys/stat.h> */
int rmdir(const char *path); /* <unistd.h> */
int chmod(const char *path, mode_t mode); /* <sys/stat.h> */
mode_t umask(mode_t cmask); /* <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 briše se file, a ukoliko
smo uklonili hard link onda se umanjuje link counter inodea. Funkcije mkdir odnosno rmdir
su identične istoimenim unix komandama. Funkcijom chmod mijenjamo modove određenog
filea. Sve navedene funkcije vraćaju 0 ukoliko je operacija prošla u redu, a u slučaju greške
vraćaju -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). Vraća dosadašnju
vrijednost umaska.

809/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Stat struktura

Za dobivanje temeljnih informacija o fileu koristimo stat strukturu. Da bi nam ona bila
dostupna unutar koda trebamo uključiti (includati) <sys/types.h> i <sys/stat.h> header
fileove.
struct stat {
dev_t st_dev; /* ID devicea koji sadrži file */
ino_t st_ino; /* broj inodea filea */
mode_t st_mode; /* modovi pristupa fileu */
nlink_t st_nlink; /* broj linkova na file */
uid_t st_uid; /* userID vlasnika filea */
gid_t st_gid; /* groupID vlasnika filea */
dev_t st_rdev; /* device ID ukoliko je file tipa
devica */
off_t st_size; /* veličina filea u bajtovima */
time_t st_atime; /* vrijeme zadnjeg pristupa */
time_t st_mtime; /* vrijeme zadnje modifikacije */
time_t st_ctime; /* vrijeme kreiranja filea */
blksize_t st_blksize; /* veličina blokova */
blkcnt_t st_blocks; /* broj blokova koje je file alocirao */
mode_t st_attr; /* atributi filea */
};

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 korištenjem file deskriptora, dok kod funkcija
stat i lstat koristimo path filea. Funkcija lstat u slučaju dohvaćanja simbolic linka referencira
sami link dok stat referencira file na koji link pokazuje. U povratnoj vrijednosti tipa int
dobivamo grešku u vidu vrijednosti -1 ukoliko funkcija nije mogla biti izvršena na normalan
način.

810/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

Dalje tu postoje i različite konstante (defineovi) za tipove i modove fileova te


predprocesorske direktive (macroi) koje ispituju tip filea. One svojim razumljivim imenima
daju mogućnost da ih lagano koristimo. Predprocesorske direktive su iskorištene u primjeru
programa u poglavlju 5.

Dirent struktura

Za dohvaćanje direktorija odnosno fileova unutar njega trebaju nam dvije stvari. Jedna
od njih je tip podataka DIR koji predstavlja direktorij, dok je druga struct dirent (skraćenica
od directory entry) koji predstavlja jedan unos unutar direktorija. Za korištenje je potrebno
uključiti (includati) <dirent.h>.
struct dirent {
ino_t d_ino; /* broj inodea */
char d_name[]; /* ime filea */
};

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. Vraća -
1 u slučaju greške. Funkcija rewinddir nam koristi da vratimo pointer na početak direktorija.
Može nam koristiti za višestruko iteriranje po direktoriju. Funkcijom telldir dobivamo
trenutnu lokaciju unutar direktoija koju onda možemo iskoristiti u funkciji seekdir koja nas
postavlja na tu lokaciju. Te dvije funkcije možemo koristiti za pamćenje pozicije unutar
direktorija i kasnije postavljanje na nju putem argumenta tipa long. I na kraju tu je funkcija
readdir koja iz direktorija učitava unos u struct dirent pomoću kojega možemo dobiti ime
filea.

811/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb File, directory and inode programming

LITERATURA, NAPOMENE I NEPOZNATI POJMOVI

Literatura
Kao literaturu sam koristio man i web stranice, bez kojih bi ovaj seminar bio teško
izvediv, pa se zahvaljujem svim ljudima koji su uložili 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 nemogućnosti odluke i definiranih stajališta struke oko upotrebe računalnog
nazivlja, a isto tako i zbog vlastitog odnosa prema toj temi izabrao sam rješenja koja mi zvuče
kao dobra, znajući da će biti onih koji se s njima ne slažu.
Kod nekih poglavlja se može primijetiti da nisu opisana do kraja, netko će reći da nešto
fali, međutim kao što sam i sam učio o ovoj temi pisajući ovaj seminar odlučio sam da ono što
mi se učinilo kao nepotrebnim, odnosno možda suviše teškim i zbunjujućim, izbacim odnosno
pojednostavnim. Poglavlje 3 navodi osnovne oblike komandi. Za njihovo potpuno
svladavanje nužno je dalje proučiti man stranice. Ovo sam više zamislio kao popis najbitnijih
komandi.

Nepoznati pojmovi
I još na kraju bitno je reći 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. Teško 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

Jurica Božiković

INETD I TCPD

815/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

INETD

Što je INETD

INETD se odnosi na ''Internet Super-Server'' zato jer rukovodi vezama za nekoliko


daemon-a (daemoni su programi koji osiguravaju mrežne usluge). INETD služi kao
«upravljajući» server za druge daemone.
INETD se pokreće pri podizanju sustava, a za njegovo pokretanje je zaslužan rc(skripte
kod podizanja i gašenja). rc je komandna skripta koja kontrolira pokretanje različitih service-
a(usluga) i operacija , a rc.shutdown je komandna skripta koja gasi različite operacije i
usluge. Nakon pokretanja,INETD ''sluša'',traži veze na određenim internet socketima
(ulazima). Kada pronađe vezu na jednom od ''ulaza'', odlučuje kojem je deamonu veza
namijenjena i pokreće program da obradi zahtjev. Nakon što je program završio, nastavlja
''slušati'' ulaze.

Pokretanje usluga (service-a)


pomoću konfiguracijske datoteke /etc/inetd.conf

Važni inetd file-ovi su konfiguracijska datoteka (/etc/inetd.conf), izvršna datoteka


(/usr/sbin/inetd), startup skripta (/etc/init.d/inet ili /etc/rc.d/init.d/inetd ili /etc/init.d/inetd) i
file /etc/services (Različiti brojevi port-ova se koriste za određene tipove service-a ili
usluga.Tako su npr., brojevi od 1 do 1023 rezervirani za standardne usluge i svakom je dano
praktično tekstualno ime.)
Većina service-a(usluga) može se pokrenuti na tri načina: prvo kao zasebni daemon
(zahtijeva mnogo resursa), zatim pod inetd-om ili kao inetd service koji je tzv. ''TCP
wrapper'' izmijenjen.

816/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

Pokretanje samostalnog service-a


Za pokretanje služe sljedeće linije:
/usr/sbin/in.ftpd –D
( /usr/sbin/in.wuftpd –s)

Pokretanje inetd service-a


Sljedeće linije koda služe za editiranje /etc/inetd.conf datoteke:
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
( ftp stream tcp nowait root /usr/sbin/in.wuftpd in.wuftpd)

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 sljedeća značenja:


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 završi prije nego počne “slušati” druge veze
root
inicijalni korisnički ID pod kojim se service izvršava
in.ftpd
komandna linija

817/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

Pokretanje inetd “TCP wrapper” service-a


S ovom metodom omogućujemo inetd-u da pokrene service pod komandom tcpd
wrappera(omotača). Metoda je skoro ista kao i prijašnje ali uz male promjene u
/etc/inetd.conf:
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd
( ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.wuftpd)

Nakon toga restartamo inetd.Ove alternativne linije omogućuju tcpd-u pokretanje


in.ftpd (ili in.wuftpd) za inetd. Tcpd provodi različite testove dolazećih veza da bi provjerio
da li im može “vjerovati”. Provjerava host (“domaćina”) veze,tj. kojem korisniku veza
pripada i uspoređuje tog korisnika s podacima u file-u /etc/hosts.allow i /etc/hosts.deny.
Znači,tcpd na osnovu ovih provjera može omogućiti ali i zabraniti pristup.

Naredbe

Omogućene su sljedeće opcije:


inetd -d pokreće debugger
inetd –l pokreće logiranje uspješnih veza(connections)
inetd –w uključuje TCP Wrapping za vanjske service(usluge)
inetd –W uključuje TCP Wrapping za unutarnje service koje su ugrađene
u inetd
inetd –c maximum određuje maximalan broj istovremenih pokretanja za svaki
service
inetd –c rate određuje maximalan broj koliko puta service može biti pokrenut
iz jedne IP adrese u jednoj minuti
inetd –R rate određuje maximalan broj koliko puta service može biti pokrenut
u jednoj minuti,defaultna vrijednost je 256
inetd –s maximum određuje maximalan broj istovremenih pokretanja svake
usluge(service-a) iz jedne IP adrese
inetd –a određuje jednu specifičnu IP adresu koje se drži
inetd –p određuje alternativnu datoteku u koju sprema ID procesa

818/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

Konfiguracijska datoteka

Nakon izvršavanja, inetd čita svoje konfiguracijske informacije iz konfiguracijske


datoteke,koja je obično /etc/inetd.conf . Mora postojati unos za svako polje konfiguracijske
datoteke, a svaki unos u polju odvojen razmakom (tab ili space). Komentari se označavaju s
“#” na početku 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 može pokrenuti: standardna i
TCPMUX. Standardni service ima poznati port koji mu je dodijeljen, može biti service koji
izvršava službene 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 službeno 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 određuje da li server pozvan od inetd-a treba preuzeti socket povezan s
pristupnom točkom usluge(service access point) i da li inetd treba pričekati da server završi s
radom prije nego počne “slušati” nove zahtjeve.
User treba sadržavati korisničko ime(user name) korisnika.
Server-program treba sadržavati ime staze(pathname) programa koji će se izvršiti od
strane inetd-a kada je zahtjev pronađen na ulazu(socket-u).

819/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

XINETD

Umjesto uobičajene 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), izvršne datoteke(/usr/sbin/xinetd) i
konfiguracijskih datoteka za svaku uslugu(service) u direktoriju /etc/xinetd.d/. XINETD nije
samo zamjena za inetd. Svatko ga može 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 različitih
konfiguracijskih datoteka,njegova konf. datoteka je drukčijeg formata od inetd-ove i razumiju
različite signale. Ali proces “signal u akciju”(signal-to-action) može 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 = 25
log_type = FILE /var/log/servicelog
log_on_success = HOST PID
log_on_failure = HOST RECORD
# only_from = 128.138.193.0 128.138.204.0
# only_from = localhost
disabled = tftp
}

service imap
{
socket_type = stream
protocol = tcp
wait = no
user = root
only_from = 198.72.5.0 localhost

820/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

banner = /usr/local/etc/deny_banner
server = /usr/local/sbin/imapd
}

service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
redirect = 192.168.1.1 23
bind = 127.0.0.1
log_on_failure += USERID
}

service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
bind = 192.168.1.11
log_on_failure += USERID
}

#service chargen
#{
# type = INTERNAL
# id = chargen-stream
# socket_type = stream
# protocol = tcp
# user = root

821/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

# wait = no
#}

service xadmin
{
type = INTERNAL
socket_type = stream
protocol = tcp
user = root
wait = no
port = 7000
}

Prednosti xinetd-a u odnosu na inetd:

1) Može dati kontrolni pristup svih service-a koji se temelje na:


a) adresi “udaljenog” korisnika(remote host)
b) vremenu pristupa
c) imenu korisnika
d) imenu domene “udaljenog” korisnika

2) Pruža napredniju rekonfiguraciju:


a) eliminira servere za usluge(service) koji više nisu u konfiguracijskoj datoteci
b) eliminira servere koji više ne odgovaraju kriterijima pristupa kontrolama

3) Sprečava zabranu pristupa(denial-of-access) tako da:


a) limitira broj servera za svaku uslugu(service)
b) postavlja gornju granicu na broj operacija koji se dijele
c) limitira veličinu log datoteke koju kreira
d) limitira broj veza koje jedan korisnik može uputiti
e) limitira broj nadolazećih veza
f) ne nastavlja usluge(service) ako količina prelazi određeni limit

822/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

4) Povećava mogućnosti loggiranja:


a) za svaki pokrenuti server može 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 dođe do neuspješnog kontrolnog pristupa,
može zapisati informacije o pokušaju pristupa(npr. može zapisati korisničko ime i
komandu za rsh service)

5) Nema ograničenja broja argumenata servera

6) Korisnik može povezati određene usluge sa određenim IP-ima na svojem računalu

823/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

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 može biti podešen da nadgleda nadolazeće zahtjeve za telnet, finger, ftp,
exec, rsh, rlogin, tftp, talk i comsat. Program podržava oba 4.3BSD-style socket-a(ulaza) i
System V.4-style TLI. Funkcionalnost će biti ograničena kada protocol pod TLI nije internet
protocol.

Kako radi tcpd

Kad stigne zahtjev, inetd daemon pokreće tcpd program umjesto željenog servera.
TCPD učita zahtjev i provede nekoliko dodatnih provjera. Provjerava kojem korisniku veza
pripada i uspoređuje tog korisnika s podacima u file-u /etc/hosts.allow i /etc/hosts.deny. Ako
je sve u redu tcpd pokrene odgovarajući server program.
S ovom metodom omogućujemo inetd-u da pokrene service pod komandom tcpd
wrappera(omotača).

Login

Veze koje tcpd nadgleda se prijavljuju preko syslog-a. Svaki zapis sadrži zapis o
vremenu,ime korisnika i zatraženu uslugu(service). Ta informacija može biti korisna da bi se
detektirale neželjene aktivnosti, posebno kad se informacije o loginu više korisnika spoje.
Ako želite saznati gdje idu informacije o vašem loginu pretražite syslog konfiguracijsku
datoteku, koja je obično /etc/syslog.conf.

824/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

Kontrolni pristup(Access control)

Opcionalno, tcpd podržava jednostavan oblik kontrolnog pristupa temeljenog na


“uspoređivanju uzoraka”. Software kontrolnog pristupa se “zakači” na izvršavanje shell
naredbi kad se pokrene “uzorak”. Software kontrolnog pristupa pretražuje dvije datoteke.
Pretraga prestaje kod prvog “pogodka”:
Pristup će biti odobren ako se korisnik nalazi u datoteci /etc/hosts.allow
Pristup neće biti odobren ako se korisnik nalazi u datoteci /etc/hosts.deny
Svaka datoteka kontrolnog pristupa sastoji se od praznih linija ili više linija teksta.
Potraga se prekida kada se tražena linija pronađe:
nova linija se ignorira ako je prije nje znak “/”.
prazne linije ili linije koje počinju sa znakom “#” se ignoriraju. Ovo
omogućava ubacivanje komentara tako da je datoteka čitljivija.
-sve druge linije trebaju zadovoljavati sljedeći oblik(stvari između znakova
[] su opcionalne):
1
HOSTS_ACCESS (5) HOSTS_ACCESS (5)

daemon_list : client_list [ :shell_command ]


daemon_list – lista jednog ili više imena daemon procesa
client_list – lista jednog ili više imena korisnika, adresa korisnika koji će se
uspoređivati
Lista elemenata treba biti razdvojena razmacima ili zarezima. Jezik kontrolnog pristupa
implementira sljedeće “uzorke”:
string koji počinje znakom “.”. Korisničko ime odgovara ako zadnji dio
njegovog imena odgovara određenom uzorku. Npr. uzorak “.tue.nl”
odgovara korisničkom imenu “wzv.win.tue.nl”.
string koji završava sa znakom “.” Korisnička adresa odgovara ako njeno
prvo numeričko polje odgovara danom stringu. Npr. uzorak “131.155”
odgovara adresi skoro svakog korisnika mreže Eindhoven univerziteta
(131.155.x.x)
string koji počinje znakom “@” se tretira kao ime NIS(nekada YP) netgrupe.
Korisničko ime odgovara ako je korisnik član određene netgrupe.

825/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb INETD i TCPD

Provjera korisničkog imena(host name)

Izvorna shema nekih protokola(rlogin,rsh) počiva na korisničkim imenima. Neke


izvedbe vjeruju korisničkim imenima koja dobiju od bilo kojeg servera, dok su neke izvedbe
mnogo opreznije. Tcpd provjerava korisničko klient ime vraćeno od adrese. Ako se otkrije
neko nepodudaranje, tcpd zaključuje da ima posla s korisnikom koji koristi tuđe korisničko
ime.

Provjera korisničke adrese(host adress)

Opcionalno, tcpd onesposobljava opcije ulaza na izvor za svaku vezu s kojom radi. To
znači da tcpd neće dopustiti ulaz na računalo ako otkrije da neko koristi neispravnu, nevažeću
IP adresu. Ovo će spriječiti sve napade korisnika koji koriste adrese tuđih mreža. UDP service
nema koristi od ove zaštite. Ova opcija mora biti uključena za vrijeme kompajliranja.

Greške(bugs)

Neki UDP I RPC daemon-i zadrže se još neko vrijeme nakon što su završili svoj posao,
u slučaju da dođe 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 zahvaćena ovim
limitiranjem je rexd, koju koristi komanda on 1. Ali to nije veliki gubitak zato jer je na većini
sustava rexd manje siguran od wildcard-a u /etc/hosts.equiv.

826/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Goran Vlahović

INTERNET SERVICES

827/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

UVOD

Početkom 1970-tih, američko ministarstvo obrane (United States Department of


Defence), započelo je istraživački program zvan DARPA (Defence Advanced Research
Projects Administration). Jedan od ciljeva DARPA-e je bio da naprave Internet, skup
međusobno povezanih mreža, koji bi omogućio interakciju istraživačkih laboratorija preko
cijele države. Mreža je prozvana ARPAnet, a protokol koji bi kontrolirao vezu IP (Internet
Protocol). Dani originalnog ARPAnet-a su davno prošli, a mreža je toliko narasla i sada je to
jedna nevjerojatna stvar zvana Internet, koja omogućuje međusobno spajanje računala preko
cijelog svijeta.

Internet Protocol omogućuje slanje paketa između bilo koja dva računala 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 sličan način kao i serijska linija između
dva računala, dok UDP/IP omogućava jednostavan način slanja poruka između dva računala.
Najinteresantniji korisnički programi koriste TCP za kreiranje veze, tako da je TCP/IP često
definiran kao interkonekcijski protokol Interneta.

828/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

DNS (Domain Name System)

Imena i adrese

Da bi mogli koristiti računala i druge resurse na mreži, potrebno ih je locirati.


Hostnames (imena računala na mreži) koriste hijerarhijsku metodologiju imenovanja, tako da
je svaki hostname jedinstven. Na primjer ftp.uu.net je ime nekog host-a na Internetu. Sam IP
koristi internet adrese, tj. jedinstvene oznake za računala na mreži koja se sastoje od 4 broja
(svaki između 0 i 255), odvojenih točkom. Npr. za navedeni primjer adresa je 192.48.96.9
Sustav imenovanja zove se Domain Naming System (DNS) i odvaja odgovornost za
jedinstvena imena na domenu administriranja. Administrator svake domene je odgovoran je
za dodjeljivanje i održavanje jedinstvenosti imena unutar pojedine domene. Nekada nije bilo
tako.
Kroz 1970-te, ARPAnet je bila mala prijateljska zajednica sa nekoliko stotina host-ova.
Jedna datoteka, HOSTS.TXT, je sadržavala sve potrebne informacije koje bi trebali znati o
glavnim računalima na mreži: bila su mapirana sva imena i adrese za svakog host-a spojenog
na ARPAnet. HOSTS.TXT je održavao Network Information Center (tzv. NIC) Stanford
Research Instituta (SRI) na jednom jedinom host-u: SRI-NIC. ARPAnet administratori bi
poslali email s promjenama u NIC i povremeno ftp-om skinuli najnoviju verziju
HOSTS.TXT. Kako je ARPAnet rastao, takav princip je postao nedjelotvoran. Kako se
priključivao pojedini novi host, ne samo da je HOSTS.TXT dobio novu liniju, nego je i novi
host skidao podatke s istog servera. Kada je ARPAnet prešao na TCP/IP protokol, počelo je
eksplozivno širenje mreže i moralo se nešto promijeniti.
Tada je došao Paul Mockapetris član Information Science Instituta, s University of
Southern California, i dizajnirao arhitekturu novog sistema. 1984. je objavio RFC 882 i 883,
koji opisuju Domain Name System. Kasnije su ih zamijenili RFC 1034 i 1035 te oni
predstavljaju trenutnu specifikaciju DNS-a. Poslije je dodano i mnogo RFC-ova koji opisuju
potencijalne sigurnosne DNS probleme, implementacijske probleme, mehanizme za
dinamičko ažuriranje name servera, osiguravanje podataka o domenama i drugo.
DNS je distribuirana baza podataka. To omogućava lokalnu kontrolu dijelova baze, a
ipak su podaci svakog segmenta dostupni preko cijele mreže putem klijent-server sheme.
Robusnost i brzina su postignute preko replikacije i cache-iranja.

829/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Programi zvani name serveri predstavljaju polovicu DNS-ovog klijent-server


mehanizma. Name serveri sadrže informaciju o nekom segmentu baze i omogućuju je
klijentima zvanim resolveri. Resolveri su obično samo library rutine koje kreiraju upite i
šalju ih preko mreže name serveru.

Struktura DNS-a

Struktura DNS baze podataka slična je strukturi UNIX datotečnog sustava. Cijela baza
se može prikazati kao naopako stablo, s korijenskim čvorom na vrhu. Za razliku od UNIX-a
gdje je root direktorij označen sa slash ("/"), kod DNS-a se označava kao jedna točka (".").

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 datotečnom sistemu.
Razlika je jedino da su domene odvojene točkom, dok su putanje datoteka odvojene kosom
crtom. Svaka domena može biti administrirana od različite organizacije, a svaka organizacija
može tu domenu podijeliti u određen broj poddomena i predati odgovornost nad njima drugim

830/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

organizacijama. Npr. InterNIC, koji drži domenu .edu, može dodijeliti pravo domene
berkeley.edu fakultetu U.C. Berkeley.

Kako je sve to počelo

U adresi koju mi upisujemo, najdesnija oznaka iza točke je tzv. top-level domena
(TLD).
1980. kreirano ih je sedam. To su: .com, .edu, .gov, .int, .mil, .net i .org. U slijedećih
12 godina, održane su mnoge rasprave i predloženo je da se uvedu novih sedam, što je
učinjeno 2001. i 2002. To su: .biz, .info, .name, .pro, .aero, .coop i .museum.

Ovdje ih možemo sve vidjeti:

Sponzor/
TLD Uvedena Sponzorirana Svrha
Operator

Societe Internationale de
.aero 2001 da Air-transport industry Telecommunications
Aeronautiques SC, (SITA)

.biz 2001 ne Businesses NeuLevel

Unrestricted (but
intended for
.com 1995 ne VeriSign, Inc.
commercial
registrants)

.coop 2001 da Cooperatives DotCooperation, LLC

United States
.edu 1995 da educational EDUCAUSE
institutions

United States US General Services


.gov 1995 da
government Administration

.info 2001 ne Unrestricted use Afilias Limited

831/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Organizations
established by Internet Assigned Numbers
.int 1998 ne
international treaties Authority
between governments

US DoD Network Information


.mil 1995 da United States military
Center

Museum Domain Management


.museum 2001 da Museums
Association, (MuseDoma)

For registration by
.name 2001 ne Global Name Registry, LTD
individuals

Unrestricted (but
.net 1995 ne intended for network VeriSign, Inc.
providers, etc.)

Unrestricted (but Public Interest Registry. Until


intended for 31 December 2002, .org was
.org 1995 ne
organizations that do operated by VeriSign Global
not fit elsewhere) Registry Services.

Accountants, lawyers,
.pro 2002 ne physicians, and other RegistryPro, LTD
professionals

Osim tih "generičkih", postoje i posebni TLD-i sa 2 slova, tzv. "country-code", koji su
uspostavljeni za preko 240 država i teritorija.

Zone

Poddomene koje zahtijevaju posebnu administraciju nazivamo zone. Jednom kada je


određen autoritet za neku zonu, osoba koja je za nju zadužena mora osigurati više name
servera za tu zonu. Kad god je instaliran novi sistem (host) unutar zone, DNS administrator

832/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

za zonu alocira ime i IP adresu za novi sistem, te ih unese u bazu podataka name servera.
Osoba zadužena za zonu također mora osigurati i najmanje jedan redundantni sekundarni
name server da bi name servis radio čak i u slučaju 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) ažuriraju svoju bazu
podataka s primarnim serverom.
Što ako name server radi ako ne sadrži informaciju koja se traži 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.root-
servers.org).
Trenutno su u funkciji slijedećih trinaest root name servera:

833/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Root Name Serveri (A-M) na dan 29.01.2004.


Host Organizacija IP adresa Mjesto
a.root-
VeriSign 198.41.0.4 Herndon, VA, USA
servers.net
b.root- Marina del Rey, CA,
Information Sciences Institute 192.228.79.201
servers.net USA
c.root-
Cogent Communications 192.33.4.12 Herndon, VA, USA
servers.net
d.root- College Park, MD,
University of Maryland 128.8.10.90
servers.net USA
e.root-
NASA Ames Research Center 192.203.230.10 Mt View, CA, USA
servers.net
f.root-
Internet Systems Consortium, Inc 192.5.5.241 Palo Alto, CA, USA
servers.net
g.root- U.S. DoD Network Information
192.112.36.4 Vienna, VA, USA
servers.net Center
h.root-
U.S. Army Research Lab 128.63.2.53 Aberdeen, MD, USA
servers.net
i.root-
Autonomica/NORDUnet 192.36.148.17 Stockholm, Sweden
servers.net
j.root-
VeriSign 192.58.128.30 Herndon, VA, USA
servers.net
k.root- Reseaux IP Europeens - Network London, United
193.0.14.129
servers.net Coordination Centre Kingdom
l.root- Internet Corp. for Assigned Names Marina del Rey, CA,
198.32.64.12
servers.net and Numbers USA
m.root-
WIDE Project 202.12.27.33 Tokyo, Japan
servers.net

834/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

BIND

Najčešće korištena 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 obično sa UNIX-om distribuira u paketu s standardnim TCP/IP mrežnim


software-om. Zadnja verzija se može pronaći na stranicama Internet Software Consortium-
a kao Open Source: http://www.isc.org/products/BIND i http://www.bind9.net/

835/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

TELNET

Na mreži smo

Sada kad znamo kako je organizirano adresiranje računala, pokušajmo se spojiti. Sa


servisima rlogin i telnet, možemo se spojiti na udaljeno računalo preko mreže. Mi ćemo se
orijentirati na telnet.
Naredba telnet je osnovni alat za prijavljivanje na daljinu pod UNIX-om i Linuxom.
telnet vam omogućuje terminalski session na udaljenom računalu. Premda neki sustavi
pružaju mogućnost prijave kao gosta, takva je mogućnost rijetka zbog sigurnosnih pitanja.
Zamisao koja stoji iza ta dva okružja za goste jest osigurati sigurnost računala i zaštiti sustav
od zlonamjernih ili nepažljivih nepoznatih korisnika. Ograničena ljuska (shell) korisniku
onemogućuje izvršavanje određenih naredbi, a sustav izbornika pruža izbor samo s prethodno
određenog skupa izbornika, u potpunosti spriječivši pristup ljuski.
telnet korisnicima omogućuje i prijavljivanje na svoja vlastita računala iz udaljenih
lokacija, unošenjem svog korisničkog imena i lozinke. Na taj način korisnici mogu
provjeravati email, uređivati datoteke i pokretati programe na svojim uobičajenim računalima
kao da su na njih prijavljeni lokalno. To ćete, međutim, trebati učiniti u okružju koje se
temelji na terminalima jer za to ne možete koristiti sustav X Windowsa. telnet pruža samo
emulaciju terminala za uobičajene terminale poput DEC VT-100, koji ne podržavaju grafička
okružja poput X Windowsa.

836/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Telnet naredbe

Ako u našem shell prompt-u napišemo telnet bez ikakvih argumenata, pokrećemo
telnet servis u naredbenom modu (command mode). Vidje ćemo poseban telnet prompt
(telnet>). Tada možemo unijeti bilo koju telnet naredbu. Ovo su neke od najčešćih naredbi, a
za kompletnu listu treba pogledati manual na našem sistemu.

Naredba Opis

open Spaja se na navedeno računalo (host)

close Prekida vezu i vraća se u naredbeni mod

quit Prekida vezu (ako postoji) i zatvara telnet

set Mijenja vrijednost danog argumenta

send Šalje naredbu na remote (udaljeno računalo)

display Pokazuje trenutno postavljenu konfiguraciju telnet-a

status 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 određuje s kojim računalom se spajamo. To računalo mora biti
dostupno i podržavati telnet servis. Ako ne navedemo broj porta, tada se spaja na default-ni
port 23. Kada dođe do spajanja, remote računalo preuzima vezu i pokreće login proceduru.
Nakon logiranja, sve je isto kao da smo se direktno logirali na to, sada udaljeno računalo.
Ukoliko nam je samo potrebno prenijeti datoteke između udaljenih računala, koristit ćemo
FTP.

837/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

FTP – PROTOKOL ZA PRIJENOS DATOTEKA

Kratak pregled FTP-a

FTP (File Transfer Protokol) tj. protokol za prijenos datoteka je razvijen kao protokol
koji će omogućiti prijenos datoteka između dva računala na mreži. Ta dva računala (host-a)
ne moraju biti slična; niti hardware niti operativni sustavi ne moraju biti slični. Windows FTP
klijent može bez problema (osim ako sigurnost ne dozvoljava) razmijeniti datoteke s UNIX
računalom na kojem se vrti FTP servis. Također, udaljeno računalo može putem FTP naredbi
inicirati i razmjenu datoteka između dva udaljena računala (tzv. third-party transfer).
Između ostalih karakteristika, FTP podržava razmjenu i ASCII i EBCDIC (Extended
Binary Coded Decimal Interchange Code) setova znakova. Također jako je važna podrška
ASCII i binarnih prijenosa, koji se mogu obaviti bez ikakvog modificiranja (uuencode i
uudecode) datoteka, kao što npr. zahtijeva UUCP protokol.

FTP veza

FTP radi na aplikacijskom nivou OSI (Open System Interconnection) modela i ovisi o
TCP-u da bi mogao sigurno prenijeti podatke između host-ova na mreži. Kao takav, ne brine
se oko komunikacijske arhitekture i oslanja se na TCP za uspostavljanje veze i prijenos
podataka bez pogreške. 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) može
biti namješten da sluša i na nekim drugim portovima. To se čak može i vrlo lako napraviti
tako da editiramo /etc/service file i zamijenimo broj porta koji je naveden za FTP servis.

838/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Primjer FTP session-a

U najjednostavnijem obliku, ftp se može iskoristiti za pokretanje session-a za prijenos


datoteka s ciljnim host-om:
# ftp targethost

targethost može biti IP adresa ili samo ime udaljenog host-a.

Kako je FTP siguran servis, zatražiti će korisničko ime i lozinku. Ako nismo
autentificirani, ftp će odustati od uspostavljanja session-a za prijenos datoteka. Postoji ipak i
mogućnost logiranja, tzv. anonymous FTP pristup, kada se za korisničko ime može
upotrijebiti riječ anonymous, a email adresa kao lozinka. To je postalo jako popularno
razvojem Interneta kada se na raznim serverima moglo pronaći nebrojeno mnogo programa
tipa freeware i shareware.
U ovom primjeru imamo korisnika koji je logiran na host jade i koji koristi ftp za
spajanje na host tenor.

# ftp tenor
Connected to tenor.
220 tenor FTP server (UNIX(r) System V Release 4.0) ready.
Name (tenor:root): sam
331 Password required for sam.
Password:
230 User sam logged in.
ftp>

Prompt ftp>, pokazuje spremnost za primanje naredbi. Da bi vidjeli koje su nam


naredbe omogućene, otipkamo help:

839/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

ftp> help
Dobijemo otprilike ovakav popis:

! debug Mget pwd status

$ dir Mkdir quit struct

account disconnect Mls quote system

append form Mode recv sunique

ascii get Modtime reget tenex

bell glob Mput rstatus trace

binary hash Newer rhelp type

bye help Nmap rename user

case idle Nlist reset umask

cd image Ntrans restart verbose

cdup lcd Open rmdir ?

chmod ls Prompt runique

close macdef Proxy send

cr mdelete Sendport site

delete mdir Put size

Ipak, nisu sve naredbe implementirane na svim UNIX varijantama ftp-a. Evo jednog
primjera gdje je naredba implementirana na lokalnom računalu, a ne i na udaljenom:
ftp> rstatus
502 STAT command not implemented.
ftp>

Ako naredba nije implementirana lokalno, odgovor će biti drukčiji:


ftp> rstatus
?Invalid command
ftp>

840/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Evo još jednog primjera korištenja ftp-a. Pokrećemo 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Ovo su neke važnije naredbe koje bi trebale sve varijante ftp-a na UNIX računalima
podržavati:

Naredbe vezane za spajanje


Open Otvara vezu s navedenim host-om.
Close Zatvara trenutno otvorenu vezu.
Quit Zatvara vezu i izlazi iz ftp-a.
Naredbe vezane za prijenos datoteka
binary Mijenja reprezentaciju datoteke u binarni tip.
ascii Mijenja reprezentaciju datoteke u ASCII tip.
put Prenosi jednu datoteku s lokalnog na udaljeno računalo (remote).
mput Prenosi više datoteka s lokalnog na udaljeno računalo.
get Prenosi jednu datoteku s udaljenog na lokalno računalo.
mget Prenosi više datoteka s udaljenog na lokalno računalo.
Naredbe vezane za upravljanje datotekama i direktorijima
cd Promijeni lokalni ili udaljeni radni direktorij.
cd .. Promijeni da trenutni radni direktorij bude korijenski direktorij.
ls Prikaz trenutnog radnog direktorija na udaljenom računalu.
pwd Ispis trenutnog radnog direktorija udaljenog računala.
mkdir Kreiraj novi direktorij na udaljenom računalu.
rmdir Izbriši direktorij na udaljenom računalu.
mv Promijeni ime datoteke ili direktorija na udaljenom računalu.
rm Izbriši datoteku na udaljenom računalu (rm, ime nove datoteke).
rm Izbriši više datoteka na udaljenom računalu (rm, više datoteka).
Razne naredbe
? Prikaz pomoći za ftp.
! Izlazak u shell.

Osim prijenosa datoteka, vrlo važna Internet usluga je elektronička pošta ili email.

842/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

EMAIL – ELEKTRONIČKA POŠTA

MUA, MTA i MDA

Sustav elektroničke pošte može biti podijeljen na tri elementa:


Mail User Agent (MUA)
Mail Transport Agent (MTA)
Mail Delivery Agent (MDA)
MUA je korisnički interface - software s kojim korisnik čita svoju poštu, organizira je
u direktorije i šalje poštu. Različite osobe u svojim MUA-ovima žele različite mogućnosti, a
nisu ni svi MUA-ovi raspoloživi na svim platformama. Mnogi MUA-ovi mogu istodobno
zajedno s drugima postojati na istom stroju. Na primjer, UNIX radna stanica može imati bilo
koji ili sve sljedeće MUA-ove raspoložive za uporabu: mailx, elm, pine, mutt, mailtool i
dtmail. Korisnik može koristiti bilo koji MUA prisutan na njegovom sistemu budući da su
MUA-ovi naprosto lokalne aplikacije. Pored toga MUA mogućnosti su često uključene u
višenamjenski software poput Lotus Notesa i Netscape Maila ili Outlook Expressa.
MTA se ne koristi za pisanje poštanske poruke, nego za usmjeravanje pošte iz lokalnog
MUA na drugi MTA na drugom sustavu. (sendmail je primjer MTA, koji se ne koristi za
izravno čitanje ili pisanje pošte, već je namijenjen samo za isporučivanje predformatiranih
poruka.) Usmjeravanje se pošte može odvijati i lokalno (local) i udaljeno (remote). MTA je u
lokalnom prijenosu pošte, gdje i pošiljatelj i odredište imaju račune na istom stroju,
odgovoran za prijenos pošte od sebe do lokalnog MDA. U tom je postupku moguće da MTA
uređuje protokole, adrese i smjer poštanske poruke. Poruka stvorena na UUCP mreži
zahtijeva neke promjene prije nego ju može primiti osoba na TCP/IP mreži. MTA djeluje kao
prolaz za poštu pri slanju poruke s jedne mreže na drugu mrežu koja koristi drukčije
protokole. U velikoj će većini slučajeva na jednom stroju biti samo jedan MTA.
MDA je treći sastavni dio rutine baratanja poštom. Dok sendmail izravno barata SMPT
prijenosom pošte između MTA-ova, u baratanju se lokalnom isporukom iz sendmail-ovog
reda čekanja u red čekanja koji koristi MUA oslanja na Mail Delivery Agente (MDA). Dva
uobičajena MDA-ova za čiju je uporabu sendmail često podešen su /bin/mail i procmail.
/bin/mail je gotovo sveprisutan na UNIX sustavima. procmail je naširoko raspoloživ i
istovremeno je brži i mnogo sposobniji od uobičajenog /bin/mail-a, pružajući jake
mogućnosti predrazvrstavanja i predobrade pošte. Za bolje razumijevanje MUA/MTA/MDA

843/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

odnosa razmotrite primjer iz stvarnog života kada neka osoba pošalje pismo. MUA
predstavlja osobu koja šalje pismo. On pismo napiše, stavi ga u omotnicu, napiše adresu i
zalijepi marku i zatim ga dostavi u poštanski ured. MTA je poput osoblja poštanskog ureda -
oni pismo zaprime, provjere adresu i ako je potrebno preformatiraju je i zatim pismo usmjere
ili u poštanski sandučić u istom poštanskom uredu (ako je pismo lokalno) ili u drugi poštanski
ured (za udaljena odredišta). MDA odgovara poštaru koji poštu iz poštanskog ureda
isporučuje na namijenjenu lokaciju. Ako je korišten prolaz, ta se sličnost može proširiti -
MTA koji zaprimi pismo za odredište u drugoj državi treba tu poruku prenijeti drugom MTA-
u koji zna kako pismo isporučiti u ciljnoj državi.

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 rješavanja
problema prijenosa email-a između triju mreža u krugu sveučilišta u to vrijeme. Te su tri
mreže bile ARPANET (koja je koristila NCP - Network Control Protocol), UUCP email
sustav i unutarnja mreža nazvana BerkNet. Sljedeće je godine ARPANET započeo prijelaz s
NCP-a na TCP (Transmission Control Protocol). Prije toga je email isporučivan upotrebom
FTP-a (File Transfer Protocol), međutim, SMTP je razvijen zbog očekivanja mogućeg porasta
email prometa na mreži u rasponu od nekoliko puta. U odazivu na te promjene Allman je
prihvatio sveobuhvatan pristup formatima poruka elektroničke pošte. Ako poruka nije
odgovarala prihvaćenom formatu, sendmail je umjesto odbacivanja poruka radije njen format
pokušao prilagoditi. Allman se također odlučio na ograničavanje namjenskog cilja sendmail-
a na usmjeravanje pošte, umjesto da uključi i mogućnosti email aplikacije za krajnjeg
korisnika. Inačica 4.1 BSD (Berkeley Software Distribution) UNIX-a je sadržavala i prvo
javno izdanje sendmail-a. Drugi su se u međuvremenu, odvojeno od Allmana, bavili
proširivanjem mogućnosti sendmail-a. Pored različitih neslužbenih nastojanja, bilo je i
nekoliko komercijalnih proizvođača, poput Suna i Hewlett-Packarda, koji su razvili svoje
vlastite verzije sendmail-a kada su ustanovili potrebu za poboljšanjima koja u trenutnim
verzijama nisu bila uključena. Iz tih je usporednih razvoja proizašlo nekoliko verzija
sendmail-a s različitih 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Email protokoli i osnovne SMTP naredbe

Email Protokoli

Protokol Opis

SMTP Simple Mail Transport Protocol, protokol korišten za prijenos pošte s


jednog Internet host-a na drugi

POP Post Office Protocol, definira metodu kako mali host može dohvatiti poštu
s većeg 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 Sintaksa Funkcija
Hello HELO <sending-host> Identificira host-a pošiljaoca
From MAIL FROM:<from-address> Adresa pošiljaoca
Recipient RCPT TO:<to-address> Adresa primaoca
Data DATA Početak poruke
Reset RSET Odustanak od poruke
Verify VRFY <string> Provjera korisničkog imena
Expand EXPN <string> Otvaranje mailing liste
Help HELP [string] Traženje online pomoći
Quit QUIT Kraj SMTP session-a

845/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Primjeri korištenja email-a

SMTP je toliko jednostavan protokol da možemo vidjeti kako se koristi najobičnijim


telnet pristupom:

# telnet almond.nuts.com 25
Trying 172.16.12.1 ...
Connected to almond.nuts.com.
Escape character is '^]'.
220 almond Sendmail 4.1/1.41 ready at Tue, 29 Mar 94 17:21:26 EST
helo peanut.nuts.com
250 almond Hello peanut.nuts.com, pleased to meet you
mail from:<daniel@peanut.nuts.com>
250 <daniel@peanut.nuts.com>... Sender ok
rcpt to:<tyler@almond.nuts.com>
250 <tyler@almond.nuts.com>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
Hi Tyler!
.
250 Mail accepted
quit
221 almond delivering mail
Connection closed by foreign host.

Osnovne POP3 naredbe


Command Funkcija
USER username Korisnikovo korisničko ime
PASS password Korisnikova lozinka
STAT Prikaz broja nepročitanih poruka/bajtova
RETR n Povrati poruku broj n

846/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

DELE n Izbriši poruku broj n


LAST Prikaz broja zadnje pristupanoj poruci
LIST [n] Prikaz veličine poruke n ili svih poruka
RSET Povrati sve poruke; resetiraj broj na 1
TOP n l Ispiši zaglavlja i jednu liniju poruke n
NOOP Ne radi ništa
QUIT Kraj POP3 session-a

Evo jednog primjera kako se, koristeći POP3, logirati na server, pročitati i izbrisati tri
poruke, koristeći 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

USENET NEWS

Uvod

Povijest USENET news servisa može se pratiti sve do izvornog ARPAnet-a. Tadašnja
ARPA-Internet zajednica koristila je niz mailing lista za distribuiranje informacija, oglasa i
nadogradnji svojim članovima zajednice. Kako se ta zajednica širila, održavanje tih mailing
lista postajalo je sve teže i teže. Liste su postale izuzetno dugačke, a sve promjene i dodaci su
postali teški.
USENET predstavlja održivu alternativu za prosljeđivanje news-a. Ideja je da se
informacije s novostima (eng. 'news') postave (post-aju) na centralni server i omoguće
korisnicima da ih prime kad oni to požele. USENET sistem omogućuje sličnu funkcionalnost
staroj mailing list operaciji; informacije su uređene kao pojedini članci podijeljeni u posebne
grupe i podjele. (na takav server se također odnosi naziv bulletin board system (BBS). Da bi
pristup i pretraživanje bili što brži, ta centralna skladišta "news" informacija distribuirana su
na mnoge lokalne servere.
USENET se razvio u najveći svjetski elektronički BBS. To je sada konglomeracija
računala na kojima se vrte različiti operativni sustavi, a informacije razmjenjuju preko UUCP-
a, Interneta i drugih mreža. USENET je vjerojatno i najveći eksperiment do sada, sa
kreativnom anarhijom. Postoji samo mala centralna kontrola i autoritet i svatko tko ima
zadovoljavajući software te vezu na Internet, može se pridružiti.
USENET news se prenosi preko TCP/IP mreže koristeći NNTP. To je protokol koji je
uključen kao dio TCP/IP protokola na svim UNIX sistemima i ne zahtijeva posebnu
konfiguraciju. Sve što trebate je ime najbližeg news servera.

RFC-i

RFC-i (Request for Comments) su izdani od strane radne grupe Internet Engineering
Task Force (IETF) i prilagođeni su Internet standardima. Može ih se smatrati nužnim za
kompatibilnost. Njihova kompletna arhiva i novosti mogu se naći na: http://www.rfc-
archive.org. Ako želite razmjenjivati news s drugim Internet NNTP serverom, morate
poštivati ono što je propisano standardima RFC 977 i RFC 1036. O čemu se zapravo radi:

849/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

RFC 977 (Network News Transfer Protocol)


Da bi Internet news serveri mogli međusobno razmjenjivati poruke, razvijen je
protokol koji definira naredbe između servera. Također, njime su definirane i naredbe između
news readera i news programa za slanje.
NNTP je protokol na aplikacijskoj razini, operativno i funkcionalno sličan HTTP-u.
Kao i HTTP, NNTP aplikacija koristi pouzdan komunikacijski servis koji je omogućen TCP
protokolom. Ovako nekako izgleda arhitektura USENET-a:

USENET mreža 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, slušajući na
portu 119 baš kao što i SMTP server sluša 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Kao i HTTP protokol, NNTP koristi sustav request i response poruka za razmjenu
informacija između klijenata i servera. Te poruke su kodirane standardnim setom ASCII
znakova. Ovdje je sažetak USENET request naredbi za poruke:

Request naredba Opis


article <message-id> Prikazuje zaglavlje poruke, praznu liniju, te tijelo poruke.
body <message-id> Prikazuje samo tijelo poruke.
group newsgroup Selektira izabranu newsgrupu.
head <message-id> Prikazuje zaglavlja selektirane poruke.
Help Daje listu mogućih naredbi.
ihave <message-id> Obavještava server da klijent ima izabranu poruku.
last Dekrementira trenutni pokazivač na poruku.
list Vraća listu postojećih news grupa.
listgroup Izlista trenutne poruke selektirane grupe.
newgroups date time Izlista nove grupe nakon navedenog datuma.
newnews date time Izlista nove poruke unutar selektirane grupe nakon navedenog
datuma..
next Inkrementira trenutni pokazivač na poruku.
post Pokreče postanje poruke s terminatorom točkom (.) na inače
praznoj liniji.
Quit Zatvara TCP vezu klijenta sa serverom.
slave Pokazuje da je ovo veza na slave server koji osigurava news
servis.
stat Klijent izabire poruku za čitanje.

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 mogućih newsgrupa

851/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

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 točkom
klijent završava session koristeći naredbu QUIT.
QUIT

852/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

RFC 1036 (standard za Interchange USENET poruka)


News članak (article) je kao email poruka – ima tijelo (body), uz koje dolazi jedno ili
više zaglavlja (header) koja osiguravaju dodatne informacije koje se odnose na poruku.
Standardni format za tijelo i zaglavlja poruke definirani su standardom RFC 1036. U tablici
ćemo prikazati koja zaglavlja postoje te koja su obavezna a koja nisu:

Header Opis Obavezno Opcionalno

approved Za moderiranu newsgroup-u X

control Kontrolna serverska, a ne korisnička poruka. X

date Datum kad je poruka post-ana.. X

distribution Doseg poruke. X

expires Datum kada istječe trajanje. X

followup-to Iza koje poruke dolazi. X

from E-mail adresa pošiljaoca. X

keywords Ključne riječi koje se tiču teme. X

lines Broj linija tijela poruke. X

message-id Jedinstveni ID poruke. X

newsgroups Kojoj grupi pripada. X

organization Opis organizacije X

path Path u trenutnom sustavu. X

references Na koji se message-id odnosi. X

reply-to Odgovor autoru. X

sender Ručno unijeto u polje. X

subject Tema poruke. X

summary Kratki sažetak. X

xref Ime host-a X

853/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Gdje News poruke žive

News poruke raspoređene unutar USENET hijerarhije su obično spremljene kao


posebne datoteke na news serveru. File sistem je obično nazvan /var/spool/news ili
/usr/spool/news. Datoteke koje sadrže poruke dobivaju serijski broj kako su primljene, a
točke unutar imena newsgrupe su zamijenjene kosom crtom (/). Na primjer, poruka broj 1047
newsgrupe comp.unix.solaris bi bila spremljena u datoteci
var/spool/news/comp/unix/solaris/1047.

Čitanje i slanje news poruka

Newsreader-i su korisnikovi interface-i za čitanje news-a. Teoretski je moguće koristiti


programe kao što su cat ili more za čitanje news-a s obzirom da su poruke spremljene kao
obične datoteke. Ipak, time smo dosta ograničeni, pa su napisani programi (nn, trn, tin) koji
nam pomažu da se snađemo u nebrojenim porukama koje svakodnevno dolaze. Dobar
newsreader može prikazati poruke ograničene raznim filtrima. Isto tako, može skinuti tzv.
News Overview Database (NOV), koja sadrži sve newsgrupe dotičnog news servera.
Newsreader-i s grafičkim sučeljem (Netscape) još više olakšavaju snalaženje među grupama i
porukama. Većina newsreader-a ima integrirane programe za slanje poruka na news ili
mogućnost pozivanja takvog programa, a uglavnom dozvoljavaju i slanje poruka putem
najobičnijeg email-a. Pregledavanje i slanje news poruka moguće je i običnim internet
preglednikom, na primjer preko web stranice http://www.google.com/grphp.

854/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

Hijerarhija i imena grupa

Imena grupa su podijeljena hijerarhijski s lijeva na desno. Najlijevije ime je tzv. top-
level grupa. Npr. comp.unix.misc spada u veliku grupu koja se tiče računala: hardware,
software, programiranje itd. Drugo ime (unix) se odnosi na sve što se tiče računala s UNIX
operativnim sustavom, dok se misc odnosi na razno unutar grupe unix.
Povijesno je postojalo 7 velikih top-level grupa:

comp. Computer. Od programiranja do hardware-a i periferija i svega što se tiče računala.

misc. Miscellaneous. Kad se jednostavno nije znalo kuda strpati grupu, dolazila je ovamo.

News o USENET-u. Ovdje ljudi pričaju o USENET administraciji, predlažu nove


news.
grupe...

Recreational. Ovdje dolaze razne slobodne aktivnosti, hobiji, a isto tako i umjetnost,
rec.
muzika...

sci. Science. Sve što se tiče znanosti, pa i medicine...

soc. Social. Razne kulturne grupe, religije, alternativni načini života...

talk. Talking. Najviše se priča o politici, ali i napada se ne sve i svašta.

Sada je to drastično prošireno, a jedna od popularnijih je i svakako .alt grupa sa


mnogim zanimljivostima. Također i skoro svaka država ima svoju top-level grupu. Tako
ljubitelji UNIX-a u Hrvatskoj imaju grupu hr.comp.os.unix.

855/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

WORLD WIDE WEB

Uvod

Mail, FTP, Telnet i USENET news su s nama od ranih dana Interneta. Oni su zapravo
proširenja usluga koje su smišljene i izvedene davno prije nego što je Internet postojao.
WWW je novi, potpuno Internetski koncept, baziran djelomično na postojećim servisima, a
djelomično na novom protokolu nazvanom HyperText Transfer Protocol (HTTP).
Mnoge ljude zbunjuju funkcije i porijeklo WWW-a, Mosaic-a i HTTP-a, a
terminologija korištena za odnose između ta tri odvojena entiteta postaje prilično maglovita.
Ta maglovitost je ponekad i namjerno proširena: Web preglednici pokušavaju osigurati
neograničen interface širokoj raznolikosti informacija različitim mehanizmima, pa
zamućivanje razlika olakšava njihovo korištenje, ali otežava njihovo razumijevanje. Zato
ćemo odmah na početku dati kratak pregled što su zapravo ta tri entiteta

WWW

WWW je velika skupina HTTP servera na Internetu i Web je ustvari najviše zaslužan 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 Berners-
Lee-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 Urbana-
Champaign. 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. Omogućuje


korisnicima pristup datotekama koje čine Web. Te datoteke mogu biti u mnogo različitih

856/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet services

formata (tekst, grafika, audio, video, ...), ali najčešći format na Web-u je HyperText Markup
Language (HTML). HTML je standardizirani jezik za opis stranice, koji služi za kreiranje
Web stranica. Omogućuje osnovne mogućnosti za formatiranje dokumenata, uključujući i
mogućnost uključivanja grafičkih 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 može se pokrenuti na različitim
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 tipično
razumiju i najmanje FTP, Gopher te WAIS protokole, dok neki drugi preglednici, npr.
Netscape, podržavaju i NNTP i SMTP protokole.
Web preglednici su nevjerojatno popularni, što je i razumljivo. Omogućuju bogat
grafički interface ogromnom broju resursa na Internetu. Informacije i servisi koje su prije
mogli koristiti samo stručnjaci, postali su lagano dostupni. Tako se danas preko Interneta
može rezervirati mjesto u restoranu, kupiti karta za kazalište 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 tražilica Interneta,
npr. www.google.com te pronaći željenu stranicu. Samo ime koje upisujemo locira se pomoću
URL-a (Uniform Resource Locator), i izgleda uglavnom ovako protocol://hostname/path.
"Protocol" kaže na koji način se pristupa podacima (uglavnom http). "Hostname" kaže ime
računala domaćina kojem pristupamo, a "path" je putanja do same datoteke, specifična za
host računalo.
Nažalost, sigurnost Web preglednika i servera predstavlja veliki problem. Iskoristivost
Web-a je velikim djelom njegova fleksibilnost, a fleksibilnost čini kontrolu vrlo teškom. Baš
kao što je lakše prenijeti i pokrenuti neki program sa Web preglednika nego preko FTP-a,
tako je i lakše prenijeti i pokrenuti štetni program. Web preglednici ovise o vanjskim
programima, tzv. plug-innovima, koji tada pokreću 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dario Dugić

RPC
(remote procedure call)

858/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Što je RPC ?

RPC je močna tehnika za konstrukciju distribuiranih aplikacija koje rade na klijent-server


principu.Baziran je na proširenju ideje o uobičajenom ili lokalnom pozivanju procedura tako
da pozivana procedura nemora biti smještena na istom adresnom prostoru na kojem je i
procedura koja ju poziva.Dva procesa mogu biti na istom sustavu ili na različitim sustavima
koji su međusobno mrežno povezani.
Upotrebom RPC-a programeri distribuiranih aplikacija izbjegavaju detalje mrežnog
sučelja.Prijenosna neovisnost RPC-a izolira aplikaciju od psihičkih i fizičkih elemenata
mehanizama podatkovne komunikacije i dozvoljava joj da koristi raznoliki prijenos.
RPC čini klijent-server model izračunavanja močnijim i lakšim za programiranje.U
kombinaciji s ONC RPCGEN protokol kompajlerom klijenti vrše pozive transparentno kroz
lokalno sučelje procedure.

Kako radi RPC i model

RPC je sličan pozivanju funkcije.Kao i poziv funkcije,kada je učinjen RPC,argumenti poziva


poslani su udaljenoj proceduri i pozivać čeka njezin povratni odgovor.

Slika - pokazuje tok aktivnosti prilikom RPC poziva između dva mrežna sustava.

MACHINE B
client (SERVER)
program

callrpc() execute
function request call
service

execute
request

return request
reply completes

program
continues

859/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Klijent stvara proceduralni poziv koji šalje zahtjev na server i zatim čeka.
Kada stigne zahtjev server poziva izvršnu rutinu koja izvodi uslugu zahtjeva i šalje odgovor
klijentu.Nakon izvršavanja RPC poziva klijentov program se nastavlja.
Napomena. RPC osobito podržava mrežne aplikacije.

ONC RPC protokol je zasnovan na modelu poziva udaljene procedure,što je slično s modelom
pozivanja lokalne procedure.U slučaju lokalnog pozivanja.pozivać postavlja argumente
proceduri na nekoj točno 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 točno specificirane lokacije i pozivać nastavlja s
izvršavanjem.
RPC model je sličan tome.Jedan djelić kontrole se logički "vrti" između dva procesa.To su
proces pozivaća i serverski proces.Proces pozivaća prvo šalje pozivnu poruku serverskom
procesu i zatim čeka (blokira se) poruku primitka.Pozivna poruka uključuje parametre
procedure i pruka primitka uključuje rezultate procedura.Jednom kada poruka primitka
pristigne rezultati procedure se odpakiravaju i ponovno se nastavlja izvršavanje procesa
pozivaća.
Na strani servera proces miruje čekajući dolazak pozivne poruke.Kada pristigne pozivna
poruka,serverski proces otpakirava parametre procedure,proračunava rezultat,šalje poruku
primitka i tada čeka sljedeću 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 ograničenja na taj model.
Npr. implementacija može koristiti asinkrone RPC pozive tako da klijent može raditi nešto
korisno dok čeka potvrdu od servera.Sljedeća mogućnost je da server kreira odvojene zadatke
za procesuiranje dolaznog poziva tako da izvorni server može biti slobodan za primanje
drugih zahtjeva.
Postoji nekoliko važnih stvari u kojima se pozivanje udaljenih procedura razlikuje od
pozivanja lokalnih:
• Kontrola pogriješaka: kada se koristi pozivanje udaljenih procedura greške u radu
udaljenih servera i mreža moraju biti uklonjene i pod kontrolom.
• Globalne varijable: pojedinačni argumenti ne mogu biti poslani kao globalne varijable
• Performanse: udaljene procedure rade nešto sporije od lokalnih procedura.
• Autentifikacija: zbog slanja kroz nesigurne sustave mreža autentifikacija je nužna.

Zaključak je da iako postoje alati za automatsko generiranje klijentskih i serverskih biblioteka


za danu uslugu,protokoli svejedno moraju biti pažljivo dizajnirani.

Mehanizam udaljenog poziva procedure.

Udaljena procedura je jednoznačno određena 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 može sastojati od jedne ili više verzija..Nadalje,svaka od
tih verzija sastoji se od kolekcije procedura koje su dostupne za poziv iz udaljene
lokacije.Brojevi verzije omogučuju da mnogobrojne verzije RPC protokola budu istovremeno
dostupne.Svaka verzija sadrži određen broj procedura koje se mogu pozvati sa neke udaljene
lokacije.Opet,svaka od tih procedura sadrži i svoj identifikacijski broj.

860/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Razvoj RPC aplikacije

Na primjeru:

Klijent-serv er pogled na bazu podataka koja se nalazi na nekom udaljenom računalu.


Pretpostavimo da možemo pristupiti bazi podataka s neke lokalne stanice(putem NFS-a).
Koristimo UNIX za pokretanje shell-a (ljuske) na udaljenom računalu i preko njega
izvršavamo naredbu.
U tom slučaju javljaju se neki problemi:
• Postoji mogučnost da se naredba izvršava jako sporo
• Zahtjeva se korisnički račun na udaljenom računalu
Alternativa iz RPC-a je:
• Instalira se server na udaljenom računalu koji može odgovarati na upite
• Dobiva se povratna informacija pozivanjem upita što će biti puno brže nego u
prethodnom pristupu.
Za razvoj RPC aplikacije potrebne su sljedeće 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

Najlakši način za definiranje i izvođenje protokola je korištenje npr kompajlera rpcgen.


Napomena.Za protokol se mora identificirati ime uslužnih 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 sličnog izgleda kao pretprocesorske
direktive.
.rpcgen postoji kao samostalni izvršni kompajler koji može čitati posebne datoteke s .x
prefiksom.

Stoga se za kompajliranje RPCL datoteke jednostavno upisuje:

-rpcgen rpcprog.x

To će po potrebi izvršiti sljedeće 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 mogučnost nezavisne računalne komunikacije


Napomena.Klijent i server ne moraju biti računala istog tipa.

861/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Definiranje klijentovog i serverskog koda aplikacije

Sada je potrebno upisati kod klijenta i aplikacije.Oni međusobno moraju komunicirati putem
procedura i tipova podataka specificiranih u protokolu.
Uslužna 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 sučelja 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 opterečenost kompajliranja RPC aplikacija,ali je važno prije razumjeti
cjelokupni model da bi se mogla sastaviti prikladna takva stvarana datoteka.
Pretpostavimo da je naziv klijentovog programa rpcprog.c,uslužni 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 sadržavati 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 izvršavanje klijentovog
cc –o rpcprog rpcprog.o rpcprog_clnt.o rpcprog_xdr.c
• kompajlirati uslužne procedure
cc –c rpcsvc.c
• kompajlirati server prijelaz
cc –c rpcprog_svc.c
• bildati izvršavanje 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 može pozvati.

Pregled rutina na sučelju

RPC sadrži više razina sučelja aplikacije za svoje usluge.Te razine proizvode različite ocjene
kontrola balansiranih s različitom koda za izvršavanje.Ovo poglavlje daje pregled rutina
dostupnih na svakoj razini.

862/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Pojednostavljene rutine sučelja


Pojednostavljene rutine sučelja upotrebljavaju se za pozivanje udaljenih procedura za rutine
na drugim računalima i specificiraju samo vrstu prijenosa koja se koristi.Rutine na ovoj razini
koriste se za večinu aplikacija.

Pojednostavljeno funkcioniranje razina

rpc_reg() – registrira proceduru kao RPC program za sve prijenose određenog tipa.
rpc_call() – udaljeni poziv određene procedure na određenom udaljenom hostu.
rpc_broadcast() – rasprostranjuje poruku poziva kroz sve prijenose određenog
tipa.Standardno sučelje je podjeljeno na gornji nivo,srednji nivo,stručni nivo i donji nivo.
Ova sučelja daju programeru puno bolju kontrolu nad komunikacijskim parametrima kao što
je prijenos koji se koristi,koliko čekati prije nego što se počne odgovarati na greške i zahtjeve
retransmisije itd.

Gornji nivo

Na gornjem nivou sučelje 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 sučelje.

clnt_create() – opći način stvaranja klijenta.Program kaže clnt_create()


gdje se nalazi server i koji tip prijenosa treba koristiti.

clnt_create_timed () – slično kao clnt_create() ali dozvoljava programeru


da specificira maksimalno dozvoljeno vrijeme za svaki pokušaj neke
vrste prijenosa u toku stvaranja.

svc_create() – stvara kontrolu nad serverom za sve prijenose određenog tipa.Program govori
svc_create() koju izvršnu funkciju treba koristiti.

clnt_call() – klijent zahtjeva od procedure da pošalje zahtjev na server.

Srednji nivo

Sučelje srednjeg nivoa RPC-a omogučava kontrolu nad detaljima.Programi napisani na ovim
nižim razinama su kompliciraniji ali rade puno djelotvornije.Srednji nivo omogučuje
specificiranje prijenosa koji će se koristiti.

clnt_tp_create() – stvara kontrolu nad klijentom za određeni prijenos.

clnt_tp_create_timed() – slično kao i clnt_tp_create() ali dozvoljava programeru da specificira


i maksimalno dozvoljeno vrijeme.

863/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

svc_tp_create() – stvara kontrolu nad serverom za određeni prijenos.

clnt_call() – klijent poziva proceduru za slanje zahtjeva na server.

Stručni nivo

Stručna nivo sadrži veći broj rutina s kojima specificiramo parametre povezane s prijenosom.
Upotreba tih rutina:

clnt_tli_create() – stvara kontrolu nad klijentom za određeni prijenos.

svc_tli_create() – stvara kontolu nad serverom za određeni prijenos.

rpcb_set() – poziva RPC obvezu za postavljanje puta između RPC usluge i mrežnih adresa.

rpcb_unset() – briše 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 određenom izvršnom rutinom.

svc_unreg() – briše povezivanje postavljeno s svc_reg().

clnt_call() -- klijent poziva proceduru za slanje zahtjeva na server.

Donji nivo

Donji nivo sadrži rutine koje se koriste za potpunu kontrolu nad opcijama za prijenos.

clnt_dg_create() – stvara RPC kontrolu kljineta za određeni udaljeni program koristeći


bezspojnu vezu.

svc_dg_create() – stvara RPC kontrolu servera koristeći bezspojnu vezu.

clnt_vc_create() – stvara RPC kontrolu klijenta za određeni udaljeni program,koristeći


normalni spojni prijenos.

sc_vc_create() – stvara RPC kontrolu nad serverom koristeći spojni prijenos.

clnt_call() – klijent poziva proceduru za slanje zahtjeva na server.

864/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Programsko sučelje RPC-a

Ovaj dio objašnjava kako je izvedeno C sučelje prema RPC-u i opisuje kako napisati mrežnu
aplikaciju koristeći RPC.
Napomena.Za kompletnu specifikaciju rutina u RPC biblioteci pogledati u rpc i s njima
povezane man dokumente.

Pojednostavljeno sučelje

Pojednostavljeno sučelje je najlakša razina,jer ne zahtjeva korištenje bilo kojih drugih rutina
RPC-a.Razvoj programa na ovoj razini može biti vrlo brz i direktno je podržan od strane
rpcgen kompajlera.Z večinu aplikacija,lakoća rukovanja rpcgen-om je dovoljna.
Neke RPC usluge nisu dostupne kao funkcije C-a ali su stoga dostupne kao RPC
programi.Pojednostavljeno sučelje uskladištenih rutina omogučava lakoću upravljanja RPC-
om za programe koji ne zahtjevaju veću razinu kontrole.
Rutine poput rusers nalaze se u RPC biblioteci librpcsvc.rusers.c.

Sljedi primjer programa koji ispisuje broj korisnika na udaljenom računalu hostu.
On poziva rusers RPC rutinu iz biblioteke.

---- program.c ----

#include <rpc/rpc.h>
#include <rpcsvc/rusers.h>
#include <stdio.h>

/* program koji poziva rusers() uslugu */

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

fprintf (stderr, "%d users on %s\n",num, argv[1] );


exit(0);
}

Zatim program treba kompajlirati s lijnijom koda:

cc program.c –lrpcsvc –lnsl

Klijentska strana

Pojednostavljeno rpc_call() sučelje ima samo jednu funkciju na strani klijenta.


Sadrži 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 određen 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
prihvaća,on vraća RPC_SUCCESS koji ima vrijednost 0.RPC_SUCCESS će vratiti vrijednost
1 ako je poziv neuspješan.
Ta vrijednost može biti pokazivać na tip clnt_stat, enumerirani tip definiran u datoteci
zaglavlja <rpc/rpc.h> i interpretiran s clnt_sperrno() funkcijom.Ova funkcija vraća
pokazivač na standardnu RPC poruku ogrešci.
U primjeru su pokušani svi "vidljivi" prijenosi nabrojeni u /etc/netconfig.
Prilagođavanje broja pokušaja zahtjeva korištenje nižih nivoa RPC biblioteke.Brojni
Argumenti i rezultati su rješeni sakupljanjem istih u strukture.

Primjer izmjenjen tako da koristi pojednostavljeno sučelje 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

exit(1);
}

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);

Budući da tipovi podataka mogu biti drugačije zastupljeni na različitim računalima


rpc_call() treba i tip i pokazivač RPC argumenta(slični 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 skladište).Zbog toga što RUSERSPROC_NUM nema argumenata,
xdr enkodirajuća funkcija rpc_call()-a je xdr_void i njen argument je NULL vrijednost.

Serverska strana

Serverski program je vrlo jednostavan jer korisi pojednostavljeno sučelje.


Jednostavno poziva rpc_reg() za registraciju procedure koja se treba pozvati i tada se poziva
svc_run() (prosljeđivać udaljenih procedura iz RPC biblioteke) da čeka zahtjev za ulaskom.

rpc_reg() ima sljedeći 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.
Prosljeđivač u rpc_reg()-u vodi brigu o dekodiranju argumenata udaljenih procedura i
rezultata enkodiranja, koristeći XDR filtere specificirane u toku registriranja udaljene
procedure.

Neke bilješke o programu servera:


• većina RPC aplikacija prati dogovoreno imenovanje dodajući _1 imenu funkcije.
Sekvenca _n je dodana imenu procedure da pokaže broj verzije n određene usluge.

867/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

• Argument i rezultat šalju se kao adrese.To vrijedi za sve udaljeno pozivane


funkcije.Ako se pošalje NULL kao rezultat funkcije tada se klijentu ne šalje
potvrda.Pretpostavlja se da nema potvrde za slanje.
• Rezultat mora postojati u statičnom prostoru podataka jer se njegovoj vrijednosti
pristupa nakon što se izašlo 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 veći broj podataka oni trebaju biti
povučeni unutar procedure koja tada može biti poslana kao jedna informacija.
• Procedura je registrirana za svaki prijenos određenog tipa.Ako je tip parametra (char
*) NULL ,procedura je registrirana za sve prijenose specificirane u NETPATH-u.
Ponekad se može implementirati puno brži ili kompaktniji kod od rpcgena –a.
Sljedeći program je primjer ručno 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);
}

svc_run () ;
fprintf (stderr, "Error: svc_run returned! \n");
exit (1);
}

rpc_reg() može biti pozvan toliko puta koliko je potrebno registrirati različite programe,
verzije i procedure.

Prosljeđivanje arbitražnih tipova podataka

Tipovi podataka poslani ili primljeni od udaljenih procedura mogu biti bilo koji set
predefiniranih tipova ili mogu biti definirani od strane programera.RPC se snalazi s
arbitražnim strukturama podataka,bez obzira na različite rasporede bajtova na računalima ili
odgovarajučih rasporeda struktura i to tako da ih uvijek konvertira u standardni transferni
format nazvan XDR prije no što ih šalje na prijenos.Konvertiranje se naziva serializing a

868/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

obrnuti proces se naziva deserializing.Argumenti prijevoda rpc_call() i rpc_reg() mogu


specificirati XDR primitivne procedure kao npr xdr_u_long().

Sljedeće 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 više od dva parametra,poziva se iz


xdr_wrapstring().

Primjer programerske rutine,struktura:

struct simple

{
int a;
short b;
}
simple;

sadrži pozivajući argument procedure.XDR rutina xdr_simple() prevodi strukturu na sljedeći


način:

#include <rpc/rpc.h>
#include "simple.h"

bool_t xdr_simple (XDR *xdrsp, struct simple *simplep)

{
if ( !xdr_int ( xdrsp, &simplep -> a ))
return (FALSE);
if ( !xdr_short (xdrsp, &simplep -> b ))
return (FALSE);
return (TRUE);
}

Njoj ekvivalentna rutina može se automatski generirati rpcgen-om.


XDR rutina vraća nulu ako se izvrši neuspješno,u protivnom vraća broj različit od nule.

869/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Za još kompleksnije podatkovne strukture koriste se XDR rutine;

xdr_array() xdr_bytes() xdr_reference() xdr_vector() xdr_union() xdr_pointer()


xdr_string() xdr_opaque()

Npr. Za slanje polja integera,sadržane su u strukture koje sadrže polje i njegovu veličinu.

struct varintarr
{
int *data;
int arrlnth;
}
arr;

Prijevod polja s xdr_array() :

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 veličinu polja i


pokazivač na XDR rutinu za prijevod svakog elementa polja.
Ako je veličina 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 slični s prva 4 parametra xdr_array()-a.

870/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

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 vrijednošću.

xdr_reference() poziva funkcije xdr_string() i xdr_reference(), koje prijevode pokazivaće na


način da šalju stringove.

Primjer korištenja xdr_reference() :

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);
}

Napomena.Primjetite da ovdje može biti pozvana xdr_simple() umjesto xdr_reference().

Razvoj RPC aplikacija na visokom nivou

Upoznajmo se sada s nekom daljnjim funkcijama i pogledajmo kako se stvaraju aplikacije


koje koriste RPC rutine na visokoj razini.Učinimo to proučavajući jedan primjer:

#include<stdio.h>
#include<strings.h>
#include "rls.h"

main ( int argc, char **argv)


{
char dir[DIR_SIZE];

871/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

strcpy (dir,argv[1]);
read_dir(dir);
printf("%s\n", dir);
exit(0);
}

read_dir.c – datoteka sadrži lokalnu rutinu

#include<stdio.h>
#include<sys/types.h>
#include<sys/dir.h>
<xpg2include/sys/dirent.h>
#include"rls.h"

read_dir(char *dir)
{
DIR *dirp;
struct direct *d;
printf("beginning");
dirp=opendir(dir);
if (dirp == NULL)
return (NULL);
dir[0]=NULL;
while (d = readdir(dirp))
sprintf(dir,"%s%s\n",dir,d->d_name);
printf("returning");
closedir(dirp);
return((int)dir);
}

Datoteka zaglavlja rls.h koja sadrži samo sljedeće(zasada)

#define DIR_SIZE 8192

zasigurno moramo djeliti veličinu među datotekama.Kasnije kada razvijemo RPC verzije, više
informacija će biti potrebno unjeti u tu datoteku.

Lokalni program se kompajlira sljedećom datotekom:

cc lls.c read_dir.c –o lls

Sada želimo prilagoditi ovaj program da radi na cijeloj mreži; dozvoljavajući nam nadziranje
direktorija udaljenog servera.
Sljedeći koraci su potrebni:
• Trebamo konvertirati read_dir.c da se pokreće na serveru.
- trebati ćemo registrirati server i rutinu read_dir() na tom serveru

872/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

• Klijent lls.c će trebati pozvati rutinu kao udaljenu proceduru.


• Morati ćemo definirati protokol za komunikaciju između klijentskih i serverskih
programa.

Definiranje protokola

Možemo koristiti string s null vrijednošću za slanje i primanje naziva direktorija i njegovog
sadržaja.Štoviše, možemo 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 može
učiniti automatski koristeći rpcgen ili oslanjajući se na predefinirane makroe u
pojednostavljenom sučelju.
Ovdje ćemo ih specificirati ručno.Server i klijent se u toku izvođenja moraju složiti koje će
logičke adresekoristiti.
Brojevi programa su definirani na standardni način:
• 0x00000000 – 0x1FFFFFFF: definirani od Sun-a
• 0x20000000 – 0x3FFFFFFF: ručno definirani
• 0x40000000 – 0x5FFFFFFF: gost
• 0x60000000 – 0xFFFFFFFF: rezervirani

Jednostavno ćemo izabrati korisnički 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.

Naša nova datoteka rls.h sadrži:

#define DIR_SIZE 8192


#define DIRPROG ((u_long) 0x20000001)
#define DRIVERS ((u_long) 1)
#define READDIR ((u_long) 1)

Djeljenje podataka

Već smo prije napomenuli da podacima možemo 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

{
return (xdr_string(xdrs, &objp, DIR_SIZE));
}

Serverska strana

Možemo upotrijebiti orginalnu read_dir.c datoteku.Sve što trebamo učiniti 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 sučelju.


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 sljedeći:

#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 sljedeći:

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Kompletan rls.c program izgleda ovako:

#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 vježbu kompajlirajte i pokrenite udaljenu datoteku rls.c. Pokrenite oboje,klijent i


server program lokalno te ako imate mogučnosti preko mreže.

875/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Zvonimir Janković

RLOGIN RSH

876/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

TELNET

Telnet je Internet servis koji omogućava spajanje na udaljeno računalo (remote


computer) preko Interneta. Telnet program spaja naše (lokalno) računalo na drugo računalo
kao obični terminal. Prikaz je isključivo 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 sadržaj direktorija (opcija -al za detalje)
- cp - kopira datoteke i direktorije
- mv - premješta datoteke
- rm - briše datoteke
- chmod - mijenja prava pristupa direktoriju
- logout - prekida vezu sa serverom
- passwd - omogućuje mijenjanje passworda

telnet host
Naredbe telnet koristi se za uspostavljanje virtualne terminalske sesije sa drugim
računalom u mreži. Parametar u pozivu ove naredbe host može biti ime ili IP adresa ciljnog
hosta. Nakon uspostavljanja veze sa remote hostom, pojavljuje se standardni login prompt i
od korisnika se očekuje da prođe uobičajenu proceduru logiranja. Telnet sesija se završava
odjavljivanjem sa remote hosta također na standardni način (logout komandom ili sa < Ctrl
>D).
Escape karakterom (< Ctrl > ]) telnet prelazi u lokalni mod i posjeduje izvjestan skup
lokalnih naredbe i. Jedna od značajnijih je close kojom se prekida sesija. Ovaj način se obično
koristi u neregularnim slučajevima kada je, recimo zbog loših veza, nemoguće regularno
prekinuti telnet sesiju.

877/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

Skup “r” (remote) naredbi (rlogin, rsh i rcp)

Skup “r” (remote) naredbi (rlogin, rsh i rcp) je još jedan primjer (slabe) točke u mrežnoj
sigurnosti, proizašle iz dobre namjere. Program rlogin prijavljuje korisnika na udaljeno
računalo, rsh (remote shell) se spaja na udaljeni sustav i izvršava specificiranu naredbu, a rcp
kopira datoteke između sustava. Tvorci su željeli korisnicima olakšati snalaženje u svijetu
velikih domaćinskih računala (hosts), omogućujući im da se s nekih računala prijave rad na
drugim, udaljenim računalima (remote hosts) bez lozinke. Ta udaljena računala nazvana su
pouzdanim domaćinskim računalima (trusted hosts). Bilo koje računalo na kojem korisnik
ima korisnički račun (account) s istim korisničkim imenom može se proglasiti pouzdanim
domaćinskim računalom (trusted host) navođenjem u datoteci .rhosts. Korisnik može imati
takvu datoteku na bilo kojem računalu na kojem ima korisnički račun. Na taj način željelo se
olakšati rad time što se lozinka traži samo kod prijave na neko od tih računala i omogućuje
automatska prijava za rad na bilo kojem pouzdanom domaćinu. Korisnik ne gubi vrijeme
upisujući lozinke kad se poželi prijaviti na neko drugo računalo. Dovoljno je znati lozinku na
jednom od računala, umjesto pamtiti sve lozinke. Logika kojom su se autori rukovodili bila je:
ako znaš lozinku, ti si autentificiran; računala u .rhosts datoteci vjeruju jedno drugom polazeći
od principa da nitko od njih ne može biti kompromitiran; ako te jedno računalo autentificiralo,
ostala mogu vjerovati njegovoj izjavi. Ako napadač uspije prikriti svoj originalni identitet i
predstaviti se kao netko drugi, omogućen mu je nesmetan i lak pristup sustavu jer mu ovaj
“vjeruje”.
No ovaj pristup ima i svojih (uvjetno rečeno) pozitivnih strana: kako se ne zahtjeva
lozinka za pristup, ona se ne može saznati prisluškivanjem. Ali taj princip upravo je i glavni
problem: ne može se vjerovati radnom računalu (host) ni korisnicima na njemu.
Programi rexec i rexecd omogućuju udaljeno izvršavanje (remote execution). Za razliku
od “r” komandi, ne koristi se mehanizam pouzdanih domaćinskih računala (trusted hosts).
Klijent šalje poruku u jasnom (nekriptiranom) tekstu koja sadržava korisničko ime, lozinku i
naredbu koja se treba izvršiti. Zlonamjernik treba samo pročitati nezaštićene podatke iz
paketa.

879/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

rlogin

rlogin -l login_name host

Ovo je još jedan način startanja virtualne terminalske sesije.


Program rlogin prijavljuje korisnika na udaljeno računalo. Obično imate tako
namještena računala u kojima hrpa računala koristi isto korisničko imena.
NIS (Network Information Service) je distribuirani sustav baza podataka koji dozvoljava
sustavima dijeljenje datoteka s lozinkama i druge datoteka preko mreže. Olakšava održavanje
mreže jer se sve konfiguracijske informacije o korisničkim računima spremaju na jedno
računalo, NIS glavni poslužitelj. Zbog toga što drži tako osjetljive materijale poput lozinki,
vrlo ga je važno 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 također prebacuje i tip terminala koji
koriste , pa cak i ako drugi sustav zatraži da unesete tip terminala. Ako udaljeni sustav ne
prepoznaje vaše korisničko ime pita vas za njega i lozinku.Dvije datoteke određuju rlogino-ov
zaključak ako da želite koristiti isto korisničko ime tada se prijavite na drugo računalo.Prva se
zove/etc/hosts.eguiv. Na svakom stroju, ova datoteka daje popis svih strojeva koja imaju ista
korisnička imena.Pojedinačni korisnici mogu imati accounte (manipulacija korisničkim
računima, obračunavanje korištenja resursa dodijeljenih određenom klijentu) na strojevima
izvan lokalne grupe ili odjelu ima svoje. Datoteka rhosts. Korisnik može imati takvu datoteku
na bilo kojem računalu na kojem ima korisnički račun. Na taj način željelo se olakšati rad
time što se lozinka traži samo kod prijave na neko od tih računala i omogućuje automatska
prijava za rad na bilo kojem pouzdanom domaćinu. Korisnik ne gubi vrijeme upisujući
lozinke kad se poželi prijaviti na neko drugo računalo. Dovoljno je znati lozinku na jednom
od računala, umjesto pamtiti sve lozinke. Logika kojom su se autori rukovodili bila je: ako
znaš lozinku, ti si autentificiran; računala u .rhosts datoteci vjeruju jedno drugom polazeći od
principa da nitko od njih ne može biti kompromitiran; ako te jedno računalo 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

primjeri:
% rlogin ban.junis
% rlogin melmack
% rlogin afrodita.rcub.zg.ac.hr
% rlogin afrodita.rcub.zg
% rlogin zmaj.eecs.wsu.edu

rsh (remote shell)

Izvršava jednu po jednu naredbu.Date naredbi ime sustava i naredbu koju želite
izvršiti.Naredba rsh koristi isti način ili strategiju sto se tiče korisničkog imena kao i rlogin za
pristup nekom sustavu , a da on ne zatraži korisničko ime i lozinku tada to možete učiniti i
rsh-om.Ali budući da rsh ne rukuje terminalom bas povezano (pametno) ne možete koristiti
cijeli ekran poput vi-a ili emacs-a ali zato možete koristiti ed.

ftp(1)

ftp host
FTP (File Transfer Protocol) sluzi za prijenos fajlova sa jednog računala u mreži 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 slična standardnoj pri uspostavljanju terminalske sesije. Dakle,
korisnik navede login ime i password koji odgovaraju remote hostu. Ukoliko je procedura
identifikacije uspješno obavljena, ftp ulazi u interaktivni mod i korisnik može početi sa
radom. U suprotnom se preporučuje izlazak iz programa i ponavljanje procedure.

881/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

U sljedećoj tabeli su date najznačajnije interaktivan naredbe programa ftp.

pwd Daje potpuni put tekućeg direktorijuma na remote hostu.

Izvršava komandu command u lokalnom shell-u. Na primjer:


!ls
!command lista sadržaj tekućeg direktorijuma a
!pwd
ispisuje tekući direktorijum na lokalnom hostu.

ls,dir prikazuju sadržaj tekućeg direktorijuma na remote hostu.

cd path Mijenja tekući direktorijum na remote hostu.

Promjena tekućeg direktorijuma na lokalnom hostu. Bez argumenata ispisuje


lcd dir
tekući direktorijum na lokalnom hostu.

Postoje dva režima prijenosa fajlova, zavisno od njihovog tipa. Tekstualni fajlovi
se prenose u ascii a binarni u bin režimu. Tekstualni fajlovi se mogu prenositi i u
ascii, bin
bin modu, međutim prijenos binarnih fajlova u ascii modu dovodi do oštećenja
sadržaja tako da o ovome treba voditi računa.

put
Transfer fajla file_name sa lokalnog na remote host.
file_name

get
Transfer fajla file_name sa remote na lokalni host.
file_name

mget Slično kao i get samo sto file_name u ovom slučaju moče da sadrži univerzalne
file_name znake (*, ?, []).

mput
Slično kao i put samo sto file_name moze da sadrži univerzalne znake.
file_name

quit Prekid ftp sesije.

882/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

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 većini računalnih mreža velikih ustanova obično postoji po jedan javni ftp server
(anonymous ftp) na kome se nalaze podaci dostupni korisnicima bez obzira da li oni
posjeduju račun na serveru ili ne. Kod pristupa ovakvim serverima korisnik kao login ime
navodi ftp ili anonymous a kao password bilo sta, obično e-mail adresu.

primjer:
% ftp ftp.elfak.ni.ac.zg
Name (venus:srle): ftp
Password: srle@elfak.ni.ac.zg

883/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

FINGER(1)

finger [user[@host]]
Naredba finger se dobivaju podaci o korisniku user na hostu host. Ti podaci obuhvaćaju
njegovo login ime, puno ime, HOME direktorijum, shell koji koristi i slično. 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 računaru host.

primjeri:
% finger
Daje spisak prijavljenih korisnika na lokalnom hostu. Slično 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Rlogin rsh

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 vraća pakete iste sadrzine
lokalnom hostu. Na korisničkom terminalu se ispisuju informacije o vraćenim 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
kašnjenja). Za slučaj da veza nije u redu svi poslati paketi ce biti izgubljeni i od ciljnog hosta
ne treba očekivati nikakve mrežne usluge.

Principali su sustavi koji se koriste da se autentificira korisnik poslužitelju ili usluzi.


Svaki sustav definira neki skup principala. Neki od najčešćih su:
korisničko ime (username)– identitet korisnika
ime domaćinskog računala (hostname) – identitet domaćinskog računala
(host)
klijent (client) – računalo koje zahtjeva uslugu od nekog radnog
(domaćinskog) računala u ime korisnika
poslužitelj (server)– domaćinsko računalo koje pruža usluge

885/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Marija Bilić

SAMBA I NFS

886/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

SAMBA POSLUŽITELJ

Samba programski paket je skup programskih modula, koji omogućuju dijeljenje


računalnih resursa između međusobno umreženih računala sa instaliranim različitim
operativnim sustavima.
U današnje vrijeme se često unutar iste lokalne računalne mreže koriste računala sa
instaliranim različitim vrstama i inačicama operativnih sustava, gdje se tipično radi o
korištenju različitih inačica Windows operativnih sustava (Win98/NT/2000) u kombinaciji sa
nekom od brojnih Linux distribucija (RedHat, Mandrake, Debian, SuSe).
Samim time javlja se potreba za međusobnim dijeljenjem resursa između spomenutih
platformi, kako bi se što bolje iskoristili svi raspoloživi resursi unutar računalne mreže.
Upravo Samba programski paket je taj koji omogućuje integraciju Linux računala u
Microsoft okolinu, u kojoj Windows računala neće biti niti svjesna da komuniciraju i
pristupaju računalima sa nekim drugim operativnim sustavom.
Na taj način moguć je prikaz Linux računala sa instaliranim Samba paketom unutar
Network Neighbourhood ili Windows Explorer okružja.
Osnovni razlog zbog kojeg je potrebno korištenje Samba paketa je taj što Microsoft
koristi nešto drugačije protokole i servise koji omogućuju mrežnu komunikaciju među
računalima u odnosu na ostale operativne sustave.
Osnovni protokol koji omogućuje međusobno dijeljene resursa između Windows
računala je SMB (Service Message Block) protokol.
Taj protokol dalje koristi NetBIOS (Network Basic I/O System) i druge protokole niže
razine, kako bi se omogućilo lociranje te međusobna komunikacija između pojedinih
računala.
Takav pristup bitno se razlikuje u odnosu na klasične mrežne protokole (TCP, UDP,
IP), koji su udomaćeni kod većine drugih operativnih sustava, što je u osnovi izvor svih
problema. Razlog tomu je taj što Microsoftovi protokoli bili prvenstveno namijenjeni za
korištenje u LAN mrežama.

887/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

NetBIOS protokol

Za međusobnu komunikaciju unutar Windows okružja, računala koriste NetBIOS


imena. NetBIOS imena vezana su isključivo za Windows platforme, i u osnovi nemaju
nikakvih sličnosti 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 određuju njegovo ime, plus šesnaesti znak koji određuje servise koje to
računalo nudi. Kako bi se riješio problem spajanja lokalne mreže koja koristi NetBIOS (LAN
u Windows okružju) sa mrežama koje koriste TCP/IP i UDP/IP protokole (Internet) razvijen
je NBT (NetBIOS over TCP/IP) standard koji određuje kako bi NetBIOS trebao raditi preko
TCP/UDP mreža. Standard određuje tri osnovne usluge:
usluga za povezivanje NetBIOS imena sa IP adresom,
datagrami,
sesije.
Usluga za povezivanje imena sa IP adresom omogućava svakom računalu da koristi
specifično ime na mreži koje će biti prevedeno u IP adresu (slično kao DNS usluga na
Internetu). Datagrami i sesije su sekundarni komunikacijski protokoli koji se koriste za
razmjenu podataka između NetBIOS računala preko mreže.

Dodjeljivanje imena i njihovo povezivanje s IP adresama

Kad se neko NetBIOS računalo spoji na mrežu, prvo što mora napraviti je registrirati
svoje ime (name registration). SMB protokol koristi koncept grupa (workgroup) na koje se
nova računala mogu prijaviti. Grupa je skupina računala unutar iste mreže. Problem je u tome
što dva računala unutar iste grupe ne mogu imati isto ime. Postoje dva načina da se to osigura:
dozvoljavanje svim računalima na mreži da čuvaju svoje NetBIOS ime u
slučaju da ga neko drugo računalo pokuša koristiti (Slika 1.1).
korištenje NBNS-a (NetBIOS Name Server) koji vodi računa o tome koja su
računala registrirala NetBIOS ime (Slika 1.2).

888/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Slika 1.1 Registracija imena bez NBNS poslužitelja

Slika 1.2. Registracija imena s NBNS poslužiteljem

Osim toga, potrebno je osigurati pretvaranje NetBIOS imena u specifične IP adrese (


name resolution). I za ovo postoje dva različita pristupa:
svako računalo može vratiti svoju IP adresu kad se prozove njegovo
NetBIOS ime (Slika 1.3).
NBNS se može koristiti za povezivanje NetBIOS imena sa IP adresama
(Slika 1.4).

Slika 1.3 Povezivanje imena s IP adresom bez NBNS poslužitelja

889/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Slika 1.4 Povezivanje imena s IP adresom s NBNS poslužiteljem

Prilikom uključivanja računala na mrežu koja ne koristi NBNS poslužitelj, novo


računalo šalje poruku, u kojoj specificira NetBIOS ime s kojim se želi priključiti na mrežu,
svim računalima u mreži (broadcast). Ako to ime ne koristi niti jedno drugo računalo tada će
ga novo računalo zadržati. U slučaju da to ime već koristi neko računalo u mreži, ono će javiti
novom računalu da je to ime zauzeto. Problem s broadcast-om, osim što zagušuje mrežu, je i
u tome što ima problema sa mrežama koje imaju više od jedne podmreže zbog usmjerivača
koji su često konfigurirani tako da blokiraju pakete koji su broadcast svim računalima na
podmreži.
Ako se koristi NBNS poslužitelj tada se dešava ista stvar samo što se komunikacija
odvija samo između novog računala i NBNS-a. Novo računalo javlja NBNS-u koje ime želi
koristiti a NBNS javlja novom računalu je li to ime slobodno ili nije.
Slično je i sa povezivanjem NetBIOS imena i IP adresa. Ako se ne koristi NBNS tada se
svim računalima u mreži šalje NetBIOS ime, a računalo kojem to ime pripada vraća svoju IP
adresu. Ako se koristi NBNS tada se njemu šalje NetBIOS ime a on vraća odgovarajuću IP
adresu.
Iz svega rečenog lako se može vidjeti da korištenje NBNS poslužitelja uvelike
rasterećuje mrežu i ubrzava komunikaciju zbog uklanjanja potrebe za slanjem poruka svim
računalima u mreži (broadcast).

890/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

WINS (Windows Internet Name Service) je Microsoft-ova implementacija NBNS-a.


Kad se računalo spoji na mrežu, ono mora prijaviti svoje ime i IP adresu lokalnom WINS
poslužitelju. WINS poslužitelj će zadržati tu informaciju sve dok novo računalo periodički
osvježava svoju registraciju, što pokazuje da je još uvijek spojeno na mrežu.

Kontrolor domene

Kontrolor domene je glavni dio Windows domene (slično kao NIS poslužitelj u
Linux/Unix svijetu). On ima više zadataka. Jedan je briga oko pravilne provjere autentičnosti
korisnika. Provjera autentičnosti je proces dodjele ili zabrane pristupa korisniku dijeljenim
resursima na drugom računalu spojenom na mrežu (korištenjem korisničke zaporke). Svaki
kontrolor domene koristi SAM (security account manager) za održavanje liste korisničkih
imena i zaporki. Kontrolor stvara centralni repozitorij zaporki i korisničkih imena što je
mnogo efikasnije nego da svako računalo na mreži mora održavati stotine zaporki za svaki
dijeljeni resurs koji je dostupan na mreži. U Windows domeni, kada neautentičan klijent
zatraži pristup dijeljenom resursu na nekom poslužitelju, poslužitelj će pitati kontrolor
domene da li je taj korisnik autentičan. Ako je, poslužitelj će dati korisniku pristup resursu, a
ako nije poslužitelj ć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. Može se reći da je korisnik
prijavljen na samu domenu.

Primjer identifikacije korisnika

Kontrolor domene koji je trenutno aktivan naziva se primarni (primary domain


controller, PDC). Na domeni može biti više pomoćnih kontrolora (backup domain controller,
BDC) koji će preuzeti ulogu primarnog ako ovaj postane nedostupan. Pomoćni kontrolori

891/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

često sinkroniziraju svoje SAM podatke (korisnička imena i zaporke) sa primarnim


kontrolorom kako bi u slučaju potrebe mogli preuzeti kontrolu domene i imaju kopije SAM
podataka samo za čitanje i nove podatke mogu dobiti samo sinkronizacijom sa primarnim
kontrolorom. Poslužitelj u Windows domeni može koristiti SAM podatke bilo kojeg
kontrolora u domeni (primarnog ili pomoćnih) za autentikaciju korisnika koji se želi prijaviti
na domenu, ali unos novih korisnika koji smiju pristupati domeni mora ići preko primarnog
kontrolora domene.
Samba može preuzeti ulogu primarnog kontrolora domene dok funkcije pomoćnog
kontrolora domene još uvijek nisu podržane od strane Samba-e.

Samba programski moduli i instalacija Sambe

Samba programski paket sastoji se od niza programskih modula, od kojih svaki obavlja
određeni dio poslova.
smbd je SMB program poslužitelj (radi na TCP portu 137) koji razgovara
SMB protokolom, te omogućava međusobnu komunikaciju i dijeljenje
resursa između računala. On predstavlja jedan od dva najvažnija modula koji
dolaze kao dio Samba paketa, i koji omogućuju njezino funkcioniranje.
nmbd je drugi modul, a uloga mu je da obavlja poslove vezane za rezoluciju
NETBIOS imena. Radi na TCP portu 139, te stalno osluškuje mrežni
promet, odnosno NETBIOS zahtjeve. Ukoliko na mreži čuje zahtjev za
pristup sa svojim NETBIOS imenom, on odgovara svojom IP adresom, kako
bi računalo koje je uputilo zahtjev zna kome slati daljnje pakete.
smbclient je klijentski program za pristupanje resursima drugog računala,
kojima je dozvoljen pristup.
nmblookup je program koji nam omogućuje saznavanje IP adrese računala
kojemu se želi pristupiti, na temelju njegovog NETBIOS imena.
smbstatus je programski modul koji omogućuje davanje informacija o
trenutnim vezama prema Samba poslužitelju.
testparm je program za provjeru regularnosti napisane ili naknadno
modificirane smb.conf datoteke.

892/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Samba programski paket dolazi u distribuciji sa većinom Linux distribucija, te se


instalira klasičnim instalacijskim postupcima.

Konfiguracija Sambe

Osnovni element koji je ključan u konfiguraciji Samba programskog paketa je smb.conf


datoteka. Sama instalacija Samba paketa neće stvoriti spomenutu smb.conf datoteku.
Sa Samba programskim paketom dolazi vrlo koristan alat (Swat), koji omogućuje
konfiguraciju i administraciju Sambe putem grafičkog sučelja, čime se djelomično otklanjaju
problemi za manje iskusne korisnike. Swat je programski paket koji administratorima
omogućuje, da se putem bilo kojeg preglednika spoje lokalno na svoje računalo preko TCP
901 porta (http://localhost:901), te da na taj način upravljaju Samba programskim paketom.
Smb.conf datoteka se u osnovi sastoji od sekcija (označene 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
počinje sa znakovima # ili ; smatra se komentarom, te kao takva neće biti tumačena. Svaka
sekcija u smb.conf datoteci opisuje jedan dijeljeni resurs, sa njegovim parametrima. Iznimka
je sekcija [global], koja se odnosi na sve sekcije, te sadrži neke općenite postavke. Osim
[global] sekcije postoje još dvije sekcije, koje se nešto razlikuju u odnosu na običnu sekciju
koja predstavlja neki dijeljeni resurs, a to su sekcije [printers] i [homes]. Ostale obične sekcije
sastoje se u osnovi od imena direktorija koji se želi dijeliti, plus dodatni parametri koji opisuju
ovlasti, odnosno dozvole pristupa.

Primjer:

[global]
workgroup = Simple
[test]

893/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

comment = Test
path = /export/samba/test
read only = no
guest ok = yes

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 korisničke zaporke. Parametar workgroup u sekciji [global], svrstati će ovaj
Samba poslužitelj u Simple radnu grupu. Unutar [global] sekcije, osim gore spomenutih,
može se naći i velik broj drugih parametara, koji se mogu definirati, i koji će se kao takvi
odnositi na sve sekcije. Tu se mogu naći razni parametri vezani za definiciju nekih općih
sigurnosnih nivoa, enkripcija, korisničkih opcija i sl. Pored [global] sekcije potrebno je
spomenuti [homes] sekciju, koja može biti vrlo korisna u određenim situacijama. Naime, u
slučajevima kada valjani korisnik (korisnik koji ima korisnički račun na poslužitelju) Samba
poslužitelju pošalje zahtjev za pristup sekciji koja nije definirana u smb.conf datoteci, a
ujedno u istoj datoteci postoji definirana [homes] sekcija, Samba poslužitelj će takvom
korisniku omogućiti 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 računalu. Upravo na opisani način [homes] sekcija se
može iskoristiti za efikasnije raspoređivanje 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 korisničkim imenom i zaporkom mogu pristupiti. Korisna opcija koja se
može navesti unutar pojedinih sekcija su parametri valid users i invalid users. Pomoću ovih
parametar može se točno definirati za svaku sekciju, tko ima prava pristupa, a tko ne.
Koristeći opciju read only = yes, korisnicima je sekcija unutar koje se nalazi naveden ovaj
atribut otvorena isključivo 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 slučaj, pri čemu
se onda koristi read list parametar.

894/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Samba dozvoljava korištenje 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 izvođenja programa.
Neke od korisnijih varijabli su:
%I - IP adresa klijenta,
%m - NetBIOS ime klijenta,
%M - DNS ime klijenta,
%H - home direktorij korisnika,
%u - korisničko ime korisnika,
%U - korisničko ime traženog korisnika,
%h - DNS ime Samba poslužitelja,
%L - NetBIOS ime Samba poslužitelja,
%v - verzija Samba poslužitelja.
Postoji još niz opcija koje se mogu definirati za pojedine sekcije unutar smb.conf
datoteke, a mogu se naći na adresi http://us1.samba.org/samba/docs/man/smb.conf.5.html.
Nakon svake modifikacije smb.conf datoteke potrebno je ponovno pokrenuti Samba
poslužitelje (nmbd i smbd), kako bi se aktivirale načinjene izmjene. Bez ovog koraka
promjene načinjene u smb.conf datoteci neće biti važeće. Komande kojima se obavlja
ponovno pokretanje Samba poslužitelja su slijedeće:

# cd /etc/init.d
# ./smb restart
ili
# /etc/init.d/smb restart

Nakon ovoga načinjene promjene trebale bi biti aktivirane.

895/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Problemi sa enkripcijom korisničkih zaporki

Element koji može unijeti najviše poteškoća što se tiče konfiguracije Sambe i
međusobne suradnje između Linux i Widows računala su problemi s kriptiranjem korisničkih
zaporki, koji su posljedica nekompatibilnosti između te dvije platforme. Naime, ukoliko se
želi omogućiti pristup nekom dijeljenom resursu s Win98/NT/2000 računala koje koristi
enkripciju zaporki, potrebno je u [global] sekciji navesti sljedeći parametar

encrypt passwords = yes

koji će predstavljati prvi korak u omogućavanju takvog pristupa. Svaki korisnik koji se
želi spojiti na Linux Samba poslužitelj s nekog udaljenog računala, mora na tom Linux stroju
posjedovati svoj valjan korisnički račun. Postoji i vrlo korisna opcija mapiranja korisnika
(username map), koja omogućuje dijeljene resursa između korisnika koji imaju različita
korisnička imena na različitim računalima. Budući da Windowsi i Linux koriste drugačije
algoritme za kriptiranje zaporki, na Linux računalu potrebno je stvoriti posebnu smbpasswd
datoteku, u kojoj će biti sadržana korisnička imena korisnika, s kriptiranim zaporkama koje
odgovaraju Windows enkripciji. Ta datoteka se može vrlo jednostavno popunjavati za svakog
korisnika zasebno naredbom:

# smbpasswd –a ime_korisnika

(korisnik mora imati otvoren korisnički račun na tom računalu) nakon čega slijedi upit
za unosom zaporke ili automatski korištenjem skripte koja dolazi u paketu sa Samba
poslužiteljem, na slijedeći način:

# cat /etc/passwd | ./mksmbpasswd.sh > /etc/smbpasswd

Ova linija će za svakog registriranog korisnika koji posjeduje korisnički račun na tom
Linux stroju, stvoriti odgovarajuće polje u smbpasswd datoteci, što će omogućiti valjanu
identifikaciju korisnika koji pokušava pristupiti sa Windows računala. Nakon ovoga ne bi
trebalo biti problema sa pristupom Windows računala koja koriste enkripciju. Postoji i

896/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

jednostavnije rješenje tj. mogućnost da se u Windowsima u njihovom registry-u isključi


kriptiranje zaporki, ali to se ne preporuča iz sigurnosnih razloga, budući da se u tom slučaju
korisničke zaporke mrežom prenose u njihovom izvornom obliku.

Samba i WINS poslužitelj

Prije nego se počeo koristiti NBNS, povezivanje imena radilo je u cijelosti preko
broadcasta. Problem s broadcastom je što ne radi dobro ako mrežama koje se sastoje od više
podmreža i nepotrebno zagušuje mrežu. Kako bi se riješio taj problem razvijen je WINS,
NBNS koji radi sa višestrukim podmrežama, koji Samba podržava. Na jednom računalu u
mreži se pokrene WINS poslužitelj i sva računala u mreži ga mogu koristiti za povezivanje
imena sa IP adresama i za registraciju na mrežu umjesto broadcasta. Postoje četiri mehanizma
za povezivanje imena sa IP adresama računala koja Samba podržava. To su:
WINS
broadcast
parovi ime-IP adresa u /etc/hosts datoteci
lmhosts datoteka
Samba može koristiti bilo koju ili sve od navedenih metoda i to redoslijedom koji se
specificira u smb.conf datoteci pomoću resolve order opcije.

Samba kao kontrolor Windows NT i Windows 2000 domene

Prije pokretanja Sambe kao primarnog kontrolora domene potrebno je osigurati:


da je Samba jedini primarni kontrolor u domeni.
da postoji WINS poslužitelj na mreži.

Samba i dijeljenje pisača

Pisač spojen na Samba poslužitelj može se dijeliti preko mreže i mogu ga koristiti druga
računala u mreži. Klijent koji ima instaliran ispravan upravljački program za taj pisač može

897/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

preko mreže na njemu ispisivati dokumente jednako kao da je pisač spojen direktno na njega.
Windows klijenti će dijeljeni pisač vidjeti u svojem Network Neighbourhood okružju. Kod
ispisa preko mreže odvija se na sljedeći način:
otvara se veza prema poslužitelju,
datoteka koja se želi poslati na pisač kopira se preko mreže na poslužitelj,
veza sa poslužiteljem se zatvara,
poslužitelj šalje kopiju datoteke na pisač i nakon toga ju briše.
Kad datoteka koju treba ispisati stigne na poslužitelj, ona se privremeno sprema na
lokalni disk u direktorij koji je određen opcijom path. Nakon toga Samba pokreće Linux
naredbu kojom se ta datoteka šalje na pisač.

Naredba za ispis na pisač


Kako bi dokument bio ispisan na pisač, potrebno je reći Sambi kojom se naredbom
datoteka može ispisati na pisač i nakon toga obrisati. Na Linux operativnom sustavu ta
naredba je:
# lpr –r -Ppisač datoteka

Ova naredba kopira dokument u direktorij /var/spool, dohvaća ime pisača iz


konfiguracijske datoteke /etc/printcap (u ovoj su datoteci pohranjeni parametri svih pisača
spojenih na računalo) i na temelju parametara pročitanih u njoj odlučuje kako će podaci biti
obrađeni prije slanja na pisač i na koji uređaj 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 poslužitelju. Ovo nema utjecaja na originalnu datoteku na klijentu.
Imena svih pisača na računalu mogu se naći 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 pisača ne smeta prilikom predaje dokumenata Samba poslužitelju. Nakon
što je neki dokument predan poslužitelju on stoji na listi čekanja dok pisač ne završi s poslom
koji trenutno obavlja i nakon toga se šalje na ispis. Samba omogućava klijentu da pogleda
status dokumenata koji trenutno čekaju na ispis, klijent može pauzirati ispis nekog
dokumenta, ponovno ga pokrenuti ili ga maknuti s liste za čekanje.
Korištenje jednog ili više Samba računala kao printer poslužitelja daje fleksibilnost
lokalnoj mreži. Pisače se vrlo lako može rasporediti na različite korisnike ili se može dozvoliti

898/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

svima da ih koriste. Dodatno, pristup pisaču može se ograničiti samo na par korisnika
korištenjem opcije valid user.

Primjer:
Korištenje 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 može se definirati posebna sekcija pod imenom [printers] koja služi
za automatsko kreiranje sekcija za pisače. Ako se u datoteci smb.conf definira sekcija
[printers] Samba će automatski napraviti sekcije za sve pisače koje nađe u datoteci
/etc/printcap.
Ako klijent zatraži resurs s imenom koje nije eksplicitno definiranu u smb.conf datoteci:
ako ime resursa odgovara nekom korisničkom imenu na poslužitelju i postoji
sekcija [homes] u datoteci smb.conf tada se stvara nova sekcija s imenom
korisnika u kojoj su parametri podešeni na vrijednosti dane u [homes] i
[global] sekcijama.
inače, ako ime resursa odgovara imenu pisača u datoteci /etc/printcap i
postoji [printers] sekcija u datoteci smb.conf tada se stvara nova sekcija s
imenom pisača u kojoj su parametri podešeni na vrijednosti dane u [printers]
sekciji.
ako ništa od to dvoje ne uspije, Samba traži resurs definiran opcijom default
service. Ako ga ne nađe, vraća se greška.
Iz ovoga se može vidjeti da ako se pisaču i korisniku dodijeli isto ime može doći do
greške tj. umjesto da se dijeli pisač dijeliti će se direktorij.
Ako je pisač spojen na računalo sa Windows operativnim sustavom njemu je moguće
pristupati preko Sambe korištenjem skripte smbprint koja dolazi sa Samba paketom. Da bi
stvar funkcionirala, pisač na Windows računalu mora biti postavljen kao dijeljeni resurs.

899/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Kako bi Linux prepoznao udaljeni pisač potrebno je učiniti dvije stvari:


potrebno je dodati pisač u datoteku /etc/printcap
napraviti konfiguracijsku datoteku u direktoriju /var/spool za pisač

Pokretanja Samba poslužitelja

Za uspješno funkcioniranje Samba programskog paketa potrebno je pokrenuti dva


demon procesa smbd i nmbd. Te je demone moguće pokrenuti ručno ili automatski prilikom
podizanja sustava. Za ručno pokretanja potrebno je u konzoli (sa administratorskim
ovlastima) napisati sljedeće naredbe:
# /usr/local/samba/bin/smbd -D
# /usr/local/samba/bin/nmbd -D

Da bi se demoni pokrenuli automatski prilikom podizanja sustava potrebno je gore


navedena dva reda upisati u neku od datoteka koje se izvršavaju prilikom podizanja sustava.
Koje su to datoteke to ovisi o operativnom sustavu koji se koristi.

900/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

NFS (NETWORK FILE SYSTEM)

Unix mrežni datotečni sustav (Network File System) omogućava korištenje particija
tvrdih diskova koje se nalaze na drugim računalima u mreži kao da su na lokalnom tvrdom
disku. Time dijeljenje datoteka putem mreže postaje jednostavno, brzo i transparentno za
korisnika. Kako neispravna konfiguracija NFS-a može pružiti pristup neovlaštenim
korisnicima lokalnom tvrdom disku, putem mreže, posebnu pažnju treba posvetiti pravilnoj
konfiguraciji sustava.
Iako postoje i drugi sustavi koji pružaju sličnu funkcionalnost (npr. Samba, koja je
prethodno opisana), prednosti NFS-a su standardiziranost, jednostavnost za korištenje, te
podrška za većinu Unix platformi. Isto tako, postoje NFS klijenti i poslužitelji za Windows
operativni sustav tako da je putem NFS-a moguće dijeliti podatke i datoteke na mrežama koje
se sastoje i od Linux (Unix) i od MS Windows računala. Verzije NFS-a koje se trenutno
koriste su verzija 2 i verzija 3. Verzija 2 je dovoljna za uobičajenu upotrebu dok je verzija 3
pogodna za jako opterećene i velike mrežne disk poslužitelje.
Verzija 2 NFS-a postoji već dugo vremena i podržana je još od verzije 1.2 Linux jezgre
(kernela) ali je minimalna potrebna verzija Linux jezgre 2.2.18 ako se želi koristiti bilo koja
od sljedećih mogućnosti NFS-a:
miješanje Linux NFS-a s NFS-om drugih operativnih sustava,
pouzdano zaključavanje datoteka preko NFS-a,
korištenje verzije 3 NFS-a.
Osnovni paketi za NFS su nfs-utils i mount. Paket nfs-utils dolazi standardno sa svim
Linux distribucijama i to u obliku .rpm (RedHat i Mandrake distribucija) i .deb (Debian
distribucija) paketa.

Postava NFS poslužitelja

Postavljanje poslužitelja sastoji se od dva dijela, editiranja konfiguracijskih datoteka


potrebnih za ispravan rad NFS poslužitelja i pokretanja NFS usluge.
Postoje tri glavne konfiguracijske datoteke koje je potrebno ispravno podesiti prije
pokretanja NFS poslužitelja. To su:
/etc/exports

901/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

/etc/hosts.allow
/etc/hosts.deny
Za rad poslužitelja dovoljno je podesiti datoteku /etc/exports ali takva postava je,
gledano s aspekta sigurnosti poslužitelja, vrlo loša. Naime, iako je za samo pokretanje
poslužitelja i omogućavanje dijeljenja datoteka preko mreže dovoljno u datoteci /etc/exports
reći koji će direktoriji biti dijeljeni, u datotekama /etc/hosts.allow i /etc/hosts.deny se navodi
koja računala imaju pristup poslužiteljskom računalu.

Postava datoteke /etc/exports


Ova datoteka se sastoji od niza unosa od kojih svaki govori koji direktorij (particija) se
dijeli i kako se dijeli. Detalji o svim opcijama koje se mogu koristiti u ovoj datoteci mogu se
naći u man stranicama s pomoći (man exports).
Tipičan unos u /etc/exports datoteci izgleda ovako:
dir računalo1(opcija11,opcija12) računalo2(opcija21,opcija22)
gdje su:
dir - ime direktorija koji se dijeli. To može biti i cijela particija. Svi
poddirektoriji dijeljenog direktorija koji se nalaze unutar istog datotečnog
sustava se također dijele.
računalo1, računalo2 - klijenti koji će imati pristup dijeljenom direktoriju.
Klijenti mogu biti imenovani ili preko svoje IP adrese ili preko svojeg
opcijaxx - lista opcija navedena uz svakog klijenta opisuje način na koji će
taj klijent moći pristupati poslužitelju.
Najvažnije opcije su:
ro - direktorij je dijeljen samo za čitanje. Klijent može samo čitati iz
direktorija ali ne može u njega pisati. Ova postavka se automatski
pretpostavlja ako nije navedeno drugačije.
rw - klijent ima može i čitati iz direktorija i pisati u direktorij.
no_root_squash - uobičajeno ponašanje poslužitelja je da se svaki zahtjev od
root korisnika na klijentu tretira kao zahtjev korisnika nobody na
poslužitelju. Ako je odabrana opcija no_root_squash tada će root korisnik na
klijentu imati istu razinu prava pristupa datotekama na poslužitelju kao da je
na poslužitelj prijavljen kao root.

902/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

no_subtree_check - ako se dijeli samo dio particije a ne cijela, tada je


potrebna provjera da li se datoteka koju je zatražio klijent nalazi na
dijeljenom dijelu particije. Ako se dijeli cijela particija tada ova provjera nije
potrebna i uključivanje ove opcije će ubrzati prijenos datoteka.
sync - verzija 2 NFS poslužitelja će obavijestiti klijenta da je proces
zapisivanja datoteke na disk završen kad poslužitelj pozove write sistemski
poziv i preda datoteku lokalnom datotečnom sustavu na poslužitelju. Ali to
ne znači da je ta datoteka doista u tom trenutku zapisana na disk. Zbog toga
može doći do gubitka podataka i pokvarenih datoteka ako dođe do pada
poslužitelja. Opcija sync osigurava da datotečni sustav na poslužitelju
datoteku doista snimi na disk onog trenutka kad od NFS-a dobije write
sistemski poziv. NFS verzije 3 nema ovih problema i kod njega uključivanje
ove opcije nije potrebno.
Za velike lokalne mreže možda će biti potrebno omogućiti pristup velikom broju
klijenata. Kako bi se u takvim slučajevima izbjeglo navođenje imena svakog od računala
zasebno postoji par načina koji pojednostavljuju referenciranje velikog broja računala. Ako se
želi omogućiti pristup svim računalima na lokalnoj mreži, to se može postići specificiranjem
IP adrese mreže i mrežne maske (eng. netmask).
Primjer:
Izgled unosa u /etc/exports datoteci koji svim računalima u lokalnoj mreži omogućava
pristup direktorijima /usr/local i /home.
/usr/local 192.168.0.0/255.255.255.0(ro)
/home 192.168.0.0/255.255.255.0(rw)

Druga je mogućnost specificiranje NIS (Network Information Service) mrežne grupe u


unosu. Da bi se specificiralo ime mrežne grupe u exports datoteci potrebno je ispred imena
dodati simbol @.
Primjer:
Primjer omogućavanja pristupa mrežnoj grupi.
/usr/local @student(ro)
/home @student(rw)
Mrežna grupa u ovom primjeru ima ime student.

903/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Treća je mogućnost korištenje asteriksa (*) (npr. *.apm.hr) umjesto cijelih imena
računala. Ista stvar se može postići primjenom djelomičnih IP adresa tako da se navede samo
dio IP adrese koji se odnosi na lokalnu mrežu bez da se adresira neko određeno
Kod korištenja ovih pojednostavljenja treba biti oprezan, jer se može desiti da se
omogući pristup neželjenim računalima. Sa stajališta sigurnosti, čak je i za velike lokalne
mreže najbolje navesti ime svakog računala zasebno jer se time smanjuje opasnost od
pogreške i omogućavanja neželjenog pristupa resursima.
Napomena o tome što se ne može (i ne smije) dijeliti:
ako je neki direktorij dijeljen tada njegov naddirektorij i njegovi
poddirektoriji ne mogu biti dijeljeni ako se nalaze u istom datotečnom
sustavu. Za tako nešto nema niti potrebe jer se dijeljenjem jednog direktorija
dijele i svi njegovi poddirektoriji, ali treba paziti kako se ne bi potkrala
greška u /etc/exports datoteci.
nije dobra ideja dijeliti FAT ili VFAT (MS DOS, MS Windows) datotečne
sustave. FAT nije predviđen za rad s višekorisničkim računalima i operacije
koje ovise o datotečnim dozvolama neće raditi.
uređaji koji se nalaze u /dev direktoriju i ostale posebne datoteke ne mogu se
pravilno dijeliti sa klijentima koji nisu pokrenuti na Linux operativnom
sustavu.

Postava datoteka /etc/hosts.allow i /etc/hosts.deny


Datoteke /etc/hosts.allow i /etc/hosts.deny su standardne Linux datoteke koje određuju
koja računala na mreži smiju pristupati uslugama pokrenutim na Linux računalu. Ove dvije
datoteke ne odnose se samo na NFS poslužitelj nego i na neke druge poslužitelje koji ih
koriste (npr. inetd). Svaki unos u ovim datotekama sadrži ime usluge pokrenute na računalu i
imena računala koja smiju (ili ne smiju) pristupati toj usluzi. Kad poslužitelj dobije zahtjev od
klijenta on provjerava u datotekama hosts.allow i hosts.deny da li tom klijentu smije dati
pristup.
Provjera se odvija sljedećim redoslijedom:
prvo se provjerava datoteka hosts.allow kako bi se vidjelo da li je u njoj
navedeno ime klijenta. Ako je, tada je klijentu odobren pristup.

904/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

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.
Pomoću ovih datoteka može se uvesti kontrola pristupa NFS usluzi tako da se pristup
demonima koji su za nju zaduženi dozvoli samo nekim računalima.

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 poslužitelju i klijentu kako bi ovi
ispravno radili.

NFS demoni
O NFS usluzi se brine pet demona:
rpc.nfsd - radi većinu posla oko NFS usluge,
rpc.lockd - brine se oko zaključavanja datoteka,
rpc.statd - zajedno s rpc.lockd se brine oko zaključavanja datoteka,
rpc.mountd - brine se oko inicijalnih zahtjeva za montiranjem datotečnog
sustava ,
rpc.rquotad - brine se oko korisničkih kvota (količina diskovnog prostora
koju korisnik smije zauzeti svojim podacima) na dijeljenim particijama.
Prvi demon kojem treba ograničiti pristup je portmapper. Ovaj demon govori klijentima
kako naći sve NFS usluge na poslužitelju. Ograničenje pristupa portmapper demonu
onemogućava neautorizirani pristup NFS-u jer neautorizirani korisnici neće znati gdje se
nalaze NFS demoni. Ovaj pristup ima i svojih mana. Prvo, ograničavanje pristupa
portmapper-u ne pomaže ako potencijalni uljez unaprijed zna kako naći potrebne demone.
Drugo, ako je pokrenuta NIS usluga, ograničavanje portmapper-a će također ograničiti pristup
NIS usluzi. U pravilu to ne predstavlja veći problem jer je poželjno ograničiti NFS i NIS na
sličan način. Pokretanje NIS usluge zajedno s NFS-om je poželjno zato što klijentu olakšava
određivanje vlasništva nad pojedinim datotekama i direktorijima dijeljene particije. Općenito
je dobra ideja kod NFS-a (kao i kod ostalih mrežnih usluga) inicijalno zabraniti pristup svim
računalima u datoteci hosts.deny, a nakon toga omogućiti pristup željenim računalima u

905/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

datoteci hosts.allow. Tako će pristup poslužitelju biti omogućen samo računalima navedenim
u datoteci hosts.allow dok će svim ostalim računalima pristup biti zabranjen.

Primjer:
Zabrana pristupa portmapper demonu za sva računala. U datoteku hosts.deny je
potrebno dodati sljedeću liniju:
portmapp:ALL

Primjer:
Zabrana pristupa svim NFS demonima za sva računala. U datoteku hosts.deny je
potrebno dodati sljedeće linije:
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL

Moguće je u datoteku hosts.deny staviti samo liniju ALL:ALL koja uzrokuje zabranu
pristupa svim uslugama koje koriste ovu datoteku osim ako nije drugačije naznačeno u
datoteci hosts.allow. Sa stajališta sigurnosti, ovo je najbolje rješenje premda može
predstavljati problem ako se potrebne dozvole za pristup zaborave dodati u datoteku
hosts.allow.
Sljedeća 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 omogućiti pristup, a host IP adresa računala
kojem se želi omogućiti pristup. Isto kao i u slučaju datoteke exports može se umjesto IP
adrese pojedinog računala koristiti kombinacija IP adrese mreže i mrežne maske kako bi se
dozvolio pristup grupi računala.

906/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Pokretanje NFS usluge

Kod novijih Linux distribucija moguće je pokrenuti NFS ponovnim podizanjem


računala. Skripte koje se pokreću kod podizanja sustava će detektirati da je datoteka
/etc/exports podešena i pravilno će pokrenuti NFS uslugu. Ako ovo ne radi potrebno je NFS
demone pokrenuti ručno. Za ispravan rad NFS-a potrebno je pokrenuti sve ranije navedene
NFS demone. Većina novijih Linux distribucija ima skripte za automatsko pokretanje ovih
demona.
Svi NFS demoni su dio paketa nfs-utils i nalaze se u direktoriju /sbin ili /usr/sbin. Ako
ih distribucija ne doda automatski u boot skripte tada ih je potrebno ručno dodati i to
sljedećim redoslijedom:
rpc.portmap,
rpc.mountd, rpc.nfsd,
rpc.statd, rpc.lockd (po potrebi), rpc.rquotad.
Kod nekih Linux distribucija nfs-utils paket dolazi s gotovim skriptama za automatsko
pokretanje NFS-a prilikom podizanja sustava. U slučaju Mandrake i RedHat Linux
distribucija te skripte se nalaze u /etc/init.d direktoriju i zovu se portmap, nfs, nfslock. Skripte
se automatski pokreću prilikom podizanja sustava ali ih je moguće pokrenuti i ručno. portmap
skripta služi za manipulaciju portmapper demonom i može je se pokrenuti s opcijama:
start - pokretanje portmapper demona,
stop - zaustavljanje demona,
status - stanje demona,
restart - ponovno pokretanje demona,
reload - isto kao i restart.
nfs skripta služi za pokretanje i zaustavljanje NFS usluge. Opcije s kojima se skripta
može pokrenuti su:
start - pokretanje NFS usluge,
stop - zaustavljanje NFS usluge,
status - stanje nfs usluge,
restart - ponovno pokretanje NFS usluge,
reload - ponovno učitavanje datoteke /etc/exports.
nfslock skripta se brine oko pokretanja i zaustavljanja NFS demona koji se brinu oko
zaključavanja datoteka. Opcije prilikom pokretanja su:
start - pokretanje demona,

907/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

stop - zaustavljanje demona,


status - stanje demona,
restart - ponovno pokretanje demona.
Kod Debian distribucije skripte postoje slične skripte koje se također nalaze u /etc/init.d
direktoriju. Njihova imena su portmap, nfs-server i nfs-common. Skripta nfs-common služi za
pokretanje programa potrebnih za NFS klijent dok skripta nfs-server pokreće dodatne demone
potrebne za NFS poslužitelj (za NFS klijent dovoljno je pokrenuti skriptu nfs-common, dok
za NFS poslužitelj moraju biti pokrenute obije skripte). Skripta portmap ista je kao i kod
Mandrake (RedHat) distribucije. Skripte se pokreću automatski prilikom podizanja sustava a
koriste se na jednak način kao i u Mandrake (RedHat) distribuciji.

Provjeravanje je li NFS pokrenut


Da bi se ovo provjerilo, moguće je tražiti od portmapper demona da ispiše koje sve
usluge trenutno pruža. To se može postići naredbom rpcinfo -p u komandnoj liniji.
Primjer:
Ispis na ekran nakon pokretanja rpcinfo -p naredbe ako je NFS pokrenut.
Program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 749 rquotad
100011 2 udp 749 rquotad
100005 1 udp 759 mountd
100005 1 tcp 761 mountd
100005 2 udp 764 mountd
100005 2 tcp 766 mountd
100005 3 udp 769 mountd
100005 3 tcp 771 mountd
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
300019 1 tcp 830 amd
300019 1 udp 831 amd
100024 1 udp 944 status
100024 1 tcp 946 status

908/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

100021 1 udp 1042 nlockmgr


100021 3 udp 1042 nlockmgr
100021 4 udp 1042 nlockmgr
100021 1 tcp 1629 nlockmgr
100021 3 tcp 1629 nlockmgr
100021 4 tcp 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 poslužitelj pokrenut, potrebno je podesiti NFS klijente.

Naknadno mijenjanje /etc/exports datoteke


Ako je NFS poslužitelj već pokrenut, a želi se dodati neke promijene u /etc/exports
datoteku te promijene neće odmah biti primijenjene. Da bi se unesene promijene počele
primjenjivati potrebno je pokrenuti naredbu exportfs -ra kako bi nfsd ponovo pročitao
datoteku /etc/exports. Kod Mandrake i RedHat Linux distribucija ista stvar se može postići
pokretanjem skripte nfs (nalazi se u direktoriju /etc/init.d) sa opcijom reload.

Montiranje udaljenih direktorija

Prije početka potrebno je provjeriti da li je verzija mount programa dovoljno nova


(verzija 2.10m ako se želi koristiti verzija 3 NFS-a) i da li računalo podržava NFS montiranje
(većina novih distribucija ga podržava). Da bi se računalo moglo koristiti kao NFS klijent
potreban je portmapper. Da bi se koristilo NFS zaključavanje datoteka potrebno je pokrenuti
rcp.statd i rcp.lockd i na poslužitelju i na klijentu. Većina novijih distribucija pokreće ove
programe prilikom podizanja sustava. Ako to nije slučaj, potrebno ih je pokrenuti ručno. Uz
pokrenute portmapper, lockd i statd moguće je montirati direktorije sa NFS poslužitelja kao
da se nalaze na lokalnom tvrdom disku korištenjem mount naredbe.

909/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Primjer:
Ako se NFS poslužitelj zove maja.apm.hr a ime klijenta je ivana.apm.hr. Da bi na
klijentu montirali /home direktorij s poslužitelja 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 datotečnom sustavu.

Montiranje NFS datotečnog sustava prilikom podizanja


sustava

NFS datotečni sustav može biti dodan u /etc/fstab datoteku isto kao i lokalni datotečni
sustav. Jedina razlika je što je tip datotečnog sustava potrebno postaviti na nfs, a opcije dump
i fsck (zadnje dvije opcije u datoteci fstab) na nulu.
Primjer:
Kao i u prošlom primjeru ime poslužitelja je maja.apm.hr a ime klijenta ivana.apm.hr.
Kako bi se /home direktorij poslužitelja montirao u /mnt/home direktorij klijenta prilikom
svakog podizanja klijenta potrebno je u datoteku /etc/fstab dodati liniju:
maja.apm.hr:/home /mnt/home nfs rw 0 0

Dodatne opcije kod montiranja

Ove opcije određuju kako će se NFS klijent ponašati u slučajevima kad se poslužitelj
sruši ili kad padne mreža. Postoje dva pristupa:
soft - ako se zahtjev za datotekom prekine, NFS klijent će prijaviti grešku
procesu na klijentskom računalu koji je zatražio datoteku. Neki programi
mogu podnijeti takav pristup ali većina ne može. Ovakav pristup se ne
preporuča jer vrlo često uzrokuje gubitak podataka i pokvarene datoteke.

910/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

hard - program koji pristupa datoteci preko NFS datotečnog sustava će stati
ako se dogodi pad poslužitelja ili mreže. Proces ne može 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 poslužitelj ponovno digne
program će nastaviti tamo gdje je stao. Preporuča se korištenje hard, intr
kombinacije na svim NFS montiranim datotečnim sustavima.
Primjer:
Isti primjer kao i prošli ali su korištene opcije hard i intr.
maja.apm.hr:/home /mnt/home nfs rw,hard,intr 0 0

Ako se direktorij želi montirati ručno korištenjem mount naredbe tada u komandnoj
liniji treba upisati:
# mount -o hard,intr naomi.zesoi.fer.hr:/home /mnt/home

Napredne postavke - optimizacija NFS-a

Pravilno postavljanje mrežnih postavki može značajno popraviti performanse NFS.


Najbitnije je pravilno podesiti veličinu blokova podataka koje razmjenjuju NFS poslužitelj i
NFS klijent.

Podešavanje veličine blokova podataka

Opcije rsize i wsize programa mount određuju veličinu blokova podataka koje
međusobno razmjenjuju NFS klijent i poslužitelj. Ako ove opcije nisu specificirane tada se
koriste uobičajene vrijednosti koje iznose 4096 byte-ova.
Uobičajene vrijednosti mogu biti ili prevelike ili premale. S jedne strane, neke
kombinacije Linux jezgre (kernela) i mrežnih kartica ne mogu podnijeti tako velike blokove
(uglavnom na starim računalima sa starim mrežnim karticama). S druge strane, ako su
podržani veliki blokovi, veća vrijednost od uobičajene može ubrzati rad sustava. Budući da se

911/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

ovo uvelike razlikuje od sustava do sustava ne postoji pravilo kojim bi se moglo odrediti koja
je veličina najbolja za dani slučaj već se to mora eksperimentalno utvrditi.
Primjer:
Testiranje brzine prijenosa podataka putem NFS-a.
Testiranje brzine NFS sustava može se obaviti pomoću par jednostavnih naredbi. Prva
od tih naredbi kopira 16384 bloka podataka od kojih je svaki veličine 16Kbyte iz datoteke
/dev/zero (/dev/zero nije prava datoteka već program koji samo vraća nule kad ga se pozove)
na montiranu particiju. Potrebno je još izmjeriti vrijeme potrebno da se to obavi. Sve
navedeno može se obaviti upisivanjem naredbe na klijentu:
# time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384

Ovo stvara datoteku veličine 256Mbyte na montiranoj particiji. U pravilu trebalo bi


napraviti datoteku koja je barem dvostruko veća od veličine RAM-a na poslužitelju, ali treba
paziti da za to ima dovoljno mjesta na tvrdom disku. Nakon toga je potrebno ponovno
pročitati stvorenu datoteku sa klijenta. To se može postići naredbom:
# time dd if=/mnt/home/testfile of=/dev/null bs=16k

Ova naredba datoteku s poslužitelja čita u datoteku /dev/null (/dev/null nije obična
datoteka već program koji briše sve što se kopira u njega).
Ovo je potrebno ponoviti više puta kako bi se dobila srednja vremena potrebna za
stavljanje datoteke na poslužitelj i za dohvaćanje datoteke natrag na klijent. Svaki put je
potrebno datotečni sustav s poslužitelja prvo odmontirati i nakon toga ga ponovno montirati
kako bi se ispraznio međuspremnik.
Cijeli postupak potrebno je ponoviti za različite vrijednosti opcija rsize i wsize. Veličine
bi trebale biti potencije broja 2 i ne smiju biti veće od 8192 byte-a budući da je to maksimalna
dozvoljena veličina za NFS verziju 2 (ako se koristi NFS verzija 3 mogu se koristiti
vrijednosti do 32768 byte-a). Odmah nakon montiranja datotečnog sustava s novim
vrijednostima za rsize/wsize potrebno je otići u taj direktorij naredbom cd i pokušati izlistati
njegov sadržaj naredbom ls kako bi se vidjelo da li NFS uopće može raditi s novim
vrijednostima. Tipična greška kod prevelikih vrijednosti je nepotpuna lista datoteka kod ls
naredbe. Nakon što se ustanovi da li nove vrijednosti za rsize/wsize rade može se ponoviti test
mjerenja brzine.

912/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Nakon što su određene 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 određene
opcije rsize i wsize.
maja.apm.hr:/home /mnt/home nfs rsize=8192,wsize=8192 0 0

Broj instanci NFSD demona

Većina skripti za pokretanje NFS-a (za Mandrake (RedHat) distribuciju to je skripta


/etc/init.d/nfs dok je kod Debian distribucije ta skripta /etc/init.d/nfs-server) pokreće osam
instanci nfsd demona. Za jako opterećene poslužitelje može biti potreban veći broj instanci što
se može postići pokretanjem nfsd demona iz komandne linije uz navođenje broja instanci kao
opcije. Ista stvar može se postići i modifikacijom skripata koje pokreću NFS demone prilikom
podizanja sustava.

NFS poslužitelj i klijent za MS Windows operativni sustav

Kako bi se NFS mogao koristiti i u MS Windows okruženju razvijeni su NFS


poslužitelji i klijenti i za taj operativni sustav. Za razliku od NFS-a za Linux, ovi programi su
komercijalni i njihovo korištenje se plaća. Primjer je programski paket ProNFS tvrtke
Labtam. U sklopu ProNFS paketa dolaze NFS poslužitelj, NFS klijent i neki dodatni mrežni
klijenti kao što su telnet i FTP. Nakon instalacije paketa računalo na kojem je instaliran MS
Windows operativni sustav može se koristiti kao i kao NFS poslužitelj i kao NFS klijent.
Postupak instalacije isti je kao i kod svih drugih Windows programa.
NFS poslužitelj se pokreće u meniju Start->Programs->ProNFS odabirom opcije
NFS-Server nakon čega se otvara glavni prozor NFS-Server programa.

913/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Glavni prozor NFS-Server programa

Odabirom opcije Exports otvara se prozor u kojem se mogu postaviti particije i


direktoriji koji se žele dijeliti preko mreže.
Opcijom Add directory dodaju se direktoriji koji će biti dijeljeni preko NFS-a, dok
opcija Add User Access služi za davanje pristupa dijeljenim direktorijima klijentima

Prozor za davanje pristupa klijentima

914/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

Ovdje je potrebno upisati IP adresu klijenta kojem se želi dati pristup, korisnički i
grupni identifikacijski broj (UID i GID) za željenog korisnika i način 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 računalu.

NFS klijent

Prije korištenja NSF klijenta potrebno je podesiti neke parametre potrebne za rad. Za to
je potrebno odabrati opciju Settings.
Tu se mogu podesiti korisnički i grupni identifikacijski broj, dodati IP adrese NFS
poslužitelja, odrediti način 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 sučelje Windows Explorer programa tako da za njegovo korištenje nije potrebno otvarati
dodatne prozore.

915/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Samba i nfs

ZAKLJUČAK

NFS omogućava jednostavno, brzo i transparentno dijeljenje datoteka i podataka preko


lokalne mreže. Korisnici dijeljene podatke (datoteke) mogu držati na dijeljenoj particiji kojoj
svi imaju pristup čime je razmjena podataka znatno olakšana i ubrzana. Diskovni prostor na
pojedinim računalima primjenom NFS-a prestaje biti problem jer se otvaraju mogućnosti
postavljanja mrežnih diskova (mrežnih disk poslužitelja) čiji diskovni prostor mogu koristiti
sva računala spojena na lokalnu mrežu. Na mrežnim diskovima mogu se nalaziti i baze
podataka, repozitoriji i slično.
Dodatna prednost NFS-a je jednostavnost instalacije (standardno dolazi sa svim novijim
Linux distribucijama) i korištenja koje se vrlo malo razlikuje od korištenja lokalnih datotečnih
sustava kao što su floppy disk ili CD-ROM. NFS se pokazao vrlo stabilnim, čak i u
slučajevima pada mreže ili poslužitelja nije došlo do gubitka podataka i do pojave pokvarenih
datoteka.
Brzina prijenosa podataka ovisi o korištenoj Ethernet vezi. Iako se NFS pokazao
upotrebljivim u manjim lokalnim mrežama baziranim isključivo na Linux operativnom
sustavu, u 'miješanim' mrežama koje se sastoje od Windows i Linux računala puno bolje
rješenje je Samba.
Samba u takvom okruženju radi brže od NFS-a i pouzdanija je. I sa stajališta sigurnosti
Samba je bolja zbog sigurnosnih rupa koje u NFS-u još uvijek nisu riješene. Zbog toga se
preporuča korištenje Sambe i na mrežama koje se sastoje samo od Linux računala. Samba
paketom omogućava se međusobno dijeljenje diskovnog prostora ( shares), zatim pisača, pa
čak i serijskih portova između različitih operativnih sustava.
Velika prednost Samba paketa leži u činjenici da Samba može zamijeniti Windows
poslužitelje potrebne za uspostavu lokalne mreže (WINS poslužitelj i kontrolor domene). Iako
Samba paket još uvijek nema potpunu funkcionalnost NT poslužitelja, on se bez problema
može koristiti u manjim lokalnim mrežama (do 30 računala) kod kojih nema potrebe za
pomoćnim WINS poslužiteljem i pomoćnim kontrolorom domene koje Samba još uvijek ne
podržava.
Može se zaključiti da je Samba dobra (i jeftinija) zamjena za Windows NT poslužitelje
u malim lokalnim mrežama kao što su SOHO mreže.

916/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

Jakov Mihaljević

X WINDOW SYSTEM

917/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

UVOD

X Window System (u daljnjem tekstu X) razvijen je 1984.g. na Massachusetts Institute


of Technology (MIT) zbog potrebe za transparentnim mrežnim 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 zadužen za razvoj i
standardizaciju X-a sve do 2004.g. Uslijed razmimoilaženja u pogledima na daljnji razvoj X
originalni članovi X consortiuma 22.siječnja. 2004.g. osnivaju X.org Foundation i preuzimaju
brigu o razvoju X window Systema.

918/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

OSNOVNE ZNAČAJKE X-A

X Widow System je podloga grafičkih korisničkih sučelja (GUI) na višekorisničkim i


mrežnim sustavima. X i pojedine njegove komponente su razvijene za gotove sve operativne
sustave, a na Unix platformama je prihvaćen kao osnovno grafičko sučelje. Na ne Unix
platformama je prihvaćen uglavnom kao sredstvo za povezivanje sa Unix-om ili za prenošenje
aplikacija sa Unix-a.
X osigurava obradu i grafički prikaz informacija. Prikaz informacija kod X je prilično
sličan prikazu kod MS Windows operacijskog sustava , no osnovna razlika je u strukturi X
protokola.

Sastavni dijelovi X Window Systema:

X server
X klijent
X protokol
Xlib

Dok MS Windows-i prikazuju grafičke aplikacije lokalno na PC-u, X distribuira


procesiranje aplikacije specificirajući klijent-server odnos na razini aplikacije. Dio aplikacije
koji se brine o obradi podataka naziva se X klijent i odvojen je od djela aplikacije koji se
brine o prikazu, koji se naziva X server.
Klijent-server dio X Window Systema često na prvi pogled zna biti zbunjujući zbog
svoje kontradiktornosti sa onim što u hardverskom smislu nazivamo klijent i server. Dakle, X
dio aplikacije koju naziva klijent smješta na udaljeno računalo(što nije nužno, može i
lokalno), a serverski dio smjesta na lokalno računalo.
X Windows System također pruža(svima nam poznat) sustav prozora. X specificira
hardverski ovisan i hardverski neovisan sloj. Komunikacija između klijenta i servera kod X
protokola utemeljena je na asinkronom mrežnom protokolu, a ostvaruje se X protokolom. Na
način na koji je utemeljen X skriva osobine operacijskog sustava i pripadajućeg hardvera.
Ovo sakrivanje arhitektualnih i konceptualnih razlika pojednostavljuje razvoj X klijenta i
osigurava izvrsne temelje za portabilnost X Window Systema.

919/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

¸
Slika 1.

Prednosti ovakve arhitekture su mnogobrojne:


ekvivalentnost rada sa lokalnim ili mrežnim računalima za krajnjeg korisnika i
ili programera
X Server je visoko portabilan što omogućava potporu za različite jezike i
operacijske sustave
X klijenti su također visoko portabilni
X može podržavati većinu mrežnih protokola, lokalno ili na daljinu
Na aplikacije se ne odražava nedostatak procesorske snage

Klijent-Server dizajn

Klijent-Server dizajn X Windows Sustava specificira odnos između aplikacije i


njezinog grafičkog prikaza. Kod X protokola proces koji upravlja zaslonom, tipkovnicom i
mišem naziva se X server. Klijent je proces koji se prikazuje na i uobičajeno se naziva X
klijent ili aplikacija. X klijent šalje zahtjeve X serveru, na primjer zahtjev za prikaz zadanih
informacija. X server prihvaća zahtjeve više klijenata i vraća X klijentima odgovore na
tražene informacije, korisničke unose i greške.
Komunikacija između klijenta i servera odvija se X protokolom. X protokol se može
naslanjati na TCP/IP, lokalnu komunikaciju pod Unix-om preko socket-a ili DECneta.
Tehnički, X protokol predstavlja definiciju X Windows systema. Naravno kad govorimo O X
Windows system-u ne mislimo samo na protokol, već i na raspoložive klijente, servere i
biblioteke koje koristi ovaj protokol.

920/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

U komunikaciji između klijenta i servera postoje četiri vrsti poruka:

Zahtjev:
X klijent traži od X servera određenu akciju npr. Create Windov
Da bi poboljšao performanse, X klijent uobičajeno ne očekuje odgovor. Server se
uobičajeno oslanja na pouzdanost mreže kao garanciju isporuke .
Dužina zahtjeva je 4 bajta(ili umnožak 4 bajta)

Odgovor:
X server će odgovoriti na zahtjev ako isti zahtjeva odgovor. Svi zahtjevi ne
zahtijevaju odgovor.
X odgovor je svaki umnožak 4 bajta; minimum 32 bajta

Događaji:
X Server će proslijediti X klijentu svaki događaj koji aplikacija očekuje . Ovo
uključuje ulaze od strane miša i tipkovnice. Da bi se minimalizirao mrežni promet
klijentu će se proslijediti samo događaji koje očekuje.
X događaji su dužine 32 bajta.

921/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

X Server

Osnovne značajke:
Pokreće se lokalno
Prihvaća i demultipleksira zahtjeve X klijenata te odgovara i djeluje na osnovu
njih
prikazuje zadane informacije na zaslonu
odgovara na zatražene informacije
prijavljuje greške u zahtjevu
Upravlja sa tipkovnicom, mišem i zaslonom
Prosljeđuje ulaze tipkovnice i miša do klijenata
kreira, upravlja i uništava prozore
piše i crta po prozorima

Dizajn:
Dizajn X servera ovisi o platformi(hardverskoj) i operacijskom sustavu na koji je
implementiran. Stoga se povećavanjem mogućnosti tehnologija na kojima je izgrađen
povećavaju mogućnosti i X servera. Karakteristika je X servera je velika zavisnost od
hardvera, razlikuje se način pristupa hardveru kroz operativni sustav. Pored kompatibilnosti,
za X server je vrlo bitna efikasnost, jer na njemu je da optimalno iskoristi grafičke kartice.
Kod X servera uobičajeno je da se za svaki tip adaptera(ili za nekoliko sličnih) postoji
poseban X server. Dakle, pod X-om tražimo server za pojedini adapter kao što na npr. MS
Windows sustavu tražimo drajver. Uz X server idu konfiguracijske datoteke, softver za
podešavanje 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 sadržaj unutar prozora, a ne i okvir, liniju sa naslovom i slično. Tako X server koji radi
pod MS Windowsima postiže da se X prozorima rukuje kao i sa ostalima. Nije tipično da
server preuzme rukovanje prozorima, on tipično taj posao prepušta posebnom klijentu-
Window menager-u.(WM) WM daje prozorima , okvir, naslov, kontrolira promjenu veličine,
pomicanje, svodi prozore na ikone i vraća u punu veličinu, dodjeljuje i oduzima fokus,

922/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

regulira koji je ispred, a koji je iza, hvata klikove miša na prozor i sl. Sa različitim WM-ovima
dobiju se različito dekorirani prozori, ali i različite politike manipuliranja.
Za jedan server u jednom trenutku može biti vezan jedan WM. Ukoliko nije tako
prozori izgledaju «ogoljeno»(bez okvira), a korisnik može raditi samo u prozoru koji trenutno
ima fokus, ali i da ga miče ili mu mijenja veličinu.

X Klijent

X klijent je aplikacija koja se vrti na udaljenom računalu(može i lokalno). U cijeloj


«temi» X Windows system-a ovo je dio koji je krajnjem korisniku najmanje vidljiv te,
naravno uvjetno rečeno, najmanje bitan. Naime u klijent server koncepciji X Window
System-a kako, gdje i na koji način X klijent radi(tj. obrađuje zadane zadatke) za krajnjeg
korisnika nije bitno. Sve stvari potrebne za rad X servera sa X klijentom su određene X
protokolom te X klijent možemo smatrati «crnom kutijom».
Npr. Klijenta možemo shvatiti ovako: Klijenta ne zanima gdje se nešto prikazuje na
zaslonu, on samo traži od X servera X, Y koordinate u kojim može crtati te nakon toga traži
da se pozovu željene funkcije(npr. crtaj liniju od točke A do točke B) i sl.

X klijent u komunikaciji sa X serverom:


šalje zahtjeve prema serveru
prima događaje od strane servera
prima pogreške od servera

923/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

Prednosti X Window systema

Prednost X window System-a proizlazi iz njegove jasne podjele posla i slojevitosti.


Prvo je klijent jasno odvojen od servera i vezuje ih jedino međuprocesna komunikacija. Dalje
je Window mwnager odvojen od klijenta koji je otvorio prozor. Način na koji klijent radi sa
datotekama, preuzima argumente iz komandne linije, kreira i kontrolira procese i na druge
načine se odnosi prema okruženju, predstavljaju pitanja kojima se X Window Sytem nebavi.
Drugim riječima: u bilo koji program možemo, gdje god želimo, dodati pozive funkcija
kojima se uspostavlja veza sa nekim X Serverom. U tom slučaju se: otvara prozor , odradi
komunikacija sa korisnikom u tom prozoru, zatvori prozor, prekine veza sa serverom i nastavi
rad isto kao da je taj dio posla obavljen bez X-a. Pri tome nije bitno dali program inače koristi
X ili ne.
Mnogi programeri komuniciraju sa korisnikom preko terminalskog prozora, dakle
tekstualno, a samo kada trebaju nešto učitati obraćaju se X-u.

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(podržana je 32 i 64 bitna verzija), Solaris x86, Mac
OS X i dr.
Xfree86, sadrži klijent/server sučelje i desktop okolinu, te također i «prozorsku»
infrastrukturu i standardizirano aplikacijsko sučelje(API). Xfree86 je platformski neovisan,
mrežno-transparentan i proširiva implementacija X Windows Systema.
Primarni cilj Xfree86 Projekta je razvijati XFree86® i stvoriti najbolji slobodno
distribuirajući Open-source implementacija X Window Systema implementirajući ga na što
više različitih hardverskih i softverskih platformi. Projekt teži ovim ciljevima na način da daje
najviše pažnje tehničkom integritetu ideja, implementaciji i individualnim sudjelovanjem .
Xfree86 je sve do 2004g bio najzastupljeniji open-sorce paket koji je dolazio uz većinu
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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb X window system

Licence) nekompatibilna. Taj potez je podigao dosta prašine 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Adriana Mihinec
Domagoj Švagelj

KDE

926/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

UVOD

K Desktop Environment jest moćno grafičko okružje za UNIX radne stanice.


KDE sučelje kombinira jednostavnost uporabe, funkcionalnost i izvanredan grafički dizajn sa
tehološkom superiornošću UNIX operacijskog sustava. KDE je zbirka programa, tehnologija i
dokumentacije koji pokušavaju olakšati rad računalnim korisnicima. KDE je prilagođen za
rad na UNIX radnim stanicama. Kombinira jednostavnu upotrebu mrežnih tehnologija i
contemorary radnu filozofiju.
Tvoritelji KDE-a su grupa software programera iz cijelog svijeta. Cilj ove grupe u
razvoju besplatnog software-a jest, pružiti visoko kvalitetni software koji korisnicima daje
jednostavnu kontrolu nad resursima njihovog računala.
KDE zadovoljava zahtjeve korisnika za jednostavnom radnom okolinom. Ideje koje se
koriste da bi se postigao taj cilj su: pojačana komunikacija između aplikacija, višekratno
korištenje objekata, poboljšani drag and drop, jedinstveni izgled itd. Na taj način KDE nudi
mnogo više nego tradicionalni UNIX window manageri.
Stabilnost i otvorenost su neke od kvaliteta UNIX-a, koje su ga učinile nezamjenjivim
izborom računalnih profesionalaca. Tokom godina, UNIX je bio prva platforma za računalne
servere i znanstvene institucije, no nije bio atraktivan za obične korisnike. KDE sve to
mijenja.

927/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE –Povijest
Od početka razvitka UNIX operacijskog sustava postojao je jedan velik problem.
Postojala je stabilna jezgra, dobre i moćne aplikacije. Na nesreću, samo mali broj ljudi je
mogao koristiti UNIX jer je on bio napisan za studente i profesionalce koji su ga proučavali
duže 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 predvođena Matthias Etrichom počinje raditi na KDE-u. Prva objava rada na
KDE-u je bila 14.10.1996. Već iduće godine 20.10.1997. objavljena je prva verzija KDE 1.0
Beta1 široj javnosti, gdje se postavilo zanimljivo pitanje: Što znači slovo K u nazivu K
Desktop Environment? Odgovor je isto tako zanimljiv: Ništa. Jednostavno je tako nazvan bez
nekog posebnog razloga. Nakon još nekoliko Beta verzija 12.7.1998. objavljena je konačna
verzija KDE 1.0. Slijede mnogobrojne poboljšane verzije KDE 1.0 sve dok 23.10.2000. nije
objavljena skoro u potpunosti izmjenjena verzija KDE 2.0. koja je zapamćena po tome što je
lansirala Konqueror, Koffice, Kparts, KIO... Zaredale su ponovno mnogobrojne verzije 2.0., a
3.4.2003. lansirana je treća generacija KDE-a 3.0. sa mnogobrojnim poboljšanjima.
Zadnje objavljena verzija je KDE 3.3.2 (08.12.2004.).
Iako ne pokušava zamijeniti tradicionalnu UNIX ljusku, KDE je alat koji će učiniti
korištenje UNIX-a lakšim, privući više ljudi UNIX okružju. Uz KDE, korištenje UNIX-a
postaje jednostavno.

928/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Što je KDE?
KDE je desktop okruženje, tj. to je kolekcija programa, tehnologija, i dokumentacije,
koji omogućavaju lakši rad na UNIX radnim stanicama. Filozofija KDE-a je besplatan
software kako bi se razvilo kvalitetno okružje koje pruža korisniku kontrolu računalnih
resursa. KDE je jedan veliki projekt koji se neprestano poboljšava i raste. Glavne misli vodilje
i filozofija ovog projekta su:

o učini to odmah!,
o koncentriraj se!,
o koristi dostupne alate radije nego da izmišljaš već postojeće!,
o Kada nešto predlažeš umjesto “trebali bi...” koristi “ja ću...” jer su ogromni planovi
beskorisni ako se ne primiš posla,
o neprekidno poboljšavaj,
o počni sa razumnom razinom funkcionalnosti i podesivosti i onda poboljšavaj tijekom
vremena!

KDE je fokusiran na korisnikove potrebe, dajući mu najbolje alate. Napravljen je


najboljim računalnim tehnologijama modernog doba koje ponajprije uključuju 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 sučeljem DCOP/Kparts je postao
konkurencija sličnim tehnologijama, u prvom redu Microsoft MFC/COM/ActiveX
tehnologiji.
Radi tako dobro iz tog razloga što otvoreni razvojni model potiče zaprimanje izvješća
o greškama i zakrpe te potiče vješte programere. KDE 1.1. je proglašen inovacijom godine na
CeBIT-u '99. svjetskom najvećem računalnom show-u, a iste godine je proglašen najboljim
izborom u Desktop Environment kategoriji od LinuxWorld's-a.
KDE libraries pružaju mogućnosti koje pomažu programerima da zadrže razinu
sofisticiranosti koja se očekuje od moderne desktop aplikacije. Klase pružaju mogućnost
pristupa mrežama kroz HTTP, FTP i dr. Protokole, drag-and-drop među aplikacijama,
interprocesorsku komunikaciju te internacionalizaciju i lokalizaciju funkcija.

929/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Velika zbirka widgets-a u KDE i Qt libraries, implementiranih u C++ klasama, su vrlo


dobro dizajnirani i funkcionalni. Budući su implementirani u C++ klasama, moguće je
modificirati (poboljšati) njihovo ponašanje. Qt signal/slot mehanizam koji je odlična
alternativa C callback funkcijama, omogućuje brzo povezivanje widgets-a u svrhu kreiranja
grafičkog korisničkog sučelja. Libraries također pružaju klase za rukovanje stringovima,
linked liste i druge strukture podataka, socket programiranje, interprocesorsku komunikaciju
kao i funkcijski kompleksne widgets (npr. Web pretraživač).
KDE libraries isto tako uključuju framework za ugrađivanje jedne aplikacije u drugu
(application embedding) nazvan Kparts koji omogućuje lako dodavanje funkcionalnosti
aplikacije u vlastiti program. KDE office program, nazvan Koffice koristi ugrađivanje
aplikacija kako bi se stvarali dokumenti koji sadrže tekst, grafičke elemente, tablice, koji se
svi nalaze na istom dokumentu.
Konačno, KDE pruža smisao kreiranju aplikacija koje su mrežno transparentne, što
znači da korisnik može otvarati i spremati dokumente koristeći poznate tehnike.
Bit mrežne transparentnosti se provlači kroz cijeli KDE. Idealan primjer za to jest “file
manager”, Konqueror. U njegovu prozoru se mogu pretraživati datoteke i manipulirati
lokalnim datotekama, FTP stranicama, i HTTP listama direktorija koristeći dobro znanu
dokument/direktorij metaforu.

DCOP messaging
DCOP je client-to-client komunikacijski protokol sa serverom kao posrednikom preko X11-
ICE library standarda. Protokol podržava prolaz poruka kao i pozive procedura koristeći
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 omogućilo grafičko
korisničko sučelje bez blokada i to bez korištenja thread-ova. Klasa je mrežno transparentna i
lako se može koristiti za pristup HTTP, FTP, POP, IMAP, NFS, SMB, LDAP, i lokalnim
dokumentima. Još bolje, ova fleksibilna modularna tehnologija dopušta programeru da
“ubaci” dodatne protokole kao npr. WebDAV, koji će tada automatski biti dostupan u svim
KDE aplikacijama. KIO ujedno ugrađuje trader koji može locirati handler za specifični
mimetype. Ti handleri tada mogu biti ugrađeni u odgovarajuće aplikacije koristeći Kparts
tehnologiju.
Kparts komponente

930/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Kparts je KDE-ov komponentni objektni model koji dopušta aplikaciji da ugradi drugu u
sebe. Tehnologija obrađuje sve aspekte ugrađivanja, kao što je pozicioniranje toolbars-a i
unošenje pravih menia kada se ugrađena komponenta aktivira odnosno deaktivira. Kparts
može također surađivati sa KIO traderom u pronalasku handlera za pojedini mimetype ili
uslugu/protokol. Ovu tehnologiju koriste specifično Koffice i Konqueror.

XML-GUI Builder
XML grafičko korisničko sučelje(GUI) traži od XML-a da kreira pozicijske menije , toolbars-
ove i druge aspekte grafičkog korisničkog sučelja. Ova tehnologija daje korisniku i
programeru na raspolaganje mogućnost pojednostavljivanja configurability elemanata
korisničkog sučelja 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 podržava
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 može lako biti upotrebljena sa strane aplikacije bilo kao widgets (koristeći normalno
window roditeljstvo-pareting) ili kao komponenta (koristeće Kparts tehnologiju). KHTML
ima mogućnost ugrađivanja komponenta u sebe koristeći Kparts tehnologiju.

931/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

O izgledu KDE-a
Pri pokretanju KDE-a prvo što ćemo uočiti jesu radna površina i panel. Velika
prednost KDE-a jest mogućnost korištenja višestrukih radnih površina. Na taj način
organizacija rada se višestruko poboljšava. Svoje programe možemo staviti na različite radne
površine koje možemo nazvati prema vrsti posla tako da se u svakom trenutku možemo lako
snaći što povećava učinkovitost rada. Vrlo je dobro koristiti višestruke radne površine kada
surfamo internetom umjesto da radimo i šef nenadano uleti u sobu?! Radne površine
mjenjamo jednostavno klikom na jednu od njih, dok dvostrukim klikom možemo promjeniti
imena radnih površina. Među radnim površinama moguće je razmjenjivati i prozore tako što
na title bar prozora kliknemo deni gumb miša i odaberemo opciju To Desktop.
Kada se KDE pokrene panel je smješten na dnu ekrana. Odavde se pokreću programi i
prelazi se u virtualne radne površine. K gumb je najvažniji dio radne površine, preko njega se
dolazi do većine instaliranih aplikacija.
Na panelu se nalaze i gumbi nazvani One, Two, Three i Four koji predstavljaju
virtualne radne površine. Korištenje višestrukih radnih površina je jedno od najmoćnijih oruđa
KDE-a i X window sistema.
Icon bar predstavlja prečice do često korištenih programa, nalazi se odmah do K
gumba, a korisnik može sam postavljati ili micati ikone sa iconbar-a.

Trenutni sadržaj 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: grafičke 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

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 okružje
KDevelop: C/C++ integrirano razvojno okružje
Quanta: razvojni alat za web stranice

933/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KAKO KDE RADI?

KDE ima jednostavan IPC mehanizam nazvan KWMcom koji je (bio!) korišten za
komunikaciju panela i window manager-a. Poruke su se propuštale preko X Atoms-a. Zbog
toga je propuštanje ograničeno u veličini i kompleksnosti podataka koji mogu biti propušteni
(X Atoms moraju biti maleni da bi sačuvali svoju učinkovitost). CORBA se smatrala boljom
idejom, učinkovitije IPC/RPC rješenje. Međutim, kroz godine rada pokazalo se da je rad sa
CORBA-om spor i memorijski naporan. Ono što je zaista bilo potrebno jest jednostavan
protokol sa osnovnom autorizacijom, koji neće raditi niti upola onoliko koliko je radila
CORBA ali će biti napredniji kada su u pitanju jednostavniji zadaci. Primjer takvog
jednostavnog zadatka mogao bi biti aplikacija koja šalje poruku panelu: „Ja sam počela sa
radom, prestani prikazivati 'Aplication starting' wait state“ ili na primjer kada neka aplikacija
pita da li postoji koja pokrenuta aplikacija sa njenim imenom. Taj problem je naveo na
stvaranje novog protokola nazvanog DCOP – Desktop Communication Protocol. DCOP jest
jednostavan IPC/RPC mehanizam namjenjen radu preko socket-a, bilo to Unix domain socket
ili tcp/ip socket. DCOP je načinjen na vrhu Inter Client Exchange(ICE) protokola koji
standardno dolazi kao dio X11R6 i nadalje. Ujedno ovisi i o Qt-u no povrh toga ne ovisi niti o
jednom drugom library-u. Zbog toga je vrlo učinkovit i lako se povezuje sa svim KDE
aplikacijama sa malim overhead-om.
Model rada DCOP-a je vrlo jednostavan. Svaka aplikacija koja koristi DCOP je
klijent. One međusobno komuniciraju putem DCOP servera koji radi poput prometnika
prosljeđujući poruke/pozive na prava odredišta. Svi klijenti su peer jedan drugome. Kod
DCOP protokola moguće su dvije vrste akcija: „šalji i zaboravi“ poruke koje ne blokiraju i
„pozivi“ koji blokiraju čekajući da se neki podatak vrati. Bilo koji podatak koji se šalje je
serijaliziran koristeći QDataStream operatore dostupne u svim Qt klasama.

934/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Uspostava veze

KApplication je uspostavila metodu nazvanu „KApplication::dcopClient()“ koja vraća


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 greška attach će vratitit false. KApplication će primjetiti dcop signal i
prikazati će se odgovarajući msgbox sa opisom greške.
Nakon što je uspjela veza sa serverom, sljedeći korak je registracija appId-a kako bi
server znao o kome se radi, u protivnom komunikacija je anonimna. Kako bi se registracija
izvršila potrebno je učiniti sljedeće: DCOPClient::registerAs(const QCString &ime). U
slučaju da se želimo prekinuti rad moramo napravitit detach, pozivajući funkciju
DCOPClient::detach(). Ako nakon toga ponovno želimo napraviti attach moramo se i re-
registrirati. 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ć učinjeno.

935/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Slanje podataka na udaljenu aplikaciju

Da bi se komunikacija stvarno ostvarila može se koristiti jedna od dvije mogućnosti:


ili pozvati na „slanje“ ili koristiti „zovi“ metodu. Obje metode zahtjevaju tri identifikacijska
parametra: identifikator aplikacije, udaljeni objekat i udaljena funkcija. Slanje je asinkrono.
„Slanje“ zahtjeva jedan, a „zovi“ dva podatkovna parametra.
Udaljeni objekat mora biti specificiran prema hijerarhiji tj. ako se objekt koji tražimo
zove „cObj“ i ako je on child objekt od „aObj“, onda će referenca na traženi objekat izgledati
ovako: aObj/cObj. Funkcije se isto tako moraju opisati u potpunosti tj. ako tražimo funkciju
„fja“ koja prima integer onda moramo to naglasiti: „fja(int)“.
U svrhu stvarnog dobivanja podataka od udaljenog klijenta možemo koristiti nešto
slično ovome:
QbyteArray data;
QdataStream arg(data, IO_WriteOnly);
arg << 5;
if (!client->send(„someAppId“, „fooObject/barObject“, „doIt(int)“,
data))
qDebug(„there was some error using DCOP.“);

936/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Dobivanje podataka putem DCOP-a

Trenutno pravi put dobivanju podataka od DCOP-a jest umnožiti nasljeđe od klase
koju smo nasljedili kao i DCOPObject klase. DCOPObject pruža jednu vrlo važnu metodu:
DCOPObject::process(). Ovo je čista virtualna metoda koju moramo implementirati kako bi
procesuirali DCOP poruke koje primamo.
Primjer implementacije:

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Procesuiranje dolaznih poruka sa transakcijom

Ako je aplikacija u mogućnosti procesuirati pozive funkcija istog trena kada oni dođu onda je
kod sa prethodne stranice sve što je potrebno. No, ako želimo da naša aplikacija procesuira
kompleksnije zadatke možemo željeti da rezultate pošaljemo nekada kasnije kada će nam to
odgovarati.
Da bi to učinili moramo upitati svog DCOPClient-a za transakcijski Id. Tada se
možemo vratititi iz funkcije koja je u tijeku izvođenja i kada rezultati postanu dostupni vratiti
se na izvođenje transakcije. U međuvremenu naša aplikacija može dobivati pozive DCOP
funkcija drugih klijenata.
Primjer:
bool BarObject::process(const QCString &fun, const QbyteArray &data,
QCString &, QbyteArray &)
{
if (fun == „doIt(int)“) {
QdataStream arg(data, IO_ReadOnly);
int i; // parameter
arg >> i;
Qstring result = self->doIt(i);

DCOPClientTransaction *myTransaction;
myTransaction = kapp->dcopClient()->beginTransaction();

// start processing...
// Calls slotProcessingDone when finished.
startProcessing( myTransaction, i);

return true;
} else {
qDebug(„unknown function call to BarObject::process()“);
return false;
}
}

slotProcessingDone(DCOPClientTransaction *myTransaction, const Qstring


&result)
{
QCString replyType = „Qstring“;
QbyteArray replyData;
QdataStream reply(replyData, IO_WriteOnly);
reply << result;
kapp->dcopClient()->endTransaction( myTransaction, replyType, replyData
);
}

938/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

DCOP signali

Ponekad pojedina komponenta računala želi poslati potvrdu putem DCOP-a drugoj
komponenti ali ne zna zapravo koja komponenta će biti zainteresirana za te potvrde. Kako bi
se to omogućilo smišljeni su DCOP signali.
DCOP signali su vrlo slični Qt signalima. DCOP signal se može 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 potječu iz DCOP Object/DCOP Cliant kombinacije. Mogu se spojiti na
funkciju druge DCOP Object/DCOP Cliant kombinacije.
Postoje dvije glavne razlike između veza Qt signala i veza DCOP signala. U DCOP-u ,
za razliku od Qt-a, signalne veze mogu imati anonimnog pošiljaoca, i te veze mogu biti non-
volatile.
Sa DCOP-om može se spojiti signal bez specifikacije DCOP objekta ili klijenta. U tom
slučaju signali od bilo kojeg DCOP objekta i/ili DCOP klijenta će biti isporučeni. Ovo
dopušta specifikaciju pojedinih događaja bez poznavanja objekta koji će prouzročiti događaj.
Druga značajka DCOP su tzv. Non-volatile veze. Sa Qt signalnim vezama, veze se
brišu u slučaju da se izbriše primaoc ili pošiljaoc signala. Volatile DCOP veza će se ponašati
isto tako, no non-volatile DCOP signalna veza neće biti izbrisana u slučaju da se izbrišu
pošiljaoc ili primaoc. Jednom kada se objekt kreira sa isti imenom kao i originalni objekt
pošiljaoc, veza će se povratiti(restore). Nema razlike u slučaju da se objekt primaoc izbriše, u
tom slučaju signalna veza će se uvijek izbrisati.
Primaoc može kreirati non-volatile vezu bez obzira da li pošiljaoc uopće kreiran, to su
tzv. anonimne DCOP veze i one bi u pravilu uvijek trebale biti anonimne.
Sljedeći primjer pokazuje kako Klauncher emitira signal svaki puta kada dobije potvrdu da se
završila 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Spaja clientDied(pid_t) signal na svoj clientDied(pid_t) DCOP funkcije. U tom slučaju signal
i funkcija imaju isto ime. Funkcija koja prima može ignorirati jedan ili više argumenata
signala.

940/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Korištenje DCOPidl kompajlera


DCOPidl čini podešavanje DCOP servera jednostavnim. Umjesto da se implementira
proces() methoda i unmarshalling parameteri ručno, taj posao za nas može učiniti dcopidl,
koji kreira potreban kod umjesto nas.

To nam ujedno dopušta opisivanje sučelja za klase u jednom odvojenom header


dokumentu.

Pisanje u IDL dokument je vrlo slično pisanju C++ header dokumenta. Iznimka je
ključna riječ 'ASYNC'. Ona indicira da će poziv na funkciju biti procesuiran asinkrono. Za
C++ kompajler, to je 'void'.

#ifndef MY_INTERFACE_H
#define MY_INTERFACE_H

#include <dcopobject.h>

class MyInterface : virtual public DCOPObject


{
K_DCOP

k_dcop:

virtual ASYNC myAsynchronousMethod(Qstring someParameter) = 0;


virtual Qrect mySynchronousMethod() = 0;
};

#endif

Kao što se vidi, kreirana je apstraktna bazna klasa, koja je virtualno nasljeđena 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, konvertirajući ga u


XML pa dobijemo MyInterface.kidl. Nadalje, dokument nazvan MyInterface_skel.cpp će biti
automatski kreiran, kompajliran i linkan.

Sljedeće što treba učiniti je izabrati koje klase će biti implementirane u sučelje opisano
u MyInterface.h. Suprotne nasljeđu ovih klasa, a takve da virtualno nasljeđuju od
MyInterface. Zatim treba dodati deklaraciju u klasno sučelje slično onome u MyInterface.h,
ali virtualno.

Class MyClass: public Qobject, virtual public MyInterface

941/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

{
Q_OBJECT

public:
MyClass();
~MyClass();

ASYNC myAsynchronousMethod(Qstring someParameter);


Qrect mySynchronousMethod();
};
U implementaciji naše klase moramo moramo eksplicitno inicijalizirati one klase od
kojih nasljeđujemo. Ovo je naravno dobra praksa, ali moramo reći DCOPObject-u ime sučelja
koje implementirmo.
Primjer:
MyClass::MyClass()
: Qobject(),
DCOPObject(„MyInterface“)
{
// bilošto...
}
Sada možemo jednostavno implementirati deklarirane metode u sučelje, onako kako bi to i
inače radili.
Primjer:
void MyClass::myAsynchronousMethod(Qstring someParameter)
{
qDebug(„myAsyncMethod called with param `“ + someParameter + „'“);
}

No mogli smo isto tako definirati k_dcop dio direktno u MyClass:


class MyClass: public Qobject, virtual public DCOPObject
{
Q_OBJECT
K_DCOP

public:
MyClass();
~MyClass();

k_dcop:
ASYNC myAsynchronousMethod(Qstring someParameter);
Qrect mySynchronousMethod();
};

942/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Među korisnička komunikacija

Ponekad je zanimljivo koristiti DCOP za procese koji pripadaju različitim korisnicima,


Frontend proces koji radi sa korisničkim Id-om i backend proces koji radi kao root. Da bi
radili ovako moramo učiniti sljedeće:
1. oba procesa moraju raditi pod istim serverom
2. mora biti osigurana valjana autorizacija
Što se tiče prvog koraka, serverovu adresu jednostavno moramo prosljediti drugom procesu.
Što se pak tiče drugog koraka da bi autorizirali proces možemo koristiti ICEAUTHORITY
varijablu kojim kažemo procesu gdje može naći informacije o autorizaciji. Primjećujemo
kako ovaj postupak implicira kako je drugi proces u mogučnosti čitati dokument o
autorizaciji, pa će to raditi samo ako je drugi proces postavljen kao root. Ako želimo da radi
kao drugi korisnik a ne kao root, moramo pristupiti na sličan način kao što kdesu čini sa
xauth-om. Ustvari pokazuje se da je jako korisno dodati DCOP podršku u kdesu!!
Primjer:
ICEAUTHORITY=~user/.ICEauthority kdesu root –c kcmroot –dcopserver `cat
~user/.DCOPserver

Nakon što je kdesu dobio root lozinku, pokreće kcmroot kao root, i razgovara sa korisnikovim
dcop serverom.

Važno je napomenuti da DCOP komunikacija nije zaštićena, pa nije zahvalno slati važne
informacije na ovaj način.

943/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE XmlRpc
KDE XmlRpc dopušta 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. Budući
su sve KDE aplikacije (ili će to postati) DCOP klijen/server, to efektivno znači da se sve KDE
aplikacije mogu manipulirati (skriptati) od strane bilo kojeg jezika na bilo kojoj platformi.
XmlRpc je standardni način implementacije poziva udaljenih procedura (RPC)
koristeći 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 označavanje 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 korištenju XML parsera i HTTP klijentima. Ovo čini implementaciju za
većinu XmlRpc dijelova relativno jednostavnom.
Iako je XmlRpc stvarno jednostavan za korištenje, bilo bi besmisleno očekivati da će
se ovaj pristup implementirati u sve aplikacije, kada već postoji jednostavan za korištenje
RPC/IPC protokol – DCOP. Kao rješenje 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 rješenje je mnogo bolje od drugog koje je također bilo opcija, a čija je
ideja bila da je prevođenje transparentno između dva protokola. Tako i XmlRpc klijent i
DCOP server oboje misle kako komuniciraju pomoću svog protokola sa deamonom.
Kako bi se ostvarila ova vrsta komunikacije potrebno je sljedeće:
provjeriti da je port kxmlrpcd uključen
auth token za autorizaciju
ime DCOP servera kojem želimo pristupiti
ime DCOP objekta kojem želimo pristupiti
Posljednje dvije stvari možemo saznati na jednostavan način, 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 naći u dokumentu
$HOME/.kxmlrpcd. Ako je komunikacija lokalnog karaktera sve što treba učiniti jest parsirati
file, no ako je komunikacija udaljena te informacije moramo dobaviti na neki drugi način.
Neke mogućnosti 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

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 mogućnost
komunicirati sa XmlRps klijentom. No, postoji jedno malo ograničenje. Mora se propustiti
samo QCString kao tip stringa i korištenje <struct> i <array> je ograničeno.

#!/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 podiže Execute Command dijalog


Ovo znači da se može skriptati bilo koja KDE aplikacija koristeći samo /bin/sh i telnet!

945/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE BASE

KDE Base

Svrha KDE Base-a jest da specificira izgled i osjećaj KDE aplikacija, tj. stvorena su
pravila, pomoću kojih se programeru omogućava izrada sučelja aplikacija koje će biti u
skladu sa izgledom KDE-a.
Ova pravila se ne nameću korisniku i on ih ne mora poštivati ako ne želi, no dužnost je
svakog dizajnera-programera da njegova aplikacija ima pristojno sučelje.

Primjer:
Knotes program se sastoji samo od radne površine. On je dizajniran tako da izgledom
podsjeća na dobro poznati blokić: Post-it:

Iako Knotes nema menubar ili toolbar ostatak programa (pri tome se misli na dijaloge i
upotrebu miša) bi trebao poštivati dizajn KDE-a.

946/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Grafičko korisničko sučelje

Većina modernih aplikacija ima vrlo sličan layout od svog glavnog prozra. Ti prozori
nude izgled dokumenta i kontrole potrebne za manipulaciju njima. Kontrole za pojedine
akcije su dostupne kroz menie sa prečicama kroz toolbars i tipkovnicu. Izvješća o tome što se
događa sa dokumentom su obično postavljena na statusnu traku.
Ovakav način prikazivanja aplikacija je toliko uobičajen da se koristi i za prikazivanje
aplikacija koje su dokumenti samo u širem smislu značenja riječi dokument, npr. File
manager.
Da bi se neki software mogao nazvati „user friendly“ mora zadovoljavati neke
kriterije. Prema nekim izvorima, većina, tj. 80 – 90% današnjeg software-a ne zadovoljava te
kriterije.
Ti kriteriji su:
• Task – suitable: Ne smije pružati previše funkcija jer će zbuniti korisnika ili će
narušiti funkcionalnost samog software-a
• Razumljiv: Kada korisnik upotrebljava software po prvi puta morao bi razumjeti o
čemu se radi i kako ga koristiti
• Navigacija: Korisnik bi u svakom trenutku trebao znati gdje se nalazi.
• Sukladan očekivanjima: Aplikacija bi trebala biti konzistentna svakim svojim
dijelom
• Tolerantan pogreškama: Aplikacija bi trebala omogućiti funkciju undo bez da se
program sruši.
• Feedback- rich: Aplikacija bi u svakom trenutku korisniku trebala davati povratne
informacije o tome što se događa s obzirom na učinjene akcije.

Kada govorimo o korisničkom sučelju ne možemo zaobići MDI i SDI. MDI (Multi
Document Interface) je usvojen prije nekoliko godina i uvelike ga je koristio Microsoft za
svoje Windows proizvode. MDI koncept predstavlja jedan glavni prozor „mother“ koji sadrži
cijelu aplikaciju pri čemu mislimo na prozor dokumenta, prozor tool bara, prozor za pomoć i
sl. Zapravo sve što aplikacija radi biti će prikazano u glavnom „mother“ prozoru. Najbolji
primjer za to je File manager iz Windows 3.1. MDI olakšava život programerima i dugo se
smatrao najboljim načinom rada. No, tehnologija je uznapredovala i danas se smatra kako
MDI ograničava rad korisnika. KDE aplikacije, čak štoviše sve aplikacije bazirane na X-u, ne

947/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

koriste MDI, već SDI – Single Document Interface. SDI aplikacije nemaju glavni „mother“
prozor koji sadrži sve ostale prozore u sebi. Prozori aplikacija su svi odreda dijeca X root
prozora što znači da su pod kontrolom window mamagera i mogu se pomicati po desktop
okruženju prema željama korisnika. Ako aplikacija mora otvoriti dodatni prozor on je također
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 koristeći ovaj model. Ovo može i ne
mora biti istina, po ovom pitanju se vode debate. Vrijeme, i rad programera, će presuditi, no u
međuvremenu, 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.

Sučelje 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 moguće. Kada čisti SDI model nije prihvatljiv programer bi
trebao koristiti kooperacijski SDI model, za aplikacije koje moraju dijeliti
konfiguracijske informacije između instanca aplikacija, ili kontrolni SDI model za
aplikacije koje zahtjevaju više otvorenih dokumenata nego što ih je moguće prikazati na
ekranu.

948/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Čisto SDI sučelje

Kod čistog SDI sučelja, jedan prozor sadrži točno jedan dokument i taj jedan dokument
jest cijela ta aplikacija. Ne postoji glavni „mother“ prozor koji sve nadzire, a prozori koji su
naizgled pod upravljanjem neke aplikacije nemaju veze sa drugim prozorima. Jedan prozor je
jedna aplikacija gdje svaki ima svoj Quit gumb koji zatvara taj prozor. Zatvaranje jednog
prozora nema nikakvog efekta na ostale otvorene prozore. Ispod površine, moguće je da jedan
proces upravlja svim virtualnim terminalima, no to je skriveno od korisnika i on ne može
znati.
Postoji niz pravila koja moraju biti zadovoljena kako bi neki prozor (aplikacija) mogao
biti nazvan čistim SDI sučeljem:
Svaki prozor bi trebao imati potpuni meni aplikacije. Naredba New bi trebala otvoriti
novi prozor sa praznim dokumentom u sebi ili sa kopijom trenutnog dokumenta u prozoru.
Dokument u ovom kontekstu predstavlja novi shell, novi (bez title-a) tekst dokument, novu
(bez title-a) sliku, itd. KDE aplikacije nebi trebale imati praznih prozora. Svaki prozor treba
sadržavati dokument koji može biti prazan. Gledano ispod površine aplikacija može imati
otvoren svoj drugi prozor ili taj prozor može biti fork od drugog procesa koji kontrolira novi
prozor ali to su implementacijski detalji koje korisnik ne zna i ne mora mariti za njih.
Ako čista SDI aplikacija ima ikonu onda bi svi prozori koji se otvaraju kao npr. prozor
za pomoć, dijalozi toolbars i sl. Također trebali imati istu ikonu. Window manager bi trebao
prezentirati samo jednu ikonu koja bi trebala vratiti sve prozore kada se aktivira.
Kada god se čista SDI aplikacija otvara trebala bi provjeriti postoji li njena kopija koja
je već pokrenuta. Ako je takva kopija pronađena, to bi trebala biti kopija koja predstavlja
novu akciju. Ovo je napravljeno zbog toga da veliki programi kao što je Wordprocessor nebi
otvarali svoje kopije i tako iskoristili svu korisnikovu memoriju. Postoje aplikacije koje zbog
tehničkih razloga moraju zaobići ovo pravilo, što je u redu no, u većini slučajeva trebalo bi ga
poštivati.
Ako korisnik želi otvoriti isti dokument dvaput u naizgled različitim aplikacijama, koje
su zapravo ista aplikacija, to im mora biti omogućeno. Ponekada korisnik želi činiti stvari
koje su zdravom razumu čudne no, svejedno mu aplikacija to mora dopustiti.
Trebala bi postojati jedna instanca dodatnog prozora kao što je toolbar po prozoru, po
korisnikovom zahtjevu. Dva aplikacijska prozora ne mogu dijeliti istu traku s alatima iako je

949/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

to tehnički moguće, zbog načina na koji aplikacija treba biti implementirana. Drag and drop
operacija nad prozorom treba pozvati otvaranje dokumenta koji se vuče u tom prozoru.

950/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Kooperacijsko SDI sučelje

Zagovornici čistog SDI sučelja tvrde kako je čisto SDI sučelje sve što je potrebno. No,
postoje situacije koje govore o komplikacijama i ograničenjima čistog SDI sučelja prilikom
rješavanja nekih problema. Jedan od potencijalnih problema je kada jedna aplikacija želi
promijeniti značajke koje koristi neka druga instanca aplikacije. Npr. zamislimo web browser
kao čistu SDI aplikaciju, u kojoj svaki prozor može sadržavati jednu web stranicu. Svaki
prozor radi u izolaciji od drguih, i on je kao takav aplikacija za sebe, neovisna od ostalih
prozora. Ovaj model će dobro raditi, no što će se dogoditi kada će korisnik željeti promijeniti
neke parametre kao npr. bookmark ili font? Sada dolazi do izražaja programer koji je odlučio
da li će se parametri promijeniti u samo jednom prozoru ili u svima. No ako je odlučeno kako
bi promjena trebala zahvatiti sve prozore koji su pokrenuti od određene aplkacije, čisto SDI
sučelje će se srušiti.
U prvi plan sada dolazi kooperacijsko SDI sučelje koje je sagrađeno na čistom SDI
modelu sučelja ali su dodane neke značajke s kojima se mogu dopustiti neke situacije koje
čisto SDI sučelje zabranjuje.
Kooperacijsko SDI sučelje je preuzelo pravila čistog SDI sučelja sa sljedećim
promjenama:
Svaki prozor još uvijek predstavlja jedan dokument, a svaki dokument još uvijek
predstavlja jednu instancu aplikacije. Na svakom prozoru je meni koji funkcionira kao kod
čistog SDI sučelja. Razlika je u tome što je svaki prozor koji radi pod nekom aplikacijom
svjestan drugih prozora koji rade pod tom istom aplikacijom, a tu „svjesnost“ aplikacija može
iskoristiti.
Aplikacija može imati dodatni meni na menubar-u označen sa Windows. Ovaj meni će
sadržavati listu drugih dokumenata koji su otvoreni u drugim prozorima, a odabir jednog od
njih će rezultirati podizanjem prozora u kojem je taj dokument.
Windows meni može ujedno sadržavati i Close all opciju. Ova opcija bi trebala biti
smještena na dnu menia i trebala bi biti odvojena od ostalih opcija tog menia, a kao što sam
naziv kaže trebala bi zatvarati sve gore izlistane dokumente i njihove prozore.

951/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Kontrolirano SDI sučelje

Čisto i kooperacijsko SDI sučelje imaju jednu odliku koju mnogi smatraju problemom.
Ako aplikacija želi otvoriti više dokumenata nego što ima dostupnih prozora, mora se stvoriti
neka vrsta kontrole mora preuzeti otvorene dokumente. Npr. zamislimo da je aplikacija
lansirana nekom zapovjedi kao što je „Kapp *.jpg“ a u radnom direktoriju postoji 2000 .jpg
dokumenata. Pod čistim ili kooperacijskim sučeljem otvorilo bi se 2000 prozora što nije
dobro.
Rješenje bi bilo da imamo neku vrstu kontrolnog prozora u kojem bi bili svi dokumenti
koji su otvoreni i spremni na rad. U prethodnom primjeru to bi izgledalo tako što bi bilo
između 0 i 2000 otvorenih dokumenata i jedan otvoreni prozor koji nadrize te dokumente.
Ovakvo sučelje poznato je pod nazivom kontrolirano SDI sučelje.
Ovdje je važno shvatiti kako kontrolni prozor ne ograničava u nijednom smislu kretanja
prozora koje kontrolira. Ovo nije MDI sučelje, ovo je SDI sučelje koje koristi kontrolni
mehanizam.
Kontrolni SDI mmodel je sagrađen na kooperacijskom SDI modelu te podržava sve
značajke kooperacijskog modela, no ima i neke svoje:
Kontrolni prozor bi trebao biti nazvan „<App> - Control“
Kontrolni prozor bi trebao imati meni koji će biti specifićan za njegovu namjenu tj. File
meni bi trebao sadržavati opciju New entry ali ne i opciju Open.
Opcija Quit zatvara sve dokumente u kontrolnom prozoru (uz upite o spremanju
promjena) i izlazi iz cjelokupne aplikacije.
U instancama gdje je kontrolni SDI model prihvatljiviji aplikacijama nego kooperacijski
SDI model, sadržaj kontrolnog prozora bi trebao biti više-manje očit. No, svejedno bi se
trebala voditi briga o tome da se ne stavljaju kontrole koje su specifične za pojedini prozor u
kontrolni prozor. Primjer za to mogao bi biti Gimp 1.1 koji ima menubar i toolbar prihvatljiv
za sve dokumente u kontrolnom prozoru. Kada bi Gimp 1.1 bio KDE aplikacija svaki
prozor/dokument bi imao svoj vlastiti meni i toolbar, a kontrolni prozor bi sadržavao globalni
konfiguracijski meni, listu trenutno otvorenih prozora ili možda jednostavan splash ekran u
stilu Wordperfect 8.
Prva opcija u prozorskom meniu svakog prozora bi trebala biti kontrolni prozor.

952/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Konqueror

Konqueror je file manager za K Desktop okruženje. Podržava osnovne file managenent


na lokalnom UNIX file sistemu, počevši od jednostavnih izreže/kopiraj – naljepi operacija do
naprednih kako udaljenih tako i lokalnih mrežnih operacija. Na prvi pogled Konqueror
izgleda kao normalni file manager, no njegove mogučnosti ga čine tako zanimljivim.
Prikazuje dokumente pomoću ikona ili stabla, dopušta kopiranje micanje i brisanje drag and
drop tehnikom, prikazuje značajke dokumenata, u njemu se mogu prikazivati tablice,
prezentacije, web stranice, te svi dokumenti načinjeni u Koffice-u. Jako zanimljiva značajka
Konquerora je da on pruža automatski update direktorija, tako naprimjer ako kreiramo novi
dokument u direktoriju koji se trenutno gleda u Konqueroru nemoramo osvježvati već će se
novi dokument automatski pojaviti na ekranu. Isto se događa i sa izbrisanim dokumentima.
Konqueror je osnova za sve novije KDE tehnologije, od KIO-a do komponenta
ugrađenih sa KPart sučeljem, te predstavlja aplikaciju sa največim stupnjem podesivosti, tako
da ju svaki korisnk može podesiti prema svojim potrebama. To omogućavaju XML
konfiguracijski dokumenti za Konqueror. Kako se i cijelo Knqueror „odijelo“ može podesiti
pomoću XML-a, korisnik može prikazati cijelu aplikaciju kako njemu odgovara (za korisnike
prijenosnih računala male ikone i sl.).
Konqueror je Open Source web preglednik koji podržava 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 može koristiti u drugim KDE programima.
Konqueror je univerzalna view aplikacija, koja je u stanju ugrađivati u sebe
dokumente smo za čitanje bez pokretanja drugih aplikacija. Može prikazivati slike, KOffice
dokumente, prezentacije, tablice i sl. Gledano sa tehničke strane zanimljivo je da ovi vieweri
nisu dio Konquerora i nisu izrađeni specifično za njega. Konqueror ugrađuje 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. Ugrađene dijelove drugih aplikacija možemo pronaći u library
Kparts.

953/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE Network

KDE Network obuhvaća programe vezane uz mreže, kako Internet tako i lokalne
mreže. U ovom poglavlju ćemo reći ukratko ponešto o tim programima uz napomenu da neke
nećemo spominjati (koji nam se nisu činili toliko važni ili zastupljeni).

Kdict
Kdict je grafički klijent za DICT protokol. Omogućava korisniku da pretražuje kroz
bazu podataka kako bi našao pojedinu riječ ili frazu, te mu tada prikazuje pogodnu
definiciju.Kdict pojednostavljuje jednostavne ali isto tako i napredne upite. Lista odvojena
separatorom predstavlja dobar način za pretraživanje riječi koje imaju isto ili slično značenje,
a koje nam je napredan upit prikazao. Kdict svojim izgledom uvelike podsjeća na web
browser. U njega je implementirana naprijed/natrag tj back/forward tehnologija. Riječi koje
su u listi a za koje želimo vidjeti značenje moramo samo kliknuti i značenje riječi će se
prikazati analogno tome u web browseru je link.
Kdict je u stanju raditi sa sadržajem clipboarda pa ga jednostavno možemo
kombinirati sa web browserom ili text editorom. Ako je na računalo postavljen firewall, ako
računalo nema pristup internetu ili ako je server koji se nalazi na dict.org prespor korisniku,
korisnik može postaviti svoj vlastiti lokalni server. Pri tome korisnik dobiva određene
prednosti kao što je mogućnost dodavanja baza podataka.

KNewsTicker
KNewsTicker je dodatni programčić za Kpanel, poznat još i po nazivu Kicker, koji
pruža jednostavan pristup vijestima koje omogućuju stranice kao što su: SlashDot, Linux
Weekly News, Frashmeat itd. Ovo je moguće na taj način što KNewsTicker zatraži od
stranice potreban RSS dokument koji sadrži glavne vijesti kao i linkove na cijelokupne
članke. Takvi dokumenti su vrlo popularni u današnje vrijeme, a KNewsTicker sa sobom nosi
popis stranica koje omogućavaju ovaku vrstu usluge.
No, što su to RSS dokumenti? Ukratko možemo reći da su RSS dokumenti bazirani na
XML-u kako bi se omogučio 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 puštena u javnost je bila RSS 0.9. RSS je zamišljen kako bi na jednostavan način

954/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

prosljeđivao sadržaj 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 izašle brojne verzije RSS-a, zadnja je 2.0, no prve
dvije verzije koriste se za čak 85% dokumenata koji se prosljeđuju ovom tehnikom.

Kopete
Kopete je KDE-ov instant messaging (IM) klijent. Omogućava jednostavnu
komunikaciju što prvenstveno znači da premošćuje zapreke koje stvaraju različite IM sistemi.

kpf
KPF je alat koji pruža jednostavno dijeljenje dokumenata koristeći HTTP. Kpf je
isključivo javni fileserver, što znači da nema ograničenja pristupa shared dokumentima. To u
principu znači da dokumentu koji je postavljen za djeljenje može pristupiti bilo tko. U samom
početku razvoja kpf-a njegova namjena je bila za dijeljnje dokumenata na IRC-a (Internet
Relay Chat). Danas uvelike olakšava dijeljenje dokumenata među udaljenim korisnicima te u
neku ruku zamjenjuje priloge kod slanja e-mail.

Kppp
Kppp je dialer i korisničko sučelje prema shell programu pppd. Dopušta interaktivno
generiranje skripta i network podešavaja. Jednom kada se kppp spoji daje korisniku široku
lepezu statistika i bilježi vrijeme provedeno online. Ugrađeni terminal i skriptni generator
olakšava uspostavu veze i podešavanja. Uz kppp korisniku više nije potreban dodatni terminal
program kao što je seyon ili minicom. Ujedno pruža stalno praćenje telefonskog računa.

KWiFiManager
KWiFiManager je skup alata koji omogućuju podešavanje wireless LAN PC-kartice
na K desktop okruženje. Pruža informacije o trenutnoj konekciji i dopušta korisniku
podešavanje čak do 4 različite nezavisne konfiguracije koje mogu biti pokrenute prilikom
pokretanja Kde-a. KWiFiManager podržava sve wireless LAN kartice koje koriste wireless
extensions sučelje, što uključuje i mnoge kartice koje podržava wlan-ng projekt.

955/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Pim

KAddressBook
KAddressBook je glavna adresar-aplikacija za KDE. Budući je bazirana na kabc
library, podržava resurse koji se mogu koristiti za podizanje i spremanje kontakata na mnogo
različitih lokacija, ne samo na local file sistem nego i LDAP server te SQL bazu podataka.
Korisničko sučelje izgledom podsjeća na MS Outlook.

KAlarm
Kalarm je jedan koristan program pomoću kojeg se mogu postavljati alarmi-poruke,
slati e-mail poruke ili se može narediti pokretanje programa u određeno vrijeme.

KPilot
KPilot je aplikacija koja sinkronizira PlamPilot ili slične uređaje sa KDE desktopom
kao što to čini HotSync za Windows. Može sinkronizirati ugrađene aplikacije.

Knode
Knode je jednostavan za korištenje čitač vijesti. Omogučava čitanje vijesti čak i
početnicima u KDE-u, no ujedno ima i naprednije funkcije za one upućenije. Knode je online
čitač ali uz pomoć newsservera kao što je leafnode može postati offline čitač.

956/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE Grafics

Kdiv
Kdiv je plugin za Kviewshell program koji dopušta Kviewshall-u da prikazuje div
dokumente (.div) koji su produkt TeX typesetting sistema. Kdiv podržava brojne ekstenzije
DIV standarda npr PostScript grafike hiperlinkova.

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 može koristiti za prikazivanje materijala za printanje ili za čitanje dokumenata
online.

KView
KView je preglednik slika na KDE desktopu. U ovom programu moguće je gledati
grafike različitih formata kao što su PostScript, TIFF i sl. Spremanjem slike sa drugom
ekstenzijom moguće je na jednostavna način konvertirati slike u bilo kakve druge grafičke
formate. KView ujedno omogučuje jednostavne procese nad slikama kao što su
sužavanje/razvlačenje rotacija i filtriranje. Pomoću KView programa moguće je postaviti
sliku kao pozadinu ekrana ili kreirati svoj slideshow.

957/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE Utilities

KdiscFree
KdiscFree prikazuje dostupne file devices ( hard disc particije, floppy i CD drives..),
zajedno sa informacijama o njihovom kapacitetu, slobodnom prostoru, tip i mount pointu.
Dopušta i mountiranji ili unmontiranje drives-a i gledanje istih u file manageru. KdiscFree je
sličan Kcontrol Disk-Free modulu, no zauzima manje prostora na ekranu. Jako je koristan ako
želimo imati KdiscFree dostupan na ekranu u svakom trenutku.

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 sučelje za GNUpg (poznat kao i gpg), snažan alat za enkripciju.
Sa Kgpg alatom jednostavno je enkriptati i dekriptati dokumente i e-mail, što pruža mnogo
sigurniju komunikaciju. Kgpg je olakšao život mnogim korisnicima UNIX operativnih
sistema utoliko što se više ne mora pamtiti sve gpg komande već se enkripcija i dekripcija
mogu izvršiti sa nekoliko klikova mišem.

958/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

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 grafičko
sučelje 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 više
arhiva na jednoj traci. KDat je kreiran sa ciljem da se stvori grafičko korisničko sučelje za tar
koje podržava brze selektivne ekstrakcijske odlike programa dds2tar. Mogućnosti koje pruža
KDat su: jednostavno grafičko sučelje do lokalnog filesistem-a i sadržaja traka, mnogobrojne
arhive na jednoj (fizički jednoj) traci, kompleksan zbir arhiva i dokumenata je pohranjen na
lokalnom hard disk-u, selektivan povratak dokumenata iz arhive i backup profili za često
korištene backup-ove.

Kpackage
KPackage je grafičko korisničko sučelje 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KOffice
KOffice je integrirano office okruženje za K Desktop Environment. Sastoji se od
sljedećih 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, višestruke kolone na stranici, zaglavlja i podnožja, tablice, ugrađivanje teksta
slika i sl. I još mnoge druge.

KSpread
KSpread je program namjenjen izradi tabličnih dokumenata, no koristan je i kada su
nam potrebne matematičke formule ili statistički izračuni. Mogućnosti KSpread programa su:
izrada višestrukih tablica u istom dokumentu, zaglavlja i podnožja, uzorci, korištenje više od
100 matematičkih formula uključujuči 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 može: ugrađivati
clike i clipart u dokument, unositi auto- forme, podešavati značajke objekata kao što su boja
rotacija sjena i sl, grupirati ili od grupirati objekte, podešavati pozadinu, napredno
poništavati/ponavljati, prezentirati uz efekte. Uz sve to može printati kao PostScript, kreirati
HTML slideshow sa samo nekoliko klikova mišem i koristiti XML kao format dokumenta.

Kivio
Kivio je program za izradu dijagrama. Ima slično sučelje kao Visio®. U potpunosti je
integriran u KOffice i može se npr. ugrditi u KWord. Karakteristike ovog programa su
skriptne matrice (stencile) koje korist Python, podrška za Dia matrice, plugin strukture za
dodavanje funkcionalnosti.

960/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

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 sljedeće mogućnost programa: crtanje sa bojama i
kistovima, kreiranje vlastitih kistova pomoću krugova i kvadrata, ispunjavanje objekata
bojama i uzorcima, brisanje, airbrush, jednostavni geometrijski oblici,
poništavanje/ponavljanje, podizanje i spremanje dokumenata, unošenje i izvlačenje slika u sve
formate podržane od ImageMagick, dodavanje pomicanje i promjene redosljeda slojeva,
zumiranje, odabir boja, podrška za Wacom tablets i još mnogo toga. Krita ovisi o sljedećim
library: ImageMagick X11, Little CMS (besplatan sistem za management boja).

Kugar
Kugar je program za izradu poslovnih izvješća koja se mogu pregledavati i ispisivati.
Izvješća se mogu pregledavati Konqueror programom, a isto tako moguse ugrađivati i u bilo
koju KDE aplikaciju. Kugar radi na principu spajanja aplikacijski generiranih podataka sa
template-ima kako bi se stvorio završni izvještaj. Podaci i template su specificirani XML-om,
što znači da se aplikacija treba brinuti samo za podatke, dok se template može referencirati
preko URL-a što dopušta da se stvori centralni template library. Ima podršku za direktan
pristup bazama podataka.

KChart
KChart je program za kreiranje dijagrama(chart). Dokumenti stvoreni KChart
programom se mogu ugrađivati u KOffice dokumente npr KWord.

KFormula
KFormula je program koji nam olakšava život pri pisanju matematičkih ili sličnih
formula. Značajke ovog programa su: jednostavnounošenje slova grčke abecede, inteligentno
pomicanje pokazivača, napredno označavanje sintakse, ogučnost izlaza dokumenta u LaTeX
program. Ovaj program se nastoji unaprijediti tako što će podržavati unos dokumenata iz
LaTeX i MathML programa.

961/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Kexi
Kexi je program koji trenutno ne dolazi sa KOffice ali sljedeća KOffice verzija
programa će sadržavati Kexi. To je program za manipulaciju podacima. Pomoću njega mogu
se kreirati baze podataka te kreirati upiti. Ideja za ovakav program došla je iz nedostataka
postojećih programa kao što su MSAccess, FoxPro, Oracle Forms i File Maker. Trenutno
Kexi podržava sljedeće sisteme baza podataka: SQLite, PostgreSQL, MySQL i
FireBird/Interbase. Planirano je da podržava i druge sisteme baza podataka, ponajprija ODBC
sučelje.

962/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDevelop

KDevelop je projekt koji je pokrenut 1998. godine sa ciljem stvaranje jednostavnog za


korištenje IDE-a (Integrated Development Environment) za KDE. Od tada pa do danas
KDevelop IDE podržava brojne programske jezike, a dostupan je i pod GPL-om. 8.12.2004.
izdana je zadnja promjenjena verzija tj. KDevelop 3.1.2.
Značajke KDevelop-a su: rukuje sa svim razvojnim alatima za programiranje pod C++
programskim jezikom što prvenstveno znači complier-om, linker-om, debugger-om i build
sistemom; drži dostupnim aplikacijski čarobnjak koji generira kompletne, spremne za rad,
pokazne aplikacije; dopušta 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 postojeći projekt; posjeduje File management za
izvore, zaglavlja, dokumentaciju itd; pruža pomoć pri kreiranje aplikacijskog korisničkog
priručnika napisanim sa KDE tools; posjeduje automatsku HTML baziranu API
dokumentaciju za klase projekta sa cross referencama korištenih library-a; pruža
internacionalnu podršku koja dopušta prevodiocima da dodaju željeni jezik u projekt s
lakoćom, što ukljućuje podršku za Kbabel; pruža podršku za manipulaciju projektom kroz
CVS na taj način što posjeduje jednostavan za upotrebu frontend za većinu potrebnih
funkcija; posjeduje frontend za debugger; posjeduje integrirani shell console emulator;
označava sintaksu koda kako bi se izbjegle sintaksne pogreške (npr. naglašava zagrade); pruža
korisniku automatsko završavanje koda za varijable klasa, metode klasa, argumente funkcija i
sl; posjeduje template za kreiranje različitih projekata (KControl module, Kicker applete,
KIOSlaves, Konqueror plugins i desktop stilove); posjeduje 4 pogleda na navigacijska stabla
za lakše prebacivanje između dokumenata; ima podršku za cross kompajler sa mogućnošću
odabira različitih kompajlera, zastavica kompajlera, ciljane arhitekture itd.; sadržava podršku
za Qt-ugrađene projekte kao što su Zaurus i iPAQ i na kraju ima mogućnost za dodavanje bilo
kojeg programa koji korisnik treba za razvoj jednostavnim dodavanjem tog programa u Tools
meni.

963/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE libraries

Libraries:
Kdecore
Kdecore je osnovni programski framework za svaki kde program. Pruža prisup
konfiguracijskom sistemu, rukovanje komandnim linijama, podizanje i manipulaciju
ikona, neke posebne vrste interprocesorske komunikacije, rukovanje dokumentima i
raznim drugim programima.
Kdeui
Kdeui librarie pruža mnoge widgets-e i standardne dijaloge koje Qt nema, ili imaju
više značajki nego njihov Qt „suparnik“. Pruža ujedno i nekoliko widgets-a koji su
subclassed od Qt-ovih i bolje su integrirane u kde desktop poštivajući korisnikove
postavke.
Kio i ksycoca
Kio i ksycoca libraries sadrže postrojenja za asinkroni mrežno transparentni
ulaz/izlaz i pristup rukovanju mimetype-om.
Kfile
Kfile libraries sadrži kde dokument dijalog i njegove pomoćne klase.
Kjs
Kjs libraries pruža implementaciju JavaScript jezika.
Khtml
Khtml libraries sadrži KHTML dio, HTML widget, DOM API i parser, uključujući
sučelje 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– drži informacije za about box
KcmdLinesArgs– procesuiranje argumenata s komandne linije

964/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Configuration settings – pristup KDE-ovoj hijerarhijskoj konfiguracijskoj bazi


podataka, globalnom podešavanju i aplikacijskim resursima

Kconfig– pruža pristup KDE ovoj konfiguracijskoj bazi podataka


KsimpleConfig– pristup jednostavnim, ne hijerarhijskim
konfiguracijskim dokumentima
KdesktopFile– pristup .desktop dokumentima
KglobalSettings– jednostavan pristupne ne specificiranim
aplikacijskim podešavanjima

File and URL handling – dekodiranje URLa, privremenih dokumenata itd

KURL– predstavlja i parsira URLe


KtempFile– kreira jedinstveni dokument za privremene podatke
KsaveFile– dopušta 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 značajke
kroz DCOP
KDCOPActionProxy – proxy klasa koja predstavlja DCOP sučelje
za akcije

Utility classes – raspodjela memorije, regularni izrazi, manipulacije stringovima,


slučajni brojevi

KregExp– POSIX mehanizam za regularne izraze


KstringHandler– ekstravagantno sučeljeza manipulaciju
stringovima

965/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KzoneAllocator– efikasno alociranje memorije za velike grupe


malih objekata
KrandomSequence– generator slučajnih brojeva

Keyboard accelerators – klase koje pomažu uspostavi konzistentnih prečica


koristeći tipkovnicu koji rade bilo gdje na desktopu

Kaccel– kolekcija prečica na tipkovnici


KstdAccel– jednostavan pristup uobičajenim tipkama prečica na
tipkovnici
KglobalAccel– kolekcija prečica na tipkovnici koje su dostupne na
cijelom sistemu

Procesuiranje slika – podizanje i manipulacija ikonama

KiconLoader– učitava ikonu iz teme


KiconTheme– pomoćne klase za KiconLoader
Kpixmap– pixmap klasa sa širokim spektrom mogučnosti
KpixmapEffect– pixmap efekti kao što su uzorci
KpixmapIO– zadnji Qimage -> Qpixmap pretvorba

Drag and Drop –. odvuci i pusti

KURLDrag– vučni objekt za URL-ove


KcolorDrag– vučni objekt za boje
KmultipleDrag– dopušte kreiranje vučnog objekta iz nekoliko
drugih

Auto-Completion

Kcompletion– generičko automatsko dovršavanje stringova


KURLcompletion– automatsko dovršavanje URLova
KshellCompletion– automatsko dovršavanje izvršnih datoteka

966/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Widgets – widget klase za pregled lista, dopuštenja, odabir boja itd.

KlistView– varijanta QlistView koja poštuje KDE-ove sistemske


postavke
KlistBox– varijanta QlistBox koja poštuje KDE-ove sistemske
postavke
KiconView– varijanta QiconView koja poštuje KDE-ove sistemske
postavke
KlineEdit– varijanta QlineEdit sa potpunom podrškom
KcomboBox– varijanta QcomboBox sa potpunom podrškom
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
Kruler–widget 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 grešaka i upozorenja

967/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KpassworeDialog– dijalog za unos lozinke

Akcije i XML GUI

Kaction– apstrakcija za akciju koja može biti dodana u traku s


menuima i alatnu traku
KactionCollection– set akcija
KXMLGUICliant– GUI dio koji se sastoji od kolekcija akcija i
DOM stabličnog prezentiranja njihove lokacije u GUIu
KpartManager– upravlja aktivacijom XMLGUI klijenata

Plugins i komponente

Klibrary– predstavlja dinamički učitani library


KlibLoader– učitavanje dijeljenih library
KlibFactory – object factory u plugin-ovima
KserviceType – predstavlja tipove servisa
Kservice– predstavlja servise
KmimeType– predstavlja MIME type
KserviceTypeProfile– korisničke postsvke za MIME type mapiranja
Ktrader– pitanja za servise

968/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE vs. GNOME, ili možda ZAKLJUČAK

Kao što svi znaju GNOME je kao i KDE, desktop okruženje za UNIX radne stanice.
Ova činjenica je sama po sebi uzrokovala mnoge polemike oko toga koje desktop okruženje je
bolje. Na ovo pitanje nije lako odgovoriti, tj. na ovo pitanje je nemoguće odgovoriti, jer su
ljudi po svojoj prirodi subjektivni, pa tako ovisno koji desktop korisnik ima, toga automatski
smatra najboljim. No, usprkos svemu jedan važan događaj pokrenuo je lavinu debata oko tog
pitanja, a to je činjenica da je nedavno Sun/Hewlett Packard odlučio koristiti GNOME kao
svoj standardni desktop. Kako je to utjecalo na KDE, najbolje pokazuje njihov odgovor na to
pitaje, a koji je bio: Ne utječe ni malo! Ovo nas vraća ponovno na početak gdje se govorilo o
KDE filozofiji. KDE projekt je osnovan i radi u nadi kako će stvoriti najbolji desktop na
svijetu. Kako se tehnologija neprekidno poboljšava, tako i programeri koji rade na KDE-u
imaju neprekidno pune ruke posla, ali usprkos tome mogli bismo reći da su poprilično up-to-
date. KDE nikada nije bio orjentiran oko podjele tržišta, podjele mozgova, koorporacijske
naklonosti ili bilo kakvog vanjskog utjecaja. Usprkos tome KDE dobiva nagrade kao
„korisnikov izbor“ i kao „programerov izbor“. Zašto? Zato što su kreatori KDE-a unijeli u
svoj posao svu svoju ljubav prema programiranju i pretočili ju u ovaj software, ili možda zato
što je GNOME kontroliran od strane GNOME Foundation, a KDE je oduvijek bio i prema
njihovim riječima zauvijek će biti kontroliran od strane KDE stvaraoca. Gledano sa druge
strane, KDE projekt je jedini Open Source projekt koji nema „dobronamjernog“ diktatora ili
upravljački odbor. Prema njihovim riječima nemaju namjeru mijenjati ovu dobitnu formulu.

969/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Marina Petrovska

UNIX DESKTOP SYSTEM

970/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

UVOD

UNIX je višeprogramski, višekorisnički operativni sistem opće 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 višeprocesni «multiuser» operativni sistem i za sada se većinom koristi za
jednoprocesorskim kompjuterima. Kako je procesor (CPU) samo jedan, on je, u cijelosti, u
svakom trenutku posvećen samo jednom procesu. Drugim riječima, 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 omogućava 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 početka imaju sve potrebne podatke i ne
zahtijevaju direktno sudjelovanje korisnika.

Vrijeme je pokazalo da se rad s komandnim linijama, kao svojevrstan stereotip "nerd"


društva, sve više odbacuje (ali nikad u potpunosti zbog nekih svojih prednosti) i da je stvorena
potreba za komunikacijom s računalom, tj. operativnim sustavom pomoći grafičkog sučelja.
Ne samo zbog toga što obični korisnik nije "nerd" i traži user friendly sučelje nego i zbog
same ljudske prirode i percepcije: ljudi brže rade sa slikama nego tekstom. Danas
najpopularniji i najčešće korišteni komercijalni operativni sustavi Windows i MacOSX svoju
popularnost (i monopol na softverskom tržištu) dobivaju zbog vrlo jednostavne uporabe i
integracije raznih aplikacija u sam sustav, što korisnika pošteđuje 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 mogućnost da korisnik u potpunosti prilagodi rad na
računalu svojim potrebama. Kao alternativa Windowsima, Linux nudi svoje GUI-e (Graphical
User Interface).

971/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

POVIJEST

1973. Xerox proizvodi prvo računalo (Alto) s grafičkim sučeljem da bi 1981. napravili
The Star, čiji sustav je imao većinu obilježja koje imaju današnji 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
padajuće izbornike, a 1984. izbacuje prvog Macintosha na tržište. Iste godine na MIT
sveučilištu je predstavljen "Window System X" - prvi Unixov GUI.

1985. izlazi Geos za Commodore 64 i kasnije Apple II, Commodore proizvodi računalo
Amiga 1000 s Workbench 1.0 sustavom, a Microsoft izbacuje prvu verziju Windowsa,
najavljenu 1983.

1987. Apple izbacuje Macintosha II, prvo Apple računalo s prikazom u boji, izlaze Ms
Windows 2.03 s prozorima koji se mogu preklapati i mijenjati veličinu.
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 računala, Microsoft izbacuje
Windows 3.0 (koji u sebi ima Program Manager).

972/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

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
omogućava 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 ušminkana verzija Windowsa 2000.

973/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Polovicom osamdesetih mala skupina programera smještena u jednoj zgradi u maloj


uličici grada Cupertina u Kaliforniji i predvođena Steveom Jobsom promijenila je svijet.
Napravili su prvo grafičko sučelje, proizvod koji je narodne mase upoznao s do tada
opskurnim digitalnim pojavama kao što su miš, prozor, ikona, izbornik (menu) i "dijaloške"
kućice, od kojih je u sjećanju mnogih ostala ona zastrašujuća "bomba" koja je upozoravala na
počinjenu pogrešku.
Macintosh je tako obične smrtnike oslobodio dotad sveprisutne tzv. "komandne linije" i
operativni sustav učinio "korisniku naklonjen".
No, Bill Gates, čovjek koji je kao svoju životnu misiju odabrao rečenicu koja kaže "da
će na svaki radni stol postaviti jedno osobno računalo", nije dugo čekao. Obukao je svoj, na
komandnoj liniji utemeljeni, DOS u ruho koje je nazvao Windows. Tako smo dobili
konkurenciju Macintosh grafičkom sučelju.
Nakon par godina više nikom nije bilo jasno kako smo uopće mogli koristiti kompjutore
bez ikona, prozora, miša i dijaloških kućica. A onda je glavna fora postao internet. Tu je
glavno sučelje postao web preglednik, pretražitelj, ili na dobrom američkom - "browser". Mac
OS i Windows više nisu bili dovoljni. Ne samo da su "odjednom" zastarjeli već su se morali
suočiti i s Linuxom, Unixom novoga digitalnog doba.
Sva trojica, unatoč tome što je Linux dijete interneta, teško su se hrvali s poplavom
informacija koje je pred znatiželjne korisnike prosipala svijetom protegnuta mreža. Steve Jobs
je opet odlučio 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,
među poznavateljima označen kao "Unix za Macove". Beta inačicom već se "igraju" tisuće
korisnika, i to ne samo Mac "fanatika", već i svi oni koji u informatičkom svijetu drže da
uvijek moraju biti "in". Mac OS X teško je jednostavno opisati jer pravi se dojam stječe tek

974/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

kad ga vidite na djelu. Šareno je to sučelje s mnogo boja, prozirnih dijaloških kućica i
prozora, te mnoštvom inovativnih funkcija.Gatesov novi borbeni poklič glasi ".NET" (čitaj:
dot-net). E sad, to nije samo grafičko sučelje, niti operativni sustav, to je, jednom riječju,
filozofija. Microsoftovi programeri koncept svog novog sučelja opisuju sintagmom
"univerzalno platno". Prostor je to gdje se internet, "radni stol" (desktop) osobnog računala i
operativni sustav sažimaju u jedan (i jedinstven) alat koji korisniku omogućuje da istim
tehnikama pretražuje poruke e-pošte, web stranice i sadržaj tvrdog diska. No, kako će
kompjuter znati kada mu treba procesor riječi, kada program za obradu slike, a kada nešto
sasvim treće, Bill Gates još nije potpuno objasnio. Odgovor je, čini se, u "univerzalnoj liniji
za tipkanje" - uvijek aktivnom praznom prostoru u koji korisnik može upisati web adresu, upit
za pretraživanje ili naslov poruke e-pošte što kompjutoru odmah daje dovoljno podataka za
"podizanje" upravo potrebne aplikacije.
Naravno, sve opisano tek je prototip. Ipak, najbliže tome što nas očekuje u vrlo bliskoj
budućnosti već možemo vidjeti u najnovijoj inačici 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 desetljećima. No, to nije slučaj s Linuxom. Taj internet "unixoid"
bio je isključivo dvorište za egzibicije turbo softveraša i nije baš sklon svakome. Još do jučer
Linuxaši su se ponosili time što imaju komandnu liniju i što u njihov klub teško može
prodrijeti netko bez diplome iz informatičkih znanosti ili bar matematike. Osim toga, to je
operativni sustav građen po "open source" načelu - što znači da je svima dostupan nacrt
temelja ("kernela"), čega se treba pridržavati, a dalje svi grade iz donesenog materijala.
Rezultat? Mnoštvo "distribucija" (vrsta) Linuxa, kojima je danas, uz to što korisnika
doista tjeraju na učenje, gotovo jedina prednost to što su uglavnom besplatne (ali ne i
podrška).
Linuxaši su dugo vremena odbacivali i samu pomisao na grafičko sučelje, no danas su
se stvari promijenile. Nekoliko skupina programera počelo je raditi i na tome, a posebno se
istaknula tvrtka Eazel - sastavljena od, a od koga bi drugog, par Macintosh veterana. Njihovo
grafičko sučelje zove se Nautilus, lako se "lijepi" na Linux, dopušta instalaciju s više
stupnjeva složenosti - od početnika do "power usera", ima navigaciju sličnu onoj kako se
pretražuje internet. No, ono što je najzanimljivije način je na koji se prezentiraju datoteke koje
su prikazane tako da odmah upućuju na svoj sadržaj. Mapa s glazbom izgleda kao CD album,
a datoteke su prikazane na isti način kao i na ovitku ploča. Drugi izum omogućava korisniku

975/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

posebno označavanje datoteka pridajući im razne atribute - glavno, tajna, posao, u-radu i
slično. To omogućuje preciznije pretraživanje tvrdog diska.
No, kako će se mala tvrtka boriti protiv "pirata silicijske doline"? Kako bilo, uključili su
se. Prvi im je uspjeh to što će Dell, drugi svjetski proizvođač osobnih računala, svojim
poslovnim korisnicima instalirati Linux s Eazel sučeljem.
Maraton za grafičko sučelje i operativni sustav budućnosti je počeo. Tko će pobijediti
sad je teško procijeniti, a korisnici od žustre konkurencije mogu samo profitirati.

976/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

STRUKTURA

Još od vremena Windows 3.1 grafičke nadogradnje za MS DOS operativni sustav i


MacOS operativnog sustava korištenje računala sve više prelazi iz pisanja naredbi u
naredbenoj liniji u point-and-click način rada u grafičkom sučelju. Grafička sučelja i point-
and-click tehnologija približili su korištenje računala širem krugu ljudi pojednostavljivanjem
rada na i danas je moderan operativni sistem bez njih nezamisliv.
Sustav koji omogućava grafičko okruženje za Linux zove se X Window. X Window je
samo podloga za grafička sučelja 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 računalu na kojem se želi koristiti Linux grafičko sučelje. Osim X Windows-a,
na računalu mora biti instalirano i samo grafičko sučelje koje će se koristiti. Odabir grafičkog
sučelja ovisi isključivo o afinitetima korisnika.
Opisat ću tri grafička sučelja:
GNOME
KDE
Ximian
Izgledom i načinom korištenja vrlo su slična MS Windows operativnom sustavu
(korisnici MS Windows-a vrlo se brzo mogu naviknuti na bilo koje od ova tri sučelja),
besplatna su i mogu se skinuti s Interneta.
KDE grafičko sučelje samo je dio KDE paketa u koji su uključeni i programi za
konfiguraciju računala u grafičkom okruženju kao i paket uredskih aplikacija (KOffice)
sličnih MS Office paketu.
Kao i u slučaju KDE paketa, s GNOME paketom uz samo grafičko sučelje također
dolazi i mnogo korisničkih programa, programa za grafičku konfiguraciju računala i set
uredskih aplikacija pod imenom GNOME Office.
Ximian GNOME je samo nadogradnja GNOME grafičkog sučelja. Za razliku od
GNOME paketa u koji su uključene 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 vješto upakiranih Windowsa ili MacOS-a, grafička sučelja za Linux se
sastoje od potpuno odvojena 3 sloja/komponente, čime se korisniku ostavlja mogućnost
izbora svakog od njih.

977/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

1) Prvi sloj je X Server čija je svrha komunikacija između grafičkog sučelja i


operacijskog sustava, a može povezati čak i grafičko sučelje jednog računala i programa koji
se izvršava na drugom. X Server dolazi s instalacijom Linuxa. Najčešće distribucije su XFree
86, Metro-X i Accelerated-X. Postoji mogućnost zabrane daljinskog spajanja na X server
koristeći –nolisten tcp opcije na x serveru. Ovo će spriječiti bilo kakva mrežna spajanja na
server preko tcp socket-a. SERVER obezbjeđuje funkcije na nižem nivou za interakciju sa
vašim video hardverom.
XFree86 – XFree86 je zaštićeno ime proizvoda tvrtke XFree86 Project, INC. Prvobitni
programeri koji su X Windowse prilagodili platformi 80386 odlučili su projekt osnovati radi
stjecanja članstva u X Consortiumu. Postavši članicom X Consortiuma, XFree86 Project
dobio je pristup trenutno razvijenim poslovima i tako je u XFree86 mogao prebacivati nove
mogućnosti istovremeno s njihovom primjenom u X Windowsima, umjesto da čeka njihov
službeni izlazak da bi ih mogao iskoristiti. X Consortium je od 1. siječnja 1997. X prepustio
skupini Open Group. XFree86 uključuje i programske biblioteke i datoteke za programere
koji žele razviti svoje vlastite aplikacije pod XFree86. XFree86 pruža preklapajuće prozore,
trenutno iscrtavanje grafike, bitmapirane grafike i slike visoke razlučivosti i visoko-kvalitetni
prikaz teksta.
Opis X servera koje možete 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 većinu 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 većinu VESA kartica (XF86_FBDev)

978/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

2) Drugi sloj je Window Manager koji vodi računa o samom prozoru i ponašanju
prozora (otvaranje, zatvaranje, mijenjanje veličine, minimiziranje, maksimiziranje...).
Najčešće dolazi u paketu s Desktop Environmentom, ali ne mora biti tako - recimo, Gnome je
dolazio sa Enlightenement window managerom dok se uz novije verzije isporučuje Sawfish.
Kao i UNIX, X-i su prilično fleksibilni. Izgled prozora, rad menija i ostale mogućnosti su
kontrolirane od strane WINDOW MANAGER-a. Najčešći WINDOW MANAGER-i su
mwm, fvwm, i twm. Postoji gomila drugih window managera uključujući i fvwm95, koji
simulira Windows-e na UNIX PLATFORMI .
Neki od window managera raspoloživih za Linux:
twm – Tomov window manager
fvwm – virtualni window manager za X11
fvwm95 - virtualni window manager za X11 koji poprilično 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 prilagođen mnogim
UNIX-ima
KDE – K Desktop Environment, besplatna varijacija CDE-a
Twm – program twm za upravljanje prozorima u sustavu X Windows pruža naslovne
trake, oblikovane prozore, nekoliko obrazaca upravljanja ikonama, korisnički definirane
makro funkcije, klik za upisivanje i pokazivačem upravljano žarište tipkovnice, korisnički
određene tipke i povezivanja tipkom miša.
Fwm – program za upravljanje prozorima fwm za X11 jest izvedenica twm-a. Program
je preoblikovan za smanjenje potrošnje memorije, pružanje trodimenzionalnog izgleda
okvirima i pružanje jednostavne virtualne radne površine
Fwm95 – program za upravljanje prozorima fwm95 za X11 je «hakerska preinaka
temeljena na fvwm2.x». Cilj je razvijatelja bio oponašanje glavnih značajki GUI-ja dobro
poznatog operativnog sustava da bi se korisnici ugodnije osjećali u UNIX okružju i radi
izbjegavanja napuhavanja jednostavnog i čistog GUI koda fvwm-a.
Olwm – program za upravljanje prozorima olwm za X Windows sustav primjenjuje
dijelove grafičkog korisničkog sučelja Openlook. To je standardni program za upravljanje

979/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

prozorima za Sunov proizvod Open Windows, ali ispravno radi sa svakim X11 sustavom,
uključujući Xfree86.
Enlightenment – Enlightenment je omiljen i sjajno napisan program za upravljanje
prozorima. Stabilan je i brz. Premda je ispočetka temeljen na rvwm radu, njegove su novije
inačice u potpunosti napisane od nule.
CDE – Common Desktop Environment (CDE) je komercijalni pokušaj prilagodbe
uobičajene radne površine na većinu inačica UNIX-a. Detaljnije sam ga opisala kasnije u
seminaru.
KDE – K Desktop Environment (KDE) je veliki freeware projekt zamišljen za stvaranje
integriranog radnog okručja sličnog CDE-u, ali razvijen i izdan u potpunosti pod GNU Public
License (GPL). Detaljnije sam ga opisala kasnije u seminaru.

3) Treći sloj je sam Desktop Environment koji brine o svemu ostalom.


Pošto se radi o višekorisničkom sustavu moguće je da svaki korisnik ima svoje
okruženje potpuno prilagođeno njegovom ukusu i potrebama. Najpopularniji su KDU i
Gnome.

980/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

GRAFIČKA SUČELJA

GNOME

GNOME je grafičko okruženje za Linux i Unix operativne sustave koje korisnicima


omogućava jednostavnu primjenu i konfiguraciju računala. Izgledom i načinom korištenja
vrlo je slično grafičkom okruženju iz MS Windows operativnog sustava. S grafičkim
okruženjem dolaze i alati za konfiguraciju samog grafičkog sučelja, alati za konfiguraciju
računala i paket aplikacija koje se nalaze u rasponu od malih korisničkih programa pa sve do
moćnih uredskih aplikacija. Zajedničke značajke tih aplikacija su besplatnost, jednostavnost
korištenja, brzi razvoj i dostupnost su preko Interneta. Cijeli GNOME paket sadrži:
GNOME desktop - grafička radna okolina,
GNOME razvojni alati - kolekcija alata i komponenti za razvoj aplikacija,
GNOME Office - paket uredskih aplikacija.
Uredske aplikacije koje su uključene u GNOME paket pod zajedničkim
imenom GNOME Office su:
Gnumeric - spreadsheet aplikacija,
AbiWord - program za obradu teksta,
Gfax - program za slanje i primanje faksimila,
Galeon - web preglednik,
Gimp - moćan program za obradu slika,
Eye Of GNOME - preglednik slika,
Evolution - program za elektroničku poštu u koji je uključen i osobni
organizer,
MrProject - program za vođenje projekata,
GnuCash - program za praćenje financijskog poslovanja,
Achtung - program za izradu prezentacija,
Dia - program za crtanje dijagrama,
Sketch - program za vektorsko crtanje.
GNOME je djelomično lokaliziran na Hrvatski jezik. Trenutna verzija GNOME paketa
je 1.4 ali uskoro bi trebala izaći i verzija 2.0. Cijeli GNOME paket je besplatan i podržava sve
Linux i Unix operativne sustave.

981/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Opća svojstva
S GNOME paketom dolazi program pod imenom Kontrolni centar i namijenjen je za
konfiguriranje grafičkog sučelja 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 moguće mijenjati.

Slika 2.1 GNOME Kontrolni Centar


U kontrolnom centru se mogu podešavati svi parametri grafičkog sučelja. Budući da tih
parametara ima mnogo i većina njih prosječnom korisniku uopće nije potrebna, ovdje se
spominju samo osnovne postavke.
Opcije vezane uz izgled ekrana nalaze se u sekciji Desktop. Ovdje se može 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 grafičkog sučelja i ne
utječu na rad računala.
U sekciji Document Handlers nalaze se opcije za rad s različitim vrstama datoteka i
dokumenata. Ovdje se može podesiti tekstualni editor koji će se koristiti (Default Editor), u
sekciji FILE Types and Programs moguće je povezati datoteke određenih ekstenzija sa
programima u kojima se te datoteke mogu pregledavati (npr. datoteke s ekstenzijom .mp3

982/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

može se povezati s programom Xmms koji je namijenjen za slušanje muzike u mp3 formatu.
Nakon toga, svaki put kad se mišem dvaput klikne na datoteku s ekstenzijom .mp3 ona će se
automatski otvoriti u Xmms-u). HTML Viewer i URL Handlers se odnose na podešavanje
parametara za pregledavanje Web stranica.
Look and Feel sekcija sadrži opcije za podešavanje izgleda aplikacija i menija u
GNOME okruženju. U sekciji Multimedia nalaze se opcije za zvučne efekte (npr. zvukovi
koji se čuju prilikom otvaranja ili zatvaranja prozora, pokretanja ili zatvaranja X Windows
okruženja i sl.).
U sekciji Peripherials nalaze se opcije za podešavanje rada miša i tastature. Ovdje se
može podesiti brzina strelice miša, dvostrukog klika miša, neke postavke vezane uz rad s
tastaturom i slično.
Sekcija Sawfish window manager sadrži opcije koje se odnose na Sawfish, upravitelj
prozorima (eng. window manager) koji dolazi standardno sa GNOME grafičkim okruženjem.
Slika 2.2 prikazuje opcije za podešavanje pozadine ekrana. U pozadinu se može staviti
slika s lokalnog tvrdog diska ili se može odabrati boja za pozadinu (boja može biti jednolika
ili se može podesiti pretapanje jedne boje u drugu). Na slabijim računalima (sve konfiguracije
slabije od PI na 166MHz sa 128MB RAM-a) nije poželjno stavljati sliku kao pozadinu zato
jer to može dosta usporiti rad računala.

Slika 2.2 Podešavanje pozadine

983/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

GNOME grafičko okruženje dolazi sa mnogo gotovih tema za prozore. Tema za prozore
određuje izgled prozora u grafičkom sučelju. Slika 2.3 prikazuje prozor za izbor neke od
dostupnih tema. U gornjem dijelu prozora može se odabrati neka od ponuđenih tema dok je u
donjem dijelu prozora prikazano kako ta tema izgleda. Izbor teme za prozore ne utječe na
brzinu rada računala tako da je svejedno koja će tema biti odabrana.

Slika 2.3 Odabir windows teme

984/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Vrlo korisna stvar u GNOME grafičkom okruženju je virtualna radna površina. Za


razliku od MS Windows grafičkog okruženja gdje se svi prozori programa nalaze na istoj
radnoj površini u GNOME-u je moguće istovremeno koristiti nekoliko radnih površina. Tako
se dobiva na preglednosti u slučajevima kada je istovremeno otvoreno više prozora. Broj
radnih površina može se podešavati u sekciji Sawfish window manager->Workspaces
(Slika 2.4).

Slika 2.4 Podešavanje virtualnih radnih površina

985/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Svaka virtualna radna površina može biti podijeljena u nekoliko virtualnih ekrana. Ovo
može biti korisno kod niskih rezolucija kada je prozor veći od ekrana. Tada se drugi dio
prozora može vidjeti na drugom virtualnom ekranu. Promjena radne površine (ili virtualnog
ekrana) obavlja se preko GNOME panela ili se može podesiti da se radna površina promijeni
kada se mišem izađe izvan ruba ekrana (Slika 2.5).

Slika 2.5 Podešavanje promjene radne površine

986/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Izgled GNOME grafičkog sučelja vrlo je sličan MS Windows operativnom sustavu


(Slika 2.6).

Slika 2.6 GNOME grafičko okruženje

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 površine pokraj kojeg je
sat. Ovako GNOME panel izgleda nakon instalacije GNOME paketa. Odabirom opcije Panel
u Start meniju može 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
površine. Standardno s GNOME paketom dolazi dvadesetak applet-a različitih namjena (npr.
sat, različiti sistemski monitori, mikser za zvuk itd.). GNOME podržava korištenje i više

987/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

panela. Dodatne panele može 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 miša na panel i odabirom opcije Panel->Add to panel. Desnim klikom miša na bilo
koji od panela i odabirom opcije Panel->Properties može se podešavati ponašanje panela
prilikom rada (npr. hoće li panel uvijek biti iznad prozora ili neće i sl.). Na ostatku ekrana
nalaze se ikone i trenutno otvoreni prozori.
Nova ikona se može dodati na desktop desnim klikom miša 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 grafičkom okruženju vrlo je sličan radu u MS Windows operativnom
sustavu. Programi se pokreću dvostrukim klikom miša na neku od ikona. Desni klik miša na
ikonu daje meni s opcijama kao što su kopiranje, brisanje i sl. Desnim klikom miša na prazni
dio radne površine dobiva se meni u kojem se može dodati nova ikona na radnu površinu,
promijeniti pozadina, poravnati ikone na ekranu i slično. Korisnicima koji su već imaju
iskustva u radu s MS Windows operativnim sustavom vrlo se lako prilagoditi GNOME
grafičkom sučelju zato jer su razlike u načinu rada i korištenju male.

Zaključak

GNOME je grafičko okruženje za Linux i Unix operativne sustave koje korisnicima


omogućava jednostavnu primjenu i konfiguraciju računala. Izgledom i načinom korištenja
vrlo je slično grafičkom okruženju iz MS Windows operativnog sustava tako da će ga
korisnici koji imaju iskustva s MS Windows grafičkim okruženjem vrlo brzo naučiti koristiti.
U GNOME paket uključeni su i programi za konfiguraciju računala iz grafičkog
okruženja što uvelike olakšava rad neiskusnim Linux korisnicima.
GNOME Office set uredskih aplikacija koji dolazi s paketom sadrži sve potrebne
aplikacije za SOHO okruženje. Problem s GNOME Office aplikacijama je to što se nalaze u
različitim fazama razvoja. Neke od tih aplikacija su još uvijek u ranoj fazi razvoja tako da su
još uvijek dosta nestabilne i malih mogućnosti. S izlaskom verzije 2.0 GNOME paketa
očekuju se dorađenije verzije tih aplikacija kao i dodavanje novih aplikacija u GNOME
Office paket.

988/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

KDE GRAFIČKO SUČELJE

Konfiguracija

KDE Control Center je mjesto gdje se podešavaju postavke KDE grafičkog okruženja.
Program se može pokrenuti iz Start izbornika odabirom Start -> Control Center, što će
otvoriti glavni prozor (Slika 3.1) sa grupama postavki za podešavanje. Moguće je pristupiti i
svakoj od postavki izravno, bez pokretanja KDE Control Center-a, jednostavnim odabirom u
Start -> Configuration -> KDE izborniku.

Slika 3.1 KDE Control Center

989/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Postavke za podešavanje podijeljene su u grupe:


FileBrowsing,
Information,
LookNFeel,
Network,
Peripherials,
Personalization,
PowerControl,
Sound,
System,
WebBrowsing,
u kojima se nalaze brojni parametri kojima se podešava izgledi i funkcionalnost KDE
grafičkog okruženja.
Pojedine grupe sadržavaju sljedeće postavke:
Filebrowsing grupa sadrži postavke za podešavanje Konqueror upravitelja
datotekama (File Manager), a ovdje se također podešava koja aplikacija
otvara koji tip datoteke (File Associations),
Information - ovdje se nalaze korisne informacije o stanju sustava i uređaja,
LookNFeel je najzanimljivija grupa za većinu korisnika. U ovoj grupi
parametara moguće je u potpunosti podesiti izgled i neke funkcije KDE
sučelja. Između ostalog, ovdje se podešavaju boje, podloga, izgled prozora,
screensaver, zvukovi, teme itd.,
Network grupa sadrži najosnovnije postavke vezane uz mrežu. Većina
mrežnih KDE aplikacija koristi ovdje unesene parametre,
Peripherials grupa služi za podešavanje miša, tipkovnice i podrške za
digitalne kamere. Ovdje se odabire podrška za Hrvatsku tipkovnicu, koja je
neophodna za pravilan prikaz naših (šđčćž) i nekih specifičnih znakova kao
npr. @, |, § na ekranu. Na istom mjestu podešavaju se postavke tipkovnice i
miša vezane uz osjetljivost i brzinu,
Personalization grupa sadrži postavke vezane uz jezik, set znakova
(charachter set) provjeru pravopisa, kao i neke parametre važne za pojedine
države (valuta, format datuma i vremena itd.). Uz pravilno podešenu
tipkovnicu u grupi Peripherials, za prikaz naših znakova potrebno je
podesiti i set znakova na iso-8859-2,

990/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

PowerControl sadrži postavke za kontrolu štednje energije, kao npr.


isključivanje monitora i standby mod. U ovoj grupi nalaze se i parametri za
praćenje statusa baterije, koji su vrlo korisni kod prijenosnih računala,
Sound grupa sadrži parametre vezane uz reprodukciju zvuka u KDE
grafičkom okruženju. Sve KDE audio aplikacije uzimaju ove parametre kod
reprodukcije zvuka,
System grupa služi za konfiguraciju printera, login menadžera, datuma,
izgleda konzole i još nekih parametara vezanih uz sustav. Za promjenu
većine parametara u ovoj grupi korisnik mora imati root ovlasti,
WebBrowsing grupa definira parametre važne za web preglednike.

Opća svojstva
KDE sučelje je svojim izgledom i rasporedom elemenata vrlo slično MS Windows
grafičkom sučelju. Ikone se na radnu površinu postavljaju pritiskom na desni gumb miša, a
sve aplikacije se pokreću iz Start izbornika koji se nalazi u donjem lijevom uglu i označen je
velikim slovom K. Ikone za pokretanje aplikacija u Start izborniku razvrstane su (ovisno o
njihovoj funkciji) u odgovarajuće grupe:
Amusement - igre i ostali programi namijenjeni za zabavu,
Applications - važnije 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 - mrežni klijenti (web, mail, news grupe),
Office - uredski alati,
Terminals - terminali.
Prilikom instalacije aplikacija iz distribucije i ostalih aplikacija napisanih za KDE
grafičko okruženje, ikone tih aplikacija automatski će se pojaviti u odgovarajućoj grupi u
Start izborniku. Ukoliko se ikona nakon instalacije ne pojavi u Start izborniku potrebno je
izdati naredbu update-menus koja će osvježiti izbornike.

991/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Slika 3.2 KDE grafičko sučelje

Najvažnije ikone koje se postavljaju automatski prilikom instalacije su linkovi na


aplikacije Trash, Xkill, Control Center, Home i Internet. Aplikacije Trash i Internet vrlo su
slične aplikacijama Recycle Bin i Internet iz MS Windows operativnog sustava, tj. služe za
povratak obrisanih datoteka i spajanje na Internet. Ukoliko prije prvog pokretanja aplikacije
Internet nije podešen način spajanja na Internet, otvoriti će se čarobnjak za konfiguraciju veze
koji će nakon ispravnog podešavanja nekoliko opcija pokrenuti vezu. Aplikacija Xkill služi za
uklanjanje programa koji su se "zamrznuli", a Control Center služi za podešavanje
operativnog sistema.
U samom dnu ekrana nalazi se traka s pokrenutim aplikacijama i ikonama za najvažnije
aplikacije (KDE Panel), a tu su također sat i ikone za odabir virtualnih radnih površina. Ikone
za pokretanje aplikacije mogu se dodavati u traku pomoću Start ->Configure Panel->Add-
>Button, a u Configure Panel izborniku nalaze se i ostale opcije za podešavanje izgleda i
funkcionalnosti KDE trake s aplikacijama. Detaljne upute za rad u KDE sučelju i svim
pratećim aplikacijama nalaze se u Start -> Documentation -> Help.

992/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Zaključak

KDE grafičko sučelje je vrlo stabilan i dobar proizvod, s kojim dolazi mnoštvo
kvalitetnih aplikacija koje su većini korisnika dovoljne za svakodnevan rad na računalu. Za
razliku od nekadašnjih grafičkih sučelja za Linux operativni sustav, KDE kao i Gnome sučelje
slijedi filozofiju MS Windowsa, pa je korisnicima naviknutima na rad u MS Windows-ima
prijelaz na KDE prilično bezbolan.
Testirana grafička sučelja za Linux operativni sustav pokazala su se vrlo kvalitetnim. Po
svojim mogućnostima konfiguracije i prilagođavanja korisniku nadmašuju MS Windows
grafičko sučelje. Jednostavna su za korištenje i pružaju sve prednosti point-and-click
tehnologije.
Gledano sa strane korisnika, razlike između ta tri sučelja vrlo su male (između GNOME
i Ximian GNOME paketa gotovo da ih i nema) i po mogućnostima i po načinu korištenja.
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 približno jednaki za sva tri sučelja. Minimalna preporučena
konfiguracija za sva tri sučelja je PI na 166MHz sa 128MB RAM memorije. Na slabijim
konfiguracijama pokretanje grafičkog sučelja previše usporava rad za normalno korištenje
računala. Testiranja su pokazala da na slabijim konfiguracijama računala GNOME i Ximian
GNOME rade brže od KDE grafičkog sučelja. Na jačim konfiguracijama (PII na 400MHz sa
256MB RAM memorije) razlika u brzini rada je neprimjetna.

993/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

XIMIAN

Ximian je grafičko okruženje za Linux i Unix operativne sustave koje korisnicima


omogućava jednostavnu primjenu i konfiguraciju računala. Izgledom i načinom korištenja
vrlo je slično grafičkom okruženju iz MS Windows operativnog sustava.
Ximian okruženje samo je nadogradnja GNOME paketa tako da su ta dva okruženja
izgledom i načinom korištenja jednaka. Razlikuju se samo u aplikacijama koje dolaze s tim
paketima. Aplikacijski softver koji dolazi s Ximian paketom je malo dorađen u odnosu na
aplikacije koje dolaze s GNOME paketom. Za razliku od GNOME paketa, u Ximian su
uključene samo provjerene i stabilne aplikacije.
S grafičkim okruženjem dolaze i alati za konfiguraciju samog grafičkog sučelja, alati za
konfiguraciju računala i paket aplikacija koje se nalaze u rasponu od malih korisničkih
programa pa sve do moćnih uredskih aplikacija. Zajedničke značajke tih aplikacija su
besplatnost, jednostavnost za korištenje, brzi razvoj i dostupnost su preko Interneta. Uredske
aplikacije koje su uključene u Ximian Desktop paket pod zajedničkim imenom su:
Gnumeric - spreadsheet aplikacija,
AbiWord - program za obradu teksta,
Mozilla - Web preglednik,
GIMP - program za obradu slike,
GNUCash - program za praćenje osobnih financija,
Evolution - program za elektroničku poštu u koji je uključen i osobni
organizator,
StarOffice - skup uredskih programa sličan MS Office paketu iz MS
Windows okruženja,
Red Carpet - program za manipulaciju softverom (instaliranje novog
softvera, nadogradnja ili uklanjanje starog).

Opća svojstva
Budući da je Ximian grafičko okruženje samo nadogradnja GNOME paketa s njim
dolazi isti softver za konfiguraciju. Program Kontrolni Centar za podešavanje grafičkog
sučelja je isti kao i u GNOME paketu.
Slika 4.1 prikazuje tipičan izgled Ximian grafičkog okruženja.

994/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Unix desktop system

Slika 4.1 Ximian grafičko okruženje

Grafičko sučelje i rad s njim isti su kao u slučaju GNOME grafičkog okruženja. Jedina
razlika između 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.

Zaključak
Ximian je grafičko okruženje za Linux i Unix operativne sustave koje korisnicima
omogućava jednostavnu primjenu i konfiguraciju računala. Izgledom i načinom korištenja
vrlo je slično grafičkom okruženju iz MS Windows operativnog sustava tako da će ga
korisnici koji imaju iskustva s MS Windows grafičkim okruženjem vrlo brzo naučiti koristiti.
Ximian je samo nadogradnja GNOME paketa tako da su ta dva grafička okruženja vrlo slična
izgledom i načinom korištenja. Razlika između GNOME i Ximian Desktop paketa je u
popratnim aplikacijama koje s njima dolaze. Kao i u GNOME paketu, u Ximian Desktop
paket uključeni su i programi za konfiguraciju računala iz grafičkog okruženja što uvelike
olakšava rad neiskusnim Linux korisnicima.

995/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Daniel Van Schepdael

DNS I DHCP

996/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

DNS

Server imena domena (Domain name server, kraće DNS) je internetska direktorijska
služba. Pomoću DNS se imena domene prevode u IP adrese, DNS također upravlja
prijenosom e-mail-a. Ukoliko računalo ne bi moglo pristupiti DNS-u, ne bi mogla pronaći
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 raspoređeni po
cijelom internetu, koji odgovaraju na upite bazirane na resource records pohranjene u zonama
od kojih imaju kopije. Cashing serveri traže podatke od drugih servera i cashiraju odgovore.
Većina 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 tisuća zona,
ali većina servera imena su autoritativni serveri za samo nekoliko zona.

Paul Mockapetris osmislio je DNS 1984. godine da riješi sve veće probleme sa starijim
sustavom mapiranje ime-adresa. Stari sustav se sastojao od jedne datoteke pod nazivom
tablica-domaćina (host-table), koja je održavala 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-domaćina postala sve nepraktičnija. Iako je
dobro funkcijonirala za mapiranje ime-adrese, nije bila praktična ni efikasna za
prilagođavanje i distribuiranje podatake. Pošto je stabilnost interneta u pitanju Mockapetris i
još par ljudi su odlučili pronaći bolji način.

Tako je nastao DNS. Dobra stvar je to što nijedna organizacija nije sama odgovorna za
prilagođavanje. DNS je vrsta distribuirana baza podataka; podijeljena je preko puno servera u

997
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

cijelom svijetu. Nijedan server ne pohranjuje sve podatke. Zbog toga DNS praktički
dozvoljava neograničen 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 može biti dio jedne druge domene, npr. računalo dvs pripada i .hr domeni i
.com domeni.
Popis 7 glavnih domena:
.com Komericijalne organizacije
.edu Obrazovne institucije
.gov Državne institucije
.mil Vojne institucije
.net Veliki mrežni centri za podršku
.org Organizacije koja ne spadaju među prijašnjih
.int Međunarodne organizacije
.arpa je posebna domena koja se koristi za adresa-ime mapiranje.

DNS server je računalo koje koristi DNS software. Pošto većina 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 trži podatke od drugog servera.
Kad se upiše URL u internet browser, ona šalje upit najbližem 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 pošalju stari podaci), onda će naći podatke u svom cashe-u
i odgovoriti.

998
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Ukoliko server ne zna za to ime domena, onda resolver pokušava ''riješiti'' problem
slanjem upita drugom serveru koji se nalazi višlje na stablu. Ukoliko to ne riješi problem,
onda će taj drugi server isto poslati upit dalje – sve dok se ne nađe 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 pronađeni, šalju se natrag browser-u, i browsera se upučuje se na traženu
internet stranicu. Obićno se taj proces brzo odvija , ali može se dogoditi da potraje i dulje (15-
ak sekundi). U najgorim slučajevima se može dogoditi da se pojavi poruka da domena ne
postoji, iako postoji.
To se događa jer autoritativnom serveru treba dosta vremena da odgovori na upit, a
računalo ističe vrijeme čekanja. Nakon isteka vremena računalo odbaci spoj. Kasnijim
pokušajem postoji velika mogućnost da će proraditi, jer je autoritativnom serveru prošlo
dovoljno vremena da odgovori i prvi sever je pohranio podatke u svom cash-u.

DNS konfiguracija

DNS omogućava sustavima da pretražuju host name-ove u lokalnoj mreži i na internetu.


Ovdje je korišten BIND 8.2 za primjer.

DNS server konfiguracija


Za konfiguraciju DNS poslužitelja treba se napraviti nekoliko tekstualnih datoteka.
Daemon DNS (nazvan named) poslužitelja prvo provjerava boot datoteku. Ta boot datoteka
određuje daemonu koja daljnje datoteke treba provjeriti za prikupljanje podataka potrebnih za
posluživanje imena domene.

Biranje Domene
Treba se izabrati ime domene prije nego što se konfigurira DNS poslužitelj.
Ovdje se koristi primjer dvs.net.hr. Boot Datoteka Named provjerava boot datoteku pri
pokretanju tako da se početne postavke i podaci mogu učitati.
Primjer named.conf datoteke :

999
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

#
# Boot file for server solaris, primary server
# for dvs.net.hr.
#

options {
directory "/var/named";
forwarders {
299.18.99.151;
299.8.183.1;
};
forward first;
dialup yes;
heartbeat-interval 1440;
};

zone "." {
type hint;
file "named.ca";
};

zone " dvs.net.hr." {


type master;
file "private.hosts";
};

zone "3.5.10.in-addr.arpa." {
type master;
file "private.rev";
};

zone "0.0.127.in-addr.arpa." {
type master;
file "private.local";
};

Named.conf datoteka za BIND

1000
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Značenje ovih linija su:

directory
Direktorij pod kojeg se mogu pronaći datoteke. /var/named direktorij je tradicijonalan
iako se konfiguracijske datoteke najčešće nalaze u direktoriju pathname/etc.
forwarders
Popis IP adresa kojima se šalju upiti.
forward
Način na kojem se šalju upiti. Upiti se šalju prvo adresama navedenima u forwarders.
Samo ako nijedan poslužitelj ne odgovori ovaj će poslužitelj sam obaviti posao. Ako se ova
postavka postavi na “only”, onda ovaj poslužitelj nikada ne obavlja pretrage sam.
dialup
Označava da ovo računalo koristi Dial-up.
heartbeat-interval
Interval u kojem se obavlja održavanje, izraženo u minutama. Ova postavka je inicijalno
postavljna na 60min.
zone
Podaci o određenoj domeni. Linija pod navodnicima daje ime domene.
type
Vrsta podataka domene. “hint” znači da podaci služe za pronalaženje glavnih
poslužitelja domena (root domain server). “master” znači da je ovaj poslužitelj glavni za ovu
domenu.
file
Datoteka iz koje se učitavaju podaci poslužitelja imena.

/var/named/named.ca Datoteka:
Kad poslužitelj obavlja svoj posao (ali ne kada šalje upite), treba mu početna točka za
pretraživanje domena. Ova datoteka sadrži IP adrese poslužitelja za glavnu domenu.
Prvi dio ove datoteke pokazuje da su poslužitelji imena za glavne domene ovi koji su
navedeni. Drugi dio pokazuje IP adresu svakog poslužitelja imena. Brojevi (518400 i
3600000) određuju time-out za ove unose. Ovi brojevi moraju biti dovaljno veliki da time-out
ne bi bio problem.

1001
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

. 518400 IN NS D.ROOT-SERVERS.NET.
. 518400 IN NS E.ROOT-SERVERS.NET.
. 518400 IN NS I.ROOT-SERVERS.NET.
. 518400 IN NS F.ROOT-SERVERS.NET.
. 518400 IN NS G.ROOT-SERVERS.NET.
. 518400 IN NS A.ROOT-SERVERS.NET.
. 518400 IN NS H.ROOT-SERVERS.NET.
. 518400 IN NS B.ROOT-SERVERS.NET.
. 518400 IN NS C.ROOT-SERVERS.NET.
;
; Addresses
;
D.ROOT-SERVERS.NET. 3600000 IN A 128.8.10.90
E.ROOT-SERVERS.NET. 3600000 IN A 192.203.230.10
I.ROOT-SERVERS.NET. 3600000 IN A 192.36.148.17
F.ROOT-SERVERS.NET. 3600000 IN A 192.5.5.241
G.ROOT-SERVERS.NET. 3600000 IN A 192.112.36.4
A.ROOT-SERVERS.NET. 3600000 IN A 198.41.0.4
H.ROOT-SERVERS.NET. 3600000 IN A 128.63.2.53
B.ROOT-SERVERS.NET. 3600000 IN A 128.9.0.107
C.ROOT-SERVERS.NET. 3600000 IN A 102.33.4.12

Inicijalna named.ca Cache datoteka za BIND

/var/named/private.hosts datoteka:
Ova datoteka sadrži IP adrese privatne mreže.
Primjer private.hosts datoteke:

@ IN SOA solaris.dvs.net.hr.
root.solaris.dvs.net.hr. (
2000050201 ; Serial

1002
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

10800 ; Refresh - 3 hours


3600 ; Retry - 1 hour
432000 ; Expire - 1 week
86400) ; Minimum - 1 day
IN NS solaris.dvs.net.hr.

name ttl class type data


localhost IN A 127.0.0.1
solaris IN A 10.5.3.1
win95 IN A 10.5.3.21
linux IN A 10.5.3.22

mail IN CNAME solaris


www IN CNAME solaris

dvs.net.hr. IN MX 10 solaris.dvs.net.hr.
dvs.net.hr. IN A 10.5.3.1

private.hosts datoteka za BIND

Objašnjenje koda:
@
Domena. Ovo je skraćenica za domenu koja je navedena u named.conf datoteci
(dvs.net.hr u ovom slučaju).
IN
Internet. Upućuje da se radi o zapisu za internet.
SOA
Source of Authority. Ovaj unas sadrži podatke o tome koje je računalo glavni poslužitelj
imena za ovu domenu (solaris.dvs.net.hr u ovom slučaju) i komu se treba obratiti u slučaju
problema (root.solaris.dvs.net.hr). Serijski broj se koristi da se označi gdje su se dogodile
promjene. Ostali brojevi daju vrijeme isteka za podatke koji ovaj poslužitelj nudi. Serijski
broj se treba povećavati sa svakom verzijom datoteke.

1003
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

NS
Name Server. Ova linija upućuje na to da je solaris.dvs.net.hr poslužitelj 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 nužno, ali upućuju
upite za www.dvs.net.hr prema solaris.dvs.net.hr
MX
Mail Exchange. Ova linija upućuje sustavu gdje se mail za korisnik@dvs.net.hr treba
poslati (solaris u ovom slučaju).

The /var/named/private.rev file


Ova datoteka dopušta “obrnutu pretragu”. S ovom datotekom sustav može dobiti ime
host-a na temelju IP adrese. Primjer private.rev datoteke:
;name ttl class type data
;
; Source of authority
@ IN SOA solaris.dvs.net.hr.
root.solaris.dvs.net.hr. (
2000050201 ; Serial
10800 ; Refresh - 3 hours
3600 ; Retry - 1 hour
432000 ; Expire - 1 week
86400) ; Minimum - 1 day
IN NS solaris.dvs.net.hr.
;
; Machines names
;
;name ttl class type data
1 IN PTR solaris.dvs.net.hr.
21 IN PTR win95.dvs.net.hr.
22 IN PTR linux.dvs.net.hr.

private.rev datoteka za DNS

1004
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

/var/named/private.local datoteka:
Ova datoteka dopušta “obrnutu pretragu” za localhost adresu. Ova datoteka nije nužna.
Primjer private.local datoteke:

;
; Reverse address file for localhost
;
;name ttl class type data
;
; Source of authority
@ IN SOA solaris.flibble.orac.net.au.
root.solaris.flibble.orac.net.au. (
2000050201 ; Serial
10800 ; Refresh - 3 hours
3600 ; Retry - 1 hour
432000 ; Expire - 1 week
86400) ; Minimum - 1 day
IN NS solaris.flibble.orac.net.au.
;
; Machines names
;
;name ttl class type data
1 IN PTR localhost.

private.local datoteka za DNS

Pokretanje named Daemon


Kad se imaju datoteke potrebne da se konfigurira named može se pokrenuti
/usr/local/sbin/named daemon. Ovaj daemon će učitati /usr/local/etc/named.conf
datoteku za svoju konfiguraciju.

1005
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

DHCP

DHCP (Dynamic Host Configuration Protocol), je protokol za dodjeljivanje dinamične


IP adrese uređajima na mreži. Sa dinamičnim dodjeljivanjem adrese, uređaj može imati
različitu adresu svaki put kad se spoji na mrežu. U nekim sustavima može se čak i promijeniti
adresa dok je uređaj još spojen na mrežu. DHCP podržava i mješanje dinamične i statične
adrese. Dinamično adresiranje olakšava posao administriranje mreže, jer software sam prati IP
adrese, tako da nema potebe za administratora da obavlja taj posao. Ovo znači da se može
dodati novo računalo na mrežu bez potrebe za ručno postavljanje IP adrese. Puno ISP-a
(Internet Service Providers) koriste dinamične adrese za dial-up korisnike.
Računala koja su namještena da koriste DHCP nemaju potrebu da se ručno postave
mrežne postavke, umjesto toga oni zatraže te postavke od DHCPD servera. Računala se ne
trebaju namjestiti da koriste određeni DHCP server, jer routeri se namješteni da prosljeđuju
DHCP zahtjeve točnim DHCPD serverima.
Od dvije vrste IP adrese koje postoje, statične se dodjeljuju serverima, routerima i
kabelskim modemima, a dinamične se dodjeljuju dial-up korisnicima.

DHCP je nastavak BOOTP-a, koji je prijašnji način dodjeljivanje IP adrese. Postojeći


BOOTP uređaji mogu komunicirati sa DHCP serverima i mogu dopustiti DHCP zahtjevima
da prođu kroz BOOTP servere. Zbog toga što su kompatibilni u natrag, administratorima je
jednostavno da nadograde uređaje 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
«posuđivanja», sa kojim server može dodjeliti adresu na određeno vrijeme. Ukoliko ima više
uređaja nego adresa, onda se koriste adrese sa kraćim vremenima trajanja da ne dođe do
manjka adrese. Ukoliko ima više adresa nego uređaja onda se dodjeljuju stalne adrese slične
onima u BOOTP sustavu.
Kad se DHCP uređaj po prvi put spoji na mrežu, ona pošalje DHCPDISCOVER paket.
DHCP server će na lokalnom segmentu vidjeti poruku i vratiti će DHCPOFFER paket, koji
sadrži IP adresu i drugih podataka. Server može, 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Client može dobiti više DHCPOFFER paketa od više servera, pa mora birati jedan od
njih. Tako pošalje DHCPREQUEST paket, koji identificira određeni server i ponudi
«posudbi» koja najbolje odgovara. Odluka se može zasnivati na tome koji server daje najdulju
«posudbu», ili koji nudi najviše podataka koji su određenom 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 više ne vrijedi (moguće 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
počeo iz početka.
Kad client dobije DHCPACK paket, vlasništvo i održavanje «posudbe» postaju
odgovornost clienta. Client-i bi trebali testirati adresu koja im je ponuđena slanjem ARP
upita, pa ako neki drugi čvor odgovori na upit client će pretpostaviti da je ponuđena adresa
već u uporabi. Tada bi client trebao odbaciti ponudu slanjem DHCPDECLINE poruke serveru
koji je bio ponudio. Isto će poslati novi DHCPREQUEST paket, pokrenući 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 može
osloboditi i ponuditi drugim korisnicima. Ukoliko server ne dobije potvrdu od clienta za
nastavak korištenja, označava posudbu kao ne-obnovljenu i učini je dostupnom za druge
client-e.

Podatke koje DHCP server nudi:


DHCP server normalno nudi slijedeće podatke client-u:
* Client IP number
* Router/gateway adresa
* Subnet maska
* Broadcast adresa
* DNS adrese
* DNS domene

1007
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

DHCP server može također nuditi slijedeće podatke client-u:


* BOOTP
* TFTP server
* Netbios name server
* Novell server
* Wins serveri
* Hostname
* vrijeme posudbe (za dinamično dodijeljene IP adrese)

DHCP jezik:

DHCP server i DHCP client se sporazumiju sljedećim porukama:

DHCPDISCOVER Ove molbe se šalju kad client traži DHCP uslugu


Ove odgovore šalje server kao odgovor na
DHCPOFFER
DHCPDISCOVER poruku. Sadrže ponudu IP adresa
Ove molbe se šalju kao odgovor serveru na
DHCPOFFER poruku, tražeći adresu koju je server
DHCPREQUEST
ponudio; ili kad DHCP posudba dođe do polovice
trajanja, tražeći produženje roka adrese.
Odgovor servera na DHCPREQUEST poruku. Sadrže
DHCPACK potvrdu da je posudba zatražena, da može koristiti tu
IP adresu.
Ove odgovore šalje server kao odgovor na
DHCPREQUEST poruku. Sadrže potvrdu da je
DHCPNAK posudba zatražena, da NE može koristiti tu IP adresu.
Client-u se uglavno odbije zatraži posudbu IP adrese
koju koristi već drugi client.
Ove odgovore šalje client kad se ponuđena adresa već
DHCPDECLINE
koristi.

1008
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Ovu molbu šalje client kad je konfiguriran na neki


DHCPINFORM drugi naćin. Ove molbe se šalju kao upit za postavke
za mrežu na koju su spojeni.
BOOTREQUEST Molba koju client šalje kad traži BOOTP adresu.
Odgovor koji se šalje client-u kao odgovor na
BOOTREPLY
BOOTREQUEST sa BOOTP adresu.
Ovo su poruke koji DHCP server iz nekog razloga
Discarded odbaci. Najčešće je to zbog loše konfiguriranog
Windows NT računala.

Konfiguriranje DHCP servera

DHCP.conf datoteka je vrlo jednostavna. Počinje sa uvodom, koji sadrži globalne


parametre postavke samog servera. Ovaj uvod, osim ako je drugaće navedeno, vrijedi za sve
subnet-e. Nakon toga slijede deklaracijske postavke za sve subnet-e koji su dostupni sa
servera, bez obzira da li oni koriste DHCP usluge ili ne.
U najjednostavnijem obliku, unos konfiguracije DHCP-a se sastoji od subnet adrese,
mrežne maske (netmask) i dosega IP adrese, pa se može imati nešto kao npr.:

subnet 10.2.0.0 netmask


255.255.0.0
range 10.2.3.0 10.2.3.200;

ovaj unos se odnosi na klasu A mreže 10.2.0.0.. Međutim, samo adrese na manjoj mreži
(10.2.3.0.) su dostupne. Čak ni sve adrese u toj mreži nisu dostupne, jer je najveća adresa
10.2.3.200.
Opcije u dhcp.conf datoteci imaju uglavom slijedeću sintaksu:
opcija opcija-ime opcije-podaci
Neke opcije su IP adrese ili imena domaćina (hostnames), neke su brojevi ili tekst, dok
su neke Boolean vrijednosti (true/false, on/off). Treba navesti riječ option tako da bi DHCP
server znao da je ono što slijdi opcija, a ne deklaracija subnet-a ili nešto drugo.

1009
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Slijedeća tablica nudi pregled najčešćih DHCP opcija. Postojih još, ali većina njih se
odnose na specifične protokole ili servere

Parametar Opis Vrsta podataka

default-lease-time Standarna dužina trajanje posudbe Numerični

domain-name Ime domene za spcifičan subnet Tekst

domain-name-
Lista servera imena za specifičan subnet. Lista IP adresa
servers

Statična adresa koja se dodjeljuje host-u


fixed-address Lista IP adresa
(podržava više mreža)

group Počinje skupnu deklaraciju N/A

Vrsta mrežne opreme (trenutno su samo


hardware Tekst,adrese: oktete
Ethernet i token ring podržani)

Host Počinje deklaraciju host-a N/A

host-name Ime koje se dodjeljuje host-u Tekst

Maksimalni rok izraženo u sekundima


max-lease-time Numerični
koji server daje posudbe

netbios-name-
Ime WINS servera Lista IP adresa
servers

Doseg IP adresa koja se dodjeljuje


range niska i visoka IP adresa
specifičnoj mreži

routers Popis routera koje se mogu upotrijebiti Lista IP adresa

shared-network Započne shared-network deklaracije N/A

subnet Započne subnet deklaracije N/A

subnet-mask Subnet-maska od ove mreže IP adresa

1010
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Jedna od najspecifičnijih definicija je hardware, koja opisuje specifičan hardware.


Trenutno su samo ethernet i token-ring podržani. Sintaksa koja se koristi za ovo je takva da se
napiše vrsta hardware, pa fizička adresa mrežne kartice (npr. MAC adresa). Dobije nešto kao
što je ovo:
host dvs
hardware ethernet
00:50:04:53:F8:D2;
fixed-address 192.168.42.3:
Ovaj primjer pokazuje da računalo dvs ima Ethernet mrežnu 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 određeni broj računala na mreži bez da ih se odvoji
u poseban subnet, npr.: mogao bi se definirati subnet za skupinu računala i odrediti specifične
opcije za samo taj subnet. Međutim, to znači da se trebaju odrediti sve potrebne opcije za
konfiguraciju, a i značilo bi da specijalni čvori ne mogu imati IP adresu u istom subnetu kao
druge.
Da se prevladaju ova ograničenja, mogu se spojiti računala u jednu skupinu koristeći
kjučnu riječ group. Na ovaj način 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

U ovom primjeru, je postavljeno standardno vrijeme posudbe za skupinu da je 300000


sekundi (skoro četiri dana) i da je router uređaj sa adresom 192.168.42.1. ova definicija
vrijedi za sva tri domaćina koja su navedena (jupiter, saturn i uran). Međutim, kod jupitera je
standardno vrijeme posudbe postavljeno na veću vrijdnost 500000 (skoro šest dana), ali
definicija routera (192.168.42.1.) i dalje vrijedi.
Ponekad se može pojaviti potreba za konfiguriranje nekoliko mreža na istom fizičkom
segmentu mreže. Postoji više razloga zašto bi se to učinilo, kao što je ograničivanje određenih
uređaja na određene segmente mreže. DHCP dopušta konfiguriranje sistema na taj način
određivanjem shared-network.
Shared-network je u biti spremište za skupinu računala. Drugačije je od skupne
deklaracije u tome što može sadržavati subnet-e i skupine. Ima sljiedeću 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 određene


parametre za odvojene host-e, kao da nisu dio shared network.

Riješavanje mogućih problema servera

Sa kompleksnim DHCP konfiguracijama, često je teško reći koje parametri se odnose


na koji host, ali treba upamtiti dvije stvari: prvo, host ili skupne deklaracije mogu premostiti
globalne deklaracije i host deklaracije mogu premostiti skupne deklaracije. Drugo, definicije
se ne primjenjuju nužno redosljedom kojim su zapisane u dhcpd.conf datoteci. Vrijednosti se
primjenjuju u odrđenom redosljedu počevši od specifičnijih od općenitijih tj. server prvo traži
određene konfiguracije host-a, pa skupne konfiguracije, pa subnet konfiguracije, pa
konfiguracije shared-network, pa globalne konfiguracije. Konfiguracijske opcije se ne brišu,
nego se dodavaju. Konfiguracije za manje, specifičnije jedinice (npr. Host) premoste

1012
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

konfiguracije za opčenitije jedinice (globalne parametre). Kad se riješavaju problemi, uvijek


se počinje na dnu pa se ide prema gore.
Najosnovniji način rješavanja problema je promatranje posudbe koju je server dodijelio.
To se gleda u datoteci za posudbe (/var/state/dhcp/dhcp.leases), koja održava 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, može se dogoditi da server tad prestane raditi. Ako se to dogodi,
dhcp.leases datoteka više ne postoji više postoji i server se ne može ponovno pokrenuti. Pošto
ne može jednostavno stvoriti novu dhcp.leases datoteku, treba staru dhcp.leases~ datoteku
preimenovati u dhcp.leases.
Sadržaj dhcp.leases datoteke je jednostavan. Svaka deklaracija posudbe se identificira sa
klučnom riječi posudbe nakon koje slijedi IP adresa i blok konfiguracijske podatke, pa se
dobije nešto 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 označavaju razdoblje u kojemu posudba vrijedi, svaki unos je oblika:
weekday yyyy/mm/dd hh:mm:ss;

Weekday je brojčana vrijednost za dan (0 za nedjelju, kao što je ovdje slučaj), datum i
vrijeme se računaju po Greenwich Mean Time, a ne po lokalnom vremenu.
Unos hardware-a je isti kao što je u dhcp.conf datoteci i daje adresu mrežne kartice. Uid
unos je jednoznačan identifikator za client, koristeći ASCII-string identifikator koji daje client
ili vrsta hardware-a sa adresom hardware-a (u ovom primjeru 01).

Konfiguracija client-a

1013
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Kako se konfigurira client ovisi o distribuciji. Ako se izabere DHCP, /etc/rc.config


datoteka će biti promjenjena postavljanjem konfiguracijske parametre za mrežnu karticu na
"dhcpclient". Npr. bez DHCP imalo bi se nešto 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"

Može se konfigurirati tako da neki uređaji koriste DHCP, a drugi statične adrese. Kad se
sustav pokrene, poziva se /etc/rc.d/network scripta. Ako je IPCONFIG linija jednaka "
dhcpclient" za odgovarajuću mrežnu karticu, onda se preskače konfiguracija za tu karticu.
Kasnije, za vrijeme boot procesa, scripta DHCP client-a, client će zatražiti
konfiguraciju od DHCP servera.
U većini slučajeva je standardna koniguracija client-a dovoljna. Ukoliko ne bi bila,
client ima svoju konfiguracijsku datoteku: /etc/dhcclient.conf. Ukoliko postoji više uređaja na
mreži sa razičitim postavkama, onda se postavke trebaju staviti u skupinama po uređajima, pa
se može dobit ovako nešto:
interface eth0
send dhcp-lease-time 3600;
request subnet-mask, broadcast-
address,time-offset, routers,
domain-name, domain-name-servers,
host-name;
require subnet-mask, domain-name-servers;

Naredba send kaže client-u da šalje pojedine postavke sa određenim vrijednostima. To


mogu biti bilo koje postavke koji server razumije.
Request naredba je lista konfiguracijskih postavki (ne i vrijednosti) koje client zatraži
od servera da mu pošalje. Klučna riječ "request," znači da server mora određenu
konfiguracijsku postavku poslati da bi client mogao prihvatiti serverov odgovor.

1014
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Dns i dhcp

Sigurnost

Na prvi pogled može se činiti da nema puno potrebe za osiguravanjem DHCP sustava.
Međutim, s obzirom koliko je DHCP važan, valjalo bi postaviti neke sigurnosne mjere.
Prva stvar je sam uređaj. Iako nestanak struje od nekoliko sati ne može stvoriti puno
problema , duži nestanak struje bi mogla značiti da neka računala 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 uređaji, na kojima DHCP radi pored još drugih uređaja.

Druga stvar koja se mora uzeti u obzir je denial-of-service napad. Ako bi DHCP server
bio dostupan sa interneta, bilo bi moguće za nekoga da zauzme sve IP adrese, pa ne bi ostale
adrese za druga računala. Treba osigurati DHCP promet kroz firewall.

1015
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

Dario Benko

INTERNET HISTORY

1016/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

UVOD

Internet je iz temelja promijenio računalni i telekomunikacijski svijet kao ništa prije.


Postao je sastavni dio mnogih života i jedno od najraširenijih sredstava komunikacije među
ljudima koje svakim danom proširuje svoje mogućnosti.
Ovoj nezapamćenoj integraciji sposobnosti, prvenstveno prikupljanju, pohranjivanju i
dohvatu informacija, te razmjeni podataka i programa sa svih područja ljudskog djelovanja, te
nizu drugih sve naprednijih i nekad nezamislivih stvari prethodili su telegraf, telefon, radio,
prva računala…
Internet je odjednom postao rasprostranjen širom svijeta, pružajući svakome tko ima
tehničke mogućnosti da se koristi njime, bilo gdje na zemlji. Komunikacija među ljudima
postala je sve manji problem bez obzira na udaljenost. On je jedan od najboljih primjera
uspješnog ulaganja u istraživanja i razvoj informatičke infrastrukture.

Ovo je prikaz samo malog dijela događaja koji su prethodili ovoj velikoj mreži bez koje
bi naš današnji svijet bio nezamisliv.

NAPOMENA: događaji koji su prethodili nastanku i razvoju Interneta poredani su


kronološki. Međutim neki događaji dogodili su se na prijelazima između godina ili je još
uvijek upitno kad su se točno dogodili, tako da podatke o godinama ne treba uzimati 100%
sigurnim.

1017/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

Internet history (kronologija)

1836.god. Cook i Wheatstone izumili Telegraf i time pokrenuli revoluciju


(tele)komunikacija.
kao sredstvo takve komunikacije koristilo se Morseovo pismo (abeceda), serija
točkica i crtica. To je opet vrlo slično današnjem, naravno vrlo bržem,
komuniciranju računala, pomoću binarnog koda (0/1).
preko oceana postavljen je Transatlantski kabel koji je po prvi put trebao
omogućiti trenutačnu komunikaciju između SAD-a i Europe. Nažalost, zbog
kvara, u funkciji je bio tek nekoliko dana.

1866.god. pothvat je uspješno ponovljen i originalni Atlantski kabel postavljen te


godine ostao je u upotrebi skoro 100 godina. Danas kablovi spajaju sve kontinente i još su
glavno žarište telekomunikacija. (Godišnja 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 omogućavaju konverziju signala iz digitalnog u audio i time spajanje
računala preko telefonske mreže.

1957.god. (4. listopada) SSSR lansira prvi umjetni zemaljski satelit, Sputnik.
ovo je početak globalnih telekomunikacija. Sateliti danas igraju vrlo važnu ulogu u
prijenosu podataka.

1958.god. (7. veljače) kao odgovor na lansiranje Sputnika i na općenite Sovjetske


istraživačke napore, Ministarstvo Obrane SAD-a (Department of Defense - DoD) objavljuje
direktivu 5105.15 kojom formira agenciju za napredna istraživanja (ARPA - Advanced
Research Projects Agency) u nadi da će u vojnom dijelu preuzeti vodstvo u znanosti i
tehnologiji. Agencija je ujedinila neke od američkih najnadarenijih ljudi i napravila veliki
uspjeh lansiravši prvi američki satelit unutar 18 mjeseci od osmišljavanja agencije. Nekoliko

1018/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

godina kasnije agencija se fokusira na računalno umrežavanje i komunikacijsku tehnologiju te


joj je povjeren zadatak razvijanja pouzdane komunikacijske mreže, naročito za računalnu
upotrebu. Glavna motivacija za ovo je bila imati mrežu decentraliziranih vojnih računala
spojenih na takav način da u mogućem ratu može "preživjeti" uništenje jednog ili nekoliko
čvorišta (nodes), oslanjajući se na komunikaciju između preostalih čvorišta (nodes).

1961.god. Leonard Kleinrock, MIT: "Information Flow in Large Communication Nets".


prvi put izložena packet-switching (PS) teorija.

1962.god. Dr. J.C.R. Licklider je dobio zadatak vođenja glavnih ARPA-inih


istraživačkih zadataka u unapređivanju računalne tehnologije za vojsku. Svojim utjecajem je
također trebao maknuti ARPA-ina istraživanja od privatnih sektora prema sveučilištima
diljem SAD-a. Time je položio temelje za stvaranje ARPANET-a.
razvijene su mreže s prospajanjem paketa - Packet-switching (PS) networks.
Paul Baran (RAND Corporation) objavljuje rad "On Distributed Communications
Networks" u kojem predstavlja mreže s prospajanjem paketa, Packet-switching
(PS) networks. Ovo je bio presudan trenutak prema realizaciji računalne mreže iz
niza razloga:
Internet se oslanja na paketima za prijenos podataka.
podaci su rastavljeni u sitne pakete koji mogu imati različite puteve do odredišta (i
svaki u svom zaglavlju mora nositi globalnu adresu odredišta).
teško prisluškivanje poruka.
moguće više od jednog puta, ako se jedan put "sruši", slijedi drugi.
ako kod bilo koje točke dođe do gubitka paketa, poruka može ponovno biti poslana
(retransmisija).
mreže se mogu oduprijeti velikom stupnju uništenja
(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 Time-


Shared Computers" (listopad).
izložen prvi ARPANET plan.

1019/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

1967.god. na ACM simpoziju operacijskih principa (ACM Symposium on Operating


Systems Principles in Gatlinburg, Tennessee, u kolovozu) - predstavljen je plan za mrežu 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 mreža s
prespajanjem paketa operativna. Paralelni napori u Francuskoj također su
rezultirali ranom packet-switching mrežom na Societe Internationale de
Telecommunications Aeronautiques.
ARPA je ugovorno dodijelila ARPANET BBN-u. BBN je izabraio Honeywell
DDP 516 miniračunalo kao bazu na kojoj će izgraditi prekretnicu (switch).

1969.god. rođenje Interneta.


BBN (Bolt Beranek and Newman, Inc.) dostavlja Interface Message Processor
(IMP) Sveučilištu Kalifornija (UCLA) i ubrzo je izgrađena fizička mreža spajajući
4 čvorišta (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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

1970.god. Norman Abrahamson razvija ALOHAnet na University of Hawaii.


ALOHAnet je pružao background za djelatnost koja kasnije postaje ethernet.
1972.god. - spojen s ARPANET-om.
ARPANET "hostovi" počinju koristiti Network Control Protocol (NCP), prvi host-
to-host protokol. Ovaj protokol je korišten do 1982, kada ga zamjenjuje TCP/IP.
AT&T postavlja (instalira) prvu "cros-county" vezu između UCLA i BBN
(56kbps). Linija je kasnije zamjenjena drugom između BBN-a i RAND-a. Druga
linija je dodana između MIT i Utah-a.

1971.god. Ray Tomlinson, BBN izumio prvi E-mail - program za slanje poruka preko
mreže.
E-mail je još uvijek glavni način komunikacije ljudi preko Interneta.
ARPANET narastao na 15 čvorišta (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 lakše spajanje računala (u mrežu).


prva javna demonstracija ARPANET-a (Bob Kahn, BBN) među 40 mašina
(strojeva). (Demonstracija "packet switch"-a, i TIP-a (Terminal Interface
Processor).

1021/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

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" značenje.

1973.god. globalna mreža postaje stvarnost (ARPANET postaje internacionalan).


prva međunarodna veza prema ARPANET-u: University College of London
(Engleska) i Royal Radar Establishment (Norveška).
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 način 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. umrežavanje se sve više širi svijetom te i kraljica Elizabeta šalje e-mail.
UUCP (Unix-to-Unix CoPy) razvijen u AT&T Bell Labs i distribuiran sa UNIX-
om sljedeće godine. UNIX je bio i još je uvijek glavni operativni sustav korišten
od strane sveučilišta i istraživačkih struktura.
Dr. Robert M. Metcalfe razvija Ethernet, presudni element prema razvoju LAN-a.
- rođen SATNET (Atlantic packet Satellite network) koji je povezivao Ameriku i
Europu. Korišteni su INTELSAT sateliti koje je posjedovao konzorcij zemalja, a
ne isključivo američka vlada.
Department of Defense počinje eksperimentirati sa TCP/IP protokolom i uskoro ga
odlučuje upotrijebiti za ARPANET.

1977.god. E-mail sve više kreće uzlaznom putanjom i Internet postaje stvarnost.

1022/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

Larry Landweber sa Univ of Wisconsin stvara THEORYNET, UUCP temeljen e-


mail sistem, pruža elektronsku poštu prema preko 100 znanstvenika u računarstvu
(pomoću 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 ožujku).

1979.god. rođene 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 višekorisničke stranice. Interaktivne
avanturističke igre, "board games", bogate i detaljne baze podataka.

1980.god. (27.10) ARPANET potpuno stao zbog nehotičnog širenja "status-message "
virusa.

1981.god. BITNET, "Because It's Time NETwork" je kao surađivačka mreža započela
svoj rad kod gradskog Sveučilišta New York, sa prvom vezom prema Yaleu.
utemeljen je CSNET (Computer Science NETwork) kao pružatelj mrežnih servisa,
pogotovo E-maila. CSNET kasnije postaje poznat kao Computer and Science
Network.

1982.god. TCP/IP definira budućnost 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 mreža,
naročito onih koje koriste TCP/IP, i Internet kao spojene TCP/IP Internet.
specificiran External Gateway Protocol (EGP).

1983.god. Internet se sve više širi i dobiva na važnosti

1023/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

na Sveučilištu u Wisconsinu razvijen je Domain Name System (DNS). Nestala je


potreba za pamčenjem 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 između CSNET-a i ARPANET-a.
ARPANET podijeljen na ARPANET i MILNET.
UNIX "mašine" s ugrađenim TCP/IP-om postaju popularne.
ICCB zamjenjen sa Internet Activities Board (IAB).
Berkeley objavljuje novu verziju UNIX-a 4.2BSD ujedinjujući 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 lakše je
upamtiti nešto 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 počeo s postavljanjem novih T1


linija(1.544Mbps), koje će biti završeno do 1988.

1986.god. shvaćena moć Interneta.


5, 000 Hosts. 241 News groups.
osmišljen je NSFNET (osnovna brzina od 56 Kbps) originalno sastavljen od 5
super-računalnih centara spojenih s 56Kbps lines. Druga sveučilišta se uključuju.
NSF osniva 5 super-računalnih (super-computing) centara za pružanje visoko-
računalne snage za sve (high-computing power for all). Ovo omogućuje eksploziju
veza, osobito od između sveučilišta.
stvoren Network News Transfer Protocol (NNTP).
Craig Partridge razvio Mail Exchanger (MX) records.

1987.god. započela je komercijalizacija Interneta.


preko 10,000 "hostova".
UUNET temeljen s Usenix-om osigurava sredstva da pruži komercijalni UUCR i
Usenet pristup.

1024/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

NSF i Merit Network, Inc pristaju na upravljanje NSFNET backbone.


e-mail link uspostavljen između Njemačke i Kine.
1988.god. NSFNET backbone nadograđen (poboljšan) prema T1 (1.544 Mbs),
promet vrlo brzo raste te odmah počinju planovi za nadogradnju novu mreže.
razvijen Internet Relay Chat (IRC).
Kanada, Danska, Finska, Francuska, Island, Norveška, Š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 nosača (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, Njemačka, 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 pružatelj Internet
dial-up pristupa.
Argentina, Austrija, Belgija, Brazil, Čile, Grčka, Indija, Irska, južna Koreja,
Španjolska, Švicarska na NSFNET-u.

1991.god. modernizacija počinje.


Brewster Kahle izumio (osmislio) Wide Area Information Servers (WAIS). Pruža
mehanizam za indeksiranje i pristupanje informacijama na Internetu.
Paul Lindner i Mark P. McCahill sa sveučilišta u Minnesoti objavili Gopher.
Worl-Wide Web (WWW) objavljen od strane CERN-a, razvio ga Tim Berners-
Lee.
NSFNET backbone nadograđen na T3 (44.736Mbps).

1025/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

NSFNET promet prelazi 1 trilijun bajtova/mjesec i 10 bilijuna paketa/mjesec.


Hrvatska, Republika Češka, Hong Kong, Mađarska, Poljska, Portugal, Singapur,
Južna 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,
Slovačka, Slovenija, Tajland, Venecuela na NSFNET-u.

1993.god. WWW revolucija stvarno započinje.


broj hostova 2 milijuna, 600 WWW stranica.
InterNIC stvoren od strane NSF-a, za pružanje specifičnih Internet usluga.
poslovni i medijski svijet zapaža Internet.
Bijela Kuća i Ujedinjeni Narodi postaju on-line.
razvijeno grafičko korisničko sučelje – Mosaic. Kasnije prerasta u Netscape.
WWW se širi sa godišnjom stopom od 341,634 %, a Gopher-ov rast je 997%.
Bugarska, Kostarika, Egipat, Fidži, Gana, Guam, Indonezija, Kazahstan, Kenija,
Lihtenštajn, Peru, Rumunjska, Ruska Federacija, Turska, Ukrayne, UAE,
Djevičanski Otoci na NSFNET-u.

1994.god. komercijalizacija započinje.


broj hostova 3 milijuna. 10,000 WWW stranica. 10,000 News grupa.
ARPANET/Internet slavi 25 obljetnicu.
trgovački centri i banke stižu na Internet.
NSFNET promet premašuje 10 trilijuna bajtova/mjesec.
Alžir, 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

NSFNET se vraća nazad prema istraživačkoj mreži. Glavni dio SAD backbone
prometa sada usmjeren kroz međusobno povezane mrežne dobavljače (network
providers).
WWW premašuje ftp-data (u ožujku) kao servis s najvećim prometom na NSFNet
temeljen na broju paketa, i u travnju temeljen na broju bajta.
tradicionalni on-line dial-up sistemi (Compuserve, America Online, Prodigy)
počinju pružati pristup Internetu.
registracija naziva domene nije više 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 pažnju američkih telekomunikacijskih poduzeća koja
traže od Kongresa SAD-a da zabrani tu tehnologiju (koja je već nekoliko godina
bila uokolo u upotrebi).
započinje WWW rat, primarno borbe između Netscape-a i Microsoft-a, i požuruje
u novo doba softverskog razvoja, pomoću čega su nova puštanja rađena
tromesječno uz pomoć Internet korisnika željnih testiranja predstojećih (beta)
verzija.

1997.god. 19.5 Million Hosts, 1 Million WWW sites, 71,618 Newsgroups.


pretraživači i Web preglednik tehnologije sve popularniji.
17. srpnja ljudskom greškom 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 područjima s čim je do
sada rukovao Network Solutions (InterNIC).

1998.god pretraživačima i Web preglednik tehnologijama popularnost sve više raste.


Američko ministarstvo trgovine (US Depart of Commerce - DoC) – u glavnim
crtama iznijelo svoj plan privatiziranja DNS-a.
uzlet elektroničke trgovine i portala.
Amazon.com pokazuje cijelom svijetu kako trgovati on-line.

1027/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

e-Bay online aukcije također kreću uzlaznom putanjom.


milijuna Web starnica.

1999.god. MCI nadograđuje vBNS prema 2.5 Gbits/sec.


razvijaju se Internet2.
nove optičke mrežne tehnologije počinju preoblikovati Internet "backbone".
priče o stapanju Interneta i javnog telefona ("public telephone system").
prvi "large-scale Cyberwar" istovremeno sa ratom u Srbiji (Kosovo).
virusi godine: Melissa(ožujak) i ExploreZip (lipanj).

2000.god. uzlet XML-a.


maleni mobilni bežični računalni uređaji.
kako se informacije o ljudima šire Internetom, privatnosti je sve manje.
US timekeeper i nekoliko drugih "time servisa" 1. siječnja bilježe godinu kao
19100.
masivni napad na velike web sajtove, uključujući Yahoo, Amazon i eBay u
ožujku, onemogućio im pružanje 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.
GÉANT, "the pan-European Gigabit Research and Education Network" stavljena u
funkciju zamjenjujući tako "TEN-155 network".
radio stanice počinju emitiranje preko Web-a.
visoke škole u pet američkih država (Michigan, Missouri, Oregon, Virginia i
Washington) među prvima dobivaju Internet2 pristup.
Napster prisiljen obustaviti svoje usluge, ali će se ponovno javiti kasnije kao
"subscription service".
Europsko vijeće dovršilo je međunarodni "cybercrime" ugovor i usvojilo ga 9.
studenog. Ovo je prvi ugovor koji obrađuje kaznena djela počinjena preko
Interneta.

1028/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

2002.god. oformljena Global Terabit Research Network (GTRN), spaja Internet2


Abiline, CANARIE CA*net3 i GÉANT.
blog-ovi postaju hit.
američki zakon osmišljava i sprovodi kids-safe domenu, "dot-kids" (kids.us).

2003.god. crv SQL Slammer prouzročio jedan od nejvećih i najbrže širećih DDoS
napada ikada. Za otprilke 10 minuta raširio se po cijelom svijetu, srušio je 5 od 13 DNS root
servera kao i desetine tisuća drugih servera, djelujući i na mnoštvo drugih sistema.
nakon ovog, u kolovozu su uslijedili drugi, Sobig.F virus, najbrže rasprostirući
virus i Blaster (MSBlast), jedan od najdestruktivnijih crva.
Little GLORIAD (Global Ring Network for Advanced Application Development)
počinje djelovati. Sastoji se od umreženog prstena preko sjeverne polutke sa
vezama prema Chicagu, Amsterdamu, Moskvi, Novosibirsku, Zabajkal'sku,
Manzhouliu, pekingu i Hong Kongu. Ovo je prva mrežna povezanost preko
Rusko-Kineske granice.

2004.god. -…

2005.god. - ???

1029/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

PRILOG:

Rast Interneta:

Datum Hosts Datum Hosts Network Domains

12/69 4 07/89 130,000 650 3,900


06/70 9 10/89 159,000 837
10/70 11 10/90 313,000 2,063 9,300
12/70 13 01/91 376,000 2,338
04/71 23 07/91 535,000 3,086 16,000
10/72 31 10/91 617,000 3,556 18,000
01/73 35 01/92 727,000 4,526
06/74 62 04/92 890,000 5,291 20,000
03/77 111 07/92 992,000 6,569 16,300
12/79 188 10/92 1,136,000 7,505 18,100
08/81 213 01/93 1,313,000 8,258 21,000
05/82 235 04/93 1,486,000 9,772 22,000
08/83 562 07/93 1,776,000 13,767 26,000
10/84 1,024 10/93 2,056,000 16,533 28,000
10/85 1,961 01/94 2,217,000 20,539 30,000
02/86 2,308 07/94 3,212,000 25,210 46,000
11/86 5,089 10/94 3,864,000 37,022 56,000
12/87 28,174 01/95 5,846,000 39,410 71,000
07/88 33,000 07/95 8,200,000 61,538 120,000
10/88 56,000 01/96 14,352,000 93,671 240,000
01/89 80,000 07/96 16,729,000 134,365 488,000
01/97 21,819,000 828,000
07/97 26,053,000 1,301,000
01/98 29,670,000
07/98 36,739,000
01/99 43,230,000

1030/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

07/99 56,218,000
01/00 72,398,092
07/00 93,047,785
01/01 109,574,429
07/01 125,888,197
01/02 147,344,723
07/02 162,128,493
01/03 171,638,297

Hosts - kompjutorski sistem s registriranom IP adresom


Networks - registrirana klasa A/B/C adresa
Domains - registriran naziv domene (sa "name server" zapisom)

1031/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Internet history

ZAKLJUČAK :

Put do ovog što danas zovemo Internetom nije bio nimalo lagan i nitko tko je
sudjelovao u njegovom stvaranju nije imao konačnu viziju o tome što će se iz svega toga
izroditi.

Tako je i danas. Internet svakim danom nezaustavljivo raste i nemoguće je predvidjeti


što će se dogoditi u budućnosti. Koliko će opstati? Dali ga išta može 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Amir Kos

Uvod u Perl

1033/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 možda ćini da su brojevi
i stringovi različite stvari,Perl ih tretira kao jednake.
Skalarne vrijednosti se spremaju u skalarne varijable.

Brojevi
U Perlu možete 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 znači 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 način na koji perl interpretira vrijednost u programu,perl prihvaća 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Integer karakteri
npr.:
12
15
-2004
3485

Nikada ne počinjite broj s 0 zato sto perl podržava i oktalne i hexadecimalne vrijednosti
okatalne počinju 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
reći da perl raspolaže sa 256 različitih karaktera(nema ništa posebno oko NUL karaktera '/0'
kao npr. u C).
Najkraći mogući string nema karaktera,najduži string može ispuniti svu vašu raspoloživu
memoriju jer perl slijedi filozofiju tzv. «no-built in limits»,to daje perlu mogućnost
manipulacijom stringovima kao sirovim binarnim podacima zadatak koji bi nekim drugim
alatima predstavljao veliku teškoću…npr. možete patc-ati svoj OS jednostavno čitajući string
u Perl string,napraviti izmjenu i ponovno zapisati rezultat na izlaz!
Kao i brojevi stringovi se prezentiraju karakterima!

Stringovi s jednostrukim navodnicima


Jednostruki navodnici služe perlu kako bi znao gdje string počinje a gdje završava i nisu dio
samoga stringa,bilo koji karakter koji se nađe unutar '' je dio samoga stringa.
Postoje dvije iznimke ako želite unutar stringa upisati jednostruki navodnik morate ga
prethoditi s \ a ukoliko želite unutar stringa ugurati backslash morate ga prethoditi s \

'hello' # pet karaktera: h, e, l, l, o


'don\'t' pet karaktera: d, o, n, jednostruki navodnik ' pa t
'' # prazan string
'silly\\me' # silly\me
'hello\n' # hello +backslash + n

1035/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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 slučajevima kada je na \ dodan još jedan \ ili ' tek
tada ima posebno značenje.

Stringovi s dvostrukim navodnicima


Stringovi s dvostrukim navodnicima se ponašaju vrlo slično C-stringovima,to je opet samo
niz karaktera,samo ovaj puta u s dvostrukim navodnicima,ali u ovom slučaju backslash ima
svoje puno značenje da specificira kontrolne karaktere.

"hello world\n"# hello world, and a newline


"new \007" # new, space, and the bell character (octal 007)
"coke\tsprite" # a coke, a tab, and a sprite
"c:\\temp" # c:, backslash, and temp

Backslash može prethoditi mnogim različitim karakterima a da znače različite stvari


U tablici se nalaze izrazi i njihova značenja:

Izraz Značenje

\n Nova linija

\r Return

\t Tab

\f Formfeed

\b Mjesto unazad(Bckspace)

\v vertikalni tab

\a Bell

\e Escape

\007 Bilo koja octal ASCII vrjed (ovdje, 007 = bell)

\x7f Bilo koja hex ASCII vrjed (ovdje, 7f = delete)

\cC Bilo koji "control" character (ovdje, control C)

1036/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Izraz Značenje

\\ Backslash

\" Dvostruki navodnici

\l Malo slijedeće slovo

\L Sve malo do \E

\u Veliko slijedće slovo

\U Velika slova sev do \E

\Q Backslash quote all nonalphanumerics

\E Terminira \L , \U or \Q

Još jedna uloga dvostrukih navodnika je da interpoliranju varijable,tj ukoliko se unutar


dvostrukih navodnika nađe varijabla vrijednost varijable će biti zamijenjena njenom
vrijednošču,još jedna napomena ukoliko koristite Pathnameove pod Unix-om ili Win32 perl
prihvaća ili \ ili / sa razlikom da \ mora slijediti esape sekvenca

"c:\\temp" # koristi escaped backslash


"c:/temp" # koristi a Unix-style forward slash
"c:\temp" # GREŠKA string sadrži c:, a TAB, and emp

Skalarni Operatori
Operatori na neki način proizvode novu vrijednost iz jedne lili više vrijednosti,operatori
očekuju ili string ili broj,ukoliko proslijedite string gdje se očekuje broj,perl automatski
pretvara po svojim intuitivnim pravilima.
Ukoliko koristite string operand na numeričkom 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 pokušate proslijediti string kada se očekuje broj,numerička vrijednost
se proširuje u ekvivalentan string recimo:
"X" . (4 * 5) # isto kao "X" . 20, ili "X20"

drugim riječima ne morate se brinuti jer perl radi umjesto vas!

1037/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Operator za brojeve

Perl podržava tipičan set operatora kao i drugim jezicima:


2+3 # 2 plus 3, ili 5
5.1 - 2.4 # 5.1 minus 2.4, približno 2.7
3 * 12 # 3 puta 12 = 36
10.2 / 0.3 # 10.2 podijeljeno 0.3, približno 34
10 / 3 # uvijek floating point djeljenje, približno 3.333333...
2**3 #Fortran 2*2*2=8
10.5 % 3.2 # 10 mod 3=1
3 > 2 # vrača true
5 != 5 # vrača false

Logički operatori su

Usporedba numerički String

jednako == eq

Ne jednako != ne

Manje od < lt

Veče od > gt

Manje ili jednako <= le

Veče ili jednako >= ge

Operator za stringove
Stringovi se mogu konkatenirati sa . operatorom
"hello" . "world" # "helloworld"
'hello world' . "\n" # isto kao "hello world\n"

"fred" . " " . "barney" # isto kao "fred barney"

1038/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Još jedan set operator su string komparacijiski operatori:

Comparison Numeric String

jednako == eq

Ne jednako != Ne

Manje od < Lt

Veće od > gt

Manje ili jednako <= le

Veće ili jednako >= ge

Operatori usporedjuju stringove na uobičajen način po ASCII vrijednostima


karaktera.Vjerojatno se pitate zašto postoje različiti 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 pogrešan,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 # rezultat "fredfredfred"


"barney" x (4+1) # rezultat "barney" x 5, or # "barneybarneybarneybarneybarney"
(3+2) x 4 # is 5 x 4, ili "5" x 4, sto je "5555"

# 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 naopačke dobili bi «44444» ovaj primjer pokazuje da x nije
komutativan #

1039/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Prioriteti operatora i asocijativnost


Perl koristi matematiku pri određivanju prioriteta operatora
2+3*4 # 3*4=12+2= 14
(2+3)*4 #2+3=5*4=20
Ukoliko želimo explicitno odrediti redoslijed izvršavanja koristimo zagrade,ukoliko ne
koristimo zagrade perl računa po svojoj (matematičkoj) logici:

Tablica Asocijativnosti i redoslijeda izvršavanja operatora

Asocijativnost Operator

Left "list" operatori (ljevo)

Left -> (poziv metode, derefernciranje)

Nonassociative ++ -- (autoincrement, autodecrement)

Right ** (potenciranje)

Right ! ~ \ + - (logički not, bit not, operator reference, unarni plus,


unarni minus)

Left =~ !~ (matches, doesn't match)

Left * / % x (množenje,djeljenje,mod,string repetition)

Left + - . (plus,minus,konkateniranje)

Left << >> (shift operatori)

Nonassociative imenovani unarni operators (npr chomp)

Nonassociative < > <= >= lt gt le ge (relacijski operatori)

Nonassociative == != <=> eq ne cmp (operatori jednakosti)

Left & (bitovni and)

Left | ^ (bitovni or, bitovni xor)

Left && (logički and)

Left || (logički or)

Nonassociative .. ... (noninclusive and inclusive range)

1040/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Asocijativnost Operator

Right ?: (if then else)

Right = += -= *=, etc. (dodjeljivanje i binarno dodjeljivanje)

Left , => (comma and comma arrow)

Nonassociative List operatori (rightward)

Right not (logički not)

Left and (logički and)

Left or xor (logički or, logički xor)

Operatori jednakoga prioriteta se rješavaju po pravilu asocijativnosti npr.:

2 ** 3 ** 4 # 2 ** (3 ** 4), ili 2 ** 81, približno 2.41e24


72 / 12 / 3 # (72 / 12) / 3, ili 6/3, ili 2
30 / 6 * 3 # (30/6)*3, ili 15

Skalarne Varijable
Varijabla je mjesto u memoriji koja sadrži jednu ili više vrijednosti,ime varijable je konstantno kroz cijeli
program ali se vrijednost koju sadržava varijabla tipično mijenja.
Skalarna varijabla drži jednu skalarnu vrijednost(bio to broj ,string ili referenca),ime varijable počinje s $ te
sadrži slova ,brojeve ili _,(max 255 znakova ☺)imena varijabli su osjetljiva na velika i mala slova tako da $A
nije isto što i $a.

Skalarni operatori i funkcije


Najjednostavniji način je pridjeljivanje razmotrimo slijedeće primjere
$a = 17; # dodaj na $a vrijednost 17
$b = $a + 3; # dodaj na $b vrijednost $a plus 3 (20)

$b = $b * 2; # dodaj na $b vrijednost $b puta 2 (40)


$b = 4 + ($a = 3); # dodaj 3 u $a, potom dodaj 4 na sve to i spremi u $b
$d = ($c = 5); # kopiraj 5 u $c, a potom i u $d
$d = $c = 5; # isto ali bez zagrada radi zbog asocijativnosti

1041/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Binarni operatori pridjeljivanja


Izrazi kao što su $a=$a+5 je ekvivalentno izrazu $a+=5 svaki izraz u kojem se varijabla pojavljuje na obje
strane jednakosti možemo skraćeno pisati ,tj. dodjeljivati im vrijednost koristeći binarne operatore
pridjeljivanja,skoro svi binarni operatori koji računaju neku vrijednost imaju odgovarjuči binarni dodjeljivač
vrijednosti.

$a = $a + 5; # bez binary assignment operatora


$a += 5; # sa binary assignment operatora
$b = $b * 3;
$b *= 3;
$a **= 3 # potenciraj $a na 3 i spremi u $a
U svakom slučaju operator izaziva da se vrijednost varijable na neki način promjeni ,a ne da se jednostavno
prepiše rezultat nekog novog izraza.
Još jedan uobičajeni perator dodjeljivanja je string konkatenator
$str = $str . " "; # dodaj na $str space
$str .= " "; # isto stavr ali sa assignment operator
Kao i jednostavni operatori pridjeljivanja,svaki od tih operatora ima i vrijednost;novu vrijednost varijable
$a = 3;
$b = ($a += 4); # $a i $b su sada = 7

Autoinkrement i Autodekrement
$a += 1; # s operatorom pridjeljivanja
++$a; # sa autoinkrementom
$d = 17;
$e = ++$d; # $e i $d su sad= 18
ovdje je operator ++ korišten kao prefix tj. operator je lijevo od operanda,operator se može koristiti i sa desne
strane izraza,u tom slučaju rezultat je ostao isti
$c = 17;
$d = $c++; ………………….# $d = 17, ali $c = 18

Auto dekrement se ponaša na sličan način samo što on ne dodaje već oduzima vrijednost .
$x = 12;
--$x; # $x sada iznosi 11
$y = $x--; # $y =11, ali sada je $x = 10

Treba napomenuti da autoinkrement i autodekrement rade i na floating point vrijednostima


npr.
$a=4.3;
++$a;

1042/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

$a=5.3;

Chop() i chomp funkcije


Chop funkcija uzima jedan argument sa zagradama(ime skalarne varijable a ne skalarne
vrijednosti) i skida zadnji karakter iz stringa koji se nalazi u varijabli,povratna vrijednost
funkcije je odsječeni karakter

$name=«amirko\n»;
chop($name) # $name=«amirko»
$name=«car the one»
chop($name); $name=«car the on»;
$name=«car the one»
$name=chop($name) # GREŠKA $name=«e»;
chop($name) # OK odsijeca zadnji karakter;
Ukoliko funkciji proslijedimo prazan string ona ne radi ništa i ne vrača ništa,treba napomenuti
da će funkcija pri svakom pozivu na skalarnoj varijabli odsijecati po jedan znak.
$a=«amir»;
chop($a) # $a=«ami»;
chop($a) # $a=«am»

ukoliko niste sigurni da li string sadržava \n možete koristiti funkciju chomp()


ona odsijeca samo newline karakter ukoliko postoji ,ukoliko ne postoji nikom ništa
$a = "hello world\n";
chomp ($a); # $a je sada "hello world"
chomp ($a); # aha! Nema promjene u $a=«hello world»

Interpolacija skalara u stringove


Kada je string pod dvostrukim navodnicima onda je on subjekt interpolacije,to znači da se
string skenira na moguće pojavljivanje skalarne varijable,i ukoliko se pronađe referenca na
varijablu tada se referenca zamjenjuje sa vrijednosti pohranjenom u navedenoj varijabli.
$a = "fred";
$b = "some text $a"; # $b = "some text fred"
$c = "no such variable $what"; # $c i= "no such varijable "
tekst koji zamjenjuje varijablu se ne skenira,čak i ukoliko se u varijabli nalazi $
$x = '$fred'; # $x="$fred"

1043/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

$y = "hey $x"; # vrijednost je sad 'hey $fred': nema ponovne zamijene


da bi spriječili supstituciju ili varijablu stavite u jednostruke navodnike ili prije $ stavite \ koji
poništava specijalno značenje $
$fred = 'hi';
$barney = "a test of " . '$fred';#$barney = 'a test of $fred'
$barney2 = "a test of \$fred"; # ista stvar
Ime varijable će biti najduže moguće ime varijable koje ima smisla kao dio stringa,to može biti problem ukoliko
želite poslije zamijenjene vrijednosti nastaviti sa nekim konstantnim tekstom,perl skenira imena varijabli,te bi
mogao protumačiti te karaktere kao ime a to ne želite u tu svrhu vam pruža delimiter za imena
varijabli,jednostavno zatvorite ime varijable u {} ili koristite operator konkatenacije.
$fred = "pay"; $fredday = "wrong!";
$barney = "It's $fredday"; # nije payday, nego "It's wrong!"
$barney = "It's ${fred}day"; # sad, $barney dobiva "It's payday"
$barney2 = "It's $fred"."day"; # još jedan način konkatenacijom
$barney3 = "It's " . $fred . "day"; # i još jedan način konkatenacijom
takodjer vam je omogućeno da manipulirate veličinom slova
$bigfred = "\Ufred"; # $bigfred je sada "FRED"
$fred = "fred"; $bigfred = "\U$fred"; # ista stvar
$capfred = "\u$fred"; # $capfred je sada "Fred"
$barney = "\LBARNEY"; # $barney je sada "barney"
$capbarney = "\u\LBARNEY"; # $capbarney je sada "Barney"
$bigbarney = "BARNEY"; $capbarney = "\u\L$bigbarney"; # same

Kao što se vidi case shifting string escape su zapamćeni unutar stringa,sve dok se ne
iskoriste,tako da iako prvo slovo «BARNEY» ne slijedi \u,već ostaje veliko slovo zbog \u.

1044/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

<STDIN> kao skalarna vrijednost

Kako unijeti text u skalarnu varijablu e pa jednostavno,svaki put kada koristite <STDIN> gdje
se očekuje skalarna vrijednost,perl čita tekst sa standardnog ulaza sve do i uključujući newline
karaktera(\n).
$a = <STDIN>; # upiši tekst
chomp($a); # riješi se \n
ili skraćeno:
chomp ($a =<STDIN>); # bez \n

Ispis
Ispis se vrši jednostavno pozivajući 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 dešava ako koristite skalarnu varijablu prije nego što ste ju definirali,ništa posebno,i
svakako ništa fatalno,sve varijable imaju undef vrijednost prije nego što im je išta
dodijeljeno,ta vrijednost je najsličnija 0 kada se koristi kao broj ili kao prazan string kad se
koristi kao string.<STDIN> naprimjer vraća undef vrijednost kada više nema što pročitati

Nizovi i Liste
Lista je uređeni skup skalarnih podataka,a niz je varijabla koja drži listu,svaki element niza je
zaseban skalarna varijabla sa svojom skalarnom vrjednosti,te vrijednosti su uređene što znači
da imaju uređen slijed od najmanje pa do najveće vrijednosti.
Niz može biti prazan ali isto tako može biti velik da napuni svu raspoloživu memoriju sve u
duhu perlove filozofije «bez ograničenja»

Literarna reprezentacija
Lista se sastoji od zarezom odvojenih vrijednosti zatvorenih u zagrade.
(1,2,3) # niz od 3 vrijednosti 1, 2, and 3
("fred",4.5) # dvije vrijednosti, "fred" and 4.5
ne nužno konstantnih:

1045/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

($a, 17) #dvije vrijednosti: vrijednost $a, i 17


($b+$c,$d+$e) # dvije vrijednosti
() # prazna lista
Lista se također može deklarirati koristeći list konstruktor koji uključuje dvije skalarne vrijednosti između kojih
se nalaze dvije točke on tada konstruira listu
Počevši od lijevog skalara te inkrementirajuči 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) # opseg definiraju dvije skalarne vrijednosti $a i $b
ukoliko bi inkrementiranjem zadnje vrijednosti izašao iz opsega on staje na zadnjoj vrijednosti koja je manja od
opsega
(1.3..6.1) # isto kao i (1.3,2.3,3.3,4.3,5.3)

Liste koje sadrže stringove deklariramo kao


@a = ("fred","barney","betty","wilma"); # ružžžžžžžžžno
bolje:
@a = qw(fred barney betty wilma); # bolje
@a = qw(
fred
barney
betty
wilma
); # ista stvar

qw= 'qoute word ' koji kreira listu stringova razmake tretirajući kao granicu gdje završava
jedan a počinje drugi string
Deklaracija liste se sastoji od @ pa imena varijable:

@somelist;#dekalracija liste
@amirko(); #deklaracija neinicijalizirane liste

1046/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Funkcije i operatori na nizovima


Funkcije i operatori na nizovima operiraju na cijelim nizovima neki vraćaju nizove koji se
onda dalje mogu koristiti i spremati u druge nizove itd..

Dodjeljivanje
Najvažniji je operator dodjeljivanja,koji daje vrijednost varijabli u nizu,= ,perl potom
odlučuje 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);
moguće 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")
Važno je napomenuti da lista ne može sadržavati 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 može tretirati kao
varijabla,svaka skalarna vrijednost se pridružuje odgovarajućoj skalarnoj vrijednosti druge liste

($a,$b,$c) = (1,2,3); # dodaj 1 na $a, 2 na $b, 3 na $c


($a,$b) = ($b,$a); # zamjeni $a i $b
($d,@fred) = ($a,$b,$c); # dodaj $a na $d, @fred=($b,$c)
($e,@fred) = @fred; isto kao ($e,@fred)=($b,$c) # zamijeni prvi element @fred sa $e
# @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 postojeće 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

duljina se također vraća 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 igoririajući sve ostalo sto slijedi.Dodojeljivanje listi je već samo po sebi
vrijednost liste te se može kombinirati sa drugim dodjeljivanjima
@fred = (@barney = (2,3,4)); # @fred= (2,3,4) @barney= (2,3,4)
@fred = @barney = (2,3,4); # isto samo kraće ☺

Pristup elementima niza


Pristup listi se vrši ili preko indexa i operatora [].
@fred = (7,8,9);
$b = $fred[0]; # $b=7;
$fred[0] = 5; # @fred = (5,8,9)
$c = $fred[1]; # $c=8
$fred[2]++; # increment the third element of @fred=(5,9,9)
$fred[1] += 6; # @fred=(11,9,9)

($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])
@fred[0,1] = @fred[1,0] # zamijeni prva dva el
@fred[0,1,2] = @fred[1,1,1] # sva tri el pretvori u drugi el @fred=(1,1,1);
@fred[1,2] = (9,10); postavi zadnja dva el na 9 i 10 @fred=(1,9, 10);

@fred je zbog toga što kreiramo list varijablu selektirajući dio liste a ne skalarnu vrijednost
npr. $a za dohvaćanje 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

$c = $fred[$a-1]; # $c = 8
($c) = (7,8,9)[$a-1]; # splice $c=8;
ili
@fred = (7,8,9);
@barney = (2,1,0);
@backfred = @fred[@barney];
# same as @fred[2,1,0] ili ($fred[2],$fred[1],$fred[0]), ili @backfred =(9,8,7)
pokušamo li dohvatiti izvan granica
@fred = (1,2,3);
$barney = $fred[7]; # $barney = undef
indeksirajući izvan dosega automatski proširujemo listu,dajuči 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]; # prints "dino"
print $#fred; # prints 3
print $fred[$#fred]; # prints "dino"

$#fred vraća zadnji indeks u nizu ili @fred-1

Push i Pop funkcije


Jedna od najčešćih upotreba liste je stack,kada se nove vrijednosti dodaju i uzimaju s vrha
stacka,te operacije su toliko česte da imaju svoje specijalne funkcije.
push(@mylist,$newvalue); # @mylist = (@mylist,$newvalue)
$oldvalue = pop(@mylist); uklanja zadnji el iz @mylist
Pop funkcija vrača undef ukoliko joj se proslijedi prazna lista i ne izaziva nikakav warning ili
compile error.
Push funkcija prihavača i listu vrijednosti koje stavlja na vrh zadane liste
@mylist = (1,2,3);
push(@mylist,4,5,6); # @mylist = (1,2,3,4,5,6)
prvi argument mora biti lista .

Shift i Unshift funkcije


Kako push i pop stavljaju i skidaju sa vrha liste funkcije shift i unshift rade identično ali sa
kraja liste.

1049/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

unshift(@fred,$a); # l @fred = ($a,@fred);


unshift(@fred,$a,$b,$c); # @fred = ($a,$b,$c,@fred);
$x = shift(@fred); # ($x,@fred) = @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)

Ukoliko im se proslijedi prazna lista vraćaju undef vrijednost:

1050/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Reverse funkcija
Reverse funkcija obrće listu argumenata koja joj je proslijeđena,vračajuči 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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)

primječujemo da je lista brojeva sortirana pogrešno,ukoliko želimo sortirati listu numerička


moramo učiniti slijedeće,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); točno

funkcija by_ može biti napisana da radi sa bilo kojom vrstom podataka,ovaj način sortiranja je
u perlu čest stoga perl je predvidio poseban operator «spaceship operator» space ship
operator vrača identične vrijednosti kao i by_number procedura tako da sada možemo pisati.

sub by_number {
$a <=> $b;
}

ili još kraće


@list = sort { $a <=> $b } @y
Spaceship operator za brojeve ima također operator za stringove cmp pa ca u ovom slučaju
izraz izgledati.
@list=sort{$a cmp $b}@listopad

1052/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Vjerojatno se pitate kako napraviti kombinaciju ili što ako moram sortirati po brojevima i po
karakterima evo jedan od načina,ili sve omoguće kombinacije ova dva izraza.
sub by_mostly_numeric {
($a <=> $b) || ($a cmp $b);
}

ukoliko je rezultat spaceshipa –1 ili 1 ostatak se preskače i povratna vrijednost je –1 ili 1 ali
ukoliko prvi dio izraza vrati 0 drugi dio izraza se potom izračunava.

Inerpolacija varijabli u listama


Radi na identičan način kao i za skalarne varijable
@fred = ("hello","dolly");
$y = 2;
$x = "This is $fred[1]'s place"; # "This is dolly's place"
$x = "This is $fred[$y-1]'s place"; # ista stvar
prvo se računa 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";
# pokušavamo reći "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)
$x = "this is $fred\[1]"; # OK (backslash skriva)
ili možemo interpolirati cijelu listu
@fred = ("a","bb","ccc",1,2,3);
$all = "Now for @fred here!";
# $all ="Now for a bb ccc 1 2 3 here!"
ili možemo koristiti slice:
@fred = ("a","bb","ccc",1,2,3);
$all = "Now for @fred[2,3] here!";
# $all =s "Now for ccc 1 here!"
$all = "Now for @fred[@fred[4,5]] here!"; # ista stvar

<STDIN> kao Lista

1053/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

@a = <STDIN>; # učitava standard input u listu (list context)


Ukoliko osoba koja pokrene gornji program unese tri linije završavajući CTRL+Z
U listi se nalaze tri linije koje završavaju s \n.

1054/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KONTROLNE STRUKTURE

Izraz koji prelazi jednu liniju može se staviti u {} čineći tako blok izraz
{
prvi_izraz;
drugi_izraz;
treci_izraz;
last_statement;
}
Blok izraz se prihvaća 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) {

true_statement_1;
true_statement_2;
true_statement_3;
} else {
false_statement_1;
false_statement_2;
false_statement_3;
}
Perl izračunava 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) izvršava se prvi blok naredbi,ako je pak laž slijedi dio koji se nalazi iza else,evo
nekoliko primjera:
0 # pretvara u "0", false
1-1 # = 0, pretvara se u "0", = false
1 # pretvara u "1", true
"" # prazan string = false
"1" # = true
"00" # nije "" ili "0", = true (ova je čudna stoga paziii)
"0.000" # =true (isto ko i gore);
undef # se izračunava u "", = false

1055/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

evo jednog primjera kompletne If else izraza


print "koliko imaš godina ";
$a = <STDIN>;
chomp($a);
if ($a < 18) {
print " Ne dovoljno star da glasaš !!\n";
} else {
print "Dovoljno star idi glasati!\n";
}

ili
print " koliko imaš godina\n ";
$a = <STDIN>;
chomp($a);
unless ($a < 18) {
print " Dovoljno star idi glasati!\n ";
}

ukoliko imate više od jednog izraza:


print "koliko imaš godina\n ";
$a = <STDIN>;
chomp($a);
if( $a<18) print «još si mali\n»;
elseif($a>18 && $a<20) print «ti si ok\n»;
elseif($a>40) print»penzioner\n»;
elseif($a>60){
print»penzioner\n»;
$a = <STDIN>;
chomp($a);
}
else{
print»ko si bre ti?n»}

While\untill izraz

while (some_expression) {

statement_1;
statement_2;
statement_3;

1056/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

}
evo jednog primjera maltertiranja korisnika:

print»koja je tajna rijec»;


chomp($a=<STDIN>);
while($a neq «car»){
print»koja je tajna rijec\n»;
chomp($a=<STDIN>);
}
ili
print»koja je tajna riječ»;
chomp($a=<STDIN>);
until($a eq ''car''){
print»koja je tajna rijec\n»;
chomp($a=<STDIN>);
}
Oba izraza su ekvivalentna s time da je nekada lakše napisati until(izraz=false ili
izraz=true).Ponekad kontrolni izraz ne dopušta izlaz iz petlje,takve situacije su prilično česte
npr. želite izvršavati petlju dokle god nemate pogrešaka a kod iza petlje bi tada mogao biti
neka error handling procedura!!

1057/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

do {} while/until izraz

Razlika od prethodnih je da će se tijelo petlje uvijek izvršiti barem jednom

do {
statement_1;
statement_2;
statement_3;
} while (some_expression);
ili recimo primjer:
$stops = 0;
do {
$stops++;
print "Slijedeća stanica\n ";
chomp($lokacija = <STDIN>);
} until ($stops > 5 || $location eq 'home');

for izraz
for ( initial_exp; test_exp; re-init_exp ) {

statement_1;
statement_2;
statement_3;
}
for ($i = 1; $i <= 10; $i++) {
print "$i ";
}

Ispisuje brojeve od 1-10


Inicijalizacija se izvodi samo na početku,tada u svakoj slijedećoj iteraciji se provjerava
uvijet,i ukoliko je istinit ide se na slijedeću iteraciju opcionalno povečavajuči inicijalnu
vrijednost za neki broj ili izraz.

foreach izraz

1058/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Ovaj izraz za argument prima listu vrijednosti,i dodjeljuje ih jednu po jednu skalarnoj
vrijednosti,izvršavajuči tijelo za svako uspješno dodjeljivanje.
Npr.:
@a = (1,2,3,4,5);
foreach $b (reverse @a) {
print $b;
}

rezultat je 54321,možete čak i izostaviti $b perl će to tada interpretirati kao da ste specificirali
$_ tako da bi to skračeno 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 označava 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; # no need to keep looking for From:, so exit
} # end "if from:"
if (/^$/) { # blank line?
last; # if so, don't check any more lines
}
} # end while

1059/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Next označava da se ide na slijedeću iteraciju(izrazi iza next neće se izvršiti) i izlazi iz
unutarnjih {}
while (something) {

firstpart;
firstpart;
firstpart;
if (somecondition) {

somepart;
somepart;
next;
}
otherpart;
otherpart;
# next comes here
}

ukoliko je somecondition=true izvršit će se somepart te potom krenuti na novu


iteraciju,otherpart se neće izvršiti.
Redo izaziva novu iteraciju za dani uvijet.
while (somecondition) {
# redo comes here
something;
something;
something;
if (somecondition) {

somestuff;
last;
}
morething;
morething;
morething;
redo;
}
Labele su mjesta u kodu koja označavamo sa IME LABELE:služe za izlaze iz ugniježđenih petlji možete
koristiti next,last redo u kombinaciji s labelama.
OUTER: for ($i = 1; $i <= 10; $i++) {

1060/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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 pronašli što smo tražili u ovom slučaju umnožak brojeva koji daju 63 nema smisla više tražiti i izlazi se
iz OUTER: petlje.
Deklaraciju labela radi lakše čitljivosti uvijek deklarirajte sa velikim slovima.
Expresion Modifiers.
If this == then that, perl vam omogućava da radi veće č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; }

važno je napomenuti da se te forme ne mogu ugnježđivati ne možete reći


exp1 while exp2 if (some_cond); ova restrikcija je zato sto je exp1 while exp2 više nije izraz
već izjava i ne možete ih više appendati.
&& operator ili logički AND u zavisnosti od oba izraza koja moraju bit true
if (this) { that; } # one way

that if this; # another way

ili this && that;

|| operatore ili logički OR izračunava u true ukoliko je ikoji od uvjeta istinit.


unless (this) { that; }
this || that;
?: operator je samo pokrata za if

1061/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

($a eq «konjino»)?print»amire $a\n»:print»care»;


ukoliko je uvjet najljeviji istinit izvršava se dio iza ? ukoliko ne dio iza : kao u C ternarni
operator.

1062/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

HASHEVI

Hash(Asocijativna lista) je sličan listi sa jednom razlikom da elementi hasha su u stvari


kolekcija skalarnih podataka,tj ključa i vrijednosti.Kljucevi se tada koriste kako bi se preko
njih pristupalo vrijednostima na koje su pridruženi.Elementi hasha nemaju neki određeni
red,svaki put kada stavite neku vrijednost u hash on jednostavno preko ključa mapira
vrijednost.

Literarna reprezentacija Hasha


Perl u stvari nema načina za literarnu reprezentaciju hasha on ju jednostavno tretira kao listu,
@fred_list = %fred; # @fred_list =("aaa","bbb","234.5",456.7)
%smooth = ("aaa","bbb","234.5",456.7); #ista stvar iz literarnih vrijednosti
%copy = %original; # copy from %original to %copy
%backwards = reverse %normal;
Ukoliko postoje dvije vrijednosti s istim ključem,perl jednostavno izbacuje višak,tj u %backwards
Se nalaze jedinstveni ključevi…duplikati se automatski izbacuju!!

Hash Funkcije

Keys Funkcija
Keys(%hash) jednostavno iz hasha izdvaja vrijednosti ključeva
$fred{"aaa"} = "bbb";
$fred{234.5} = 456.7;
@list = keys(%fred); # @list = ("aaa",234.5)
foreach $key (keys %fred) { # za svaki ključ u %fred
print "na $key imamo $fred{$key}\n"; # ispisi key i vrijednost
}

1063/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Values Funkcija
Values funkcija ispisuje vrijednosti u hashu,na isti način 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 možete koristiti keys,ali je each puno efikasnija,ona vraća
par koji se sastoji od ključa i vrijednosti

%a=('amir' => 'kos', 'petar'=>'pan' ,'ivan'=>'grozni');


while (($first,$last) = each(%a)) {
print "Prezime od $first je $last\n";}

Funkcija vraća parove dokle ih god ima kada dodje do kraja hasha vraća praznu listu,prilikom
dodjeljivanja novih vrijednosti hashu,funkcija each se resetira i kreće od početka.

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Hash slice
Kao i liste,u hashevima možemo pristupati više elemenata istovremeno…tzv. slice.
Promotrimo slijedeći 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 veće.


@league{keys %score} = values %score; #mergamo ključeve s vrijednostima
%league = (%league, %score);#isto samo sporije

1065/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

OSNOVNE I/O OPERACIJE

Perl daje STDIN STDOUT,STDERR kao tri glavna ulazno izlazna streama

Čitanje sa standardnog ulaza


Perl omogućava file handle <STDIN> preko kojeg je moguće čitati sa standardnog ulaza,
<STDIN> čita liniju do \n,može se koristiti u skalarnom ili list contextu.

$a=<STDIN> #skalrni kontekst


@a=<STDIN> #list kontext

želite li učitiavati liniju po liniju sa STDIN –a ,jedan od načina je


while (defined($line_ = <STDIN>)) {
# process $line here
}
Posto Perl omogućava tzv. podrazumijevanu vrijednost(_$) možete jednostavno pisati
while (<STDIN>) { # == "while(defined($_ = <STDIN>_)"
chomp; # =="chomp($_)"
# other operations with $_ here
}

<> Operator

Ovaj operator se ponaša na sličan način 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 pročitati sve linije u prvi.txt
Potom sve linije u drugom.txt ispisivajući ih na ekran,te će vratiti undef tek pošto je pročitao sve linije,ukoliko
mune proslijedimo argumente čita automatski sa STDIN.

1066/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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

%% Percent sign

%c Character with the given number

%s String

%d Signed integer, in decimal

%u Unsigned integer, in decimal

%o Unsigned integer, in octal

%x Unsigned integer, in hexadecimal

%e Floating-point number, in scientific notation

%f Floating-point number, in fixed decimal notation

%g Floating-point number, in %e or %f notation

Izmedju % i format karaktera možete opcionalno ubaciti slijedeće flagove

1067/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

REGULARNI IZRAZI

Regularni izraz je ništa drugo nego pattern ili uzorak koji će se testirati na određeni string,to
testiranje može biti uspješno ili neuspješno,ponekad čete željeti nešto pronaći ili nešto
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 pruža set karaktera za manipulaciju.

Jednostavni regularni izrazi


Ukoliko tražimo linije u fileu koje sadrže string abc na win 32 mogli bi napisati
>findstr abc nekifajl.txt>rezultati.txt
u ovom slučaju 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
zatvarjuči ga u /abc/ perl takodjer ima tzv. wild karakter set
želimo li pronaći linije u fileu koje počinju s a a završava s bc a izmedju može biti bilo što mogli bi napisati u
win 32
>findstr ab*c somefile >results
u perlu:
while (<>) {
if (/ab*c/) {
print $_;

space Prefix positive number with a space

+ Prefix positive number with a plus sign

- Left justify within the field

0 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

s/ab*c/def/; # traži a…bc te zamijeni sa def

Construct Equivalent Class Negated Construct Equivalent Negated Class

\d (a digit) [0-9] \D (digits, not!) [^0-9]

\w (word char) [a-zA-Z0-9_] \W (words, not!) [^a-zA-Z0-9_]

\s (space char) [ \r\t\n\f] \S (space, not!) [^ \r\t\n\f]

Složeni regularni izrazi


Prava moć regularnih izraza dolazi do izražaja tek kada ih se grupira

Sekvenca
ukoliko tražimo sekvencu karaktera možemo pisati
/[abcd]/ # traži sekvencu koja se sastoji od abcd;
/[a.*bcd]/ #traži sekvencu koja počinje s a slijedi bilo što osim \n i završava sa bcd;

Multypliers
operator + želimo li naći sekvencu koja se sastoji od 1 ili više znakova koristimo + operator
operator ? koristimo kada želimo opcionalno pretraživanje
general multiplier sastoji se od para {} sa jednim ili dva broja unutra

/[ab+cde]/# a pa jedan ili više b završava sa cde


/[ab+c.*d?e]/ #a pa jedan ili više 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 više multypliera primjenjuje se pravilo pohlepnosti tj. izvršit će se prvo
najljeviji,možemo 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 odgovarajući int
/fred(.)barney\1/; # matches fred barney tj bilo koji znak u duljini 1 osim \n
#no match fred barney

tj. int iz backslasha na govori koliko karaktera se odnosi izraz.


/a(.)b(.)c\2d\1/;# matches axbycz
/a(.)b(.)c\2d\1/; #matches axbycydx

1069/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

/a(.*)b\1c/;# matches aXXbXXc


#no match aXXXbXXc
možemo grupirati izraze i sa alternacijom
/[a|b|c]/# matches jedino ukoliko string ima ili a ili b ili c
ili tzv. usidravanje, oni vam omogućuju da od malih djelića uvjetno slažete veće dijelova stringa
\b traži granicu u riječi na datoj točci da bi matchao,granica riječi 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)
analogno tome \B zahtijeva da ne bude razmak izmedju riječi
/\bFred\B/; # matches "Frederick" but not "Fred Flintstone"

prioriteti

Name Representation

Parentheses ( ) (?: )

Multipliers ? + * {m,n} ?? +? *? {m,n}

Sequence and anchoring abc ^ $ \A \Z (?= ) (?! )

Alternation |

Evo nekih primjera regularnih izraza i utjecaj zagrada


abc* # matches ab, abc, abcc, abccc, abcccc, itd..
(abc)* # matches "", abc, abcabc, abcabcabc, itd..
^x|y # matches x na pocetku linije, ili y bilo gdje
^(x|y) # matches x ili y na početku linije
a|bc|d # a, or bc, or d
(a|b)(c|d) # ac, ad, bc, or bd
(song|blue)bird # songbird or bluebird

PERL Practical Extraction and Report Language koristi regularne izraze kao svoje jako
moćno oružje
Modifiers:

Modifier Meaning

i Do case-insensitive pattern matching.

1070/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Modifier Meaning

m Treat string as multiple lines (^ and $ match internal \n).

s Treat string as single line (^ and $ ignore \n, but . matches \n).

x Extend your pattern's legibility with whitespace and comments.

Quatifiers

Maximal Minimal Allowed Range

{n,m} {n,m}? Must occur at least n times but no more than m times

{n,} {n,}? Must occur at least n times

{n} {n}? 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})

Asertiranje

Assertion Meaning

^ Matches at the beginning of the string (or line, if /m used)

$ Matches at the end of the string (or line, if /m used)

\b Matches at word boundary (between \w and \W)

\B Matches except at word boundary

\A Matches at the beginning of the string

\Z Matches at the end of the string

\G Matches where previous m//g left off

(?=...) Matches if engine would match ... next

(?!...) Matches if engine wouldn't match ... next

=~ Operator
Target ovog operator može biti bilo koji izraz koji se izračunava u skalarnu vrijednost.

$a = "hello world";

1071/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

$a =~ /^he/; # true
$a =~ /(.)\l/; # also true (matches the double l)
if ($a =~ /(.)\1/) { # true, so yes...
# some stuff
}

ulaz sa <STDIN> se također izračunava 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 ignorirajući case
$a=«AMIR»;
if($a=~/amir/i) # true
sada bi prijašnji primjer izgledao
print "any last request? ";
if (<STDIN> =~ /^y/i) { # does the input begin with a y?
# yes! deal with it
...
}

Ukoliko tražite string koji počinje s \ morate ga delimitirati s /


$path = <STDIN>; # read a pathname (from "find" perhaps?)
if ($path =~ /^\/wwwroot\/docs/) {
# begins with /wwwroot/docs...
}

takav način pisanja koda može kod malo složenijih izraza nalikovati na smetnje u vezi stoga
perl omogućava definiranje vlastitog delimitera uz opciju m
/^\/wwwroot\/docs/ # using standard slash delimiter
m@^/wwwroot/docs@ # using @ for a delimiter
m#^/wwwroot/docs# # using # for a delimiter (my favorite)

1072/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Interpolacija varijabli

Regularni izraz je samo varijabla interpolirana prije nego se testira na specijalne karaktere,kao rezultata možete
slagati regularne izraze od izračunatih 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";
}

\Q delimiter za [] zagrade stoga ih tretira kao literar a ne kao operator []


$what = "[box]";
foreach (qw(in[box] out[box] white[sox])) {
if (/\Q$what\E/) { #konstruira [box] ali kao literarni string ne kao karakter klasu
print "$_ matched!\n";
}
}

Specijalne Read –only Variable


Prilikom matchiranja možete koristiti specijalne read-only varijable namely:$1,$2,$3…itd
$_ = "this is a test";
/(\w+)\W+(\w+)/; # match first two words
# $1 is now "this" and $2 is now "is"

možete postići istu stvar stavljajuči matchirane varijable u list context


$_ = "this is a test";
($first, $second) = /(\w+)\W+(\w+)/; # match first two words
# $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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

# $& is now "sample"


# $' is now " string"

Substitucija
Već smo spomenuli substituciju,razmotrimo sada načine kako ju možemo malo modificirati.
Ukolko želite da zamjena operira na sve moguće matcheve,a ne na samo prvi na koji naiđe
dodajte g.
$_ = "foot fool buffoon";
s/foo/bar/g; # $_ is now "bart barl bufbarn"

string koji se mijenja je ništa drugo nego interpolirana varijabla,dopuštajuči vam da


specificirate zamjenu u runtimeu,također možete specificirati vlastiti delimiter

s#fred#barney#; # replace fred with barney, like s/fred/barney/

možete također koristiti =~,u ovom slučaju odabrana vrijednost mora biti nešto čemu možete
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
$d{"t"} =~ s/^/x /; # prepend "x " to hash element

Split I Join Funkcije


Split funkcija razdvaja izraz prema danom matchu.

$line = "c:\\;;c:\\windows\\;c:\\windows\\system;";
@fields = split(/;/,$line); # split $line, using ; as delimiter
# now @fields is ("c:\", "", "c:\windows","c:\windows\system")

primijetite da je druga vrijednost prazan string,želite li to eliminirati koristite +


@fields = split(/;+/, $line); # delimiter je ; ili ;;;;;
u list kontekstu

1074/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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 početak 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

FUNKCIJE

Funkciju ili proceduru možete definirati bilo gdje u programu ali ju je preporučljivo 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 slučaju je say_heloo rutina ,primijetite da je moguć pristup globalnim varijablama


izvan tijela funkcije.Funkciju pozivate jednostavno navodeći njezino ime i specificirajući
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 vrača se zove «povratna vrijednost» i
nalazi se iza riječi return.
sub sum_of_a_and_b {
return $a + $b;
}

povratna vrijednost može biti bilo što lista,skalar ,hash,broj itd.


sub gimme_a_or_b {
if ($a > 0) {
print "choosing a ($a)\n";
return $a;
} else {
print "choosing b ($b)\n";
return $b;
}
}

Argumenti

1076/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

U Perlu poziv procedure slijedi lista,izazivajuči učinak da se vrijednost liste automatski


dodjeli specialonoj varijabli @_ u izvršavanju.Procedura ima pristup tima varijablama.
Pogledajmo slijedeći primjer.
sub say {
print "$_[0], $_[1]!\n";
}
say("hello","world"); # hello world, once again
say("goodbye","cruel world"); # silent movie lament

Ukoliko promašite vrijednost parametara ne brinite perl ih zanemaruje dodajući im undef


vrijednosti.
sub add {
$sum = 0; # initialize the sum
foreach $_ (@_) {
$sum += $_; # add each element}
return $sum; # the sum of all elements
}
$a = add(4,5,6); # adds 4+5+6 = 15, and assigns to $a
print add(1,2,3,4,5); # prints 15
print add(1..5); # also prints 15, because 1..5 is expanded
@_ je privatna danoj proceduri,ukoliko postoji globalni @_ on se sprema na stek i vrača se
tek pošto se procedura izvršila,to ujedno znači da procedura može prosljeđivati 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 izvršavanja
procedure stvara se uvijek nova kopija my.
sub bigger_than {
my($n,@values); # create some local variables
($n,@values) = @_; # split args into limit and values
my(@result); # temporary for holding the return value
foreach $_ (@values) { # step through the arg list
if ($_ > $n) { # is it eligible?
push(@result,$_); # add it
}
}
@result; # return the final list

1077/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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 također omogućuje da kreirate privatne varijable koristeći local,no bitnije je
razumjeti razliku između my i local
$value = "original";
tellme();
spoof();
tellme();
sub spoof {
local ($value) = "temporary";
tellme();
}
sub tellme {
print "Current value is $value\n";
}
This prints out:
Current value is original
Current value is temporary
Current value is original

Da smo koristili my umjesto local ,privatno čitanje $value bilo bi moguće jedino unutar
spoof(),ali sa local privatna vrijednost i nije više 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 vrijednošću. Local varijable su u stvari prerušene globalne vaijable,stoga
koristite radije my nego local ne samo da je brže več je i sigurnije.
Use strict kompajlerska direktiva tjera vas da deklarirate varijable prije nego ih počnete
koristiti.
use strict;
my $a; # starts as undef
my @b = qw(fred barney betty); # give initial value
...
push @b, qw(wilma); # cannot leave her out
@c = sort @b; # WILL NOT COMPILE
Use strict je preporučljivo,jer radi brže(varijable deklarirane s my imaju nešto brži pristup
nego obične varijable,jer čete lakše uočiti tipfelere.

1078/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

1079/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

FILE HANDLES

Filehandle je u perlu je ime I/O konekcije između Perl procesa i svijeta,Perl omogućava tri
filehandle STDIN,STDOUT,STDERR ukoliko želite otvoriti neki drugi file napisat ćete nešto
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 više 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 kraće
unless (open DATAPLACE,">c:/temp/dataplace") {
die "Sorry, I couldn't create c:/temp/dataplace\n";
}
ili najkraće
open(DATAPLACE,">c:/temp/dataplace") ||
die "Sorry, I couldn't create c:/temp/dataplace\n";
die se izvršava samo ukoliko open operacija nije uspjela
OTVORI ILI UMRI die takodjer prima skalarnu vrijednost koju ispisuje ukoliko se izvrši 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 grešci
open(LOG, ">>logfile") || die "cannot append: $!"; $_ sadrži «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 korištenja 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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 značenja

File Test Meaning

-r File or directory is readable

-w File or directory is writable

-e File or directory exists

-x File is executable

-z File exists and has zero size (directories are never empty)

-s File or directory exists and has nonzero size (the value is the size in bytes)

-f Entry is a plain file

-d Entry is a directory

-t isatty on the filehandle is true (that is, the filehandle is a character device)

-T File is text

-B File is binary

-M Modification age in days (C lang. time_t value)

-A Access age in days (C lang. time_t value)

-C Inode-modification age in days (C lang. time_t value)

Recimo da ste učitali 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Stat povratne vrijednosti.

Field Description

dev Device number (drive number)

ino Inode number: 0 (zero) in Perl for Win32

mode File permission mode: read/write/execute

nlink Number of links to file (usually one for Win32 systems - NTFS filesystems may have a value
greater than one)

uid User ID - zero for Win32

gid Group ID - zero for Win32

rdev Device Identifier (drive number)

size File size in bytes

atime Last access time (C lang. time_t value)

mtime Last modification time (C lang. time_t value)

ctime File creation time (C lang. time_t value)

blksize Disk block size (cluster size): zero for Win32

blocks Number of blocks for file: zero for Win32

1082/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

OTVARANJE I ZATVARANJE DIREKTORIJA

Funkcija opendir otvara željeni direktorij


opendir(NT,"c:/winnt") || die "Cannot opendir c:/winnt: $!";
closedir(NT);# neobavezno

retraživanje direktorija Globing


Perl podržava traženje kroz jednostavan mehanizam, samo postavite uvjet za traženje unutar<>
I pobudite ga sa glob funkcijom
@a = <*.plx>;
@a = glob("*.plx"); # @a=sadrži listu svih fileova koji zadovoljavaju uvijet.
Ili
while (defined($nextname = <c:/scripts/*.plx>)) {
print "one of the files is $nextname\n";
}
želite li pak samo ime
while ($nextname = <c:/scripts/*.plx>) {
$nextname =~ s#.*/##; # remove part before last slash
print "one of the files is $nextname\n";
}
Višestruki patterni su legalni unutar<> liste se konstruiraju zasebno tek se potom konkateniraju kao da su bili na
velikoj listi
@fred_barney_files = <fred* barney*>;
Iako globing i regularni izrazi funkcioniraju na istom principu, značenje njihovog spec. karaktera je različito
potreban je pažnja da se ne bi pitali zašto <\.c$> ne pronalazi fileove koji završavaju na.c
Argument glob-a se interpolira prije expanzije ,stoga možete koristiti varijable za selektiranje odgovarajućeg
wildchara za string koji se računa u run-timeu.
if (-d "c:/tmp") {
$where = "c:/tmp";
} else {
$where = "c:/temp";
}
@files = <$where/*>;
$where smo postavili na jedno od imena direktorija u zavisnosti od uvjeta da li postoji c:\tmp
ili c:\temp tek potom $where se expandira u što znači da će wildchar djelovati na c:\tmp\* ili c:\temp\* a
u @files će se naći svi fileovi zadanog direktorija.

1083/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

FORMATI

PERL Practical Extraction and Report Language ==FORMATI

Definiranje formata i pozivi Formata


format ADDRESSLABEL =
===============================
| @<<<<<<<<<<<<<<<<<<<<<<<<<< | # u $name dolazi < karaktera poravnanih u ljevo
$name
| @<<<<<<<<<<<<<<<<<<<<<<<<<< | # u $address dolazi < karaktera poravnanih takodjer u ljevo
$address
| @<<<<<<<<<<<<<<<<, @< @<<<< | # $city dolazi < karaktera poravnanih,u $state< karakter, u $zip 4
$city, $state, $zip
===============================
.

open(ADDRESSLABEL,">labels-to-print") || die "can't create"; file handle adresslabel -> file labels-to-print
open(ADDRESSES,"addresses") || die "cannot open addresses"; #otvori addrese za čitanje
while (<ADDRESSES>) { # čitaj
chomp; # makni \n
($name,$address,$city,$state,$zip) = split(/:/); razdvoji ih :
# load up the global variables
write (ADDRESSLABEL); # upisi u file labels-to -print
}
($name,$address,$city,$state,$zip)== imenima definiranim u formatu
primjer ispisa u datoteku labels-to-print
===============================
| Stonehenge |
| 4470 SW Hall Suite 107 |
| Beaverton , OR 97005 |
===============================
===============================
| Fred Flintstone |
| 3737 Hard Rock Lane |
| Bedrock , OZ 999bc |
===============================

1084/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 # točka je opcionalna i označava na koliko će se decimala formatirati

Višelinijska Polja
Dopušta formatiranje vrijednosti koje imaju više od jedne linije informacija, taj fileholder se
označava @*
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 odgovarajuća vrijednost mora biti skalarna varijabla ,a ne
izraz koji vrača skalarnu varijablu, razlog tome je što će Perl promijeniti varijablu dok puni
polje.
Prilkom punjenja polja Perl će otrgnuti onoliko riječi koliko stane u polje ,vrijednost te
varijable ostaje sve ono što nije uspio strpati u polje.

1085/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

format PEOPLE =
Name: @<<<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$name, $comment
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
.
Perl ugrabi onoliko riječi koliko stane u $comment,ostatak stavlja u drugi $comment do kraja.
Šta se dešava 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, $comment
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
.
ukoliko comment pokrije samo prve dvije linije zadnje dvije se odbacuju
ali što ukoliko ne zanmo koliko linija može zauzeti $comment, mogli bi napraviti 20 kopija
zadnje linije ali perl pretpostavlja da ste lijeni. Koristeći operator ~~,svaka linija koja sadrži
~~ će biti ponavljana uzastopno sve dok ne vrati "" finalno primjer bi izgledao.
format PEOPLE =
Name: @<<<<<<<<<<<<< Comment: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$name, $comment
~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$comment
.

Perl vam omogućava i definiranje tzv Top-of Page-Format koji sprječava 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

.
Default dužina stranice je 60 linija ali je i to moguće promijeniti.
Korištenje select za promjenu file handle.
Povratna vrijednost selecta je string koji sadrži ime prethodno odabranog handlea.
print "hello world\n"; # like print STDOUT "hello world\n";
select (LOGFILE); # select a new filehandle
print "howdy, world\n"; # like print LOGFILE "howdy, world\n";
print "more for the log\n"; # more for LOGFILE
select (STDOUT); # 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.

Mijenjanje imena formata


Defaultno ime formata za određeni filehandle je isti kao i file handle, ali ga možete i mijenjati
Perl izlaže specijalnu varijablu $~ u koju spremate novo ime formata
$oldhandle = select REPORT;
$~ = "SUMMARY";
select ($oldhandle);
write (REPORT); #ispisuje report u sumary formatu

Mjenjanje Duljine stranice


Ponekad nam 60 linija ne odgovara nema problema $= je varijabla koja čuva duljinu stranice
u linijama
$old = select LOGFILE; # select LOGFILE and save old handle
$= = 30;
select $old;

ovo neće imati učinka 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Zaključak:

PERL je jezik namijenjen ljudima koji žele brzo obaviti neke stvari ,za koje bi u drugim
jezicima morali rješavati puno teže i duže, PERL je ne samo lagan za upotrebu već on ujedno
koristi i postojeće alate i solucije.
PERL je također bogat jezik nudeći mnoge funkcionalnosti koje su ugrađene u sam
Jezik ,ljudi ostanu iznenađeni 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 došao
kada ga je Microsoft uključio(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 znači da se ne kompajlira već se koristi PERL
interpreter(slično 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 izvršava ,ne samo što omogućava brzo run-
time izvršavanje ,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 ,možete jednostavno razvijati PERL
programe, ne samo sto postoji debugger ,već je samo kompajler dostatan da ukaže na poruku
o grešci,.
Interpreter ne izvršava program ako se program ne iskompajlira ,ovo vas spašava od
interpreterskih noćnih mora gdje se prva polovica programa izvršava 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 možete:
-možete pristupati vašoj bazi podataka(Win32::ODBC)ili da radi s vašim Word procesorom
ili spreedshetom koristeći OLE automation.
-za filtriranje e-maila ,sa slanje e-maila, komunikaciju s FTP i HTTP serverima

1088/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

-procesirati tekstualne i numeričke podatke i još mnogo, mnogo toga.


Kao i mnogi drugo jezici PERL može biti 'write-only' tj moguće je pisati programe
koji su jako teško čitljivi, ali uz malo brige i truda možete izbjeći ovakve situacije.

1089/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Tamara Krutman
Ante Penava

PERL
Practical Extraction And Report Language

1090/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

UVOD

Što je Perl?

Perl je engleska skraćenica za Practical Extraction and Report Language. To je


interpretorski programski jezik opće namjene prenosiv za sve OS (UNIX, Linux, Windows,
Mac,...). Perl je besplatan, "open-source" jezik. Proširiv je novim funkcijama i mogućnostima
koje korisnici sami proizvedu (modularan je). Podržava proceduralno i objektno
programiranje.
Perl se sastoji od programa, interpretera i compiler-a. Program je ono što korisnik piše,
interpreter je prevodilac tog programa, a compiler je izvršitelj programa.
Perl je jednostavan za razumijevanje i već se sa malo znanja može raditi puno stvari.

Povijest Perl-a

Prvu inačicu Perl-a napisao je Larry Wall davne 1987. godine. Wall je tada radio
sustav izvješćivanja pogrešaka prilikom kompajliranja programa. Sustav izvješćivanja
pogrešaka trebao je biti po strukturi jednak Usenet-u. Kako je u to vrijeme awk bio
neprimjeren za takve zadatke, a C jezik presložen, Larry Wall se odlučio na stvaranje
posebnog alata koji bi bio moćan s obradom teksta i stvaranjem izvješća. S vremenom je taj
alat prerastao u programski jezik koje je Wall podijelio s ostalima putem Usenet-a. Tako je
zaživio Perl - interpretorski jezik pisan u C-u i namijenjen samo UNIX platformama.
Jednostavnost, veća brzina izvođenja i fleksibilnost koju je Perl nudio naspram ostalih
jezika u to vrijeme za tu primjenu, učinile su ga vrlo popularnim. Zahvaljujući tome Perl se
brzo razvijao obuhvaćajući sve više novih mogućnosti (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 opće prihvaćenih skriptnih programskih jezika opće namjene. Nije više
ograničen samo na UNIX platforme, već postoji i podrška za druge OS (Windows, Mac,...).
Posebnost Perl-a je u tome što u sebi objedinjuje mogućnosti C, sed i awk programskih
jezika, te UNIX-ovih ljuski.

1091/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

U novije vrijeme Perl se zbog svoje opsežnosti počinje sve više izbjegavati kod mlađih
webmastera, te polagano, unatoč mogućnostima koje se preklapaju sa drugim serverskim
jezicima, gubi utrku na webu.

Namjena Perl-a

Kako se s vremenom razvijao, Perl se nije zadržao samo na procesiranju teksta. Danas
je Perl naširoko primjenjivan za zadatke kao što su: administracija sustava, razvoj
interaktivnih web stranica, meržno programiranje, grafičko programiranje, izrada sistemskih i
običnih aplikacija. Perl se primjenjuje kada je potrebno brzo, jednostavno i efikasno razvijanje
ispitnih okruženja programa ili njihovih prototipova te kada se zahtijeva široka prenosivost.
Perl podržava proceduralno i objektno programiranje. Poput C i C++, Perl nema
striktnu granicu između procedura ili objekata.
Perl je izveden kao modulator, tj. interpreter (prevodi računalu ono što korisnik napiše
na poznat jezik jedinica i nula) Perl-a može se dopunjavati bibliotekama koje mu proširuju
funkcionalnost (vrlo velika baza modula). Baza modula je okupljena oko CPAN mreže (eng.
Comprehensive Perl Archive Network). Perl interpreter nije ograničen samo na određenu
primjenu. U žargonu se za Perl kaže da je "otvoren prema svima, ali nije poseban prema
nekome".
Perl je od samog početka 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 opsežnosti počinje sve više izbjegavati kod mlađih
webmastera, te polagano, unatoč mogućnostima koje se preklapaju sa drugim serverskim
jezicima, gubi utrku na webu.

1092/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 početka razvijen kao jezik na UNIX operativnim sustavima jer koristi
njegove osnovne pozive kernela. Kako je njegova raširenost rasla, tako je s vremenom postao
sastavni dio distibucija UNIX i Linux operativnih sustava. Ipak, distribucije obično ne sadrže
najnovije verzije Perla pa ga je potrebno skinuti s Interneta.

S Interneta se može skinuti kompajlirana verzija Perla (eng. ports, binary


distributions), no to nije preporučljivo zbog već podešenih postavki prije kompajliranja koje
ne moraju odgovarati onima koje želimo.

Najbolje je skinuti izvorni kod s Interneta, te ga kompajlirati na vlastitiom računalu.


Najnoviji izvorni kod moguće 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 slijedećom naredbom u ljusci:

$ tar xvzf stable.tar.gz

Nakon toga slijedi proces kompajliranja koji se najčešće izvodi slijedećim naredbama u ljusci:

$ cd stable
$ ./configure
$ make

Gornjim naredbama postavlja se tekući direktorij stable (koji je nastao otpakiravanjem


arhive stable.tar.gz), učitavaju se postavke za proces kompajliranja i na kraju se pokreće samo
kompajliranje.

Preporučljivo je prije procesa kompajliranja pročitati datoteku Readme koja dolazi sa


izvornim kodom, a u kojoj je detaljno opisana procedura kompajliranja.

1093/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Instalacija ActivState Linux Package-a

Tražeći po internetu potrebni materijal za pisanje našeg seminara o Perlu pronašli smo
komentare kako je pomoću ActiveState Linux Package-a najlakše instalirati Perl na Linux
platformu, te smo napisali kako se instalira Perl na Linux pomoću ActiveState Linux
Package-a.

ActiveState Linux Perl Package se može 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.623-


i686-linux-thread-multi.tar.gz/tmp, te ga otpakiramo. To možemo napraviti na dva načina.:

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 –xf-

Mi ćemo koristiti drugi način. Uđemo u direktorij komandom cd ActivePerl-5.6.0.623 i


upišemo ./install.sh za instalaciju Perl-a. Postavimo Environment varijable tako da upišemo
setenv PATH /usr/local/ActivePerl-5.6/bin:$PATH. Time je instalacija Perl-a na Linux-u
završena

1094/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Instalacija Perl modula na Linux-u

U ovom dijelu smo opisali tipičnu instalaciju za sve *NIX sisteme. Perl module prvo
moramo skinuti sa Interneta. Nakon što smo to učinili kopiramo ga u određeni direktorij, npr.
cp DBD-Mysql.tar.gz /tmp i otpakiramo ga. To možemo napraviti na dva načina:
1.· tar -xzf DBD-Mysql.tar.gz
2.· gunzip -c DBD-Mysql.tar.gz | tar -xf –
Zatim uđemo u direktorij komandom cd DBD-Mysql i započnemo instalaciju upisivanjem:
· perl Makefile.PL
· make
· make test
· make install
Make test nije obavezan korak, ali nam pomaže da vidimo da li ima pogrešaka prije nego što
instalacija bude završena.
Ako koristimo neki drugi compiler, npr. Gnu CC, onda moramo umjesto make
napisati make CC=gcc. Time prisiljavamo program make da koristi gcc compiler. Ukoliko
koristimo gmake umjesto make, gmake moramo upotrebljavati cijelo vrijeme.
Primjer: - perl Makefile.PL
- gmake CC=gcc
- gmake test
- gmake install

Time je modul instaliran i ako nisu prikazane nikakve greške možemo ga koristiti u
našim skriptama.
Da bi instalirali Perl i module moramo biti root.
Više informacija o modulima možemo naći na stranicama http://www.cpan.org.

1095/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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. Veličina 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 olakšavaju korištenje.
Zatim resetiramo kompjuter.
Environment varijable možemo naći klikom desne tipke miša na Computer ->
Preferences -> Advanced -> Environment Variables I pod opcijom PATH pronalazimo
tražene Perl varijable. U slučaju da neka varijabla fail treba ih unijeti ručno jer bi morali pisati
puni PATH za Perl skripte.
Sve Perl skripte počinju sa #!Perl Dir. Environment varijble nam skraćuju pisanje Perl
Dir-a. Umjesto Perl Dir-a pišemo #!perl.
Za provjeru da li je instalacija uspješno prošla napravimo kratku Perl skrupitu tako da
napravimo novi file na npr. desktopu i imenujemo ga perl.pl. Otvorimo ga u editoru I
napišemo sljedeći 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 treća linija mu govori da MS-DOS prozor drži
otvorenim dok ne pritisnemo ENTER na kompjuteru. Ako se nakon duplog klika miša 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 naći i instalirati.

1096/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Za instalaciju Windows XP-ea instaliranje se pokreće 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.

Instalacija Perl modula na Windows OS-u

ActiveState je izmislio jednostavan način instaliranja modula na Windows sistemima


PPM. PPM (Programmer_Package Manager) je program koji pomaže da se instalacija Perl
modula odvija jako brzo.

PPM funkcionira na način:


- Otvorimo MS-DOS prozor klikom na ikonu u Start menu-iju ili klikom na Start -
Run , upišemo cmd i kliknemo ENTER.
- U MS-DOS prozoru upišemo ppm3 za pokretanje PPM. Ako se pojavi greška tipa
“Could not find...”, upišemo C:\perl\bin\ppm3 za pokretaje PPM-a.
- Upišemo search ime_modula (npr. search DBI) za pronalazak željenog modula
(DBI - moduli za rad sa bazama), i PPM će izlistati nađene module zajedno sa kratkim
opisom svakog od njih. Za rad sa search (i u ovom slucaju install) naredbom moramo biti
online spojeni.
- Nakon pretraživanja upišemo 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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
Writing C:\perl\site\lib\auto\DBIx\Easy\.packlist
ppm>

- PPM skida modul sa Interneta i instalira ga u odgovarajući direktorij (C:\Perl\lib).


- Modul je instaliran i možemo početi sa korištenjem. module u Perl-u koristimo
naredbom use ime_modula.
- Za sve daljnje PPM komande treba upisati help.

1098/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

STRUKTURA PERL PROGRAMA

Konvencije Perl-a

Kada se kaže "Perl", pod time se misli na elemente, pravila i definicije koje
objedinjuje taj programski jezik, dok "perl" predstavlja njegovu izvedbu (interpreter).
U smislu Perl kodiranja možemo koristiti termine program i skripta s jednakim
smislom. I jedno i drugo je ispravno.

Perl program je običan tekstualni dokument koji se može pisati klasičnim editorom
teksta (npr. joe na Linux OS, ili Notepad na Windows OS).

Struktura Perl-a

Prvi red Perl programa obično počinje posebnim komentarom koji počinje sa #!. On
služi kao uputa UNIX ili Linux ljusci (npr. bash) da se radi o Perl skripti koju Perl interpreter
treba izvesti.

Jednostavan Perl program može 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 našem slučaju, Perl interpreter se nalazi u
direktoriju /usr/bin.

Kod Windows OS prva linija ne mora biti komentar. Važno je samo da skripta ima
sufiks .pl i da za takav tip datoteke OS poziva Perl interpreter.

Drugi red primjera je izraz koji sadrži poziv Perlove predefinirane funkcije -
operatora. To je print operator koji proslijeđuje tekst unutar navodnika na standardni izlaz
STDOUT, ispisuje ga na monitoru. Svaki Perl izraz mora završavati sa ;.

1099/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

U trećem redu napisan je komentar. Obični komentari u Perlu počinju znakom # iza
kojeg slijedi tekst koji interpreter preskače pri izvođenju. Ti komentari služe za umetanje
teksta koji programeru služe za jednostavnije snalaženje u kodu.

Nakon pokretanja programa, Perl interpreter u potpunosti provjerava kod pozvanog


programa, te ga kompajlira. Poslije kompajliranja počinje njegovo izvršavanje izraz po izraz.
Nakon uspješnog izvođenja programa, Perl proces završava vraćajući ljusci iz koje je pozvan
vrijednost o uspješnom kraju programa.

Iz takvog slijeda izvršenja Perl skripte, dolazi se do zaključka da Perl nije efikasan za
male skripte i njihova višestruka pokretanja. Razlog je taj što samo kompajliranje uzima nešto
vremena i resursa prije izvođenja, pa trajanje izvršenja samog programa može biti manje od
trajanja kompajliranja. U tom slučaju je korisnost (omjer između korisnog i ukupno utrošenog
vremena) procesorskog vremena mala.

VARIJABLE I NJIHOVI OPERATORI

Kod Perla razlikujemo tri ugrađene vrste podatkovnih struktura: skalari (eng. scalars),
polja skalara (eng. arrays), te asocijativna, združena polja skalara (eng. associative arrays).

1100/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Imena varijabli razlikujemo po početnom znaku koji definira tip varijable i imena varijable.
Njihova veličina je jedino ograničena 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 najčešće korištenih operatora. Njihova namjena je
promjena vrijednosti varijabli. Operatori se dijele s obzirom na tip verijable. Na perlop man
stranicama može se naći više o samim operatorima.

Skalarne varijable

Skalarne varijable su najednostavnije vrste podatkovnih struktura. Služe za pohranu


cijelih i realnih brojeva, za pohranu niza znakova (stringova) i reference.
Označavaju se kao:
$ime_varijable
Pridjeljivanje vrijednosti skalarima prikazat ćemo u slijedećih 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 mogućnost interne pohrane brojeva kao cjelobrojnih (intdeklaracija u C-u) s
ciljem optimizacije programa.
Najčešći operatori nad brojevima su:
+ plus
- minus
* množenje
/ dijeljenje
** eksponent
% modulo
== jednako
!= razlicito
< manji od

1101/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

> 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 označavaju da se unutar znakovnog niza prepoznaju nazivi varijabli, te
da vrijednost toga niza ovisi o vrijednosti te varijable.
Npr.:
$ime = "Tamara"
$obrazac = "$ime pohadja Sveučilište u Splitu."
# $obrazac postaje " Tamara pohadja Sveučilište u Splitu."
Jednostruki navodnici označavaju da znakovni niz ima fiksnu vrijednost.
Najznačajniji operator znakovnih nizova je chop($ime_varijable) koji briše zadnji
znak niza.

1102/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Polja skalara

Polja skalara su spremnici niza skalara čijim vrijednostima se pristupa putem index-a
(prvi element $array [0], drugi $array [1], …).

Označavaju se kao:
@ime_polja
Pridjeljivanje vrijednosti poljima prikazat ćemo kroz primjere:
@trio = ("Ante", "Tamara", "Jana", "4401");
@trio_gusti = @trio;
Pristup određenom elementu polja izvodi se na slijedeći način:
$trio[3] = "1044";
Time smo promijenili zadnji element polja "4401" u "1044". Indeksiranje elemenata
polja počinje od 0.
Najčešći 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 poèetak 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 briše se zadnji znak
@linija = ;
# jedna linija sa standardnog ulaza pohranjuje se u @linija

Združena polja skalara

1103/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Združena polja skalara, poznata jos kao “hashes” su spremnik koji predstavlja
dvodimenzionalno polje skalara. Svakom elementu polja pristupa se putem jedinstvenih
ključeva prema kojem se razlikuje od ostalih elemenata. Ključevi su također skalari i njihova
bitna karakteristika je u tome da Perl ne garantira njihov redoslijed pri njihvom isčitavanju iz
združenog polja skalara.
Združena polja se označavaju 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 združena polja su:


@kljucevi = keys(%a);
# vraca polje s vrijednostima kljuceva
@elementi = values (%a);
# vraca polje vrijednosti elemenata
delete $a{"Ante"};
# briše element s kljucem "Ante"

1104/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KONTROLA TIJEKA PROGRAMA (PETLJE)

Tijek izvođenja programa u Perlu je od prvog izraza prema zadnjem izrazu. On se


može
promijeniti uvjetnim petljama ili grananjem.
I u Perlu, kao u svim programskim jezicima, postoje izrazi za kontrolu tijeka
programa. Mi smo naveli samo njihovu osnovnu sintaksu. Detaljniji opis može se naći u
perlsyn man stranicama.
if izraz služi za ispitivanje uvjetnog izraza. Ukoliko je on točan (TRUE) izvode se
izrazi unutar vitičastih zagrada odmah iza if-a. U suprotnom, izvode se izrazi unutar vitičastih
zagrada odmah iza else.
Uvjetni izraz daje vrijednost FALSE ako je rezultat tog izraza NULL string "" ili
znamenka "0".
if (uvjetni_izraz_A) {
A_tocan_izraz_1;
A_tocan_izraz_2;
A_tocan_izraz_3;
} elsif (uvjetni_izraz_B) {
B_tocan_izraz_1;
B_tocan_izraz_2;
B_tocan_izraz_3;
} else {
netocan_izraz_1;
netocan_izraz_1;
netocan_izraz_1;
}
While je petlja koja ispituje uvjet, te ako je istinit izvrši blok i ponovno
testira uvjet.
Akooznacimo petlje s tzv. labelima, mozemo sa next, last i redo kontrolirati i vanjske
petlje.

1105/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

LABELA:
while (uvjetni_izraz) {
izraz_1;
izraz_2;
izraz_3; }
for petlja izvodi blok izraza u vitičastim zagradama sve dok je uvjetni izraz koji
ispituje točan (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 vitičastim zagradama za svaki element polja
@polje, pri čemu je vrijednost tekućeg elementa polja sadržana u varijabli $i.
LABELA: foreach $i (@polje) {
izraz_1;
izraz_2;
izraz_3;
}

1106/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

FUNKCIJE (PODRUTINE)

Kao i mnogi drugi programski jezici i Perl pruža 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, učitati iz nekih drugih file-ova, možemo pozvati funkciju indirektno koristeći
varijablu koja sadrži ime funkcije ili CODE reference.
Funkcije su osnovni element svakog programskog jezika. Najčešće se ponašaju poput
običnih operatora čineći promjenu vrijednosti neke varijable ili vraćajući neku vrijednost koja
se može pridjeliti nekoj drugoj varijabli. Osim toga, u određenom kontekstu funkcije izvode i
kontrolu tijeka izvođenja programa (mijenjajući tijek programa od poziva fukcije, preko
izraza kojima je definirana, pa nazad do točke od kuda je pozvana).
U perlsub man stranicama se nalaze detalji vezani uz podrutine.

Definicija podrutine (perlsub)

Definicija podrutine označava se oznakom sub iza čega slijedi ime funkcije i blok
izraza unutar vitičastih zagrada. Pozivom funkcije izvest će se taj blok izraza.
Npr. :
sub ime_funkcije {
izraz_1;
izraz_2;
izraz_3;
}

1107/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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)

Vraćanje vrijednosti

Podrutina uvijek vraća vrijednost zadnjeg izraza koji je izveden unutar podrutine.
Npr.:
sub aFunction {
izraz_1;
izraz_2;
$a = $b + $c;
}
U primjeru podrutina vraća vrijednost varijable $a. Nakon povratka iz podrutine,
vraćena 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 vraća vrijednost zbroja dvaju brojeva koji se u nju prenose putem
argumenata. Poziv te podrutine bi izgledao ovako:
&zbroji(2, 5)

1108/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Lokalne i globalne varijable

S obzirom na raspon dohvatljivosti određene varijable postoje globalne i lokalne (u


daljnjem tekstu leksičke) varijable. Slično nekim drugim jezicima, globalnim varijablama se
može direktno pristupiti iz bilo kojeg dijela programa, a leksičkim samo iz blokova gdje su
definirani, ili ako nisu u bloku, onda od mjesta gdje su definirani pa do kraja datoteke.
Program se može sastojati od više datoteka. Blok se odnosi na funkciju, foreach, while, ili
neku drugu konstrukciju sa vitičastim zagradama.
Globalne varijable se definiraju sa "our", a leksičke sa "my" oznakom. Novu
vrijednost GLOBALNE varijable određuje oznaka "local" koja privremeno vrijedi do kraja
bloka, a proteže se također i na funkcije koje su pozivane iz tog bloka.
Primjer:
sub neka_rutina {
local ($A, $B);
$A = $_[0];
$B = $_[1];
}
&neka_rutina ($a, $b);
U primjeru varijable unutar podrutine $A i $B će imati jednake vrijednosti kao i
globalne varijable $a i $b. Bilo kakve promjene nad lokalnim varijablama neće utjecati na
vrijednosti varijabli $a i $b.
Leksičke varijable također mogu "pregaziti" svoju staru vrijednost s tom razlikom da
se novo dodjeljena vrijednost ne proteže i na pozivane funkcije.

Sve varijable uvijek moraju biti definirane prije nego im se pristupa, a obrnuti
redoslijed označava pogrešku u logici, i u većini slučajeva završava prijavom greške kod
pokretanja.

1109/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Funkcije map i grep

Map je funkcija koja za svaki element liste s desne strane, obavlja transformaciju i
prosljedjuje takvu transformiranu listu prema lijevoj strani. Unutar map bloka globalna
varijabla $_ poprima redom vrijednosti liste.
my @arr = map { $_*2 } 0..3;
Tako @arr nakon ovakvog mapiranja sadrzi (0, 2, 4, 6).

Kako Perlu većini slučajeva omogučuje alternativni način, I ovdje se radi o


jednostavnom ozrazu koji ne zahtjeva blok, možemo napisati:
my @arr = map($_*2, 0…3);

Ili jednostavnije bez zagrada:


my @arr = map $_*2, 0…3;

Grep je funkcija koja za svaki element liste s desne strane, obavlja provjeru I sukladno
tome prosljeđuje filtriranu listu prema lijevoj strani. $_ opet redom poprima vrijednosti liste.
my @arr = grep { $_%2 } 0...3;
my @arr = grep $_%2, 0...3; # isto

@arr nakon ovakvog filtriranja sadrzi (1, 3).


0 % 2 je 0, te 0 ne prolazi
1 % 2 je 1, te 1 prolazi
2 % 2 je 0, te 2 ne prolazi
3 % 2 je 1, te 3 prolazi

1110/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

REGULARNI IZRAZI (regex-i)

Regularni izrazi su Perl-ov pojam za znakove ili posebne znakovne (pod) nizove koji
se žele pronaći unutar drugih znakovnih nizova. Regularni izrazi predstavljaju točno
definirane uzorke znakovnih nizova (eng. patterns). Ti uzorci ne služe samo za pronalaženje
tih uzoraka u drugim nizovima, već i za ostale operacije kao što je na primjer zamjena
pronađenog uzorka u nizu nekim drugim znakovnim nizom. Tip operacije ovisi o
primjenjenom operatoru.
Detaljnije i kompletnije o regularnim izrazima može se vidjeti u perlretut i perlre
man stranicama.
Regularni izrazi u Perlu se definiraju na točno određen način. Najuobičajeniji način
definiranja je postavljanjem znakovnog niza (uzorka) unutar znakova /:
/neki_niz_znakova/
/Tamara_98/
Osim znaka / može se koristiti neki drugi ne-alfanumerički znak, samo je potrebno
naglasiti znakom m:
m#uzorak#
m@Tamara_98@
Definirani regularni izraz se pretražuje u preodređenoj varijabli $_. Želi li se regularni
izraz pretraživati unutar neke prethodno definirane varijable, tada se koristi operator =~:
$imena =~ /marko/;
Ukoliko se u varijabli $imena nalazi uzorak "marko", cijeli izraz vraća TRUE (u
suprotnom FALSE). Budući da regularni izrazi vraćaju logički rezultat (TRUE/FALSE)te se
oni većinom koriste kod kontrolnih struktura.
if (/Ante/) {
print "Ante postoji u $_\n";
}

1111/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Oblici uzoraka

Regularni izrazi su uzorci koji općenito 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 alfanumerički 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]

Višeznakovni uzorci mogu u sebi sadržavati sekvencu znakova koji se ponavljaju


određen broj puta. Zato u Perlu postoje specijalni znakovi kojima se definira točan broj
ponavljanja u uzorku.
Primjeri višeznakovnih uzoraka koji u sebi sadrže sekvencu znakova koji se
ponavljaju određen broj puta:
/a*t/
# bilo koji broj znakova "a" iza kojeg slijedi "t"
/a+t/
# jedan ili više znaka "a" iza kojeg slijedi "t"
/a?t/

1112/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

# 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 više znaka "a" iza kojeg slijedi "t"
/a{2}t/
# tocno 2 znaka "a" iza kojeg slijedi "t"
Za uzorke se može definirati i položaj na kojem mora biti unutar znakovnog niza koji
se pretražuje.
Primjeri toga:
/\bdr/
# \b == granica (prazninu, poèetak 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Operatori regularnih izraza


Najčešće korišten operator je zamjena koja je formulirana na slijedeći način:
$niz =~ s/uzorak/zamjena_za_uzorak/
Uzorak se pretražuje unutar varijable (skalara) $niz, te se svaki uzorak koji se
podudara s njime zamjenjuje definiranim znakovnim nizom.
Primjeri:
s/ante/tamara/
# zamjenjuje se "ante" s "tamara" (unutar $_)
s/ante/tamara/gi
# isto kao i prethodni samo operator sada
# nije osjetljiv na velika i mala slova
$a =~ s/ante/tamara/
# ista operacija se izvodi nad $a

Operator split() vraća polje skalara (znakovnih nizova) koji se nalaze između
pronađenih uzoraka.
Primjeri:
@var = split(/pattern/, $znak_niz);
@var = split(/pattern/);

Ukoliko nije definiran znakovni niz, uzima se sadržaj varijable $_.


Još jedan važan operator je join(). On uzima polje skalara (znakovnih nizova), te ih
spaja dodajući između njih definirani znakovni niz.
Primjer:
@imena = ("ante", "tamara", "jana");
$a = join(" + ", @imena);
# kao rezultat skalar $a æe sadržavati
# niz "ante + tamara + jana"

RUKOVANJE ULAZIMA/IZLAZIMA (I/O)

1114/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Perl omogućuje osnovne ulazne/izlazne operacije koje obuhvaćaju prihvat podataka sa


standardnog ulaza (tipkovnica), proslijeđivanje podataka na standardni izlaz (monitor), te
pisanje i čitanje datoteka.

Standardni ulazi/izlazi (I/O)


Standardni I/O su STDIN, STDOUT i STDERR.

Pristup standardnom ulazu STDIN izvodi se preko <> operatora (eng. diamond
operator). U skalarnom obliku, operator vraća jednu liniju s ulaza, dok u kontekstu polja
operator vraća cijelu datoteku s time da svaki element polja predstavlja jednu liniju.

Primjer:

$a = ; # vraæa liniju
@a = ; # vraæa datoteku

Standardni izlaz STDOUT u najčešćem broju slučajeva nije potrebno posebno


pozivati. Na primjer, operator print uvijek radi sa STDOUT proslijeđujući mu tekst koji mora
ispisati.
Standardni izlaz za prijavljivanje pogreški STDERR je obično preusmjeren na monitor
(STDOUT).

1115/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Rad sa datotekama
Datotekama se pristupa putem posebnih pokazivača (eng. filehandles). Pokazivači su
zapravo spona između datoteke i Perl procesa. Ti pokazivači se moraju povezati s datotekom
koju će oni predstavljati u programu. Tome služi operator open().

Primjer pokazivača INPUT-a koji je povezan s datotekom index.html na slijedeći


način:

open (INDEX, "index.html");


U primjeru je datoteka otvorena samo za čitanje. Ukoliko se u nju želi pisati to se radi
na slijedeći način:
open (INDEX, ">index.html");
U ovom slučaju će se prebrisati stari sadržaj datoteke. Ukoliko se želi sadržaj datoteke
nadopunjavati (eng. Update), tj. dodavati podatke na njen kraj, potrebno je datoteku otvoriti
na slijedeći način:
open (INDEX, ">>index.html");
Operator open() vraća vrijednost TRUE/FALSE s obzirom na to da li je operacija
uspješno izvršena (TRUE za uspješno izvedenu operaciju). Provjera uspješno izvedene
operacije open() može se ispitati na slijedeći način:
open (INDEX, ">index.html") || die "Poruka za SDTERR";
Funkcija die() proslijeđuje tekst unutar zagrada na STDERR i gasi Perl proces. U
ovom primjeru ona će se izvoditi ukoliko je lijevi dio operatora || jednak FALSE (neuspješno
otvorena datoteka).
Zatvaranje datoteke nije nužno izvršiti jer se obavlja automatski prilikom završenja
Perl procesa. No, ukoliko ga je potrebno učiniti prije, za to služi operator close(). Ako u
gornjem primjeru želimo zatvoriti datoteku index.html s pokazivačem INDEX, učiniti ćemo to
ovako:
close(INDEX);
Čitanje datotete je isto kao i kod SDTIN. Operatorom <> pristupamo datoteci u
skalarnom kontekstu ili u kontekstu polja.
$a = ; # vraæa liniju
@a = ; # vraæa cijelu datoteku
Pisanje u datoteku izvodi se operatorom print, samo što se mora prije definirati izlaz
na koji se tekst proslijeđuje. Na primjer:

1116/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

print INDEX "neki tekst $odlomak \n";


Ispitavanje statusa i atributa datoteka je u mnogo slučajeva korisno i poželjno. 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 # izvršna datoteka?
-e # datoteka postoji?
-z # prazna datoteka?
-d # direktorij?
-l # simbolièki link?
-T # tekstualna datoteka?
-B # binarna datoteka?
Svaki od operatora vraća 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

SISTEMSKI POZIVI

Sistemski pozivi u Perl-u usko su povezani s terminologijom UNIX operativnog


sustava. Svi operatori omogućuju pozivanje određenih procesa iz ljuske.
Operatori se dijele na dvije glavne skupine: operatori datotečnog sustava i operatori
procesa. Mi smo operatore samo ukratko naveli operatore, a njihova objašnjenja mogu se
pročitati na perlfaq8 i perlfunc man stranicama.

Operatori datotečnog sustava


Operatori za upravljanje datotekama i direktorijima pozivima su vrlo slični onima koji
se pozivaju u ljusci.
Najčešći operatori su:
chdir ("/put/ . . . /direktorij");
# promjena aktivnog sirektorija
opendir (POKAZIVAC, "/path/ . . . /directory");
# postavljanje pokazivača za direktorij
closedir(POKAZIVAC);
# zatvarenje direktorija
readdir(POKAZIVAC);
# vraća imena datoteka iz direktorija
symlink("put", "IME_VEZE");
# stvaranje simboličke veze
link("path/file", "IME_VEZE");
# stvaranje čvrste veze (eng. hard link)
unlink("IME_VEZE");
# brisanje veza na datoteku
mkdir("ime_direktorija", mod);
# stvaranje novog direktorija
rmdir("ime_direktorija");
# brisanje direktorija
chmod(mode, "ime_datoteke");
# promjena moda datoteka

1118/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Operatori procesa

Operatori procesa su vrlo moćni po svojim mogućnostima. Oni omogućuju izvedbe


poput jednostavnih poziva drugih programa, te izvedbe vrlo složenih procesa kao što je
klijent/server mrežni model.
Mi smo spomenuli neke od najčešćih operatora procesa.
Najjednostavniji sistemski operator je system(). On pokreće novi proces, dijete Perl
procesa. Ime novog procesa je sadržano unutar zagrada:
system("pwd")
Vrijednost koju vraća proces dijete na STDOUT, moguće je dobiti ako se poziv
procesa izvede pomoću unazadnih navodnika:
$a = `pwd`;
Pokretanje novog procesa može se učiniti operatorom exec samo što se u tom slučaju
automatsk gasi Perl proces:
exec "pwd";
Najznačajniji 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 vraća fork. Proces
vraća 0 za dijete i 1 za roditelja.

1119/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

ZAKLJUČAK

Perl ( eng. Practical Extraction and Report Language ) je interpretorski programski


jezik opće namjene prenosiv za sve OS (UNIX, Linux, Windows, Mac,...). Perl je besplatan,
"open-source" jezik, proširiv sa novim funkcijama i mogućnostima koje njegovi korisnici
sami naprave (modularan je). Podržava proceduralno i objektno programiranje.
Posebnost Perl-a je u tome što u sebi objedinjuje mogućnosti C, sed i awk programskih
jezika, te UNIX-ovih ljuski.
Perl nudi aplikacije za programiranje i administraciju, datotečno programiranje,
znanstvene programe, grafičko programiranje, GUI alate.
U novije vrijeme Perl se zbog svoje opsežnosti počinje sve više izbjegavati kod mlađih
webmastera, te polagano, unatoč mogućnostima koje se preklapaju sa drugim serverskim
jezicima, gubi utrku na webu.
Perl je jezik bogat mnogim mogućnostima. Mi smo obradili samo neke od tih njegovih
mogućnosti i samo neka njegova svojstva. Za dublje spoznaje i veća znanja o Perlu treba
posvetiti puno više vremena, kojeg mi u toj mjeri nismo imali.
Sve o Perlu može se naći u knjigama koje obrađuju tu temu ili na WEB stranicama
dostupnima na Internetu ( najlakše je utipkati riječ Perl u jedna od serach engine-a ) koje
sadrže mnoge primjere, ilustracije i literaturu.
Moto Perl-a je "there's more than one way to do it" -"uvijek postoji više načina"
(ili skraćeno TMTOWTDI popularno zvano "tim toady").

1120/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

DODACI

U dodacima smo priložili izgled instalacije i primjere nekih od mnogobrojnih skripti.

Dodatak A: Izgled instalacije Perl-a

1121/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

1122/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

1123/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

1124/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dodatak B: Izgled Perl Package Mnager-a

1125/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dodatak C: Skripta našeg pozdrava

1126/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dodatak D: Primjer povezivanja Perl-a i PostgreSQL-a

#!/usr/bin/perl
use Pg;
# niz izraza: opcija=vrijednost opcija1=vrijednost1 ....
# opcije: host, port, options, tty, dbname, user, password
$conn = Pg::connectdb("dbname=fakultet");
# Postavljanje upita
$sql = "SELECT ime,prezime FROM student WHERE indeks=’F-15973’";
$result = $conn->exec($sql);
while (@row = $result->fetchrow)
{
$ime = $row[0]; $prezime = $row[1];
print "ime: $ime, prezime: $prezime\n";
}

Izvođenje:
racunalo> ./primjer.pl
ime: Tamara, prezime: ¡Krutman

1127/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dodatak E: Instalacija Link it skripte

Link it skripta dozvoljava posjetiocima neke Web stranice da dodaju svoju Web
stranicu na tu stranicu koju posjećuju.
Za instalaciju skripte potrebno je editirati linkit.cgi i varijable koje odgovoraraju
potrebama servera. Zatim upload-ati linkit.cgi, links.htm, header.htm i footer.htm na server
upotrebljavajući ASCII prijenos i chmod-ati file-ove ovim redom:
linkit.cgi – 755
links.htm - 777
header.htm – 644
footer.htm - 644
Nakon toga treba pokrenuti skriptu za dodavanje linka da budemo sigurni da li radi.
Ukoliko ne radi treba provjeriti da li su varijable točne, da li smo upload-ali pomoću ASCII
transfera i da li smo chmod-ali file-ove kako treba.

#!/usr/bin/perl
# Variables #
# Url location of the script (http://www.yourserver.com/cgi-bin/linkit.cgi)
$me = "http://www.free-scripts.net/cgi-local/linkit.cgi";
# Absolute location of the html file (/home/yourname/public_html/links.htm
$ab_html = "/www/docs/free-scripts/links/links.htm";
# Absolute location of the header file (/home/yourname/public_html/header.htm
$header = "/www/docs/free-scripts/links/header.htm";
# Absolute location of the footer file (/home/yourname/public_html/footer.htm
$footer = "/www/docs/free-scripts/links/footer.htm";
# DO NOT EDIT BEYOND THIS POINT #
print "Content-type: text/html\n\n";
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<([^>]|\n)*>//g;

1128/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

$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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 name=\"site_desc\" rows=\"5\" cols=\"50\"
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";

1130/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

}
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\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

# 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\" size=\"1\"><a
href=\"http://www.free-scripts.net/scripts\">Link It</a> v1.3<br>Free from <a
href=\"http://www.free-scripts.net/scripts\">Free-Scripts.Net</a></font></center></td>
</table>
</center>\n";
}
# End of Sig sub #

1132/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Dodatak F: Instalacija skripte brojača

Skripta brojača računa broj korisnika koji su pristupili stranicu.

#!/usr/local/bin/perl
#Change Variables
$count = '/mnt/web/guide/aestheticsurgerycenter/test/count.dat';
$base_url = 'http://www.aestheticsurgerycenter.com/test/';
$your_ip = "0.0.0.0";
$gif = '.gif';
if ($ENV{'REMOTE_ADDR'} eq $your_ip) {
}
else {
print "Content-type: text/html\n\n";
open (COUNT, "$count");
$counter = <COUNT>;
close (COUNT);
open (COUNT, ">$count");
$counter += 1;
print COUNT "$counter";
@indivual = split(//, $counter);
foreach $number (@indivual) {
$output = "<img src=\"$base_url$number$gif\" alt=\"$CNum\">";
print $output;
}
close (COUNT);
}

1133/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

print end_html;

Dotatak H: Skripta koja izbacuje odgovor u novom prozoru

#!/usr/local/bin/perl
use CGI;
$query = new CGI;
print $query->header;
print $query->start_html('Popup Window');
if (!$query->param) {

1135/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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;

Dodatak I: Primjer Gd skripta

Gd nam omogućuje kreiranje crteža korištenjem brojinim grafičkim mogućnostima.

use GD;
# create a new image
$im = new GD::Image(100,100);
# allocate some colors
$white = $im->colorAllocate(255,255,255);
$black = $im->colorAllocate(0,0,0);
$red = $im->colorAllocate(255,0,0);
$blue = $im->colorAllocate(0,0,255);
# make the background transparent and interlaced

1136/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – 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;

Ovako je rezultat skripte:

1137/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Ana Babić

PYTHON

1138/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

UVOD

Povijest

Oko 1972. godine pojavio se jezik C, prvi jezk opće namjene. Sedamnaest godina
kasnije Guido van Rossum, istraživač na CWI (Stichting Mathematisch Centrum) u
Nizozemskoj, radi na projektima vezanima uz interpreterskim jezik ABC. Nezadovoljan
nefleksibilnošću tog i sličnih programskih jezika i nedostatkom alata za automatiziranje
dosadnih sistemskih problema, odlučuje se razviti novi programski jezik. Želio je programski
jezik koji bi mu omogućio rješavanje generalnih administratorskih zadaća brzo i fleksibilno,
ali je istovremeno želio iskoristiti snagu sistemskih poziva Amoeba distribuiranog OS-a. I
tako je, krajem 1989. godine, počeo razvijati programski jezik Python, koji je nazvao prema
kultnoj BBC seriji „Monty Python's leteći 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 početku zamislio jezik koji bi bio specifičan 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 pušten interpreter za novi programski jezik, Python, napisan u C-u.
Zbog činjenice da je Python open source aplikacija, danas se uspješno može 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Release Derived from Year Owner GPL compatible?


1.6.1 1.6 2001 CNRI no
2.1 2.0+1.6.1 2001 PSF no
2.0.1 2.0+1.6.1 2001 PSF yes
2.1.1 2.1+2.0.1 2001 PSF yes
2.2 2.1.1 2001 PSF yes
2.1.2 2.1.1 2002 PSF yes
2.1.3 2.1.2 2002 PSF yes
2.2.1 2.2 2002 PSF yes
2.2.2 2.2.1 2002 PSF yes
2.2.3 2.2.2 2002-2003 PSF yes
2.3 2.2.2 2002-2003 PSF yes
2.3.1 2.3 2002-2003 PSF yes
2.3.2 2.3.1 2003 PSF yes
2.3.3 2.3.2 2003 PSF yes
2.3.4 2.3.3 2004 PSF yes

Osnovna svojstva jezika Python

Python je interpreterski jezik, što znači da se program ne kompajlira tj. ne prevodi se u


strojni kod procesora nego u poseban, tzv. Python binarni kod. (Python bytecode) kojeg
pokreće Python virtualna mašina. Zato se programi vrlo jednostavno mogu prenositi sa stroja
na stroj, dovoljno je da se kod kopira i pokrene. Naravno, pod uvjetom da na tom stroju
postoji odgovarajući virtualni stroj. Zbog činjenice da se Python kod interpretira, a ne izvodi
izravno u strojnom jeziku optimiziranom za odgovarajući procesor, Python programi su
sporiji od ekvivalentnih programa pisanih u drugim jezicima. Ali, kao i Java, i Python
virtualni strojevi pružaju mogućnost prevođena Python binarnog koda u matični izvedbeni
kod koji je puno bliži strojnom kodu i kao takav omogućava i brže izvođenje. Tako Python
omogućava dobre perfomanse svojim programima, a u isto vrijeme zadržava snagu
interpreterskih jezika.
Python podržava proceduralno i objektno orijentirano programiranje. Kod
proceduralnog programiranja program se rastavlja na niz manjih zadataka – procedura – koje
su dovoljno jednostavne da bi se mogle izraziti pomoću naredbi programskog jezika. U
takvom načinu programiranja procedure se odvajaju od podataka koje obrađuju. Za razliku od
toga, u objektno orijentiranom programiranju, cilj je spajanje podataka i operacija nad njima u

1140/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

objekte. Programer koji će koristiti taj objekt jednostavno od objekta zatraži određenu uslugu
i ne zamara se razmišljajući o načinu na koji objekt funkcionira.
Modularnost. Python je moguće koristiti na više načina. Najčešće se kod rastavlja na
više manjih modula koji međusobno mogu "komunicirati". Može se vrlo jednostavno iz
jednog modula pozivati procedure ili koji koristiti objekte drugog modula.. Što je još važnije,
pristup modulima je uvijek isti, bez obzira da li se radi o već ugrađenim modulima iz Python-
ove standardne biblioteke ili o modulu koji ste napravili trenutak prije. Python-ova standardna
biblioteka podržava regularne izraze, generiranje dokumentacije, threadove, baze podataka,
web pretraživače, CGI, ftp, elektroničku poštu, XML, HTML, WAV datoteke, kriptografiju,
GUI (grafičko sučelje) 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 sučelja, koje je
potpuno isto kao i kod Python modula, jednostavno koristiti. To omogućuje da se dijelovi
koda koji predstavljaju usko grlo (vremenski su zahtjevni) ubrzaju i time znatno poboljšaju
cjelokupno izvršavanje programa. Takav način programiranja se podrazumijeva u jezicima
kao što su C i C++, ali je iznimka među skriptnim jezicima.
U python-u je vrlo jednostavno otkriti pogrešku u izvršavanju programa. U slučaju
pogreške u izvođenju programa, moguće je pristupiti stogu programa, "stack trace" će točno
odrediti vrstu i mjesto greške (exception) što omogućuje vrlo lagano lociranje i ispravljanje
pogreške u programu.
Automatsko skupljanje smeća. Curenje memorije ili prerano uništenje objekata u
tradicionalnim jezicima je vrlo čest uzrok "blokiranja" rada programa ili cijelog računala.
Python interpreter sam se brine da se oslobodi memorija koja više nije potrebna – mehanizam
za sakupljanje smeća (garbage collection) je ugrađen u sustav i automatski se pokreće 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 rješavanje problema.
S druge strane, kod automatskog skupljanja smeća, sustav sam procjenjuje kada treba to
sakupljanje započeti i nerijetko se to događa upravo onda ka program obavlja neku zahtjevnu
operaciju. Zato se i kod ugrađenog automatskog sustava za skupljanje smeća treba često paziti
da ne novi objekti ne stvaraju neracionalno.

1141/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Usporedba s drugim programskim jezicima

Python se vrlo često uspoređuje s drugim programskim jezicima zbog činjenice da


podržava više programskih paradigmi, sam Python je nastao kao kombinacija mnogih drugih
programskih jezika, uključujući ABC, Modula-3, C, C++, Algol-68, SmallTalk, razne
skriptne jezike. Ali, pošto je Python interpreterski jezik, najviše je usporedbi sa Perl-om,
Javom, Tcl-om i JavaScript-om. Perl, kao i Python, nudi snagu potpunog programskog jezika
kao i pristup sistemskim pozivima. Najveća snaga Perl-a je u radu sa stringovima, Perl je
najmoćniji upravo u radu sa regularnim izrazima, filtriranju teksta i još uvijek se najčešće
koristi za pisanje CGI skripti. Problem Perl-a je u kompliciranoj sintaksi koju je ponekad vrlo
teško čitati, što dovodi do frustrirajuće teškog učenja jezika i nerazumljivih programa.
Python se vrlo često, zbog podržavanja objektno orijentiranog programiranja i slične
sintakse, uspoređuje sa Javom. Java, iako puno jednostavnija od C++-a, još uvijek je kruta,
posebno ako se želi napisati mali, brzi program. Python-ova jednostavnost omogućuje puno
brže pisanje malih programa nego upotreba čiste Jave. Veliki korak u odnosu Python-a i Jave
je razvoj JPython-a, Python interpretera napisanog isključivo u Javi. Sada je moguće pokretati
Python programe na strojevima na kojima se vrti samo Java virtualni stroj. Vrlo je
jednostavno u JPython-u raditi s Java objektima, komunicirati s njima, koristiti Java
biblioteke klasa, kao da je Java u Python bila integrirana od početka razvoja jezika.
Od jezika koji je najčešće uspoređuju s Python-om najsličniji je JavaScript po svojoj
sintaksi i po činjenici da je objektno orijentiran. Programeri JavaScript-e vrlo brzo i bez
problema prihvaćaju Python. Python se, za razliku od JavaScripte, pokreće izvan Web
pretraživača, a omogućava sistemske pozive i podržava vrlo jednostavno rješavanje problema
koji se tradicionalno obavljaju pomoću shell skripta.

1142/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

POKRETANJE PYTHON PROGRAM-A

Tri su načina pokretanja Python programa

Najjednostavniji je način startanjem interpretera interaktivno. Pokreće se iz komandne


linije a kod se unosi liniju po liniju i izvršava.
Dodatne opcije kada se interpreter pokreće iz komande linije.

-d provide debug output


-O generate optimized bytecode (resulting in .pyo files)
-S do not run import site to look for Python paths on startup
-v verbose output (detailed trace on import statements)
-X disable class-based built-in exceptions (just use strings);
obsolete starting with version 1.6
-c cmd run Python script sent in as cmd string
file run Python script from given file (see below)

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 način je pokretanje skripte napisane u Python-u. Interpreter se poziva zajedno sa


skriptom. Većina skripta završava sa ekstenzijom .py. Vrlo je važno da se dobro izabere editor
u kojem će se pisati program. Više editora koji podržavaju python sintaksu, među njima su
najpopularniji i najmoćniji Vim i Emacs.

Primjer (hello world skripta)

#!/usr/bin/pyhon
# Filename : hello_world.py
print 'hello world'

/usr/bin/pyhon označava puni put prema python interpreteru.


Pokretanje interpretera sa skriptom:

$ python hello_world.py

1143/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

hello world

U Unix-u je moguće 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

Treći način pokretanja Python programa je korištenje grafičkom sučelja 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. Većine IDE
sučelja sadrži i editor i interpreter.

Ispis/unos
Unos korisnika je vrlo jednostavno dobiti pomoću raw_input() funkcije

Primjer Unošenje 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, unošeni tekst se
mora konvertirati u integer pomoću 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 počinju sa %, ima %d
za integere, %s za stringove i %f za realne brojeve.

Komentari
Komentar započinje direktno iza znaka # i nastavlja se do kraja linije.

1144/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

TIPOVI PODATAKA
Postoje dva načina provjere tipa varijabli u programi. Za vrijeme kompajliranja
programa (static typing) ili za vrijeme rada programa (dynamic typing). Python prodržava
dynamic type što znači da nema deklaracija tipa varijabli već da sam program za vrijeme rada
odlučuje koji će tip pridružiti kojoj varijabli. Takav način korištenja 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, dinamičko deklariranje funkcionira tako da svaki program za vrijeme svog
rada pridjeljuje varijablama tipove ovisno o tome koje su im vrijednosti pridružene (operator
pridruživana u Python-u je =). Valjanost tih tipova se provjerava tek kada se te varijable
koriste u operacijama – u tom trenutku se i generiraju greške u slučaju upotrebe operatora koji
nisu dozvoljeni nad tipovima varijabli koje su u izrazu.
Među jezicima koji podržava dinamičko deklariranje, Python je umjereno type-checked.
Impilicitno pretvaranje je definirano za numeričke tipove, npr. dozvoljeno je množiti complex
broj i long integer bez eksplicitnog pretvaranja. Ali nema implicitnog pretvaranja između
numeričkih tipova i stringova (za razliku od Perl-a, u Python se ne može operaciji sa stringom
pridružiti broj.)
Ono što Python ima je ugrađena funkcija eval() koja čita string kao moguću operaciju:

>>> eval('5+6')
11
>>> eval('7*8')
56

Vrlo je važno je zapamtiti da je Python osjetljiv na velika i mala slova pa varijabla


brojac nije jednaka varijabli Brojac.

1145/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Brojevi
Python podržava četiri tipa brojeva: integer, long integer (mogu biti prezentirani i
oktalno i heksadecimalno), float (realni) i complex (kompleksni).

Primjeri unosa:

Int 0101 84 -237 0x80 -0X92


Long 29979062458L -84140l 0xDECADEDEADBEEFBADFEEDDEAL
Float 3.14159 4.2E-10 -90. 6.022e23 -1.609E-19
complex 6.23+1.5j -1.23-875J 0+1j 9.80665-8.31441J -.0224+0j

Stringovi
String je u Python-u neprekidni niz karaktera između navodnika (jednostrukih ili
duplih).
Evo nekoliko primjera korištenja 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 može doći do brze pomoći za korištenje neke funkcije ili naredbe.
Jednostavno se u interpreter prompt-u napiše help(naredba).
Npr. za pomoć u radu sa stringom:
>>> help(str)

1146/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Operatori
Standardni operatori funkcioniraju u Python-u kao i u bilo kojem drugom programskom
jeziku.
+ - * / % **
Uz standardno zbrajanje, oduzimanje, množenje, cjelobrojno dijeljenje/ostatak
cjelobrojnog dijeljenja Python nudi i operator za potenciranje **.
Python podržava operatore poput *=, +=, -=, /=, ali ne podržava C-ovsko
predinkrementiranje i postinkrementiranje.
Isto tako, Python ima i standardne operator za uspoređivanje.
< <= > >= == != <>
Za različito postoje dva operatora != i <>. Preporuča se korištenje operatora !=.
Isto tako podržani su logički operatori and, or i not. Upotrebljavajući logičke operatore
možemo stvarati izraze poput:

>>> (2 < 4) and (2 == 4)


False
>>> (2 > 4) or (2 < 4)
True
>>> not (6.2 <= 6)
True
>>> 3 < 4 < 5
True

Zadnji izraz je u Python-u legalan, i zapravo je kraći zapis ovoga.

>>> (3 < 4) and (4 < 5)


True

1147/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KONTROLA TOKA PROGRAMA

Naredba
Python implicitno pretpostavlja da fizička linija koda odgovara logičkoj naredbi. Ako se
želi staviti više logičkih naredbi u fizičku liniju odvaja ih se s točka-zarez. U praksi se takav
način pisanja koda izbjegava jer dovodi do nepreglednosti i nečitljivosti št je u suprotnosti sa
Python ideologijom.

Blokovi naredba

Blokovi naredba – grupe naredbi koje se uvjetno izvode ili čije se izvođenje ponavlja (a
ponašaju se poput jedne naredbe) – grupiraju se pomoću uvlaka, za razliku od C-a i C++ gdje
se blokovi grupiraju pomoću vitičastih zagrada. Vrlo je važno paziti na sva prazna mjesta jer
Python-u je svako prazno mjesto ispred naredbe uvlaka. Prazni blok naredbi definira se
ključnom riječju pass.

If-elif-else

If naredba omogućuje grananje toka programa ovisno o tome da li je logički izraz istinit
ili lažan. Ako je vrijednost izraza iza riječi if logička istina, izvodi se if_blok_naredbi, u
protivnom se ispituje izraz iza elif, ako ni on nije točan izvodi se else_blok_naredbi.

if logički_izraz1:
if_blok_naredbi
elif logički_izraz2:
elif_blok_naredbi
else:
else_blok_naredbi

Python nema switch-case naredbu. Svi mnogostruki izbori se rade pomoću 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 raspolaže Python je while petlja. Ona se koristi za ponavljanje
bloka naredbi. While_blok_naredbi će se izvršavati dok god je logički uvjet iza while naredbe
istinit. Blok naredbi iza else će se izvršiti na kraju petlje.

while logički_izraz:
while_blok_naredbi
else:
else_blok_naredbi

else u while petlji redundantan jer zapravo se bilo koja naredba koja dolazi iza while
petlje izvršava nakon što while petlja završi.

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

else:
print 'While je gotov.'

print 'Kraj.'

For petlja
Druga petlja kojom raspolaže Python, for petlja je više slična foreach petlji u shell
skriptama nego tradicionalnoj for petlji u većini programskih jezika koja funkcionira kao
brojač. Petlja uzima kao ulaz niz elemenata i obraduje svaki element u bloku naredbi. Niz
elemenata može biti lista, tuple ili string, isto tako to može 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 označava da se sljedeći
ispis nastavlja u istom redu.

break i continue

1150/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Break naredbom se prekida izvođenje petlje, bez obzira na logički izraz u petlji koji još
uvijek može biti istinit.
Continue naredba uzrokuje skok programa na kraj petlje, ali se petlja nastavlja na
sljedeću iteraciju.

Primjer Upotreba break i continue naredbe

#!/usr/bin/python
#break_continue.py

while True:
s = raw_input('Unesi nešto(izlaz): ')
if s == 'izlaz':
break
if len(s) < 3:
continue
print 'dovoljna duzina'
print 'Kraj'

$ python break_continue.py
Unesi nešto(izlaz): a
Unesi nešto(izlaz): 45
Unesi nešto(izlaz): 123
dovoljna duzina
Unesi nešto(izlaz): izaz
dovoljna duzina
Unesi nešto(izlaz): izlaz
Kraj

1151/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

FUNKCIJE

Deklaracija i korištenje funkcija

Ponavljani postupak, blok naredbi koji se često koristi, stavlja se u jednu zasebnu
cjelinu, funkciju i svaki put kad zatreba pokreće pozivom te funkcije. Onom tko poziva
funkciju nije važno što u njoj piše, jedino je važno ono što funkcija prima (argumenti) i ono
što funkcija vraća.

Primjer Prva funkcija

#!usr/bin/python
#prva_funkcija.py

#definiranje funkcije nadiMax sa dva argumenta a i b


def nadiMax(a,b):
if a > b:
return a
else:
return b

#poziv funkcije
print nadiMax(4,7), 'je najveci'

x=-3
y=-6
print nadiMax(x,y),'je_najveci'

$ python prva_funkcija.py
7 je najveci
-3 je najveci

Odmah nakon return naredbe vraća se tamo od kud je funkcija pozvana. Svaka
funkcija implicitno sadrži return naredbu. Ako uz return naredbu ništa nije navedeno funkcija
će vratiti None. None je specijalna vrijednost koja predstavlja ne postojanje vrijednosti. Kada
varijabla nema vrijednosti, ima vrijednost None.

1152/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Lokalne i globalne varijable

Pojedina funkcija u svojem radu može za realizaciju željenog algoritma trebati niz
pomoćnih varijabli (objekata)

#!usr/bin/python
#funkcija_lokalna.py

def funkcija(x):
print 'Lokalna varijabla x je',x
x=2
print 'Lokalna varijabla x je',x

x=50
funkcija(x)
print 'x je',x

$ python funkcija_lokalna.py
Lokalna varijabla x je 50
Lokalna varijabla x je 2
x je 50

Python podržava i globalne objekte. Ako se želi u funkciji koristi varijabla definirana
izvan nje koristi se global.

#!usr/bin/python
#funkcija_globalna.py

def funkcija():
global x

print 'x prije promjene je',x


x=2
print 'x poslije promjene je',x

x=50
funkcija()
print 'x je',x

$ python funkcija_globalna.py
x prije promjene je 50
x poslije promjene je 2
x je 2

1153/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Podrazumijevani argumenti

U slučaju da se neke funkcije pozivaju vrlo često sa istim vrijednostima mogu se


definirati podrazumijevane vrijednosti argumenata funkcije. Argumenti s podrazumjevanom
vrijednošću moraju se nalaziti na kraju liste argumenata. Isto tako umjesto pozicije u pozivu
funkcije vrijednosti se mogu vezati uz neku određenu 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

PYTHON MODULI
Osnovna namjera modula je omogućiti efikasnije programiranje. Moduli su dokumenti
koji sadrže 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 sadrži
funkcije i varijable koje je pisac modula definirao. Python nudi svoju standardnu biblioteku,
koja dolazi sa svakom instalacijom interpretera, u obliku modula. Sadrži vrlo veliku količinu
korisnih modula za rad sa gotovo svime što se može zamisliti.
Većina funkcija za rad sa sistemom dolazi u dva modula: sys (koji podržava rad sa
Python interpreterom) i os (koji podržava rad sa operacijskim sustavom na kojem se Python
interpreter vrti).

sys

Primjer Upotreba sys.argv liste (sadrži 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

else:
for filename in sys.argv[1:]:
readfile(filename)

Model se uključuje koristeći import naredbu. U ovom primjeru importali smo sys modul. U
trenutku kad Python interpreter dođe do linije u kojoj piše import sys traži dokument sys.py u
nekom od direktorija koji su u path-u. Ako nađe dokument, naredbe u glavnom bloku tog
modula se izvršavaju i funkcije modula se nakon toga mogu pozivati iz programa.

os

Primjer Izlistavanje sadržaja 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

print 'Uspjesni backup u', odr


else:
print 'Stvaranje backupa je propalo.'

socket
Da se stvori veza između mašina, 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 vraća ono što je primio, dodajući 'Echo=>' ispred stringa.

Primjer Socket na server

from socket import * # ukljuci modul socket


myHost = '' # server, '' znaci localni host
myPort = 50007 # 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 pomoću kojih se šalju podaci na server, i


ispisuje odgovor servera; 'localhost' znači da se klijent i server vrte na istoj mašini što nam
omogućava da testiramo skriptu. Za testiranje preko interneta: pokreni server na drugoj
mašini, i postavi serverHost ili argv[1] na IP adresu te mašine.

Primjer socket na klijentu

import sys
from socket import *
serverHost = 'localhost' # server ime
serverPort = 50007 # slobodni port koji koristi server

message = ['Hello network world'] # tekst koji se salje na server

1157/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

if len(sys.argv) > 1:
serverHost = sys.argv[1] # ili server iz prvog argumenta
if len(sys.argv) > 2: # ili iz drugog argumenta komandne linije
message = sys.argv[2:] # 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

Pošto 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 može se koristiti i iz drugih programa.
Svaki modul ima ime koje se može dobiti sa naredbom __name__ , koje je postavljen
na __main__ kada se modul poziva samostalno, što se može iskoristit ako se želi izbjegnuti
pokretanje nekog dijela glavnog programa u slučaju 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Korisnički 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 može 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 uključene u modul.

>>> import name


>>> dir(name)
['__builtins__', '__doc__', '__file__', '__name__', 'funkcija', 'verzija']

1159/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

C Python
Kada u programu postoje dijelovi koda koji predugo traju i usporavaju rad programa
python omogućava korištenje modula napisani i kompajliranih u C-u, što uvelike može
ubrzati kritične dijelove koda.

Primjer Hello.c

/* Jednostavan C modul za Python, "hello" */

#include <Python.h>
#include <string.h>

/* module funkcija */
static PyObject * /* vraća objekt */
message(PyObject *self, PyObject *args) /* self neiskorišten 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 važno jedino ako se dinamično učitava u Python */
(void) Py_InitModule("hello", hello_methods);
}

1160/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 # import C modula
>>> hello.message('svijet') # poziv C funkcije
'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 između C modula hello i Python modula osim po imenu (ne završava na .py ili .pyc).
C moduli čak i odgovaraju na dir() funkciju.

>>> dir(hello) # C modul atributi


['__doc__', '__file__', '__name__', 'message']

>>> hello.__name__, hello.__file__


('hello', './hello.so')

>>> hello.message # C funkcijski objekt

1161/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

STRUKTURE PODATAKA
Strukture podataka služe spremanju povezanih podataka u kolekciju. Tri su ugrađene
strukture podataka u Python-u – lista, tuple i rječnik.

Lista
Lista je struktura podataka koja sadrži uređenu kolekciju, tj. u listu možeš dodavati niz
objekata koji su međusobno povezani. U listu možeš dodavati, iz nje brisati ili ju pretraživati.

#!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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

remove(x) – briše prvi element iz liste


pop(i) - briše element na poziciji i, i vraća ga
index(x) – vraća indeks prvog elementa u listi s vrijednošću 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 neće 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

Rječnik

Rječnik je kao telefonski imenik gdje se može naći broj osoba znajući njihovo ime.
Svakom objektu u rječniku pridružuje se ključ sa vrijednostima. Ključ mora biti jedinstven –
ne može se naći prava osoba ako ih ima više sa istim ključem. Za ključeve se može koristiti
samo nepromjenjive objekte poput stringova, dok se za vrijednosti može 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

OBJEKTNO ORIJENTIRANO PROGRAMIRANJE


Za razliku od proceduralnog programiranja koje je orijentirano na funkcije, objektno
orijentirano programiranje je orijentirano na objekte, strukture koje kombiniraju podatke sa
funkcionalnošću.
U Python programskom jeziku sve je objekt. To uključuje i funkcije i sve ugrađene
tipove podataka pa čak i integer.
Metode klada se razlikuju od običnih funkcija jedino po tome da imaju posebnu
varijablu imena self – ta varijabla odnosi se upravo na objekt koji sadrži te metode. Self
varijabla je ekvivalenta this pokazivaču u C++-u.
U klasi se može definirati specijalna metoda imena __init__ koja će se pokrenuti odmah
nakon što se objekt stvori. Koristi se za inicijaliziranje početnih vrijednosti ako je potrebno.
Odgovara konstruktoru u C++-u.

Postoji još specijalnih metoda:

__del__ (self) poziva se u prije nego što se objekt uništi


(destruktor)
__str__(self) poziva se kada koristimo print sa objektom ili
kada se upotrebljava str()
__lt__(self,other) Poziva se kada se koristi operator <. Postoje
metode za sve operatore (+,>,…)
__getitem__(self,key) Poziva se kada se koristi operator []
x[key]
__len__(self) Poziva se kada se built-in funkcija len()
koristi za objekt

Unutar objekata postoje dva tipa varijabli – varijable klase i varijable objekta. Razlika
između tih dviju vrsta je u vlasništvu – pitanje je tko je vlasnik tih varijabli – objekt ili klasa?
Varijable klase se dijele između svih objekata (instanci) klase. Varijable objekta su
specifične za pojedinačni objekt i ne dijele se između 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

'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 (uključujući i podatke) su public,


i sve metode su virtualne. Postoji iznimka: ako se na početku imena varijabla koristi
__privatevar Python takvu varijablu pretvara u privatnu.

Python podržava nasljeđivanje.


#!/usr/bin/python
# nasljedivanje.py

class ClanSkole:
'Bilo koji clan skole'
def __init__(self, ime,godine):
self.ime = ime

1166/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

RAD S TEKSTUALNIM DATOTEKAMA


Mogućnost kreiranja, čitanja i ispisivanja tekstualnih datoteka je vrlo važan dio mnogih
programa.

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 piše u datoteku
ovisno o tome u kojem je modu otvorena datoteka. Nakon završetka 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Pickle
Standardni modul koji omogućava da se bilo koji Python objekt sprema u dokument i
dobavlja kasnije (trajno spremanje objekata). Postoji još jedan modul cPikle koji se ponaša
kao i pickle modul osim što je napisan u C-u pa time puno brži. Korištenje i jednog i drugog
modula je potpuno identično.

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 pogreške tj. odstupanja u radu programa. Mogu biti uzrokovane raznim
događajima (pad sistema, nedozvoljeno pisanje po memoriji, dijeljenje s nulom,...) Kada se
detektira takva situacija u python programu podiže se iznimka. Iznimka se zatim prosljeđuje
pozivatelju funkcije koji ju obrađuje. U slučaju da nema koda za obradu iznimke program se
ruši.

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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 izvršiti neki dio koda bez obzira je li došlo do greške ili nije koristimo
Try…Finally

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

ZAKLJUČAK

Python je jednostavan programski jezik koji istovremeno ima snagu i složenost


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
započeti u njemu programirati, a dovoljno je kompleksan da se u njemu mogu programirati i
najteži problemi. Za razliku od većine drugih programskih jezika, ne prisiljava programera da
prihvaća jednu programsku paradigmu i razmišlja o samoj metodi programiranja, već da
razmišlja o rješavanju problema i onog što zapravo želi učiniti s programom.

Programiranje u Python-u treba biti zabava...

1172/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Marijan Poljak

INTERPRETERI – TCL/TK

1173/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

UVOD
Općenito o interpreterima

Programi prevodioci imaju zadatak da programe koji su napisani u višem


programskom jeziku prevedu na strojni jezik, a što je uvjet njihovog izvođenja (realizacije) u
računalu. Oni su dio sistemskog softvera bez kojeg racunalo ne bi shvatilo niti bi moglo
izvesti bilo koju instrukciju programa. Program napisan u nekom višem programskom jeziku
zove se izvorni program (source program) i prije njegovog prevođenja kažemo da je on
napisan u izvornom kodu. Nakon njegovog prevođenja od strane programa prevodioca, tj.
kompajlera ili interpretera, dobijamo program u strojnom jeziku tj. objektnom kodu. Osim
prevođenja kao osnovnog zadatka i kompajlera i interpretera, interpreteri osiguravaju i
izvršavanje, tj. izvođenje svake istrukcije. Naime, interpreteri prevode i izvršavaju jednu po
jednu instrukciju nasuprot kompajlerima koji prevode čitav program prije nego što ga prenesu
na izvršenje. Proces prevođenja programa stoga se i zove kompajliranje - kada koristimo
kompajler, ili interpretacija - kada koristimo interpreter. Neki programski jezici koriste
isključivo interpreter pa se i zovu interpreterski jezici.

Slika -Shematski prikaz prevođenja programa

1174/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Uvod u Tcl/Tk

Tcl/Tk dizajnirao je prof. John Osterhont sa Berkley sveučilišta. 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 izvođenje Tcl programa
(skripte), script file prenosi se Tcl interpreteru – wish (npr. wish hello.tcl). Wish se može
koristiti i interaktivno na način da se naredbe unose u command line. Postoji i drugi
standardni Tcl interpreter, tclsh, koji razumije isključivo Tcl jezik. On ne sadrži nikakve
naredbe za Tk korisničko sučelje. Tcl-u je pridružen Tk koji predstavlja Windows toolkit,
jednostavan i efikasan način razvijanja windows aplikacija. Tcl C biblioteka ima jasno i
jednostavno sučelje, sadrži osnovni interpreter i set naredbi koje definiraju varijable, tijek
programa tj. control flow, I/O fileove i procedure. Željena aplikacija može definirati i nove
Tcl naredbe. Ove naredbe su povezane sa C ili C++ procedurama. Skriptni dio ima pristup
shell-u, npr. sposobnost da pokreće druge programe i pristupa file sistemu. Također se može
pozivati direktno u aplikaciju, korištenjem specifičnih Tcl naredbi, koje se definiraju. Sa
razine C programiranja, moguće je pozivati ovakve Tcl skripte.
Postoji mnogo besplatnih Tcl proširenja tj. ekstenzija. Većina ekstenzija uključuje C
biblioteku, koja pruža neke nove funkcionalnosti i Tcl sučelje prema samoj biblioteci. Ipak,
proširenje od najvećeg značaja predstavlja Tk. Tk definira Tcl naredbe kako bi kreirali i
manipulirali widget korisničkim sučeljem. Skriptno orijentirani pristup programiranju
korisničkog sučelja ima tri prednosti. Prvo, razvijanje je brzo jer nema čekanja na duga
povezivanja. Drugo, Tcl naredbe pružaju sučelje višeg nivoa od većine standardnih alata C
biblioteke. Jednostavnija sučelja zahtjevaju manje naredbi kako bi se definirala. Treća
prednost je u činjenici da se korisničko sučelje može jasno izdvojiti od ostatka aplikacije. Na
taj način može se razvijati jezgra aplikacije da bi se naposljetku izgradilo sučelje. Osnovni set
Tk widgeta često je dovoljan za većinu UI potreba, no moguće ih je razvijati pomoću jezika
C, a postoji i mnogo već razvijenih Tk widgeta dostupnih na webu.

1175/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

TCL OSNOVE

Tcl ima jednostavnu strukturu. Svaka linija započinje naredbom, svaka naredba je implementirana kao C funkcija. Jezik ima nekoliko
osnovnih konstrukcija i relativno malo sintakse, što ga čini lakim za učenje. Osnovni mehanizmi vezani su uz stringove i supstitucije
stringova, pa je lako vizualizirati što se zapravo događa u interpreteru. Svakim instaliranjem Tcl-a obično 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 proširen Tk naredbama koje se koriste pri kreiranju i manipuliranju Tk widgeta. Moguće su varijacije ovih programa
ovisno o ekstenziji koja je dodana shellu.

Tcl naredbe

Zadaci aplikacije podjeljeni su u module. Specifični 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 postojećih i novih naredbi čineći tzv. overall aplikaciju. Tcl se sastoji
od nekoliko sintaksnih pravila i skupa naredbi, čineći jezgru. Tcl naredbe sastoje se od jedne
ili više riječi, od kojih je prva ime C funkcije koja će biti pozvana od strane interpretera.
Ostale riječi u naredbi prenose se kao argumenti C procedure. Osnovna sintaksa Tcl naredbe :

naredba arg1 arg2 arg3 ...

Razmakom se odvaja ime naredbe od argumenata, a prelaskom u novi red ili znakom točka-
zarez , ; , naredba završava. Argumenti naredbe imaju vrijednost stringa. Tcl interpreter ne
prevodi vrijednosti argumenata u naredbi, osim u slučaju supstitucije. Kod Tcl-a sve se
predstavlja stringom, i mora se jasno tražiti evaluacija varijabli i naredbi koje su ugnježđene.
Osnovni model naredbe može biti proširen sintaksom za grupiranje, čime se omogućava
upotreba više riječi u jednom argumentu, te supstitucijom koja se koristi pri programskim
varijablama i pozivanju ugnježđenih varijabli. Grupiranje i supstitucija su jedini mehanizmi
uključeni u Tcl interpreter prije nego što on izvrši naredbu.

1176/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

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. Vitičaste zagrade, {}, grupiraju riječi u jedinstveni argument.
Interpreter ih odbacuje prilikom prevođenja pa tako puts naredba prima Hello, world!
kao drugi argument.

Tablica Ugrađene Tcl naredbe

array ispituje stanje polja, pretraživanje po elementima


break izlaz iz petlje
catch hvatanje greški
cd promjena radnog direktorija
close zatvara i otvara I/O stream
concat spaja argumente zajedno s razmacima
continue nastavlja sa sljedećom iteracijom
error prijavljuje grešku
eof provjerava end-of-file.
eval spaja argumente te ih evaluira kao naredbu
exec Fork i execute UNIX program.
exit terminira proces
expr evaluira matematički izraz
file query file system
for stvaranje petlje
foreach stvaranje petlje preko niza vrijednosti
format formira string, slično kao C sprintf
gets čita input line s I/O
glob proširuje pattern prema odgovarajućim file imenima
global deklariranje global varijabli
history command-line history control
if naredba uvjeta
incr inkrementira varijablu za integer vrijednost

1177/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

info query o stanju Tcl interpretera


join spajanje niza elemenata sa zadanim string separatorom
lappend dodaje elemente na kraj niza
lindex dohvaćanje elementa niza
linsert umetanje elemenata u niz
list stvaranje niza van argumenata
llength vraća broj elemenata u nizu
lrange vraća udaljenost između elemenata niza
lreplace zamjena elemenata u nizu
lsearch traži element u nizu koji odgovara uzorku
lsort sortiranje niza
open otvara file ili process pipeline za I/O
pid vraća process ID
proc definira Tcl proceduru
puts šalje string na I/O stream.
pwd vraća trenutni radni direktorij
read čita blokove znakova sa I/O sreama
regexp Regular expression matching
regsub supstitucija bazirana na regularnim izrazima
rename promjena imena Tcl naredbe
return povratna vrijednost procedure
scan slično kao C sscanf funkcija
set dodjela vrijednosti varijablama
source evaluira Tcl naredbe u file-u
split dijeli string kao niz elemenata
string operira nad stringovima
switch grananje u programu
time mjeri vrijeme izvršavanja naredbe
trace nadzire varijable
unknown rad sa nepoznatim naredbama
unset brisanje varijabli
uplevel izvršava naredbu u različitom opsegu vidljivosti (scope)
upvar referenca na varijablu iz drugog opsega vidljivosti

1178/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

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
dužine, 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 dohvaća 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 može obrisati korištenjem naredbe unset:
unset imevar imevar2...
Bilo koji broj imena varijabli može se prenesti unset naredbi. Unset će prijaviti grešku ako
varijabla nije definirana.
Varijable se dijele u tri kategorije: local, global, visible.
Postojanje varijable može se testirati naredbom info exists.

Pravila supstitucije i grupiranja

Sljedeća pravila opisuju osnovne mehanizme supstitucija i grupiranja koje Tcl interpreter
izvodi prije pozivanja naredbi:

1. Znakom dolara, $, izvodi se supstitucija varijable. Ako su pozivi varijabli uključeni u


različite stringove, mogu se razlikovati sljedećom sintaksom: ${ime_var}
2. Uglatim zagradama, [ ], izvodi se supstitucija naredbe. Sve što se nalazi između
zagrada, tretira se kao naredba. Sve, uključujući i zagrade, zamjenjuje se rezultatom
naredbe. Ugnježđivanje je dozvoljeno.

1179/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

3. Znak kose crte tj. backslash, \ , koristi se za definiranje posebnih znakova. Ovo se
može 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
vitičastim zagradama. Supstitucija se može pojaviti usred riječi, tj. dio riječi može biti
string dok ostatak mogu biti neke od supstitucija. Supstitucije mogu djelovati čak i na
ime naredbe.
5. Grupiranje vitičastim zagradama, {}, sprečava supstituciju. Interpreter uključuje sve
znakove između odgovarajuće lijeve i desne zagrade u grupi. Krajnje vitičaste zagrade
nisu uključene u grupu.
6. Grupiranjem dvostrukim navodnicima, “ ”, dopušta se supstitucija. Interpreter grupira
sve dok ne naiđe na drugi znak dvostrukog navodnika. Sam znak navodnika može biti
uključen u grupu u kombinaciji sa znakom kose crte.
7. Grupiranje se mora izvršiti prije izvršenja supstitucije. Ovo znači da vrijednost
varijabli i rezultati naredbi ne utječu na grupiranje.
8. Supstitucija koja se izvede jednom, izvršava se prije poziva naredbe. Rezultat
supstitucije ne prevodi se drugi put. Ovo pravilo je važno ako vrijednosti varijabli ili
rezultati naredbe sadrže specijalne znakove poput: $, {}, [ ]...

1180/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Matematički izrazi

Naredba expr koristi se za evaluaciju matematičkih izraza. Tcl interpreter tretira


naredbu expr kao svaku drugu naredbu. Sintaksa koju podržava naredba expr slična je
sintaksi u C jeziku. Expr primarno barata vrijednostima: integer, floating point i boolean.
Vrijednost integer se po potrebi može pretvoriti u floating point zapis. Logičke operacije
vraćaju 0 (laž) ili 1(istina). Naredba expr podržava komparaciju stringova, ali pouzdanijom
metodom za uspoređivanje stringova smatra se upoteba naredbe stringcompare.

Primjer jednostavne aritmetike:

expr 7.2 / 3

=> 2.4

Naredba expr uzima sve argumente, spaja ih u jedan string, zatim predstavlja string kao
matematički izraz. Nakon što izračuna rješenje, ono se formatira u string i vraća. U
matematičke izraze moguće je uključiti i varijable kao i ugnježđene naredbe. Expr, naravno,
podržava i velik broj ugrađenih matematičkih funkcija.

Tablica Neke od ugrađenih matematičkih funkcija


acos(x) arc-cosinus od x
asin(x) arc-sinus od x
atan(x) arc-tangent od x
cos(x) cosinus od x
exp(x) exponential, e x
floor(x) najveća vrijednost integrala manja ili jednaka x fmod(x,y)
log(x) prirodni logaritam od x
log10(x) log od x uz bazu 10
pow(x,y) x na y potenciju
sin(x) sinus od x

1181/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

sqrt(x) drugi korijen od x


tan(x) tangens od x
abs(x) apsolutna vrijednost od x
double(x) stavlja x kao floating point
int(x) pretvara x u integer vrijednost

Tablica Aritmetički operatori sortirani od višeg prema nižem prioritetu

-~! unarni minus, bitovno NOT, logičko NOT


*/ množenje, djeljenje
+- zbrajanje, oduzimanje
<< >> left shift, right shift
< > <= >= operatori uspoređivanja
== != jednako, različito od
& bitovno AND
^ bitovno NOT
| bitovno OR
&& logičko AND
|| logičko OR
x?y:z If x then y else z

1182/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Tcl Procedure

Tcl koristi naredbu proc za definiranje procedura. Osnovna sintaksa kojom se


definira procedura je:

proc ime lista_arg tijelo

Prvi argument predstavlja ime procedure koja se definira. Ime procedure može sadržavati bilo
koje znakove, bitno je razlikovati velika i mala slova. Imena varijabli i imena procedura nisu
u međusobnom konfliktu. Sljedeći argument u sintaksi predstavlja listu parametara procedure.
Treći argument je naredba ili obično grupa naredbi koje formiraju tijelo (body) procedure.
Jednom definirana, Tcl procedura koristi se kao bilo koja ugrađena naredba. Rezultat
procedure je rezultat kojeg vraća zadnja naredba u tijelu procedure.

Primjer definiranja procedure:

proc diag {a b} {
set c [expr sqrt($a * $a + $b * $b)]
return $c
}

Procedura imena diag izračunava duljinu dijagonale pravokutnog trokuta ako su zadane
ostale stranice. sqrt funkcija je jedna od mnogobrojnih matematičkih funkcija i podržana je
naredbom expr. Vitičaste zagrade grupiraju argumente a i b u jedinstveni argument, koji
sada predstavlja drugi argument naredbe proc. Otvorenom vitičastom zagradom na kraju
drugog argumenta započinje treći argument a ujedno i grupiranje, sve dok se zagrada ne
zatvori. Kao rezultat grupiranja dobiva se sljed naredbi, u obliku trećeg argumenta. Sljedeći
važan učinak vitičastih zagrada oko tijela procedure je da odgađa 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
nepoželjna je supstitucija varijabli tijekom samog definiranja procedure diag. Naredba
proc podržava i dodatne oblike poput definiranja broja varijabli argumenata defniranjem

1183/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

ključne riječi args kao zadnji parametar. Moguće je definirati defaultne vrijednosti za
argumente.
U Tcl-u postoji jedinstveni, globalni opseg (scope) za imena procedura. (za razliku od jezika
C koji dopušta privatne – static procedure). Moguće 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 neće 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. Važno je ipak
naglasiti da je varijable definirane na ovom području potrebno učiniti 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


pripadajućim komentarom u većini slučajeva pojavljuje se prije same naredbe. Dobar način
kako priključiti komentar na kraju naredbe je dodavanje znaka #, neposredno iza znaka koji
označava 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 sljedeći red skripte. Znak ; unutar
komentara nema značaja, komentar se prekida samo prelaskom u novi red.

# Ovo je pocetak Tcl komentara\


a ovo je nastavak ; kao što je i ovo

1184/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

STRINGOVI

String predstavlja osnovni tip Tcl podataka, pa ne iznenađuje činjenica da postoji velik
broj naredbi za manipulaciju stringovima. Uz područje stringova je usko vezan pojam
usporedbe prema uzorku tj. “pattern matching”. Tcl podržava dvije vrste ovakvog
uspoređivanja prema uzorku. Tzv. “Glob matching” predstavlja jednostavno uspoređivanje
kakvo se koristi u mnogim shell jezicima. “Regular expresion matching” je više složeno ali
zato i moćnije.
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. Većina string naredbi obično je
vezana uz string funkcije u standardnoj C biblioteci.

Tablica Oblici string naredbe

string compare str1 str2 uspoređuje stringove leksičkom analizom


string first str1 str2 pokazuje na mjesto u stringu gdje se prvi puta pojavljuje
neki zadani string ili vraća –1 u suprotnom
string index string index vraća znak na specificiranom indexu
string last str1 str2 obrnuta logika od first
string length string vraća duljinu stringa
string match pattern str vraća vrijednost 1ako string odgovara patternu
string range str i j vraća razmak između zadanih znakova
string tolower string vraća string malim slovima
string toupper string vraća string velikim slovima
string trim string uređuje znakove na početku i kraju stringa
?chars?
string trimleft string uređuje znakove na početku stringa
?chars?

1185/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

string trimright string uređuje znakove na kraju stringa


?chars?
string wordend str ix vraća index znaka u stringu nakon riječi koja sadrži taj
znak na ix indexu
string wordstart str ix vraća index u stringu prvog znaka u riječi koja sadrži
znak na ix indexu

Osim naredbe string postoji čitavi niz drugih naredbi kojima je moguće manipulirati
stringovima. Naredba append je dobar način da se nešto doda na kraj nekog stringa. Radi na
principu pretraživanja sheme alocirane memorije. Tcl alocira dodatni prostor kako bi
omogućio š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 slična C printf funkciji. Naredba formira string prema sljedećoj
specifikaciji:
format spec vrijednost1 vrijednost2.
Argumenti specifikacije mogu sadržavati i ključne riječi ali u tom slučaju ispred ključne riječi
mora stajati znak postotak, %. Oznakom zastavice, flag, definiraju se u naredbi format razna
umetanja znakova i slično.
Scan naredba je nešto poput C sscanf procedure. Scan analizira string prema format
specifikaciji i dodjeljuje vrijednosti varijablama te vraća broj pretvorbi koje su uspješno
obavljene. Naredba ima sljedeću formu:

scan string format var ?var? ?var? ...

Specifikacija za naredbu scan je gotovo jednaka kao za naredbu format. Uz naredbu scan
može biti uključena set notacija. Uporabom uglatih zagrada određuje se set znakova. Set
odgovara jednom ili više znakova koji su upisani u varijablu.
String match naredba je primjer tzv. glob-style uspoređivanja.
Postoje tri osnovne konstrukcije korištene u ovakvom glob uzorku:
1. uspoređivanje bilo kojeg broja, bilo kojih znakova (*)
2. uspoređivanje pojedinog znaka (?)
3. uspoređivanje jednog u setu znakova ([abc])

1186/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Ako se želi uključiti znakove *, ?, [ ], potrebno ih je koristiti u kombinaciji sa backslashom, \ .


Regularni izraz predstavlja najefikasniji način kako uobličiti uzorak (pattern). Postoji osnovna
sintaksa koja uključuje sposobnost izdvajanja podstringova iz stringa koji se uspoređuje i
predstavlja uzorak. Ono može biti korisno kod prikupljanja razdvojenih podataka. Uzorak
predstavlja slijed literalnih znakova, znak uspoređivanja (matching character) s dodacima
poput ponavljanja, alternacije te poduzoraka koji su grupirani u zagrade. Znak točke, . ,
predstavlja wild-card znak koji odgovara bilo kojem pojedinačnom znaku. Sintaksom [xyz]
bilo kojem znaku unutar zagrada je dozvoljeno uspoređivanje. Tako npr. izraz [Hh]ello
odgovara izrazu Hello i izrazu hello. Ponavljanje se označava znakom * za 0 ili više
ponavljanja, znakom + za 1 ili više ponavljanja i znakom ? za 0 ili jedno ponavljanje.
Sljedeći izraz npr. uspoređuje string koji sadrži znak b iza kojeg slijedi 0 ili više znakova a :
ba* . Alternacija je specificirana znakom “|” . U pricipu, uzorak ne mora u potpunosti
odgovarati čitavom stringu. Ako je uzorak pronađen u više dijelova stringa, uzima se onaj dio
koji se najranije pojavljuje u zadanom stringu. Ukoliko ima više pronađenih uzima se onaj
najduži.
Regexp naredba omogućava direktan pristup regularnom izrazu koji se upoređuje. 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 vraća broj pogađanja i zamjena ili 0 ako ne postoji odgovarajuća usporedba.
Regsub kopira string u ime varijable zamjenjujući događaje uzorka supstitucijom
definiranom izrazom subspec. Opcionalno se može dodati izraz –all, čime se zamjenjuju
svi događaji uzorka, inače se zamjenjuje samo prvi. Sintaksa naredbe regsub je sljedeća:

regsub ?switches? pattern string subspec varname

1187/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

STRUKTURE PODATAKA

Osnovnu strukturu podataka u Tcl-u čine stringovi. Dodatno, postoje dva tipa struktura
podataka višeg 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 zamišljati kao put od jednog
stringa (indexa) do nekog drugog stringa (određene vrijednosti elementa polja). Pravilo je
sljedeće: nizovi su funkcionalni ako su kratki ili ako se izgrađuje naredba koja će se kasnije
evaluirati. Polja su efikasnija i primjerenija za veće količine podataka.

Nizovi

Nizovi u Tcl-u su , za razliku od drugih jezika, stringovi sa posebnim značenjem. Po


definiciji, Tcl nizovi imaju istu strukturu kao i Tcl naredbe. To znači da je niz jednostavno
string sa nizovima elemenata odvojenih razmakom. Zagrade ili navodnici mogu biti korišteni
za grupiranje riječi 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. Naredbe kojima se konstruiraju nizovi: list, lappend i concat.

Naredbom list konstruira se niz iz argumenata, tako da postoji jedan element niza za svaki
argument. To je važna naredba budući osigurava da rezultirajući niz ima odgovarajuću
sintaksu. Ukoliko neki od argumenata sadrži 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 može pozvati sa imenom nedefinirane varijable, koja će u tom slučaju
biti definirana. Naredba concat spaja višestruke nizove u jedinstveni niz.

2. Naredbe kojima se pristupa elementima niza: llenght, lindex i lrange.

Naredba llenght vraća broj elemenata niza, lindex vraća pojedini element iz niza,
lrange vraća razmak između elemenata niza.

3. Naredbe za modifikaciju nizova: linsert, lreplace

1188/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Naredba linsert umeće elemente na mjesto u nizu koje je označeno indexom, lreplace
zamjenjuje elemente u nizu novim elementima.

4. Ostale neredbe su lsearch, lsort, split, join.

Naredba lsearch vraća index tražene vrijednosti u nizu ili vrijednost –1 ako vrijednost nije
pronađena. Naredbom lsort nizovi se sortiraju. Tri osnovne vrste sortiranja definirane su
opcijama: ascii, integer ili real. Redosljed je određen opcijama increasing i decreasing.
Naredba split uzima string i pretvara ga u niz djeleći ga na označenim mjestima. Naredba
join je inverzna split naredbi, ona spaja elemente nizova.

Poželjno je izbjegavati velike nizove i nizove kojima se freventno pristupa. U tom slučaju
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, može imati bilo
koju vrijednost stringa i može biti rezultat supstitucije neke varijable ili naredbe. Elementi
polja definiraju se naredbom set:

set arr (index) value

Vrijednost (value) elementa polja dohvaća se $ supstitucijom. Uporaba varijable definirane i


kao polje i kao obična varijabla izaziva grešku. Index, ako je kompleksan, može biti rastavljen
upotrebom zareza; pri tome ju nužno izbjegavati razmak poslije zareza. Iako je dozvoljen,
razmak u indexu može izazvati probleme budući se zagrade u ovom slučaju 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
može biti rezultat supstitucije. Naredba array vraća informacije o varijablama polja i može
se koristiti za iteraciju kroz elemente polja. Naredba array names omogućava iteraciju
kroz polje upotrebom foreach petlje. Redosljed imena vraćenih ovom naredbom je
neodređen. Moguće je ograničiti vraćanje imena specificiranjem uzorka argumenta. Uzorak se
definira string match naredbom. Moguća je iteracija kroz elemente polja pojedinačno,
korištenjem search naredbi. Redosljed je opet neodređen. Ako polje ima ogroman broj

1189/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

elemenata ili ako se vrši iteracija kroz dulji period vremena tada su search operacije
praktičnije od array names naredbe.

Operacije array get i array set koriste se za pretvaranja između polja i niza.

Naredba trace dopušta registriranje naredbe koja će biti pozvana svaki put kada se pristupa
varijabli, kad se modificira ili briše. Druga česta uporaba trace naredbe je osvježavanje
korisničkog widget sučelja kao odgovor na promjenu varijable. Ako postoji više trace naredbi
koje su pridružene određenoj varijabli, one će se pozivati u obrnutom redosljedu; prvo će se
izvršiti naredba koja je zadnja pridružena. Ako postoji trace naredba pridružena polju i
elementu tog polja, prvo se izvršava ona pridružena polju. Informacije o trace naredbama nad
varijablama vraćaju se opcijom vinfo. Naredba trace može biti obrisana opcijom
delete.

1190/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

NAREDBE TIJEKA PROGRAMA

Naredbe ponavljanja u Tcl-u su naredbe: while, foreach i for. Uvjetna grananja vrše
se naredbama if i switch. Dodatne naredbe za kontrolu tijeka programa su break,
continue, return i error. Naredba za manipuliranje greškama je catch.

Naredba tijeka programa često ima tijelo naredbe koje se izvršava kasnije, uvjetno ili u petlji.
U tom slučaju važno je grupirati tijelo naredbe vitičastim zagradama kako bi se izbjegle
supstitucije u vrijeme poziva naredbe. Drugu ugodno svojstvo vitičastih zagrada je da
grupiraju stvari uključujući i prelaske u novi red, šireći naredbe kroz više redova. Naredba
tijeka programa vraća vrijednost zadnje naredbe koju je odlučila izvršiti. Naredbe poput if, for
i while mogu sadržavati boolean izraze.

If Then Else naredba je naredba grananja. Naredba if je osnovna i bazirana je na


uvjetu. Ako je uvjet istinit izvršava se jedno tijelo naredbe, u suprotnom se izvršava drugo
tijelo naredbe. Ključne riječi then i else su opcionalne.

Switch naredbom moguće je grananje više tijela naredbi ovisno o vrijednosti izraza. Kao
dodatak, izbor je moguć na temelju upoređivanja prema uzorku, isto kao i jednostavnom
usporedbom. Ukoliko odgovaraju višestruki uzorci, evaluira se samo jedan odgovarajući
uzorak.

Foreach naredba vrši loop nad tijelom naredbe dodjeljujući varijable svakoj vrijednosti u
nizu. Tijelo naredbe se izvršava jednom za svaki element u petlji.

While naredba uzastopce testira boolean izraze, a zatim izvršava tijelo naredbe ako je
rezultat različit od 0. Iz razloga što se testni izraz evaluira ponovno, prije svake iteracije petlje
važna je zaštita izraza od bilo kakve supstitucije prije pozivanja while naredbe.

For naredba slična je izrazu for iz jezika C. Naredba uzima četiri argumenta. Prvim se
inicijalizira petlja, drugi definira da li će se tijelo petlje izvršiti, treći argument je naredba
koja će se izvršiti poslije tijela petlje i četvrti argument predstavlja tijelo petlje.

Break i continue naredbe kontroliraju izvršavanje petlje. Break naredbom odmah se


izlazi iz petlje, continue naredbom petlja nastavlja sa sljedećom iteracijom.

Tcl ne podržava goto izraz.

1191/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Catch naredba služi za hvatanje grešaka. U praksi, bilo koja naredba će prijaviti grešku ako
je pozvana sa pogrešnim brojem argumenata ili ako detektira neke posebne greške vezane uz
njezinu implementaciju. Ako se greška ne uhvati ona prekida izvršavanje čitave skripte; zato
je potrebno služiti se catch naredbom.

Catch uzima dva argumenta: prvi je tijelo naredbe, drugi je ime varijable koja će sadržavati
rezultat ili poruku greške ako naredba prijavi grešku.

Error naredba prijavljuje stanje greške koje terminira skriptu ukoliko greška nije uhvaćena
catch naredbom.

Return naredbom vraćamo se iz procedure. Potrebna je ako je povratak nužan prije kraja
tijela procedure ili ako je potrebno vratiti konstantnu vrijednost. Return naredba na kraju
procedure je pitanje stila. Naredba return može biti specificirana opcionalnim argumentima
tipa code, code error, error info... Ove opcije su rijetko u upotrebi, iako omogućuju
izgradnju novih naredbi tijeka programa u Tcl-u.

1192/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

RAD S UNIXOM

Tcl naredbe exec, open, close, read, write, seek, tell, glob,
pwd i cd koriste se u Unix okruženju. Iako su ove naredbe dizajnirane za Unix, one su
također uključene (s nekim modifikacijama) u Tcl portove prema ostalim sustavima poput
DOS-a. Ovakve sposobnosti omogućavaju da se Tcl skriptom spajaju različiti programi u
jedinstveni alat prilagođen različitim potrebama.

Naredba exec

Naredba exec koristi se za pokretanje drugih Unix programa iz naše Tcl skripte.

primjer:

set d [exec date]

Standardni output programa vraćen vraća se kao vrijednost exec naredbe.

Za razliku od C-shell exec naredbe, tcl exec naredba ne zamjenjuje trenutni proces sa
novim. Exec naredba podržava 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 moguće 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 priključen na standardni input sljedeće naredbe u cjevovodu. Bilo koji
broj programa može biti linkan zajedno u cjevovod. Uz naredbu exec dolazi
podrazumjevana sintaksa za I/O redirekciju.

Tablica Pregled osnovne exec sintakse za I/O redirekciju


| pipeline
< fileName uzima input
<@ fileId uzima input sa I/O streama identificiranog sa field
<< value uzima input sa zadane vrijednosti
> fileName uzima output

1193/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

2> fileName uzima standard error output


>> fileName dodaje standard output imenovanoj datoteci
2>> fileName dodaje standard error imenovanoj datoteci
>>& fileName dodaje zajedno standard error i s. output datoteci
>@ fileId direct standard output na I/O stream identificiran sa fileId
2>@ fileId direct standard output na I/O stream identificiran sa fileId
>&@ fileId direct standard error i standard output na I/O stream.
& izvršavanje cjevovoda u pozadini

Promatrajući sintaksu redirekcije važno je uočiti da se ona izgrađuje na temelju nekoliko


osnovnih građevnih blokova. Osnovna ideja je da znak | predstavlja cjevovod, znak >
predstavlja output, znak < predstavlja input, znakom & pridružuje se standardni error
standardnom outputu, znakom @ moguće je koristiti vlastite I/O streamove.

Naredba file

Naredba file pruža nekoliko načina za provjeru statusa datoteke u Unix datotečnom
sustavu. Npr. možemo saznati dali datoteka uopće postoji i kojoj vrsti datoteka pripada.
Naredba file može biti u različitim formama.

Tablica Pregled osnovnih formi Tcl file naredbe


file atime name vraća vrijeme pristupa datoteci
file dirname name vraća glavni direktorij imena datoteke
file executable name vraća 1 ako ime ima execute dozvolu, inače 0
file exists name vraća 1 ako ime postoji, inače 0
file isdirectory name vraća 1 ako je ime direktorij, inače 0
file owned name vraća 1 ako je trenutni korisnik vlasnik imena datoteke, inače 0
file readable name vraća 1 ako ime ima dozvolu čitanja, inače 0
file rootname name vraća sve osim ekstenzije imena
file size name vraća broj byteova u imenu
file tail name vraća sve znakove nakon zadnjeg '/ ' u imenu
file type name vraća type identifier (može biti: file, directory, characterSpecial,
blockSpecial, fifo, link, ili socket)

1194/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

file writable name vraća 1 ako ime ima dozvolu pisanja, inače 0
file lstat name var stavlja stat rezultate linka name u var
file stat name var stavlja stat rezultate od imena u polje var

Nake od formi operiraju nad imenom staze datoteke (pathname); one ne vraćaju informacije o
samoj datoteci. Takve naredbe mogu biti primjenjene nad bilo kojim stringom, nema zahtjeva
da se pathname mora odnositi na postojeću datoteku.
Najopćenitije opcije koje dolaze uz naredbu file su stat i lstat. One uzimaju treći
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 koristeći file dirname rekurzivno kako bi kreirao

glavni direktorij.. Taj posao obavlja mkdir program. Greške mogu biti prijavljene na dva
mjesta: ako procedura makedir pronađe tzv. non-directory u pathname-u ili u programu
makedir ako korisnik nema npr. dozvolu za kreiranje direktorija.

1195/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Otvaranje datoteka za I/O

Naredba open postavlja I/O stream bilo za file ili pipeline procesiranje. Osnovna sintaksa je:

open what ?access? ?permissions?

Argument what predstavlja ime datoteke ili pipeline specifikaciju sličnu onoj koja se koristi
kod naredbe exec. Argument access može 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 pojašnjenja moguće je pronaći na man stranici vezano uz chmod naredbu.
Povratna vrijednost naredbe open je identifikator za I/O stream; vrijednost je potrebno
pohraniti u varijablu.

Tablica Pregled open acess argumenata


r otvoren za čitanje, file mora postojati
r+ otvoren za čitanje i pisanje, file mora postojati
w otvoren za pisanje
w+ otvoren za čitanje i pisanje
a otvoren za pisanje, dodavanje podataka u file
a+ otvoren za čitanje i pisanje, dodavanje podataka u file

Tablica Pregled osnovnih POSSIX zastavica za access argumente


RDONLY otvoren za čitanje
WRONLY otvoren za pisanje
RDWR otvoren za čitanje i pisanje
APPEND otvoren za dodavanje
CREAT kreira file ako ne postoji
NONBLOCK sprečava blokiranje prilikom otvaranja
TRUNC skraćuje file ako postoji

Primjer: Otvaranje dokumenta korištenjem POSSIX access zastavica

1196/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

set fileId [open /tmp/bar {RDWR CREAT}]

File se u ovom slučaju 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 vrjednošću naredbe open. Postoji nekoliko
naredbi korištenih sa identifikatorima datoteka.

puts - piše string i newline na output. Naki detalji u vezi puts naredbe ipak su drugačiji.
Naredba puts uzima argument nonewline koji sprečava newline znak koji bi se inače
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), vraća se prazan string. Naredba eof
mora se koristiti kako bi se razlikovala prazna linija od kraja file-a. eof naredba vraća 1 ako
je dosegnut kraj. Naredba gets može pohraniti liniju u imenovanu varijablu i vratiti broj
pročitanih 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 pročitan i vraćen kao količina
byteova koju zauzima.

seek, tell -naredbe koje se koriste za pristup I/O streamu slučajnim odabirom
(random access to I/O stream)

close -naredba koja je važna kao i ostale jer oslobađa operativni sustav resursa
vezanih uz I/O stream. Ako se zaboravi zatvoriti stream, on će biti zatvoren pri izlasku iz

1197/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

procesa. Međutim, ako se radi o dugačkom programu poput Tk skripte to može dovesti do
problema. Naredba close može prijaviti i greške.

Refleksija

Refleksija (reflection) omogućava feedback skripte u vezi s unutarnjim stanjem


interpretera. To može biti korisno u mnogo slučajeva, od testiranja kako bi se uvjerili da neka
varijabla postoji do odbacivanja stanja interpretera.
Naredba info pruža mnogo različitih informacija u vezi interpretera.

Tablica Pregled osnovnih formi info naredbe


info args procedure lista argumenata procedure
info body procedure naredbe u tijelu procedure
info cmdcount broj naredbi koje su dosad izvršene
info commands ?pattern? lista svih naredbi ili onih koje odgovaraju pattern-u
info exists variable istina ako je definirana varijabla
info globals ?pattern? lista svih glob varijabli ili onih koje odgovaraju patternu
info level stack level trenutne procedure, ili 0 za global scope
info library pathname direktorija Tcl biblioteke
info locals ?pattern? lista svih local varijabli ili one koje odgovaraju patternu
info procs ?pattern? lista svih procedura ili one koje odgovaraju patternu
info script ime datoteke koja se procesira ili NULL
info tclversion broj Tcl verzije
info vars ?pattern? lista svih vidljivih varijabli ili onih koje odgovaraju p.

Operacija koja se najčešće koristi je info exist. Ako se skripta želi pokretati na različitim
Tcl verzijama potrebno je testirati broj verzije i poduzeti različite akcije u vezi
nekompatibilnosti između verzija.
Tcl shell programi sadrže dnevnik naredbi koje su korištene. Dnevniku se pristupa i on se
kontrolira naredbom history. Uz naredbu history dolazi termin event ID, što
predstavlja index u dnevniku. Moguće je specificirati događaj sa negativnim indexom koji će

1198/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

se izračunavati od kraja dnevnika. Npr. event –1 predstavlja prošli događaj. Mnoge forme
imaju event specifikator postavljen na –1 po defaultu.

Tablica Pregled osnovnih formi history naredbe

history skraćeno za history info


history add command ?exec? dodaj naredbu u history list, ako je exec specificirano
izvrši naredbu
history change new ?event? mijenja naredbu specificiranu sa event sa novom u
naredbi history
history event ?event? vraća naredbu specificiranu sa event
history nextid vraća broj sljedećeg eventa
history redo ?event? ponavlja specificiranu naredbu

U praksi poželjno je iskoristiti mogućnost skraćivanja opcija koje dolaze uz naredbu history,
pa čak i samu naredbu history. Za sve opcije postoje definirane jednoznačne skraćenice, 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 vraćena kao rezultat history operacije. Na ovakav način ponašaju
se operacije event, redo, substitute i words. Ovo ima smisla jer je poželjnije
imati aktualnu naredbu u history, umjesto korištenja naredbe history da bi se dobila
željena naredba.
Radi što efikasnijeg korištenja mogućnosti koju pruža history, ona je podržana dodatnom
posebnom sintaksom (nisu sve history operacije podržane ovakvom sintaksom):

!! ponavljanje prošle naredbe


!n ponavljanje naredbe s brojem n
!prefix ponavljanje zadnje naredbe koja počinje zadanim prefixom
!pattern ponavlja zadnju naredbu koja odgovara pattern-u
^old^new zamjenjuje old sa new u zadnjoj naredbi

Primjer 6.2. Korištenje history naredbe

1199/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

% 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Debugger

Korištenjem debug procedure u skripti moguća je kontrola output-a. Don Libes je


izgradio Tcl debugger koji dopušta definiranje tzv. breakpoints i prolaz kroz skripte
interaktivno. Ovaj debugger zahtjeva modificirani Tcl shell jer koristi nešto više ugrađenih
naredbi koje ga podržavaju, pa se podrazumjeva da su one ugrađene 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 poželjno koristiti vlastite jednoznačne naredbe
zbog mogućeg konflikta.
Način na koji se uključuje debugger odlučuje aplikacija. Expect shell uvodi debugger kada se
generira prekid s tipkovnice.
Kada se nalazimo u promtu debuggera, komuniciramo s Tcl interpreterom i možemo
iskoristiti bilo koju Tcl naredbu. Nema potrebe za definiranjem novih naredbi,
upotrebljavamo ključnu riječ set.

Tablica Naredbe debuggera

s ?n? , n ?n? naredbe koje se koriste za prolaz kroz skriptu, uzimaju


opcionalni parametar koji određuje koliko koraka se prolazi
prije ponovnog zaustavljanja
r izvršava trenutnu proceduru i zaustavlja se nakon što procedura
vrati rezultat
w ispisuje call stack
u ?level?, d ?level? mijenjaju trenutni scope, uzimaju opcionalni parametar
b manipulacija nad breakpointom (set, clear, show)
h help

Uobičajna forma naredbe kojom se postavlja breakpoint je sljedeća:

b ?-re regexp? ?if condition? ?then action?


b ?-glob pattern? ?if condition? ?then action?

1201/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Breakpoint će se pojaviti ako je postavljen uvjet. Breakpoint može sadržavati neku akciju,
nezavisno o uvjetu. Sam pattern je također opcionalan, pa je moguće defimirati breakpoint
koji sadrži samo uvjet ili samo akciju. Ako sadrži samo akciju on će se okidati na svaku
naredbu. Breakpoint se poziva prije nego se naredba izvrši. Naredba bez ikakvih argumenata
vraća listu definiranih breakpointa. Svaki breakpoint ima svoj ID. Brisanje se vrši naredbom b
–N , gdje je N broj breakpointa.

Tkinspect program je Tk aplikacija koja pruža uvid u stanje ostalih Tk aplikacija. Prikazuje
hijerarhiju procedura, varijabli, Tk widgeta. Program se koristi za debugiranje Tk aplikacija.

1202/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

BIBLIOTEKE SKRIPTI

Biblioteke skripti sadrže zajedničku kolekciju korisnih Tcl procedura kako bi bile
korištene u više od jedne aplikacije. Jedan od načina kako izgraditi veliku aplikaciju je
korištenjem jedne kratke glavne skripte i biblioteke dodatnih skripti. Prednost ovakvog
pristupa je u činjenici da se neće učitavati čitavi Tcl kod.
Tcl kod dizajniran za upotrebu u biblioteci iziskuje određena pravila kodiranja. Pravila se
moraju poštivati radi izbjegavanja konflikta između imena u različitim bibliotekama i u
glavnoj aplikaciji, osim toga na taj način je biblioteka lakša za korištenje drugim korisnicima.
Dva su osnovna pravila:

1. odrediti identificirajući prefiks za procedure u vlastitom pakiranju biblioteke. Ako


se npr. definira prefiks Pref, tada će sve procedure koje sadrži naša biblioteka
počinjati sa Pref. Pravilo je dalje prošireno na razlikovanje privatnih i izlaznih
(exported) procedura. Izlazna procedura ima znak underscore nakon zadanog
prefiksa (npr. Pref_init). Ovakve procedure je moguće pozivati iz glavne aplikacije
ili drugih pakiranja biblioteka. Privatne procedure ne sadrže underscore znak, a
namjenjene su korištenju drugim procedurama u istom pakiranju.
2. Korištenje istog prefiksa nad globalnim varijablama koje se koriste u vlastitom
pakiranju. Istim prefiksom određujemo koje varijable pripadaju pakiranju i time
izbjegavamo konflikt s drugim pakiranjima. Ako postoji potreba za exportom
nekih ključnih varijabli iz vlastitog modula, za njihovo razlikovanje je također
potrebno koristiti znak underscore. Ako postoji potreba za više od jedne glob
varijable, potrebno je i dalje poštivati pravilo prefiksa.

Važna naredba vezana uz Tcl biblioteku je naredba unknown. Svaki put kad interpreter naiđe
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 može se pronaći u init.tcl datoteci Tcl biblioteke. Kako bi se ubrzalo pretraživanje
naredbi koje nedostaju , unknown naredba koristi se indeksom. Prilikom stvaranja biblioteke
skripte mora se generirati index koji će bilježiti koje su procedure definirane u biblioteci.
Procedura auto_mkindex kreira index koji se pohranjuje u datoteci tclIndex koja se nalazi

1203/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

u istom direktoriju kao i datoteke koje čine biblioteku skripte. Dodavanjem procedura ili
mijenjanjem njihovih imena mora se izvršiti i update nad datotekom tclIndex. Jedan od načina
je ponovno stvaranje indexa ako se bilo što u biblioteci promijenilo od zadnjeg generiranja
datoteke tclIndex.
Za korištenje biblioteke skripte potrebno je informirati naredbu unknown gdje da traži. Ona
koristi varijablu auto_path kako bi bilježila listu direktorija za pronalaženje 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 mogućnosti pronaći implementaciju naredbe Library_UpdataIndex. Jednom kad se

tclIndex kreira po prvi put to osigurava da svaka nova procedura koja se doda biblioteci bude

uključena i u tclIndex datoteku.

U praksi, ako se želi automatska promjena, korisno je uključiti datoteku Library_UpdateIndex


direktno u aplikaciju kako bi izbjegli učitavanje iz biblioteke.
Naredba unknown pruža neke dodatne pogodnosti (automatsko izvršavanje programa,
naredba history, korištenje skraćenih naredbi) koje se koriste u slučaju kada se naredbe unose
direktno; one su onemogućene ako se Tcl shell ne koristi interaktivno.

1204/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

TK OSNOVE

Tk predstavlja alat za windows programiranje. Prvotno je bio dizajniran za Xwindow


sustav. Tk dijeli neke zajedničke koncepte s ostalim windows alatima. Tk omogućuje da
setom Tcl naredbi kreiramo widget-e, tj. njima manipuliramo. Widget predstavlja prozor u
posebno oblikovanom grafičkom sučelju (GUI). Termin widget i window često se međusobno
isprepliću. Tip widget podržava naredbene gumbe, scrollbars, menu i okvire za tekst. U Tk je
ugrađen i widget za opće namjene ucrtanja – drawing widget. Takav widget naziva se canvas i
podržava lakše oblike crtanja poput linije, okvira i bitmapa. X window sustav podržava
hijerarhiju prozora i to se također odražava na Tk naredbe. Hijerarhija prozora za aplikaciju
znači da postoji primarni prozor, a unutar tog prozora može postojati određeni broj djece
prozora. (children windows). Prozori djeca mogu sadržavati nove prozore itd.
Widgeti se nalaze pod kontrolom geometry manager-a, koji kontrolira njihovu veličinu i
položaj na ekranu. Njih postoji nekoliko vrsta. Zajedničko svima njima je da koriste frame
widget – okvirni widget kao spremnik za sve ostale. Dakle, kreira se jedan ili više widgeta, a
zatim se smještaju unutar okvira pomoću geometry managera.
Aplikacija koja se bazira na Tk ima tijek programa kojeg pokreću događaji (event). Tcl
naredbe se pridružuju događajima korištenjem naredbe bind. Tk widgeti se međusobno
povezuju po defaultu (default binding), pa nije potrebno dodatno programiranje. Veze između
događaja dijele se na: global bindings, class bindings i instance bindings. Hijerarhija u
povezivanju kontrolira se naredbom bindtags. Naredbom after moguće je urediti da se
događaji pojavljuju nakon definiranog perioda vremena. Koncept koji se veže uz povezivanje
je focus. U bilo koje vrijeme, jedan od widgeta ima input focus i događaji tipkovnice se
upućuju na njega. Postoje dva općenita pristupa fokusiranju: fokusiranje widgeta na kojeg
pokazuje miš ili eksplicitno postavljanje fokusa na određeni widget. Tk omogućuje
naredbama da mijenjaju fokus.
Osnovna struktura Tk skripte započinje stvaranjem widgeta i njihovim raspoređivanjem
pomoću geometry managera, zatim vezivanjem akcija uz widgete. Nakon što interpreter
procesira naredbe koje inicijaliziraju korisničko sučelje, event loop se ubacuje i aplikacija
može započeti.

1205/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Ako se wish koristi interaktivno to će rezultirati kreiranjem i prikazom praznog glavnog


prozora koji predstavlja prompt komandnu liniju. Iz ovakvog sučelja moguće je postupno
izgraditi Tk sučelje.

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 ograničena 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 određuju veličinu slobodnog prostora oko gumba. Posljedica je prikaz glavnog
prozora koji je smanjen do te mjere da sadrži samo gumb i definirano mu proširenje.

slika 8.1. Izgled widgeta

1206/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

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 «.». Slično
pravilima imenovanja za direktorije u Unixu gdje je root direktorij nazvan «/» a zatim se taj
znak koristi za daljnja razdvajanja. Tk koristi «.» na isti način. Svaki widget koji je dijete
glavnom prozoru je imenovan na način sličan ovom: .foo. Dijete widgwet od .foo bio bi
recimo .foo.bar itd.
Postoji i jedan dodatak uz sustav imenovanja. Naime, ako se sučelje mijenja to može
rezultirati promjenom pozicije u widget hijerarhiji pojedinih widgeta kojima se tada mora
mijenjati ime. Ovo se može izbjeći korištenjem varijabli u koje se spremaju imena važnih
widgeta.

Konfiguriranje Tk widgeta
Za specifikaciju atributa widgeta koriste se parovi argumenata. Imena atributa
započinju crticom «-», npr. –text (sljedeći argument je vrijednost tog atributa). Čak i
najjednostavniji Tk widget može imati desetak ili više atributa, dok oni složeniji mogu imati i
više od dvadeset atributa. Prednost kod Tk-a je potreba za specificiranjem samo onih atributa
koji ne zadovoljavaju defaultne vrijednosti. Svaki primjerak widgeta podržava operaciju
configure (skraćeno config) koja je u stanju mijenjati atribute ili vršiti query nad njima.
Sintaksa operacije config koristi iste parove argumenata korištene prilikom kreiranja
widgeta. Tako je npr. moguće promijeniti boju pozadine naredbenog gumba nakon što je on
već kreiran i postavljen na ekran:

.hello config -background red

Ako se želi izvršiti query nad trenutnom vrijednošću atributa, izostavlja se vrijednost na kraju:

.hello config -background


=> -background background Background #ffe4c4 red

Atributi widgeta mogu se redefinirati bilo kada, čak i tekst i naredba koji su postavljeni u
vrijeme kada je gumb kreiran:

1207/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

.hello config -text Goodbye! -command exit

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 pružaju odgovarajuće funkcije (input focus,
event binding, geometry managment)

Tablica Pregled osnovnihTk naredbi za kreiranje wdgeta


button kreira naredbeni gumb
checkbutton kreira toggle gumb koji je linkan na Tcl varijablu
radiobutton kreira radio gumb
menu kreira menu
canvas kreira canvas (podržava linije , bitmape...)
label kreira jednolinijski tekst label (read only)
entry kreira widget za jednolinijski unos teksta
message kreira višelinijsku tekstualnu poruku
listbox kreira scrolling text widget
text kreira text widget općenite namjene
scrollbar kreira scrollbar koji je linkan u drugi widget
frame kreira widget koji je spremnik za widgete
toplevel kreira okvir koji predstavlja novi top level X window

Tablica Pregled osnovnihTk naredbi za manipulaciju widgeta


after izvršava naredbu nakon određenog perioda vremena
bell zvučni signal
bind vezanje Tcl naredbe na X event
bindtags kreiranje binding klasa, kontrola
clipboard manipulira sa X clipboard
destroy briše widget
fileevent povezuje Tcl naredbe sa file deskriptorima

1208/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

focus kontrolira input focus


grab uzima input focus od drugih widgeta
option pristup Xresources bazi
pack packer geometry manager
place placer geometry manager
send šalje Tcl naredbu u drugu Tk aplikaciju
tk query internal Tk state
tkerror background errors
winfo query window state
wm poziva window manager

1209/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

8.5. Primjer Tk aplikacije

Slika Tk sučelje za output prikaz unix programa

Ovo sučelje sastoji se od dva gumba, Run It i Quit, entry widgeta u koji se unosi naredba i
text widgeta za prikaz rezultata izvršavanja unix programa. Skripta izvršava program kroz
pipeline.

Primjer Tk program za output prikaz izvršavanja unix programa

#!/usr/local/bin/wish -f
# execlog - run a UNIX program and log the output

# Set window title


wm title . ExecLog
# Create a frame for buttons and entry.

frame .top -borderwidth 10


pack .top -side top -fill x

# Create the command buttons.

1210/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

$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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

ZAKLJUČAK

Tcl ima ulogu jezika kojim se konfiguriraju i izgrađuju aplikacije. Tcl je kao skriptni
jezik pogodan za automatiziranje rutinskih poslova.
Korištenjem Tcl interpretera moguće je izgrađivanje aplikacija kao niz jednostavnih operacija
sastavljenih skriptom na način kako to najviše odgovara određenim potrebama. Dopuštena je
kontrola nad aplikacijom od strane drugih programa, čineći aplikacije još funkcionalnijim.
Ono čime se Tcl interpreter razlikuje od drugih shell-ova je sposobnost njegovog ugrađivanja
u aplikacije. Tcl se pokreće na više platformi pa tako postoje verzije za UNIX, Windows i
Macintosh. Povrh svega Tcl je besplatan.

1213/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

Elizabeta Velkavrh
Alja Pavlić-Ravšer
Eliot Karlo Pavletć

DISTRIBUCIJA LINUXA/UNIXA
(Verzije linuxa/ unixa danas u upotrebi)

1214/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Distribucija Linuxa/Unixa

UVOD

Distribucije su zapravo gotovi “paketi” programa koji čine cjeloviti operativni sustav.
Dakle, kada govorimo o distribucijama, mislimo na određeni skup programa i koncepata koji
čine operativni sustav.

Ovaj dio teksta namijenjen je početnicima Linuxa, tj. savjet kako odabrati Linux
distribuciju. Za početak najbolje je odabrati distribuciju po općenitoj potrebi korisnika. Svaka
distribucija je kompletni operacijski sistem, uključujući Linux kernel i sve ″utilitie″ te razne
programe koji su potrebni te spremni za instalaciju i upotrebu. Većina distribucija uključuje
na tisuće programskih paketa, jednostavnih grafičkih sučelja, ″office″ programa i igrica.

Postoje različite Linux distribucije, od ″jednostavnih″ do ″punerukeposla″ distribucija.


Sa aspekta novopečenih 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 osvježava na http://lwn.net.

Prije samog odabira distribucije, dobro je pažljivo pročitati opis same distribucije te je
usporediti s vlastitim potrebama. Svaka distribucija je namijenjena posebnom tipu korisnika.
Znači, neke su optimalne za funkciju kao serveri, neke optimalne za igrice te neke su
optimalne za ″desktop″ i ″office″ upotrebu.

1215/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

MALO O LINUXU

Linux je slobodan i besplatan operativni sustav sličan Unixu. Linux je stvoren i razvijan
ujedinjenim snagama tisuća hakera entuzijasta širom svijeta povezanih putem Interneta.

Linux je objavljen pod GNU GPL licencom, što znači da je njegov izvorni kod dostupan
svima. Svi GNU programi koji su također potrebni da bi cijeli sustav radio su također pod
slobodnom licencom, a tako i mnogi drugi programi. Zahvaljujući ovome, različiti programeri
razvijaju puno različitih "distribucija" Linuxa, od kojih svaka ima neke posebnosti, iako su
sve jednako funkcionalne. Najpoznatije su Red Hat, Debian, Slackware, SuSE i Mandrake.

Linux se može instalirati i koristiti na mnogim platformama, računalima baziranim na


Intelovim i sličnim ( x386 ) procesorima, na Alphama, Motorola 68K procesorima, PowerPC-
u, 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 zašto je AT&T držao licencu na samo ime
Unix dugo vremena, pa su drugi proizvođači iz razloga copyrighta "izmišljali" svakakva
imena, ili bi se Unix pisalo kao Un*x...

AT&T danas za priča nije osobito bitan, ali zbog sveg ovog se Unix, pisan u jednini,
više smatra kao neka "opća imenica", dok govoreći o konkretnim operativnim sustavima treba
govoriti o Unixima, u množini. Linux je jedan od Unixa, besplatan i zadnjih godina jedan od
najpopularnijih. Komercijalne Unixe proizvode mnoge informatičke 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 proizvođači komercijalnih Unixa počinju nuditi
besplatne licence određenim skupinama korisnika, očito potaknuti Linuxovim uspjesima.
Linux je nastao 1991. - u slobodno vrijeme, iz hobija, rad na Linuxu započeo je Linus
Torvalds, tada student na sveučilištu u Helsinkiju. Linus je u međuvremenu postao guru i

1216/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

božanstvo za priličan broj sljedbenika Linuxa koji u njemu vide protutežu ulozi kakvu ima
Bill Gates.

Linus se pravda kako je po njegovom izvorno ime daleke 1991. trebalo biti "Freax"
(Free kao besplatno + X, po grafičkom sučelju Unixa), ali je administrator FTP sitea
sveučilišta u Helsinkiju, preko kojega su se prve beta verzije distribuirale zaključio 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 niži broj verzije), i rad se, uz regrutiranje sve
većeg broja pristalica, ali stalno pod Torvaldsovim vodstvom i nadzorom, nastavio do 1994.,
kad je konačno izbačena 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, brojčana oznaka verzije
bez problema bi bila "napuhana" na 4.0, 5.0, 8.0 ili koliko bi već bilo potrebno.

1217/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

GNU POKRET

GNU projekt je jedan projekt koji je počeo 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 znači da je sustav otvoren i dostupan
svima, zajedno s izvornim kodom.

GNU projekt je do sada dosta napredovao jer


u njemu sudjeluje nekoliko tisuća programera koji
bez novčane 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 uskače Linux.

Kada je student Linus Torvalds na Sveučilištu u Helsinkiju 1992. napravio vlastiti


kernel, to je radio iz čistog hobija. Priključili su mu se mnogi programeri i već 1993. izašla 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
(pogrešnim) imenom Linux.

1218/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

LINUX DISTRIBUCIJE – Najpoznatije Linux distribucije

Linux distribucije

Mandrake Linux
Mandrake Linux započeo je Gaël Duval, to je
distribucija koja je stekla ogromnu popularnost od
svoje prve pojave u srpnju 1998. Developeri su od Red Hat distribucije promijenili grafičko
radno sučelje u KDE i Gnome, te dodali ″easy-to-use″ instaler, prekidajući tako mit da je
Linux teško instalirati. Mandrake pri hardware detekciji automatsko vrši particioniranje diska
koje je u prednosti, te se od mnogih smatra najboljim u industriji i mnogi su se našli u
Mandrake-u tamo gdje su ostale distribucije zakazale u određenim potrebama.
No, s obzirom na ipak nešto veću složenost Mandrake-a, hardware-ski zahtjevi ove
distribucije su veći. Iz tog razloga preporuča se da računalo na koje se instalira Mandrake
distribucija ima najmanje Pentium procesor, sa barem 32 MB RAM-a , te oko 800 MB (ili
više) slobodnog prostora na disku (nije fiksan zahtjev ovisno o broju paketa npr. može se
prilikom instalacije odabrati samo jedno grafičko sučelje KDE, a ne i GNOME. ). Poželjno je
da nakon instalacije ostane slobodnog prostora na disku (ako je moguće 200 MB).
Kako bi se naknadno mogle dodavati aplikacije koje ne dolaze na instalacijskim CD-
ima (npr. Open Office). Paketi koji nisu odabrani prilikom instalacije, a kasnije zatrebaju,
lako se mogu naknadno dodati korištenjem Software Manager programa.
Mandrake Linux je postala popularna distribucija među novim korisnicima Linuxa, te
među onima koji traže alternativni operacijski sistem. Razvoj ove distribucije je u potpunosti
otvoren i transparentan sa novim paketima koji se nalaze u «cooker» direktoriju na internetu u
svako doba.
Kada se objavi nova verzija, te ulazi kao prikladan za betu, cooker snapshot je prihvaća
kao ″first″ beta. Beta proces testiranja je kratak i intenzivan. Počinjući sa verzijom 9.0, taj
proces je postao duži i temeljitiji. Beta mailing lista je jako zauzeta, ali se može ubrzo dobiti
odgovor na bilo koji problem koji se prijavi.
Rezultati ovakvog razvijanja su pogled unaprijed u prenošenju prava na drugoga, kao
moderna i suvremena Linux distribucija. S obzirom na učestalo mijenjanje korisnici će uočiti
više grešaka i manju stabilnost nego kod drugih distribucija.

1219/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Red Hat i Fedora Core


Za mnoge, ime Red Hat je distribucija koja
predstavlja Linux, kao što i je sigurno najpoznatija Linux
kompanija na svijetu. Osnovana 1995. od Boba Younga i
Marca Ewinga.
Red Hat, Inc. je tek nedavno pokazala znakove
profitabilnosti, određen kao linija proizvoda - Red Hat
Enterprise Linux product line. Ipak, Red Hat Linux 9.0 je
bila posljednja verzija u liniji Red Hat Enterprise Linux, koju je zamijenila Fedora Core
distribucija krajem 2003. Kako je Red Hat službeni sponzor Fedore, razvija se u zajedničkom
okruženju, sa malim razmacima, te sudjeluje uglavnom kao ″test baza″ za Red Hat Enterprise
Linux. Važna osobina ove distribucije je RPM, Red Hat Package Manager. Taj program
predstavlja ogroman napredak; omogućava čisto instaliranje i deinstaliranje aplikacija i
komponenti operacijskog sustava, kao i kernel tj. samu osnovu OS-a. RPM sada u biti koriste
i sve ostale distribucije osim Debiana.
Što je toliko specijalno u vezi Red Hat Linux i Fedore Core? To je ne uobičajena
mješavina suzdržanih i vodećih paketa (aplikacija) stavljenih zajedno na vrh ispred mnogih
znanjem jakih ″utilitie-a″ razvijenih ″kod kuće″. Kad se objave novi paketi, objavi se nova
beta verzija, paket verzija se zamrzne, osim sigurnosnih ″update-ova″. Rezultat je dobro
testirana i stabilna distribucija, te beta program i prijavljene greške su otvorene za javnost, te
imaju nekoliko mailing lista.
Red Hat Linux postala je dominantna distribucija u čitavom svijetu. Drugi razlozi za
uspjeh Red Hat distribucije su veliki izbor servisa koje kompanija nudi. Software paketi su
jednostavni za osvježavanje putem Red Hat Network-a, skup besplatnih software-a i vrijednih
informacija. Visoki rang servisa podrške i poduzetnosti Linux produkta su dostupni od
kompanije i iako ne uvijek jeftini, možemo reći da je pozitivni razlog i stručno osoblje koje
nam stoji na raspolaganju. Između ostalog kompanija je razvila i certificirani program za
daljnje širenje ideje distribucije – RHCE (Red Hat Certified Engineer) obrazovanje, te pregled
je dostupan u velikoj većini dijelova svijeta. Svi ovi faktori su doprinijeli činjenici da je Red
Hat distribucija sada prepoznatljivo ime u IT industriji.

1220/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Debian GNU/Linux
Debian GNU/Linux, započeo je Ian Murdock 1993., te je ishod napora developera da
stvore nekomercijalnu distribuciju visoke kvalitete, možda čak i
najčišću formu od idealista koji su započeli ″free software
movement″.
Debian Linux je lako nadogradiva distribucija, uglavnom
sastavljena od softvera slobodne distribucije iz više različitih
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. Više od
400 održavatelja radi na više od 1500 paketa i poboljšava Debian Linux. Prednosti Debian
Linuxa su njegova nadogradivost, dobro definirane međuzavisnosti paketa i otvoren razvoj.
Profinjeni sustav za pronalaženje grešaka omogućava korisnicima lako prijavljivanje grešaka i
sigurnosnih propusta s kojim se zatim Debian zajednica brzo obračunava.
U bilo koje vrijeme procesa razvitka, tri su osnovna djela u glavnom direktoriju –
″stabilno″, ″testiranje″ i ″nestabilno″ (također poznat kao ″sid″). Kada se pojavi nova verzija
paketa, smještena je u djelu ″nestabilno″i čeka prvo testiranje. Ako prođe dalje, paket se
pomiče u sljedeći dio ″testiranja″, gdje opet prolazi rigorozno testiranje koje može potrajati
mjesecima, nakon toga se proglašava ″stabilno″ stanje. Kao rezultat gore navedenog, ova
distribucija je možda čak i najstabilnija i najpouzdanija, a sigurno dinamična, jer izdanja se
zamrzavaju svaka tri mjeseca, a FTP arhive dnevno osvježuju.

Gentoo Linux
Gentoo Linux je stvoren od Daniela Robbinsa,
prijašnjeg Stampede Linux i FreeBSD developera. Gentoo
Linux je izvorno-bazirana distribucija. Za razliku od
uobičajenih distribucija, Gentoo ne isporučuje već
kompajlirane pakete, nego samo izvorne kodove aplikacija,
koje se onda izravno na korisničkom sustavu prilagođavaju i
kompiliraju. Gentoo je prvi put u stabilnoj verziji pušten u
ožujku 2002.

1221/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Prednost ove distribucije je naime to što raspolaže vlastitim upraviteljem programskih


paketa, koji nadilazi osnovno upravljanje s RPM i DEB-paketima. Pod nazivom "Portage"
objavljen je sustav za upravljanje paketima, osmišljen kao port-sustav u najboljoj tradiciji
BSD-ovih portova. Sama distribucija pretpostavlja točno određeno sučelje, 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 drže u centralnom spremištu koji su obično najnovije verzije. S druge strane, instalacija
Gentoo-a čitave distribucije sa posljednjim grafičkim desktopima, multimedijom i
razvijačkim alatima je dosadan i dug proces (nekoliko dana i na najbržim računalima).

SuSE
SuSE je još jedna kompanija fokusirana na
desktop, korisnicima svih razina, od početnika do
stručnjaka, nudi brz i lagan ulaz u svijet Linuxa i Unixa.
Mogućnosti kao što je instalacija s CD-ROM-a pomoću
izbornika, modularna disketa za dizanje sustava,
priručnik od 400 stranica i S.u.S.E-ov alat za administraciju sustava, YaST (alat za
instaliranje i administriranje koji konfigurira mrežu), omogućavaju brzo instaliranje i početak
rada u Linuxu, te nastavak rada bez problema. S.u.S.E. također nudi niz podržanih X servera
koji podržavaju najnovije grafičke kartice. Dokumentacija koja dolazi sa produktima, je ubrzo
označena kao najkompletnija, najtemeljitija i najupotrebljiva na daleko. Distribucija je
postigla važno tržište 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. Štoviše, SUSE ne osigurava ni jednostavnu instalaciju ISO images, no
profesionalno izdanje je dostupno za instalaciju putem FTP-a, inače oko 1-2 mjeseca poslije
službene verzije.

1222/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Slackware Linux
Slackware Linux, stvoren od Patricka Volkerdinga 1992.,
jest najstarija ″živuća″ Linux distribucija. Ova distribucija ne
nudi grafičke konfigurirane alate, nego više mogućnosti sa
tekst-baziranim instajlerom. Gdje ostale distribucije se trude
razviti easy-to-use sučelje za mnoge uobičajene ″utilitie-e″,
Slackware ne nudi održavanje i sve se još radi kroz
konfiguracijske fajlove. Baš zbog toga, Slackware je jedina
preporučljiva distribucija za one koji žele naučiti više o
Linuxima. Ništa manje zbog toga, Slackware ipak ima magični utjecaj na mnoge. Ova
distribucija je uvelike stabilna i sigurna – vrlo povoljna za razvijanje poslužitelja. Iskusni
Linux administratori smatraju da ova distribucija ima manje bagova, jer koristi pakete
prijašnjih formi, bez previše ″in-house″ unapređivanja, što uzrokuje veće šanse za nove
bagove.
Puštanje novih verzija je dosta rijetko (jedanput na godinu), iako noviji paketi su uvijek
dostupni za ″skidanje″ poslije službenog puštanja. Slackware distribucija je idealna za one
koji su zainteresirani za unutarnje osobine Linuxa. Možda najbolja karakteristika ove
distribucije je ako se naiđe na bilo kakav problem, treba pronaći Slackware korisnika.
Slackware korisnik će sigurno puno prije pomoći neko korisnici drugih distribucija.

Lycoris Desktop/LX
Lycoris je mala, vrlo komercijalna i poprilično ambiciozna distribucija. Osnovana je od
Josepha Cheeka, koji je navodno uz još četvoricu pokrenuo Redmond Linux, 2000.,
Redmond, savezna država Washington, SAD. Današnji Lycoris si je uzeo za cilj sastavljanje
jedne distribucije, koja će na kućnim računalima slijediti aktualne koncepcijske XP-trendove,
te prema tome stvoriti «easy-to-use» distribuciju, koja bi olakšala prelazak sa Windowsa u
Linux i to omogućavala na što bezbolniji način.
Lycoris distribuciju prema tome korisnik može koristiti
slično kao i neko Windows-računalu, koja nužnost dodira
korisnika sa samim operacijskim sustavom svodi na najmanju
moguću mjeru, klonirajući tako My Computer i Network
Neighborhood, kao i atraktivno grafičko sučelje (boje koje korespondiraju s XP-predloškom),
koje jako liči na Windows XP. Isto tako s druge strane ono što nedostaje su brojni alati i

1223/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

programski paketi za razvoj programa na koje su korisnici naviknuti kod gotovo svih drugih
Linux distribucija.
Ova distribucija koja djelomice sadrži elemente zasnovane na Calderinom OpenLinuxu,
podržava 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 godinu-
dvije unazad tržište 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
konačnom oblikovanju. Tako da Lycorisov Desktop/LX je ocijenjen za početnike – vrlo
dobar, pogotovo za prijelaze s MS Windowsa, no za naprednije korisnike ne zadovoljava.

Xandros Desktop
Xandros je kreiran od ostataka Corel Linuxa, sasvim
uspješnog pokušaja približavanja Linuxa mnoštvu 1999., ali
napušten od kompanije kada je naišla na financijske
probleme.
Xandros je kupio distribuciju u kolovozu 2001., te
pustio prvu i jedinu verziju u listopadu 2002.
Xandros Desktop je bez sumnje najpristupačnija distribucija na tržištu, te najbolja
preporuka za one «first-time» Linux korisnike. Dok je broj aplikacija uključenih u
distribuciju ograničen, developeri su ipak osigurali da taj broj radi savršeno. Xandros se
također pobrinuo za samo njihov fajl manager i ostale odgovarajuće komponente. Dostupna
su dva izdanja:
Deluxe ($99) i Standard ($40), jedine razlike između ova dva izdanja su nedostajanje
CrossOver Offica i Plugin-a (kompaktni sloj koji omogućava pokretanje Microsoft Offica i
ostalih Windows produkata na Linux) i NFTS particijskog alata (za Windows XP korisnike)
kod jeftinijeg izdanja.

1224/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

LindowsOS
Lindows.com je započeo Michael Robertson, u listopadu 2001.,
inače osnivač i prijašnji CEO od MP3.com - sitea koji je omogućavao
(legalnu) kupovinu glazbe u MP3 formatu, te promovirao neovisne
bandove, koji su preko njegovih stranica tražili svoju publiku bez
posredovanja izdavačkih kuća..
LindowsOS predstavlja najnoviji pokušaj dovođenja Linuxa na
desktop scenu i njegovog pretvaranja u "pravu" alternativu
Microsoftovim operativnim sustavima, čemu bi trebala pomoći i njegova mogućnost da
pokreće aplikacije pisane za Windowse.
Prvo javno puštanje 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ć korišten u
sličnim projektima, koji LindowsOS-u omogućuje pokretanje aplikacija pisanih za
Windowse. Dodana je također i nova osobina nazvana Click'n'Run - mogućnost instalacije
softvera izravno s Lindows.com web-stranica, kao i pretraživanje, uspoređivanje i kupovinu
softverskih naslova koje nas zanimaju, poboljšana instalacijska procedura - brzina i
jednostavnost instalacije.
Testne verzije (sneak previews, u terminologiji tvrtke) dostupne su, naime, tek
odabranim članovima Lindows Insider zajednice, formirane za pružanje podrške ovom
projektu, čiji članovi za "upad" moraju platiti 99 USD. Ta svota im, međutim, 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 potvrđuju ono što se i do sada znalo o Wineu:
Windows aplikacije i pod ovim sustavom rade sporo, loše i često se ruše.
Kompanijina ogromna marketinška propaganda (glavni razlog tome jest Microsoftova
tužba protiv tvrtke, zbog navodne "krađe" registriranog naziva Windows), no to je rezultiralo
da LindowsOS (i Linux) ubace među glavne medije instalirane na novim računalima
prodanim diljem US-a i UK-a.

1225/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Caldera OpenLinux
Caldera isporučuje OpenLinux 1.2 kao tri proizvoda:
OpenLinux Lite, OpenLinux Base i OpenLinux Standard.
OpenLinux Lite besplatan je proizvod za iskušavanje (Calderin
integrirani Desktop radi samo 90 dana -- potpuno licencirana verzija
desktopa uključena je u proizvode Base i Standard). OpenLinux Lite
može se skinuti s Calderinog FTP servera ili za cijenu isporuke
dobiti na CD-u. Napravljena je i za izdavače knjiga ili softvera koji tako mogu ponuditi
stabilnu komercijalnu distribuciju uz svoje knjige ili programe.
OpenLinux Base sadrži sve što i Lite i potpun je Linux operacijski sustav, s
jednostavnom instalacijom, integriranim Desktopom, Internet klijent i server komponentama i
povezivošću na Internet. OpenLinux Base uključuje i Netscape Navigator te potpunu
dokumentaciju.
OpenLinux Standard uključuje ono što je u Base, kao i više 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. Pomoću Caldere OpenLinux vidjet
ćete cijeli novi svijet moćnog računalstva, čak i moć Unix radne stanice na svom PC-u.
Korištenjem Linux kernela, OpenLinux vam pruža brzinu i stabilnost usporedivu sa sustavima
koji koštaju tisuće dolara. OpenLinux također nudi:
Prava višezadaćnost zbog koje mnogo tekstualnih ili grafičkih aplikacija radi
istovremeno; nijedna aplikacija ne može uzrokovati rušenje druge, kao kod manje robusnih
sustava.
Linux 2.0 kernel pruža iznimno brz TCP/IP pristup Internetu, uz montažne drivere za
uređaje za najdjelotvornije korištenje mogućnosti vašeg sustava.
Jednostavna, brza instalacija s izbornicima i automatskim pronalaženjem vašeg
hardvera čini instaliranje lakim na većini računala. Uključeni Vodič u započinjanju rada
postupke opisuje korak po korak, uz upute ako naiđete na probleme.
Nijedan drugi Linux sustav nema tako potpuno, integrirano grafičko sučelje s
konfiguracijskim alatima i grafičkim editorom. Njegove moćne drag & drop sposobnosti
dolaze podešene s tisućama ikona i opcija aplikacija. Desktop vam nudi prikladno mjesto za
pohranu omiljenih programa i podataka kojima odmah možete pristupiti. Desktop vam pruža:

1226/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Drag & drop pokretanje programa s podacima.


Integrirani grafički editor teksta.
Lak pristup nizu moćnih alata za konfiguriranje sustava.
Prilagodljivu ploču s ikonama, promjenjiv izgled i mijenjanje drugih opcija.
Moćan pristup datotekama pomoću drag & dropa ili grafičkih dijaloga.
Caldera je jedan od rijetkih distributera Linuxa koji nude podršku e-mailom i telefonom.
Podrška 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 tehničke
podrške. OpenLinux Base i Standard isporučuju se s potpuno licenciranim verzijama Caldera
Desktopa bez roka uporabe. OpenLinux Lite isporučuje se s verzijom Desktopa čiji rok
uporabe ističe nakon 90 dana.

Faq

Potreban prostor na disku


Općenito je za Linuxe potrebno oko 10Mb za minimalnu instalaciju, koja odgovara
samo za isprobavanje Linuxa, te ništa drugo. Tipična server instalacija, koja uključuje X
Window System GUI, otprilike zauzima 80Mb. Za instaliranje manje Debian GNU/Linux
platforme potrebno je od 500Mb do 1GB, koja uključuje kernel izvor koda, nešto prostora za
korisničke mape i swap particije.
Za instaliranje komercijalne distribucije koja sadrži desktop GUI okruženje,
komercijalni word procesor i front-office, približno potrebuje 15.1 GB prostora na disku, dok
za full instalaciju Debian GNU/Linux distribuciju potrebno je i do nekoliko gigabajta prostora
na disku.

Minimalna i maksimalna potrebna memorija


Linuxu je potrebno najmanje 4Mb, no onda je potrebna instalacijska procedura dok se
instalira disk swap prostor. Linux će raditi komforno sa 4MB RAM-a, iako pokretanje GUI
okruženja je sasvim nepraktično, radi sporo radi potrebe za swap diskovnim prostorom.
Neke aplikacije, npr. StarOffice, potrebuju 32MB radne memorije, te kompilacija C++
koda lagano kombinira radne i virtualne memorije preko100MB.
Postoji distribucija naziva ″Small Linux″, koja će raditi sa 2MB RAM-a.

1227/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Adresiranje više od 64MB memorije, koja je kod većine standardnih kernela postavljena
kao gornja granica. Više o tome na: http://FAQ/Linux-FAQ/linux

Najbolja distribucija
″Najbolje″ od bilo čega zavisi o potrebama korisnika. No međutim, diskusija na ovu
temu često se odvija na Usenet-u. Često ova tema je ″vatreni mamac″, no govoriti općenito
gubitak je vremena. Licenca za besplatni software nije dovoljno ograničavajuća, pa uz malo
više iskustva, mogu se obavljati vlastita testiranja.

Kako nabaviti distribuciju


Linux distribucije su ekstremno jeftine – uobičajeno oko $30 za kompletnu distribuciju,
te svugdje od $70 do $150 za podebljane sisteme sa više server programa ili razvijačkih alata.
Čak i $30 ″osnovni″ sistemi sadrže ekvivalentno na tisuće dolara prikladnih alata. U ovom
slučaju potrošen novac ulaže se daljnje razvijanje, te veliku većinu se može pronaći kao ″open
source project″.
Komercijalne distribucije su dostupne iz specijaliziranih trgovina ili naručivanjem preko
web stranica.
Svaka distribucija omogućava ″skidanje″ sistema na njihovoj službenoj stranici. Na taj
način se zadovoljava uvjet za licencu samog softwera, pa ako određeni iznos za distribuciju
predstavlja problem, na ovaj način se može to izbjeći. Nije neuobičajeno što korisnici znaju
napraviti kompromis između plaćanja i ″skidanja″, za primjer kupnja verzije 6.0, a ″skidanje″
nadopune verzija 6.1, 6.2.

BSD Unix

Početak BSD-a
Priča o BSD-u, kao i danas najpoznatijim, besplatnim, verzijama istog, FreeBSD,
NetBSD i OpenBSD-u počinje još u studenom davne 1973-te godine, kada su Ken Thompson
i Dennis Ritchie na 'Symposium on Operating Systems Principles' održanom na Purdue
sveučilištu predstavili svoj rad o UNIX operativnom sistemu. Profesor Bob Fabry, sa

1228/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Berkeley sveučilišta, jedan od prisutnih na konferenciji, bio je izrazito zainteresiran za kopiju


UNIX operacijskog sistema radi eksperimenata na Berkeley sveučilištu.
Dolaskom UNIX-a na Berkeley počeo je i rad na INGRES bazi podataka, koja je bila
preteča jedne od najboljih baza podataka današnjice, Postgres-a. Prvu zvaničnu distribuciju
UNIX-a napravio je Bill Joy, autor vi-a (što je impliciralo i termcap), čovjek koji je značajno
unaprijedio tadašnji Pascal interpreter, jedan od osnivača Sun Microsystems-a i jedan od
najvećih UNIX hakera svih vremena. Od tog trenutka postoji ime BSD-Berkeley System
Distribution. Ubrzo je slijedio i razvoj DARPA mreže sa osnovom na Berkeley sveučilištu,
č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 učiniti određene ustupke) uslijedila je pojava
revolucionarnog BSD4.2 operacijskog sistema sa implementacijom TCP/IP protokola. Uskoro
je, logično, 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 vršene u originalnom BSD-u.
Njegov rad bio je oživljen 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
korištenje imena UNIX. Od tada su BSD i UNIX, kontradikcijsko, postali dvije različite
stvari. Tokom 90-tih godina polako je počela kristalizacija situacije vezana za BSD
operacijske sisteme i na ovom mjestu bi spomenuli i razdvojili 3 glavne BSD distribucije koje
su počele 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 isključivo za Net, a komunikacija
među developerima je bila bazirana na chatu i mailu. Njegova glavna odlika je izuzetna
portabilnost (pogledati www.netbsd.org), kompaktan sistem sa odličnim packaging sistemom,
kao i velika pouzdanost.
Njegova velika mana je nedostatak SMP podrške (ako ne računamo nezvanične patch-
eve kao što je podrška za dvoprocesorske VAX mašine), ali je to u neku ruku i logično, pošto

1229/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
fantastičnim 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 odrađen ports sistem za ″update″ i održavanje sistema, kao
i jako logično organiziran sistem u cijelosti (što je generalno odlika svih BSD baziranih
operacijskih sistema).

OpenBSD
Najmlađi BSD izdanak, nastao 1996. godine zahvaljujući
lošem karakteru Theo De Raadt-a jednog od originalnih developera
NetBSD, koji je uslijed neslaganja sa ostatkom NetBSD developera
odlučio napustiti NetBSD projekt i započeti svoj, koji je nazvao
OpenBSD. Zahvaljujući tome što živi u Kanadi, bio je u prilici
zaobići demokratsku 'USA crypto policies' i napraviti operacijski
sistem sa izrazito jakim security-em, kao i sa kriptografijom integriranom u sam sistem, kao i
nečim što se zove ″proactive auditing″, koji se bazira na konstantom 'češljanju' koda samog
kernela i traženjem mogućih exploit-a, pa se često događa da mogući sigurnosni problem je
već otklonjen, prije nego što se on uopće i otkrije. Svakako najimpresivniji operacijski sistem
današnjice sa aspekta security-a.

1230/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Razlike BSD-a i Linuxa

Bitno je naglasiti razliku u terminima 'BSD distribucija' i 'Linux distribucija', pošto se


kod BSD distribucija radi o iako velikim dijelom potpuno kompatibilnim, a ipak različitim
operacijskim sistemima (čitaj kernelima), dok kod distribucija Linuxa govorimo o istom
operacijskom sistemu u drugom pakiranju, iako je u posljednjih 2 godine fork-ovanje kernela
postala omiljena disciplina velikih distributera Linux operacijskih sistema. Ono što čini BSD
operacijske sisteme, jest sličan način organizacije, zajednička osnova, kao i slična filozofija.

Zašto BSD bazirani operacijski sistemi nisu nikada postali jako popularni? Odgovor je
jednostavan, BSD nikada nije ciljao na popularnost, on je jednostavno alat.

Live CD distribucije

4.5.1 Knoppix
Razvijen od Klausa Knoppera, slobodno se može reći 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), mogućnost korištenja i za spašavanje već instaliranih sustava ili
provjeru omrežja, može poslužiti za demonstraciju Linuxa za one, koji ih još nisu vidjeli kao
test prije nabave.
S druge strane, može se u potpunosti koristiti kao Linux distribucija. Kojim se dobiva
potpuno kompatibilan Debianov sustav s vrlo aktualnim paketima, bez zahtjevnosti i
složenosti uobičajeno originalne Debianove instalacije. Sustav je opremljen vrlo dobrim
automatskim prepoznavanjem hardwarea i solidnom podrškom za mnoge grafičke, zvučne i
mrežne kartice, SCSI uređaje i ostalu periferiju, no i bez grafičkih sučelja ima što za ponuditi.
Učinci i brzina sustava dakako mjerodavno ovise o količini raspoložive radne memorije,
brzini CD-pogona i radnim sposobnostima glavnog procesora.

1231/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

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
može pokrenuti izravno iz CD-ROM-a. U takav projekt upustio se
nedavno i francuski Mandrake, s vrlo dobrim rezultatima...
Mandrake Move je nastao još prošle godine i zasnovan je na prethodnoj generaciji
Mandrakeove stolne distribucije Mandrake Linuxu 9.2 te mu stoga nedostaju neke od
mogućnosti i neki od programskih paketa koje će donijeti ″desetka″ - na prvi pogled najočitiji
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 više nego dobro. Usmjerenost krajnjem
korisniku vidljiva je iz činjenice da je Mandrake u ovu distribuciju uvrstio samo jedan
program za svaku namjenu: jedno grafičko sučelje (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, grafička kartica, zvučna kartica) je bila gotovo stopostotna. Problemi koje
smo uočili većinom su se svodili na postavljanje previsoke ili preniske rezolucije grafičkog
sučelja, što se može izmijeniti davanjem odgovarajućeg parametra pri pokretanju. Pokretanje
traje nekoliko minuta i odvija se u dvije faze: prva je tekstualna koja podsjeća na pokretanje
nekog instalacijskog programa i koja traje vrlo kratko. Druga faza odvija se u grafičkom
sučelju i traje duže, prije svega zato što je – interaktivna.

1232/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

TABLICA KARAKTERISTIKA DISTRIBUCIJA

DISTRIBUCIJA PREDNOSTI MANE SPM DOWNLOAD

″User-friendly″, Nove verzije imaju


Prednosti graf. grešaka te su
Mandrake konfiguracije, inicijalno dostupne RPM Besplatno, sa
Velika tehnička samo za članove zakašnjenjem
podrška, MandrakeClub-a
NTFS particija

Ograničeni produkti
Na široko se koristi, obuhvaćaju free
RedHat Odlična teh. potpora, izdanje, Siromašna RPM Besplatan je
Fedora Core Puno inovacija multimedijska
podrška

100% besplatan,
lako nadogradiva Nema puno
distribucija, otvoren inovacija kod
Debian razvoj, lako instalacije, DEB Besplatan je
prijavljivanje grešaka Dugo testiranje
novih verzija

″Bezbolna″ Duga i gnjavatorska


instalacija sistem instalacija,
Gentoo individualnih prog. povremena SRC Besplatan je
paketa, često nestabilnost
puštanje novih
verzija

Nudi brz i lagan Dostupan samo u


ulazak u svijet prodaji ili putem
Linuxa, izuzetna FTP instalacije,
SuSE posvećenost uključujući RPM Nije besplatan,
detaljima komponente s samo putem FTP-
(dokumentacija), ″pravom a

1233/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

YaST- vlasništva″
konfiguracijski alati

Stabilna distribucija, Sva konfiguracija


malo grešaka, se podešava Text
Slackware privržen Unix File editorom, TGZ Besplatan je
principima (širiti i limitirana
prilagođavati) hardverska
detekcija

Idealan za početnike, Neki zastarjeli Nije besplatno,


dizajniran da nalikuje programski paketi, samo 45-
Windowsima zahtjeva licencu dnevno probno
Lycoris ″po mjestu″ za RPM izdanje
komercijalnu
upotrebu

Dizajniran za Uključuje vlasničke


početnike, dobar File komponente, nema
Xandros Manager i drugi free download DEB Nije besplatan
korisni utiliti-i

Brza i jednostavna Skup, nedostupne


instalacija, ″one- testne verzije, osim
LindowsOS click″ instalacija ako se plaća DEB Nije besplatan
programa pružanje podrške

Jednostavna Za Lite nema


Caldera instalacija, nijedna tehničke podrške,
OpenLinux aplikacija ne može jer rok upotrebe RPM Nije besplatan
uzrokovati rušenje istječe za 90 dana
druge

Izuzetna portabilnost,
kompaktan sistem, Nedostatak SMP - Nije besplatan
NetBSD velika pouzdanost podrške

Dobar security, Razvija se za samo

1234/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

fantastični dvije arhitekture:


FreeBSD performansi, najbolja i386 i alpha TBZ Besplatan je
implementacija
TCP/IP stack-a

Najimpresivniji OS
OpenBSD današnjice sa aspekta - TGZ Samo putem FTP-
security-a a

Hardverska auto-
detekcija, pokreće se Ako se pokreće sa
Knoppix direktno s CD-a, bez CD-a, mala brzina i DEB Besplatan je
potrebe za hard disk izvedba
instalacijom

Pokreće se direktno s Zasnovan na


CD-a, jednostavna prethodnoj
upotreba, pouzdana generaciji te mu
Mandrake Move detekcija hardvera stoga nedostaju RPM Besplatan je
neke od mogućnosti
i prog. paketa

1235/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

LOKALIZACIJA LINUXA I PRIMJENA U HRVATSKOJ

Članovi HULK-a zaslužni su i za pokretanje te (ne uvijek redovno) održavanje domaćeg


linuksaškog portala smještenog 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 također napisao
domaći autor).
Distribucija je zasnovana na Mandrakeu, a sadrži lokaliziranu verziju instalacijskog
programa te dijela softvera. Na osnovi HRID-a nastale su još dvije distribucije: HRID.school,
predstavljen prije nešto manje od godinu dana i namijenjen edukacijskim ustanovama, te
HRID.office - uredska distribucija predstavljena u proljeće 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 uložen u nju poslan upstream developerima. Za
razliku od Mandrakea u HRIDu su izbačene razne kineske
podrške i nehrvatski prijevodi, te dodani hrvatski korisni sadržaj (howto-i, prijevodi, ...).
Također 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 podrškom 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 između 0.9 i 1.0 nisu velike (samo
malo noviji paketi + kozmetičke promjene).
Distribucija je namijenjena za one kojima je potreban office, te za one koji imaju
programiranje u svom obrazovanju (c/c++, pascal, prolog, ...) - uključene su i razne imitacije
poznatih Borlandovih sučelja (xwpe) kao i druga inovativna sučelja (motor) i za one koji žele
raditi web programiranje (php/perl/python... sa posgtresql/mysql-om).... Ustvari, iskoristiti ju

1236/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

može svatko kome to odgovara. U distribuciju su također uključene mnoge nepravedno


zapostavljene aplikacije. Kako autor naglašava u budućnosti je planiran i dodatni CD od
distribucije koja bi trebala sadržavati 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 početak

CULC / Hrvatska konvencija Linux korisnika 2004.

Od 21. do 23. travnja 2004. po jedanaesti put održana je središnja godišnja Open Source
i Linux manifestacija u Hrvatskoj. Mjesto radnje odvijala se kao i do sada na Fakultetu
elektrotehnike i računarstva u Zagrebu, a organizatori su Hrvatska udruga za otvorene sustave
i Internet (HrOpen) i Hrvatska udruga Linux korisnika (HULK).
Ove godine predavanja su obuhvaćala zanimljive aktualne teme: od poslovne uporabe
Linuxa u tvrtkama i državnim institucijama, preko lokalizacije, optimalnog korištenja Open
Source baza, SAMBA-e, SNORT-a, uporabe uredskog programskog paketa OpenOffice,
razvoja programske podrške pod GNU licencom, do sigurnih bežičnih mreža pogonjenih
Linuxom, te VoIP rješenja.
Središnja osoba i predavač-uvodničar oba konferencijska dana ovogodišnje
manifestacije bio je g. Ken Coar, dopredsjednik Apache Software Foundation i član izvornog
tima programera Apache Web poslužitelja, čiji je trenutni internetski tržišni udio više od 67%.
″Open Software: Opportunities Abound″ predavanje koje je pokušalo odgovoriti na dva
postavljena pitanja prisutna kod pokretanja tvrtke odnosno posla temeljenog na otvorenoj
programskoj podršci: kako se može zaraditi na nečemu što je besplatno i da li su sve dobre
niše već zauzete.
″Advenced httpd Topics″ tema koja se bavi unutarnjom logikom rada Web poslužitelja
pri obradi nadolazećih zahtjeva za isporukom Web stranica. Ovo je jednoipolsatno predavanje
je bilo namijenjeno prvenstveno programerima koji bi voljeli započeti pisanje vanjskih
(extension) modula za Apache poslužitelj.

1237/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Jednostavno... Linux

26./27.10.2004. na zagrebačkom se Fakultetu elektrotehnike i računarstva održala


strukovna konferencija ″Jednostavno... Linux″. Taj dvodnevni događaj okupio je popriličan
broj sudionika te pobudio veliko zanimanje u domaćim IT krugovima.
Prvi dan konferencije bio je rezerviran za predavanja, podijeljena u dvije grupe, jednu
namijenjenu sadašnjim, ali i budućim Linux korisnicima, a drugu administratorima Linux
računala. Svoja predavanja na konferenciji održali su neki od najeminentnijih domaćih, ali i
stranih Linux stručnjaka poput Davida McIntosha iz IBM-a, Marcella Marsa iz
Multimedijalnog instituta, Matije Nalisa iz tvrtke Opus, Dobrice Pavlinušića iz Plive i drugih.
Sudionici su mogli nazočiti praktičnim radionicama poput seminara Roberta Sedaka s
naslovom ″Abeceda otvorenog koda″, kao i radionicu Ivana Guština o administraciji Linux
računala. U isto vrijeme Linux administratori imali su prilike upoznati se s mogućnostima
povezivanja Sambe i LDAP baze u jedinstveni AAI te naučiti ponešto o VLAN tehnologijama
i L3 routingu u radionici koju su zajednički održali Dorian Ivančić i Denis Lacković.

1238/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

POVIJEST LINUXA I UNIXA

Linux se na računarskoj sceni pojavio kao izdanak Unixa. Kao operativni sistem
(zapravo niz različitih operativnih sistema sličnih osobina), Unix je mnogo stariji od stolnih
računara. Unix je i dalje u širokoj upotrebi iako se danas često koristi i na klijent-server
intranet mrežama.
Povijesno gledano, problem sa Unixom je bila njegova nedostupnost programerima koji
su htjeli da rade sa nečim van računarskih centara velikih poduzeća i univerziteta. Iako su
neke verzije Unixa za PC odavno na raspolaganju, one nikada nisu pružale eleganciju i snagu
operativnih sistema koji stoje na raspolaganju mini i mainframe računarima i današnjim
serverima. Uz to, rane komercijalne verzije Unixa bile su skupe, ponekad skuplje od PC
hardvera za koji su bile namijenjene. Ta nepristupačnost je na kraju dovela do Linuxa, kao da
operativni sistem sličan Unixu postane široko dostupan.
Život Linuxa je započeo u rukama Linusa Torvaldsa, sa helsinškog univerziteta u
Finskoj. Iako je Linux razvijen uz pomoć tisuća programera širom svijeta, Linus Torvalds još
uvijek upravlja razvojem središtem operativnog sistema – njegovom jezgrom (engl. kernel).
Mnogi danas misle kako je Linux operativni sustav poput MS Windows 9x, 2000 ili
NT. Međutim, to nije istina. Linux je kernel odnosno jezgra operativnog sustava. Potrebno je
još nešto osim kernela (jezgre), a to su programi. Nijedan kernel ne može ništa pametno raditi
bez programa. Danas se uz Linux kernel koriste i GNU programi i tada imamo cjeloviti
operativni sustav. Zato je ispravnije koristiti izraz “GNU/Linux sustav” ili skraćeno
“GNU/Linux”.
Lako je tijekom proteklih desetak godina postao Ljubimcem akademske zajednice,
raznih računalnih geekova i rebela te administratora manjih i srednjih mreža, Linux se još
uvijek teško probija u dva najisplativija tržišna segmenta - enterprise segment velikih servera
i računalnih sustava (koji još uvijek čvrsto drže klasični Unixi i serverske verzije Windowsa)
te segment stolnih računala, pogotovo onih u tvrtkama (na kojima je gotovo nemoguće zateći
bilo što drugo osim Microsoftovih operativnih sustava).
Srećom po linuksaše, ova situacija se u zadnje vrijeme lagano mijenja i sve je više tvrtki
spremno razmotriti korištenje Linuxa na mjestima na kojima ovaj operativni sustav sve
donedavno nije imao što tražiti.
Čak i najveći konkurenti priznat će da se Linux sve donedavno nije mogao ravnopravno
nositi s konkurencijom i da su mu jedine prednosti bile cijena i otvorenost izvornog koda.

1239/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Danas je situacija drugačija - zahvaljujući ubrzanom razvoju Linuxa i pripadajućih aplikacija


unatrag nekoliko godina, većina stručnjaka se danas slaže da je Linux tehnološki i te kako
konkurentan, pogotovo na serverskom segmentu.
Izvrsna interoperabilnost s desktop verzijama Windowsa oš je jedna prednost koja
serverskim verzijama ovog OS-a omogućuje zauzimanje što većeg tržišnog udjela.
Na desktop sceni situacija je nešto nepovoljnija, mada je napredak koji je na njoj
postignut iznenadio mnoge. Aktualna verzija KDE-a je po mnogočemu funkcionalno
ekvivalentna Windowsima, a izdanak StarOfficea, OpenOffice.org, je skup aplikacija koji
oduševljava i recenzente navikle na daleko moćniji Microsoftov uredski paket.
Novije verzije distribucija sve se jednostavnije instaliraju i koriste - možda i dalje ne
dovoljno jednostavno za kućne korisnike, no dovoljno jednostavno za informatičke odjele u
tvrtkama.
Osim nabrojanih faktora, sve većem profiliranju Linuxa pridonosi i polako odumiranje
klasičnih Unixa i sve veća dominacija Intelovog i Intelu kompatibilnog hardvera u
serverskom segmentu.

1240/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

KRONOLOGIJA LINUXA

1991. Linus Torvalds izdaje prvu javnu verziju (0.02) Linux kernela nastalog kao
"projekt iz hobija", bez ikakvih pretenzija za imalo ozbiljnije korištenje.

1992. U razvoj Linuxa uključuju 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 uspješnom serverskom OS-u.

1996. Izlazi Linux 2.0. Pojavljuju se prva grafička okruženja i prve naprednije
aplikacije za Linux.

1998. Pojavljuju se KDE i GNOME. Linux igra ulogu u internetskom boomu kao jedan
od najkorištenijih 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 podršku Linuxu u nekom obliku.

1999. Red Hat Linux i VA Linux izlaze na burzu, učetverostručujući, odnosno


uosmerostručujući svoju tržišnu vrijednost u prvom danu trgovanja. Na burzu izlaze i drugi, a
investitori se otimaju za tvrtke koje imaju bilo kakve veze s Linuxom, trošeći novac na sve
strane. Pojavljuje se OpenOffice.org, a kernel 2.4 bliži se svojoj finalizaciji. Oracle ulaže
značajna sredstva u razvoj svojih aplikacija za Linux.

2000. VA Linux za 800 milijuna dolara kupuje mrežu siteova posvećenih 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 iščezavaju
mnoge tvrtke koje su se bavile Linuxom.

2001. Recesija je u punom zamahu. Propadaju mnoge tvrtke koje se bave Linuxom,
preživjeli smanjuju obim poslovanja i otpuštaju radnike. Corel prodaje svoj odjel za razvoj

1241/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Linuxa Xandrosu. Unatoč svemu tome, Linux bilježi uspjehe - sredinom godine se kratko
vrijeme isporučuje na gotovo trećini novih servera. Michael Robertson pokreče Lindows.com
- tvrtku čiji je cilj dovesti Linux na računala kućnih korisnika. Pojavljuje se OpenOffice.org -
besplatni uredski paket zasnovan na Linuxu.

2002. Red Hat Linux bilježi prvi profit. Caldera, SuSE, Connectiva i TurboLinux
pokreću 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 koristeći Linux. Europska komisija naručuje studiju o isplativosti
prelaska IT infrastrukture državne 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 potiče da razmisle o prelasku na Linux.

2003. The SCO Group podiže tužbu protiv IBM-a, optužujući ga za neovlašteno
korištenje SCO-ovog intelektualnog vlasništva i njegovo prenošenje u Linux kernel, tražeći
milijarde dolara odštete. Red Hat Linux nastavlja s profitabilnim kvartalima. Gartner predviđa
da će Linux do kraja godine biti instaliran na desetak posto novoisporučenih servera, što čini
najveći udio u ovom tržišnom segmentu na godišnjoj razini do sad. Gradske uprave nekoliko
njemačkih gradova, uključujući Munchen, objavljuju kako će u potpunosti migrirati na Linux.
Nekoliko velikih korporativnih korisnika, uključujući australsku Telstru, razmišlja o prelasku
na Linux i StarOffice na desktopu zbog visokih cijena Microsoftovih proizvoda. Ford i Audi
počinju s korištenjem Linuxa. Reuters se prebacuje na Linux u poslu vrijednom navodno 200
milijuna USD kroz pet godina. Linux nalazi svoju primjenu u clusterima, superračunalima i
radnim stanicama. Izlaze nove verzije KDE-a, OpenOffice.orga i Sambe. lzlazi kernel 2.6.
Izlaze HRID.office, uredska distribucija Linuxa za hrvatsko tržište, s prevedenim programima
i spellcheckerom na hrvatskom, te Knoppix - inovativna distribucija koja korisnicima
omogućuje isprobavanje Linuxa bez instaliranja na računalo.

1242/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Važni 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
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb

Saša Protulipac

Kompajliranje kernela

1244/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

UVOD

Linux

Linux je operativni sustav nastao kao inicijativa g. Linusa Torvaldsa započeta 1991.
godine. On je prvobitno zamislio projekat kao skroman izdanak Minixa, operativnog sistema
kojeg je napisao Andrew S. Tanebaum. Budući da Linux duguje mnogo svom prethodniku
UNIX-u, moglo bi se reći da je Linux započet davno prije, nekoliko desetljeća ranje, točnije
1969. godine kada je UNIX kao istraživački projekt započet u labaratorijima Bell kompanije
AT&T. Linus Torvalds je napravio revolucionaran korak kada je izvorni kod svog projekta
stavio na Internet i omogućio svakome tko želi da se pridruži razvoju. Danas Linux
predstavlja jezgra, tj. kernel operativnog sustava koja korespondira sa mnogobrojnim
uslužnim programima bez kojih bi rad bio nemoguć. Svi ti programi su većinom kompatibilni
sa svim inačicama UNIX-a, pa iz svega navedenog gotovo bi se moglo reći da je Linux jedna
od inačica UNIX-a.

Kernel

Kao što sam već napomenuo, temeljn dio Linuxa je kernel tj. jezgra operativnog sustava
koja je učitana u memoriju računala i predstavlja kariku koja povezuje hardverske
komponente (procesor, diskove itd.) sa mnogobrojnim uslužnim programima na čijoj strani se
nalaze korisnici. Iako nije jedini, vrlo je važan dio Linuxa operativnog sustava (OS) i zato
mora biti ispravno podešen i prilagođen, jer o njemu ovisi ispravnost i stabilnost rada svih
hardverskih i softverskih komponenti računala.
Danas je izvorni kod Linux-ovog kernela dostupan svakome preko interneta što nam
omogućava da ga preuzmemo, maksimalno prilagodimo i ugradimo u naš Linux operativni
sustav.

1245/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

KADA I ZAŠTO KOMPAJLIRATI KERNEL

Kompajliranje kernela je postupak u kojem uz pomoć gcc kompajlera prevodimo


izvorni kod (souce) u izvršni, tj. binarni kod. Kao krajnji rezutat kompajliranja dobivamo
kernel i njegove module u obliku izvršnog koda. Izvorni kod kernela je gotovo u cijelosti
pisan u progamskom jeziku C, samo neki djelovi čija je brzina izvršavanja ključna za brzinu
rada operativnog sustava pisani su u asembleru.

Razlozi za donošenje odluke o izradi novog kernela

Konfiguracija izvornog koda kernela zahtjeva podosta veliku količnu predznanja i


upoznavanja sa hardverskim komponentama računala. Sam proces kompajliranja i na
snažnijim računalima ponekad traje sat ili više. Konkreto na računalu Pentium 100, sa 64 MB
rama i 1,2 GB hard diskom kompajliranje čitavog kernela 2.6.0test9 traje oko četiri sati. Ako
još uzmete u obzir da će svaka pogriješka prilikom konfiguracije kernela vjerovatno rezultirati
ponovnim kompajliranjem kernela, može se desiti da kod početnika navedeni proces potraje
po nekoliko sati, a ponekad i nekoliko dana. Zato prije nego što pristupite izradi novog
kernela razmislite da li Vam to zaista treba? Neki od razloga zbog kojih bi trebalo pristupiti
kompajliranju kernela su:
- podrška za noviji hardver koji u prethodnoj inačici nije bio podržan ili je bio
podržan u eksperimentalnom obliku (vrlo često su takvi slučajevi sa grafičkim
karticama, raznim multimedijalnim dodacim, mrežnom opremom i sl.)
- podrška za noviji protokol ili datotečni sustav (najčešće se javlja kod računala koja
rade u mrežnom okružju)
- sigurnosni propusti koji su popravljeni u novijoj inačici kernela
- potreba za promjenom strukture kernela (npr. ako želimo umjesto modularnog imati
monolitan kernel ili sl.)

Samo činjenica da je izišla nova verzija kernela koja je mjesec dana svježija od
postojeće nikako ne bi trebala biti razlog za nadogranju kernela.

1246/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Kada treba izbjegavati najnovije inačice kernela

Najnovije inačice kernela nisu uvijek najbolje rješenje, jer osim najnovijih mogućnosti
mogu donijeti sa sobom još neotkrivene sigurnosne propuste. Ako računalo radi u okružju u
kojem je sigurnost i stabilnost važan čimbenik njega ne bi trebalo stavljati kernel koji je
objavljen tek prije nekoliko dana. Svakako treba prethodno provjeriti kakvi su problemi
vezani uz verziju na koju mislite nadograditi kernel bez obzira koliko je ona stara.

1247/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

INSTALACIJA IZVORNOG KODA KERNELA

Prilikom instlacije Linux-a gotovo se nikad ne instalira izvorni kod kernela iako on
dolazi sa svakom distirbucijom. Svaka distribucija dolazi sa nekoliko gotovih kernela i
velikim brojem gotovih modula. Sam kernel je obično prilagođen tako da podržava većinu
osnovnih komponenti koje se nalaze na pripadajućoj platformi (PC, Mac), sve ostalo se nalazi
u modulima koji se po potrebi pozivaju. Neke općenite stvari o kernelu kao i način na koji se
kernel instalira saznat ćete iz nekoliko narednih poglavlja.

Općenito o izvornom kodu kernela

Izvorni kod kernela je skup datoteka pisanih pisanih u C-u i assembler. Uz navedene
datoteke pronaći ćemo još podosta konfiguracijskih i textualnih dokumentacjskih datoteka.
Kompletan kernel (kao i većina ostalih stvari na Linux-u) objavljena je pod GNU licencom.
Izvorni kod kernela dolazi u dvije verzije, stabilnoj (namjenjena korisnicima) i nestabilnoj
(namjenjena za testiranje i razvoj). Prva stabilna verzija kernela (1.0) je objavljena 1994.g.
Verzije kernela se označavaju sa tri broja međusobno odvojenih točkama, u obliku
major.minor.release. Po drugom broju (minor) možemo vidjeti da li se radi o stabilnoj ili
nestabilnoj verziji kernela, tj. sa neparnim brojevima se označavaju nestabilne, a s parnim
stabilne verzije kernela, npr:
2.4.27 - označava stabilnu verziju kernela
2.5.1 - označava nestabilnu verziju kernela
Kad verzija kernela 2.5.x postane dovoljno stabilna za upotrebu, ona se preimenuje u
prvu slijedeću stabilnu verziju, u ovom slučaju to bi bila 2.6.0 koja nastavlja dalje sa
razvojem. Nestabilne verzija kernela je experimentalna i služi za testiranje nekih novih
programskih rješenja, podrška za hardver, posjeduju više noviteta, no nije preporučljiva za
korištenje jer može uzrokovati nenadana rušenja operativnog sustava, gubitke podataka ili
neočekivana ponašanja računala. Nasuprot tome stabilne verzije kernela dobro su testirane,
posjeduju minimalan broj bug-ova i kao takve preporučljive su za upotrebu. Mada bi sve
stabilne verzije kernela trebale biti jednako kvalitetne, praksa pokaže da su neke od njih
"stabilnije" od drugih. Upravo takve verzije kernela često koriste poznatije distribucije Linux-
a unatoč tome što je u vrijeme njihovog izlaska posojala novija verzija.

1248/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Gdje pronaći izvorni kod kernela

Izvorni kodovi kernela bi se trebli na svim distribucijama uvijek nalaziti u direktoriju


/usr/src/linux-x.x.xx
gdje su sa x označeni brojevi koji pripadaju verziji kernela i to je prvo mjesto gdje bi ga
trebali potražiti (neke verzije kernela mogu imati još nekoliko dodatnih oznaka u nastavku).
Ako nismo ništ apronašli u navedenom direktoriju, a želimo ostaviti postojeću verziju
kernela i u njoj samo napraviti neke promjene ili dograditi podršku za neki novi uređaj, ne
moramo ići daleko, vjerovatno već imamo izvorni kod u obliku paketa na nekom od CD-ova
na kojima smo dobili distribuciju linuxa. Način instalacije takvih paketa biti će obrađen u
jednom od slijedećih poglavlja. Da bi smo doznali koja je verzija kernela kojeg koristimo na
računalu treba u konzoli upisati slijedeću naredbu:
# uname –r
U većini slučajeva ipak ćemo htjeti nadograditi računalo sa novijom verzijom kernela
(ili starijom), tad ćemo ga morati potražiti na Internetu. Najbolje bi bilo ako uspijemo pronaći
verziju izvornog koda kernela u obliku paketa za distribuciju koju koristimo jer je takav
izvorni kod u većini slučajeva dodatno prilagođen samoj distribuciji. Najbolje ga je potražiti
na internet stranicama od distribucije koju koristimo:
Red Hat - http://www.redhat.org
Debian - http://www.debian.org
Mandrake - http://www.mandrake.org

Ili na stranicam namjenjenim za pretraživanje programskih paketa, npr:


http://www.rpmfind.org

U većini slučajeva nećemo biti zadovoljni ponudom (obično nema novijih inačica
kernela), pa je onda najbolje otići na stranicu
http://www.kernel.org

gdje ćemo pronaći sve do sada izdane verzije kernela. Tu ćemo pronaći izvorni kod arhiviran i
komprimiran u obliku *.tar.gz ili *.tar.bz2 datoteka. Navedena stranica sadrži i dosta linkova
vezanih uz razvoj i korištenje kernela.

1249/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Instalacija izvornog koda kernela oblika .tar.gz (.tar.bz2)


datoteke

Kernel je u takvom obliku je arhiviran i komprimiran u datoteku izgleda linux-


x.xx.xx.tar.gz ili linux-x.xx.xx.tar.bz2 gdje su sa x zamjenjeni brojevi verzije kernela, veličine
30-tak MB. U stvari radi se o izvornom kodu koji je arhiviran sa programom tar i zatim
komprimiran sa programom gzip ili bzip2. Jedino što trebamo napraviti je raspakirati
navedenu datoteku u direktorij /usr/src i to na slijedeći način:
1. kopiramo datoteku kernela iz direktorija /root/source u direktorij /usr/src
# cp /root/source/linux-2.4.27.tar.bz2 /usr/src
umjesto /root/source stavljamo putanju do mjesta gdje nam je datoteka kernela
2. poziconiramo se u direktorij /usr/src
# cd /usr/src
3. raspakiramo datoteku kernela
# bzip2 –dc linux-2.4.27.tar.bz2 | tar xvf –
ako se radi o *.tar.bz2 formatu datoteke ili
# bzip2 –cd linux-2.4.27.tar.gz | tar xvf –
ako se radi o *.tar.gz formatu datoteke.
4. provjerimo sa
# ls –al
postoji li simbolički link /usr/src/linux , ako postoji obrišemo ga sa
# rm linux
5. napravimo simbolički link /src/linux na /src/linux /kernel-2.4.27
# ln –s /usr/src/linux-2.4.27 /usr/src/linux
Uvijek mora postojati simbolički link /usr/src/linux prema direktoriju kernela kojeg
kompajliramo, ako želimo raditi sa nekim drugim kernelom, dovoljno je simbolički link
preusmjeriti na njega.

1250/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Instalacija izvornog koda kernela oblika .rpm datoteke

Datoteke, tj. pakete oblika kernel_source-2.4.27.i386.rpm koristi Red Hat Linux i


distribucije temeljene na njemu (Mandrake, Fedora, White Box). Njihova instalacija je
jednostavnija jer u sebi sadrži između ostalog i podatak gdje se izvorni kod kernela treba
nalaziti. Bez obzira gdje se nalazimo u sistemu dovoljno je upisati
# rpm –i /putanja/kernel_source-2.4.27.i386.rpm
Ako ne postoji trebamo još dodati simbolički link /usr/src/linux.

4.1. Instalacija izvornog koda kernela oblika .deb datoteke

Izvorni kod Debian distribucije Linux-a dolazi u obliku .deb paketa, tj. datoteke oblika
kernel-soruce-2.4.17-1_all.deb gdje su oznake iza verzije kernela vezane za izmjene koje su
rađene na orginalnoj verziji kernela. Instalaciju možemo napraviti sa naredbom u konzoli:
# apt-get install kernel-source-2.4.17
nakon toga dobit ćemo poruku da ubacimo potrebne CD-ROM-ove na kojima se nalazi
distribucija. Nakon instalacije izvorni kod kernela ćemo pronaći u direktoriju /usr/src u obliku
kernel-source-2.4.17.tar.bz2 datoteke. Za završetak instalacije trebati ćemo proći proceduru
opisanu u poglavlju 3.3. Uklanjanje prethodno navedene datoteke možemo napraviti sa
naredbom:
# apt-get remove kernel-source-2.4.17

Patchiranje (krpanje) kernela

Patchiranje kernela je postupak u kojem izvorni kod kernela nadograđujemo datotekom


koja u sebi sadržava samo promjene između starije i novije verzije kernela. Same datoteke za
patchiranje su puno manje (0.1 – 4 MB) od kompletnog izvornog koda kernela. Zato je puno
praktičnije sa interneta preuzeti patcheve. Nadograditi možemo samo release kernela, tj.
možemo nadograditi verziju 2.4.19 na 2.4.22, ali ne možemo nadograditi 2.2.18 na 2.4.0.
Oblik datoteke za patchiranje je patch-x.x.xx.bz2 ili patch-x.x.xx.gz gdje se umjesto x nalaze
brojevi koji određuju verziju kernela. Program patch čita datoteku za patchiranje i radi

1251/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

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 međuvremenu izašli, konkretno:
patch-2.4.26.bz2
patch-2.4.27.bz2
patch-2.4.28.bz2
Naravno umjesto ovih možemo koristiti i patcheve sa .gz ekstezijom. Prilikom
patchiranja uvijek patchiramo redom na prvu slijedeću 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 izvršavamo slijedeću
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 postojeće verzije kernela, često


puta možemo naći patcheve u nekom drugom obliku. Takvi patchevi gotovo su uvijek
potrebni za podršku nekog uređaja čiju specifikaciju proizvođač drži u tajnosti. Uz takve
patcheve uvijek dolazi detaljno uputstvo kako ih primjeniti, često puta su to skripte koje ćemo
trebati izvršiti slijedeći upute proizvođača, a ponekad ćemo trebati sve napraviti ručno.
Uglavnom su postupci specifični za svaki slučaj i ovdje neće biti obrađeni.

1252/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

KONFIGURIRANJE KERNELA

Konfiguriranje kernela je jedan od najbitnijih koraka u procesu izrade novog kernela.


Zbog mnogobrojnih mogućnosti današnji kerneli imju mnogo opcija za podešavanje što
zahtjeva dobro poznavanje hardvera i softvera. Prije početka konfiguriranja kernela trebamo
dobro proučiti koji hardver ima računalo za kojeg radimo kernel, u kakvom okružju radi, koje
protokole i datotečne sustave treba podržavati itd. Neke od važnijih stavki su:

- tip platforme ( Intel 3086, Intel 4086, Intel Pentium III, AMD Athlon ...)
- broj procesora (radi li se o jednoprocesorskoj ili višeprocesorsko platformi)
- tipovi čipseta na matičnoj ploči, grafičkoj kartici, mrežnoj kartici, zvučnoj kartici ...
- tipovi sabirnica koje imamo na sistemu (ISA, PCI, AGP ...)
- koje datotečne 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 ...)
- ...
Također puno informacija o našem hardveru možemo dobiti naredbom
# /sbin/lspci
detalje o tipu procesora kojeg koristimo možemo dobiti naredbom
# cat /proc/cpuinfo

Svi podaci o konfiguraciji izvorog koda kernela trebaju se nalaziti datoteci .config u
osnovnom direktoriju našeg kernela. Navedena datoteka je najobičnija tekstualna datoteka
koja u sebi sadrži podatke o uključivanju ili isključivanju pojedinih opcija kernela, a
generierana je od strane programa config, menuconfig ili xconfig. Ti programi su okružja koja
nam pomažu u snalaženju među mnogobrojnim opcijama. Datoteku .config nakon što je
generirana možemo pogledati sa nekim textualnim editorom, no nije preporučljivo na taj
način raditi izmjene u njoj.

Pojedini koraci u konfiguriranju kerenela su:


1. Provjerimo da li simbolički link /usr/src/linux pokazuje na pravu verziju kernela
koju želimo konfigurirati

1253/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

2. Pozicioniramo se u direktorij /usr/src/linux


# cd /usr/src/linux
3. Slijedeća naredba će obristati sve nepotrebne datoteke prijašnjeg kernela koje su
nastale prilikom kompajliranja
# make mrproper
4. Sada pokrećemo neko od okružja u kojem ćemo konfigurirati kernel
# make xconfig - radi pod X-ima, preferirani način
ili
# make menuconfig - radi u konzoli, koristiti ako nemamo X-e
ili
# make menucofig - radi u konzoli, koristiti samo u nuždi ako niti jedan od
prethodnih načina ne radi

Konfiguriranje sa make xconfig

Da bi ste mogli pokrenuti xconfig, trebamo biti u nekom od grafičkih okružja (KDE,
GNOME, Afterstep) koji rade pod X Windows-ima. Najprije trebamo pokrenuti konzolu (u X
Windows-ima) i pozicionirati se u direkotrij /usr/src/linux, zatim upisati naredbu:
# make xconfig
koje će pokrenuti sučelje kao što je prikazano na slici 1. Preko tog sučelja pristupamo
pojedinim sekcijama u kojima se nalaze opcije kernela. S obzirom da sada aktualna verzija
kernela 2.6.10 još nije ušla u širu upotrebu, okvirno će biti opisane važnije opcije kernlea
2.4.27.

1254/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Odabirom bilo koje sekcije otvara se novi izbornik, sličan onome na slici .

Sa y odnosno n uključujemo i isključujemo pojedinu opciju, a odaberemo li m


navedena opcija će biti modularna, što znaći da će biti učitana u kernel samo onda kad se za to
pojavi potreba. Gotovo sve može biti modularno, osim podrške za datotečni sustav,

1255/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

upravljački uređaj (kontroler) na kojem se nalazi osnovni sistem datoteka i PS/2 miša. Ako
nismo sigurni što pojedina opcija znači, možemo si pomoći odabirom dugemta Help. Neke od
opcija su posivljene i one su nedostupne, da bi smo ju omogućili moramo promjeniti neku od
prethodnih opcija o kojoj ona ovisi. Najbolje je krenuti od prve opcije i odabirom dugmeta
Next prelaziti na slijedeće opcije sve do kraja, tako ćemo biti sigurni da nismo ništa
preskočili. U nastavku redom će biti opisana većina važnijih sekcija i važnije opcije u njima:

Code maturity level options


U ovoj sekciji određujemo želimo li da nam prilikom odabira opcija budu prikazane i
one koje su u razvoju. Sve opcije koje su u razvoju dodatno su označene sa
EXPERIMENTAL, mada ih nije poželjno odabirati jer nam mogu uzrokovati nestabilnost
sistema, ponekad je nužno jer je baš u njima većinom podržan najnoviji hardver.

Loadable module support

Enable loadable module support - Ovdje možemo izabrati želimo li monolitan ili
modularan kernel. Monolitan kernel zanči da će kernel u potpunosti biti u jednom komadu i
prilikom podizanja OS-a čitav se učitava u memoriju, naknadna izmjena kernela ili dodavanje
bilo kakvih modula nije moguće bez ponovnog pokretanja računala. Većinom se koristi za
strogo namjenska računala kad je potrebna velika sigurnost i stabilnost sustava bez čestih
izmjena funkcionalnosti. Najčešće ćemo ipak trabati modularan kernel gdje se samo jedan
osnovni dio učitava prilikom podizanja OS-a, a ostali dijelovi kernela su u obliku modula koje
jednostavno možemo učitavati (pripajati) tijekom rada OS-a sa naredbama:
# insmod ime_modula - ubacuje modul
# rmmod ime_modula - briše 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 dinamičkog učitavanja
modula koji prethodno nisu testirani može doći do rušenja OS-a.
Set version inforation on all module symbols – selektiranjem ove opcije odabiremo
mogućnost učitavanja modula iz starije verzije kernela, poželjno je odabrati N
Kernel module loader – omogućava kernelu da prilikom učitavanja nekog modula koji
ovisi o drugom modulu automatski učita potreban modul, poželjno je staviti Y

1256/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Procesor type and features


U ovoj sekciji se nalaze sve opcije vezane za prilagodbu kernela procesoru (CPU-
central processor unit) s kojim će raditi, neke važnije su:
Procesor family – izabir vrste procesora, ostim standardnih Intel-ovih i AMD-ovih
procesora podržana 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 podršku za Intelove 386 procesore kernel će
raditi i na Pentium MMX procesorima no sporije jer neće koristiti naprednije mogućnosti –
set instrukcija novijih procesora) ubrzat ćemo rad OS-a.
/dev/cpu/*/msr – Model-specific register support - poželjno uključiti za Intel-ove
procesore Pentium Pro, Pentium II i novije.
MTTR (Memory Type Range Register) support - uključiti za procesore novije
generacije počevši od Pentium Pro i Pentium II.
Symetric multi-processing support - Podrška za višeprocesorske sustave (2 – 32
procesora, na kernelu 2.6.8 generacije do 255 procesora), većinom serverske platforme,
snažnije grafičke radne stanice i sl. Prilikom odabira ove opcije dodatno treba podesiti opciju
Maximum number of CPU(2-32) - gdje određujemo za koliko procesora trebamo podršku,
podrškom za svaki dodatni procesor kernel zauzima okvirno dodatnih oko 8 K RAM-a.
High Memory Support – uključiti 4 GB ako računalo ima 1 – 4 GB RAM memorije, za
više uključiti opcjiu 64 GB

General setup
Zbog isključivanja nekih opcija iz ove sekcije neke naredne sekcje mogu postati
nedostupne.
Networking support – bez obzira da li je naše računalo spojeno na mrežu ili ne, ovu
opciju je dobro uključiti zbog pravilnog rada nekih aplikacija koje to zahtjevaju.
PCI support – podrška za PCI sabirnicu, uključiti ako imamo PCI sabirnicu (većina
računala 386 i 486 generacije i starija nisu imala PCI sabirnicu)
MCA support – uključiti za za IBM PS/2 računala i laptope koji podržavaju
MicroChannel arhitekturu
PCMCIA/CardBus support - sekcija iza koje se krije obavezno uključiti ako imamo
slotove za priključenje PCMCIA kartica, gotovo na svakom prijenosnom računalo.

1257/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

System V IPC - obavezno uključiti


Kernel core (/proc/kcore) format - podrška za ELF programe, obavezno uključiti
Kernel support for MISC binaries – uključiti ako namjeravamo koristiti interpretere
poput Jave, Python-a ili Lisp-a
Power managment support – korisno uklučiti ako želimo kosrititi mogućnosti Power
managmetn-a (Stand by, Sleep), tj. da računalo samo prelazi u mod smanjene potrošnje
električne energije ako ga dok je uključeno dulje vrijeme ne koristimo. Vrlo korisna opcija za
prijenosna računala.
Advanced Power Mangment BIOS support - uključiti ako imamo u BIOS-u podržan
Advanced Power Managment (APM) i podesiti dostupne opcije.

Memory Technology Devices(MTD)


Podrška za memorijske uređaje, treba uključiti ako koristitimo razne vanjske jedinice
za pohranu koje koriste FLASH, ROM, RAM ili sl. memoriju, konkretno Compact Flash
kartice.

Parallel port support


Uključivanje podrške za paralelni port, danas gotovo sva PC i IBM kompatibilna
računala imalju paralerlni port (osim nekih novijih prijenosnih računala), služi za povezivanje
raznih periferija kao što je printer ili umrežavanje dvaju računala.
Parralel port support – obavezno uključiti
PC-style hardware - podržavaju sva PC i IBM kompatibilna računala i poneka
računala tipa Alpha, također treba uključiti.

Plug and Play configuration


Podrška za Plug and Play (PNP) uređaje.
Plug and Play support – uključiti ako želimo podršku za PNP
ISA Plug and Play support – podrška za ISA PNP uređaje

Block devices
Tu se nalaze opcije vezane uz IDE, Floppy disk, RAID, CD-ROM uređaje i sl.
Normal floppy disk support – uključiti ako imamo floppy disk na računalo (danas ga
imaju gotovo sva računala osim nekih novijih laptopa)

1258/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Parallel port IDE device support – podrška za IDE uređaje koji se priključuju preko
paralelnog porta (hard diskovi, CD-ROM-ovi itd.). Prilikom odabira ove opcije od nekoliko
nanovo ponuđenih treba specificirati tip uređaja.
Lopback device support – ova opcija omogućava montiranje datoteke (disk image-a)
kao file sitema koju na taj način možemo pregledati prije nego što ju snimimo na CD
RAM disk support – omogućava nam da jedan dio RAM memorije odvojimo i
proglasimo kao file sistem (jasnije rečeno od dijela memorije napravimo brzi hard disk), nije
preporučljivo uključitvati jer usporuje rad računala osim ako nam je nužno
Initial RAM disk support - Podrška za Inital RAM, tj. za RAM disk učitan od strane
boot loader-a i montiran kao osnovni file sistem prjie normalne boot procedure. Tipično se
koristi za učitavanje modula koji su nužni za montiranje stvarnog osnovnog (root) file
sistema, inače je praksa da se takva podrška ne ugrađuje u obliku modula nego u osnovni dio
kernela.

Multi-device support (RAID and LVM)


Ovjde se nalaze važne opcije za serverske sustave, pogotovo ako nemamo hadverski
RAID kontroler, jer omogućava organizaciju postojećih diskova u RAID polja. Logical
volume manager (LVM) je također važna opcija koja između ostalog omogućava dinamčku
promjenu veličine file sistema.

Networking options
Ovo je jedna od najvećih sekcija kernela i slobodno bih mogao reći "ponos" Linux
OS-a, upravo zbog mogućnosti koje su dostupne u ovoj sekciji Linux je postao jako raširen i
prihvaćen u mrežnom okružju.
Packet socket – Uključivanjem ove opcije omogućavamo nekim aplikacijama direktnu
komunikaciju sa mrežnim uređajima (mrežnim karticama itd.)
Unix domain sockets – Omogućava podršku za Unix domain sockets, koji su
standardni mehanizmi za mrežne konekcije. Mnogi progami koriste ove mogućnosti iako
možda nismo spojeni na mrežu, stoga ovu opciju obavezno uključiti.
TCP/IP networking – podrška za TCP/IP protokol, ako namjeravamo koristiti Internet
ili mreže temeljene na TCP/IP protokolu (većina LAN-ova) ovu opciju obavezno uključiti.

1259/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Ovo su neke važnije od mnogobrojnih postojećih opcija za čije je podešavanja


potrebno temeljito poznavanje mrežnog okružja te većina njih neće biti opisano, samo ću
spomenuti još neke:
Network packet filtering – filtriranje mrežnih paketa, uključivanje ove opcije će
omogućiti pristupu nizu drugih opcija za podešavanje firewall-a (iptables – firewall 2.4 tipa
kernela, ipchains – firewall 2.2 tipa kernela, ipfwadm - firewall 2.0 tipa kernela), podršku za
ARP itd.
Socket filtering – filtriranje socket-a, tj. zabrana pristupa servisima
IP: TCP synoockie support – ako je uključen onemogućava SYN napade, poželjno
uključiti na serverskim računalima ako imaju bilo kakvih doticaja sa Internet-om
IP: advanced router – omogučava konfigurianje sistema kao router-a

ATA/IDE/MFM/RLL support
Podrška za ATA/IDE uređaje (tj. za kontrolere na matičnoj ploči koji su zaduženi za
upravljanje hard diskovima, CD-ROM –ovima itd.)
Enhanced IDE/MFM/RLL disk/cdrom/tape/flopy support – ovo obavezno uključiti
osim ako imamo sistem baziran na SCSI diskovima ili ako imamo sistem koji nema hard
diskova.
Boot off-board chipsets first support – neke matične ploče dodatni kontroler uz već
postojeći na matičnoj ploči, ova opcija omogućava da se sistem najprije pokušava podignuti
sa dodatng kontrolera na matičnoj ploči, a tek onda sa osnovnog kontrolera. Ova opcija
ponekad rješava problem koji se desi kada kernel prilikom boot-anja ne uspije pronaći root
particiju (npr. ako nam je root particija na disku koji je spojen na dodatni kontroler na
matičnoj ploči).
Include IDE/ATAPI CDROM support – podrška za CD ROM-ove
SCSI emulation support – omogućava SCSI emulaciju za IDE ATAPI uređaje, a time
korištenje SCSI drajvere za ATAPI uređaje umjeto orginalnih ATAPI drajvera. Korisno
uključiti ako imamo CD snimalicu, USB FLASH stick i sl.
Osim navedenog tu se još nalazi podrška za mnoge tipove kontrolera, odabrati onaj tip
koji odgovara tipu na našem sistemu, ova opcija značajno ubrzava rad diskovlja.

SCSI support

1260/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Podrška za SCSI uređaje. Danas većina servera ima SCSI kontrolere za rad sa
diskovima.
SCSI support – obavezno uključiti ako nam treba podrška za SCSI
SCSI generic support – korisno uključiti ako imamo CD sinmalicu ili CD-ROM jer
time omogućavamo pristup u "raw" modu (nužno za ripanje audio CD-ova i sl.)
SCSI low-level drivers – podrška za SCSI kontrolere, treba točno znati koji tip
kontrolera posjedujemo i izabrati jedan od ponuđenih.

IEEE 1394 (FireWire) support (EXPERIMENTAL)


Tipičan primjer podrške za novije uređaje koja je još u testnoj fazi razvoja. IEEE 1394
standard se još naziva i FireWire ili i.Link, omogućava prijeos podataka do 400 Mb/s, često se
koristi za povezivanje DV kamera i externih diskova. Uz odabir ove opcije treba još odabrati i
odgovarajući tip kontrolera koji se nalazi u sistemu.

Network device support


Podrška za mrežne uređaje (mrežne kartice i sl.) i za neke protokole. Neke važnije
opcije su:
Network device support – uključuje podršku, ako nam je sistem umrežen ili se spajama
na Internet, obavezno uključiti.
Ethernet (10 pr 100Mbit) – iza ovog se krije sekcija sa opcijama za podršku raznih 10
i 100 Mbit-nih mrežnih kartica, ako imamo mrežnu karticu ovdje trebamo uključiti podršku za
nju.
Ethernet (1000 Mbit) – podrška za 1Gbit (1000 Mbit) mrežne kartice.
PLIP (parallel port) support – omogućava umrežavanje dvaju (rijetko više) računala
preko paralelnog porta (RS 232, 25 pinski priključak). Maksimalna duljina priključnog kabla
je 15 m. Koristiti ju samo u nuždi zbog male brzine prijenosa podataka.
PPP (point-to-point protocol) support – ako se spajamo na internet preko telefonskog
priključka obavezno uključiti ovu opciju
PPP support for async serial ports - uključiti 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 uključivati.

1261/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

PPP support for sync tty ports – treba uključiti ako koristimo PPP preko
sinhronizirane linije (ADSL, visoko propusne iznajmljene linije T1/E1 i sl.).
SLIP (serial line) support – podrška za Serial Line Internet Protokol, slično kao i PPP,
no PPP se danas više koristi.
Wireless LAN (non-hamradio) – iza ovoga se krije podrška uređaja za Wireless LAN.
Token Ring devices – sekcija za podršku Token Ring-a
PCMCIA network device support – sekcija sa podrškom za PCMCIA mrežne kartice
(većina externih mrežnih kartica za prijenosna računala)

Amateur Radio support


Podrška za vezu putem amaterskih radio uređaja preko prilagođenog X25 protokola.
Kod nas postoji jedna ovakava mreža brzine 2400 bps mada su ostvarive brzine preko 56
Kbps, ne podržava TCP/IP što joj je veliko ograničenje.

IrDA (infrared) support


Podrška za Infrared Data Associations (IrDA) protokol. Koristi se za komunikaciju
preko IC porta, često se koristi za uvezivanje računala sa PDA uređajem ili mobilnim
telefonom.

ISDN subsystem support


Podrška za ISDN, ako trebate pristup Internetu preko ISDN usluge onda obavezno
uključitit ISDN support.
Support synchronus PPP - podrška za PPP protokol preko sinhrone ISDN linije,
obavezno uključiti.
Support generic MP (RFC 1717) - omogućava povečanje propusnosti veze
grupiranjem nekoliko ISDN konekcija, preporučljivo je uključiti.
Passive ISDN cards – u ovoj sekciji treba odabrati tip ISDN kartice koju koristimo za
ISDN uslugu:
HiSax Siemens ChipSet driver support – podrška za Simensov čipset (nalazi se na
većini ISDN kartica), obavezno uključiti
HiSax Support for EURO/DSS1 – podrška za pozivni protokol E-DSS1, kao i u
Hrvatskoj podržan je u većini Europskih zemalja, obavezno uključiti.

1262/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

HiSax supported cards – u ovom popisu treba pronaći tip kartice koju posjedujemo i
selektirati (uključiti) ju.

Old CD-ROM drivers (not SCSI, not IDE)


Ovdje se nalzi podrška za stare CD-ROM pogone koji su se priključivali preko zvučne
kartice (ISA slot). Na takve CD-ROM-ove može se naići na računalima 486 generacije, u
većini slučajeva ova podrška nam neće trebati.

Input core support


Podrška za neke periferije koje se priključuju preko USB porta kao npr. pordška za
tastaturu, miša, joystick, grafičke tablete i sl. Ako nemamo nešto od navedenog nije potrebno
uključivati navedenu podršku.

Character devices
Virtual terminal – podrška za virtualne terminale, ona nam omogućava 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 služiti za različite
funkcije, obavezno uključiti.
Support for console on virtual terminal – omogućava praćenje poruka kernela na
nekom od virtualnih terminala.
Support for sharing serial interrupts – omogućava dijeljenje IRQ-a, korisno ako
imamo puno raznih uređaja (kartica) priključeno u našem sistemu, preporučljivo uključiti (da
bi ova opcjia bila dostupna treba uključiti Extended dumb serial driver options)
Unix98 PTY support – podrška za pseudo terminale, novi način kreiranja virtualnih
terminala na Linuxu, obavezno uključiti.
Mice – sekcija u kojoj su dostupne podrške za razne vrste miševa.
Mouse support – podrška za miševe, ali ne serijske (DB-9 ili DB-25 konektor) i ne
USB miševe, uključiti da bi nam bila dostupna opcja PS/2 mouse.
PS/2 mouse – podrška za PS/2 tipove miša (imaju mali okrugli konektor sa 9 pinova,
većina novijih miševa je tog tipa).
Joystick – sekcija sa podrškom za igraće dodatke, podržano je puno toga pa treba
samo odabrati model, ako imamo nešto što nije podržano postoje i generičke opcije. Može se

1263/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

desiti da je ova sekcija nedostupna (posivljena), to je vjerovatno zbog toga što u sekciji Input
core support nije napravljen pravilni izbor.

Multimedia devices
Podrška za razne video i audio multimedijalne dodatke kao što su video kartice, TV
kartice, radio kartice itd.

File systems
Podrška za različite file sisteme (način na koji su podaci zapisani na medij za pohranu
– hard disk, CD-ROM, floppy disk itd.). Većina OS je vezana za jedan ili nekoliko za njega
specifičnih file sistema, za razliku od toga Linux ima podršku za gotovo sve file sisteme (neki
su još u razvojnoj fazi).
Quota support – omogućava ograničenje diskovnog prostora na kojem pojedini
korisnik može raditi, za sada radi samo sa ext2 datotečnim sustavom.
Kernel automonter support – uobičajeno je da se svi uređaji ("device" - diskovi,
particije, mrežni diskovi) moniraju prilikom podizanja OS preko datoteke fstab ili naknadno
ručno sa naredbom mount, uključivanje ove opcije pruža nam mogućnost da se to montiranje
vrši atuomatski kad pokušamo pristupiti direktoriju na kojem bi se trebao nalaziti pripadni
uređaj. Često se primjenjuje za pristup CD-ROM pogonima i dijeljenim diskovima na mreži.
Resiserfs support – napredni datotečni sustav novije generacije, jedan od najbržih
datotečnih sustava na Linux-u koji podržava journalling, zbog tih svojstava koriste ga neke
Linux distribucjie namjenjene za servere.
Ext3 journaling file system support – journaling verzija ext2 datotečnog sustava (koji
je standardni datotečni sustav za Linux), zbog navedene je mogućnosti sporiji ali zato puno
sigurniji od ext2.
DOS FAT fs support – podrška za FAT (MS DOS) i VFAT (Windows 95),
uključivanje ove opcije omogućit će jošnekoliko opcija.
MSDOS fs support – Podrška za MS DOS datotečni sustav, omogućava montiranje i
prisutp MS DOS particijama.
VFAT (Windows-95) fs support – Podrška za VFAT datotečni sustav, omogućava
montiranje i pristup particijama koje koste Windows 95, 98 i NT operativni sistemi.
ISO 9660 CDROM file system support – standardni datotečni sustav za CD-ROM
medije.

1264/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Microsoft Joliet CDROM extensions – verzija ISO 9660 datotečnog sustava koja
omogućava korištenje 16-bitnog unicode formata.
NTFS file system support (read only) – podrška za MS NTFS datotečni sustava
(Windows NT, 2K i XP), no samo za čitanje, podrška za pisanje je još uvjek u fazi testiranja.
Second extended support - Podrška za ext2 datotečni sustav, koji je standard na
Linux-u.
UDF file system support (read only) - datotečni sustav novije generacije korišten na
CD-ROM i DVD medijima. Omogućava paketni način zapisivanja (korisnik može sa njime
upisivati i brisati podatke kao na hard disku). Za sada je podrška za upisivanje još uvjek u
razvojnoj fazi.

Network File Systems – Iza ovoga se krije sekcija sa podrškom za mrežne datotečne
sustave:
NFS file system support – omogućava pristup klijentima preko mreže dijeljenim
resursima (particije, direktoriji, diskovi) koji se nalaze na NFS serveru.
Provide NFSv3 client support – novija verzija NFS-a, puno otpornija na greške nastale
uslijed pada mreže, prestanka rada NFS servera itd.
NFS server support – omogućava pružanje NFS usluge, tj. dijeljenje resursa (particija,
direktorija, diskova) na mreži, koristi se na serverskoj strani.
Provide NFSv3 server suport – novija verzija NFS-a, puno otpornija na greške nastale
uslijed pada mreže, prestanka rada NFS servera itd., koristi se na serverskoj strani.
SMB file system support (to mount Windows shares etc.) – podrška za SMB (Server
Message Block), protokol koji omogućava platformama baziranim na Windows operativnim
sustavima dijeljenje datoteka i printera. Da bi se mogla koristiti navedena mogućnost na
Linux-u, osim podrške od strane kernela moramo imati instaliranu aplikaciju koja će to
realizirati (programski paket SAMBA). Nije podržan Microsof-ov NetBEUI mrežni protokol
tako da je dijeljenje moguće samo u mrežama zasnovanim na TCP/IP protokolu.

Partiton Types – U ovoj sekciji se nalazi podrška za pristup diskovima i particijama


koje su formatirane na arhitekturama različitim od one na kojoj se nalazi naš OS.

Native language support – to je sekcija u kojoj možemo podesiti regionalne postavke,


nabrojit ću samo one koje bi trebalo uključiti jer su interesantne za naše područje.

1265/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

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 – podrška za unicode

Console drivers
VGA text console – omogućava naprednije prikaze u terminalu (standardni je 25
redova X 80 zankova), tj. više znakova i redova, text u boji itd., obavezno uključiti.
Video mode selection support – omogućava da se prilikom podizanja računala prije
nego što boot loader učita kernel inicijalizacijom vga parametra kernela prebacimo u neki
drugi text mod različit od standardnog. Navedeni parametar možemo inicijalizirati u
konfiguracijskim datotekama grub-a, lilo-a ili u konzoli.
Frame-buffer support – podrška za naprednije mogućnosti nekih grafičkih kartica,
većina ih je u razvojnoj fazi.

Sound
U ovoj sekciji se nalazi podrška za zvučne kartice. Većina kartica je podržana,
trebamo pronaći tip čipseta na temelju kojeg je građena naša zvučna kartica i uključiti ga.
Sound card support - obavezno uključiti ako nam treba podrška za zvučnu karticu.

USB support
Podrška za Universal Serial Bus (USB), navedeno je samo nekoliko značajnijih opcija.
U odjeljku USB Host Contrloller Drivers treba odabrati treba odabrati driver koji
podržava naš USB kontroler na sistemu.
Suport for USB – ako želimo na sistemu podršku za USB, ovo obavezno uključiti.
USB Mass Storage support – uključiti ako nam treba podrška za masovnu pohranu
podataka preko USB-a (npr. vrlo popularan FLASH stick)
USB Printer support – podrška za printere koji su na sistem spojeni preko USB-a.

Cryptographic options

1266/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

U ovoj sekciji se nalazi podrška za razne kriptografske algoritme, da bi bili dostupni


treba uključiti opciju Crypthographic API, sve algoritme osim HMAC je najbolje uključiti kao
module, pa će tako biti automaski učitani kad se za to ukaže potreba.

Save and Exit


Kad smo gotovi sa konfiguriranjem izvornog koda kernela sa ovom opcijom snimamo
odabrane postavke u .config datoteku i izlazimo iz sučelja za konfiguraciju.

Quit Without Saving


Izlazak iz sučelja za konfiguraciju bez snimanja postavki u .config datoteku.

Load Configuration from File


Pomoću ove opcije možemo učitati postavke koje smo prethodno spremili sa Store
Configuration to File.

Store Configuraton to File


Sa ovom opcijom možemo spremiti trenutnu konfiguraciju izvornog koda kernela u
datoteku proizvoljnog naziva.

Konfiguriranje sa make menuconfig

Zadavanjem naredbe iz direktorija /usr/src/linux


# make menuconfig
pokrećemo sučelje za konfiguriranje izvornog koda kernela za koje nije nužno imati pokrenut
X – Window sustav, no ipak zahtjeva da na računalu imamo instalirane course library-je (kod
Debiana je ncourse). Opcije su istovjetne kao i kod xconfig-a pa za konfiguraciju izvornog
koda možemo koristi prethodno opisan primjer. Izgled glavnog izbornika sekcija prikazan je
na slici 3. Kroz sekcije i opcije se krećemo sa strelicama, sa tipkom ENTER ulazimo u
pojedine sekcije, prikaz jedne takve sekcije se vid na slici 4. Modularno uključivanje
pojedinih selektiranih opcija vršimo sa tipkom M, sa tipkom Y selektirana opcija će biti
integrirana u osnovi dio kernela, a sa tipkom N vršimo isključivanje selektirane opcjie. Opcije
koje počinju sa znakovima [ ] ne mogu biti uključene u obliku modula.

1267/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

1268/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Konfiguriranje sa make config

Konfiguriranje kernela počinjemo kao i u prethodnim primjerima iz direktorija


/isr/src/linux izdavanjem naredbe:
# make config
Ovaj tip konfigurianja također se radi iz konzole i za njega nam nisu potrebne nikakvi grafički
library-ji, no sa njim je vrlo teško raditi jer ne dozvoljava snimanje postojeće konfiguracije
niti vraćanje na opcije koje smo prošli, ako negdje pogriješimo moramo krenuti od početka.
Kako to izgleda mož se vidjeti na slici.

Na postavljena pitanja odgovaram sa y – opcija će biti integrirana u kernel, m – opcija će biti


u obliku modula ili N-opcija neće biti uključena. Zbog neprilagođenosti sučelja ovaj način
koristite samo u nuždi kad su prethoda dva nedostupna.

1269/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

KOMPAJLIRANJE KERNELA

Priprema izvornog koda za kompajliranje

Ovo je faza koja slijedi nakon konfiguriranja izvornog koda kernela. I dalje trebamo
ostati u direktoriju /usr/src/linux. Ako radimo sa kernelom verzije 2.4.x ili starijim trebamo u
konzoli zadati slijedeću naredbu (za kernele 2.6.x ili mlađe ovaj korak možemo preskočiti):
# make dep
Nakon toga slijedi naredba koja je obavezna za sve verzije kernela.
# make clean
Tijekom izvršavanja ovih koraka kao i nekoliko slijedećih na konzoli će biti ispisana hrpa
poruka, treba pričekati neko vrijeme (nekad i po nekoliko desetaka minuta) da zadati proces
završi do kraja.

Izrada osnovne jezgre kernela

Linux OS možemo pokretati na nekoliko načina, osnovna dva su pokretanje sa


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 završi kernel bi se trebao nalaziti u direktoriju /usr/src/linux/arch/i386 u
obliku datoteke bzImage veličine nekoliko stotina kilobajta do nekoliko megabajta, što zavisi
o tome da li je kernel modularan ili monolitan, te koliko je opcija bilo uključeno prilikm
konfiguracije.
Ako želimo da nam se OS podiže sa sistemske diskete, što je preporučljivo prilikom
iskušavanja novih kernela trebamo umetnuti disketu u floppy pogon na našem sistemu i
umjesto naredbe iz prethodnog koraka (# make bzImage) trebamo zadati naredbu
# make bzdisk

1270/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

ili
# make zdisk
Kernel će automatski biti snimljen na disketu koja će nam služiti za podizanje OS-a
(obavezno u BIOS-u podesiti boot-anje sistema sa diskete). Može se desiti da nam kompajler
javi da je kernel prevelik za floppy disk, u tom slučaju trebamo rekonfigurirati .config
datoteku i pokušati opcije koje su integrirane u kernel staviti kao module.
Već u ovoj fazi trebalo bi biti moguće podignuti OS sa novim kernelom (još nismo
napravili module pa će neke funkcionalnosti biti nedostupne), kako se to radi pogledajte u
poglavlju 6.

Izrada modula kernela

Za monolitne kernele ovaj korak možemo preskočiti. Ako prvi puta kompajliramo
module za verziju izvornog koda kernela koju smo konfigurirali dovoljno je redom upisati
naredbe (naravno iz direktorija /usr/src/linux)
# make modules
# make modules_install
U prvom koraku će biti u procesu kompajliranja izrađeni moduli, a u drugom koraku će
ti moduli biti instalirani u direktorij /lib/modules/x.x.xx gdje je umjesto x oznake verzije
kernela, npr. u našem slučaju će se moduli iskopirati u direktorij /lib/modles/2.4.27. U
navedenom direktoriju moduli će biti organizirani prema funkcionalnosti u poddirektorije.
Osim navedenih direktorija tu se nalazi i simbolički link build na direktorij u kojem se nalzi
naš izvorni kod kernela.
Upravo direktorij /lib/modules/x.x.xx pravi probleme prilikom ponovnog kompajliranja
iste verzije kernela jer se novi moduli pokušavaju prepisati preko starih.
Jedan načina je da prije izdavanja naredbe # make modules_install preimenujemo
direkotrij /lib/modules/x.x.xx u npr. /lib/modules/x.x.xx-old sa naredbom mv.
# mv /lib/modules/2.4.27 /lib/modules/2.4.27-old
Nakon instalacije i testiranja kernela kad se uvjerimo da je sve u redu taj direktorij
možemo obrisati (kao i prethodnu verzija kernela). Kod ovog načina može se pojaviti problem
da nam upravo prilikom kompajliranja OS zatraži neki modul koji se sada nalazi u
preimenovanom direktoriju i zbog toga nije dostupan.

1271/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

Drugi način rješava ovaj problem. Ovdje ćemo se poslužiti malim trikom, uvijek
trebamo na računalu imati drugačiju verziju kernela od postojeće sa kojom ćemo podignuti
OS (naravno i za taj kernel moraju postojati pripadajući moduli u direktoriju
/lib/etc/modules/y.y.yy, y su oznake drugačije 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 također možemo 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 (inače u ovom direktoriju su uvijek
smješteni kerneli). Datoteku bzImage pri tom treba preimenovati u vmlinuz-x.x.xx, gdje je sa x
označena pripadajuća verzija kernela. U našem slučaju datoteka kernela treba imati oblik
vmlinuz-2.4.27. Na tu datoteku trebamo napraviti simbolički 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 također ih treba preimenovati u oblik System.map-x.x.xx i config-x.x.xx, u našem
slučaju u System.map-2.4.27 i config-2.4.27. Ako u diretkoriju /boot imamo simbolički link
config trebamo ga preusmjeriti na našu config-... datoteku, kao i System.map koji trebamo
preusmjeriti na našu System.map-... datoteku.

1272/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

POKRETANJE OPERATIVNOG SUSTAVA SA NOVIM


KERNELOM

Učitavanje kernela u radnu memoriju radimo pomoću dodatnih programa prilikom boot-
anja sistema, ovdje će biti opisana konfiguracija dva najpopularnija te namjene,a jedan od njih
je vjerovatno već došao sa instalacijom OS-a.

Podešavanje progaram lilo za učitavanje kerenla

Program lilo (Linux loader) je smješten na nekom od boot sektora hard diska (najčešće
na Master Boot Record-u (MBR). Konfiguracijska datoteka za lilo je lilo.conf i nalazi se u
direktoriju /etc. Primjer datoteke lilo.conf:

# /etc/lilo.conf
boot=/dev/hda # Program za učitavanje (lilo) se instalira u MBR
root=/dev/hda2 # Osnovan particija gdje se nalazi naš Linux OS
install=/boot/boot-menu.b # Prikazuje izbornik za odabir kernela
default=linux # Defaultni kernel ako nismo ništa izabrali
map=/boot/map
delay=20 # Vrijeme odabira sistema, u ovom slučaju 2 sekunde
image=/vmlinuz # Kernel (u našem slučaju link na kernel)
label=linux # Ovo će biti ispisano u izborniku za izbor kernela vmlinuz
read-only

image=/vmlinuz.old # Link na stari kernel


label=linux-old
read-only

Sve parametre iza znaka jednakosti možemo izmjeniti sukladno našim potrebama. Prilikom
bilo kakvih izmjena u toj datoteci ili promjena linkova na kernele moramo zadati naredbu
# lilo –v

1273/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

da bi promjene bile ažurirane. Ako smo napravili neku grešku prilikm izmjena lilo.conf
datoeke bit će nam prijavljeno prilikom izvšenja ove naredbe. Svaki put kad izvršimo # lilo –v
parametri se nanovo upisuju u MBR, što baš nije poželjno. Grub to rješava na elegantniji
način.

Podešavanje programa grub za učitavanje kernela

Grub je program nešto mlađe generacije, također je kao i lilo smješten na boot sektor
hard diska, ali ne zahtjeva ažurianje boot sektora prilikom izmjena konfiguracijske datoteke
ili verzije kernela. Njegova konfiguracijska datoteka je /etc/grub.conf, čiji primjer možemo
vidjeti ovjde:

# /etc/grub.conf
default=0
timeout=10 # Vrijeme odabira sistema u sekundama
splashimage=(hd0,0) /boot/grub/splash.xpm.gz # Prikaz uvodnog ekrana iz Splash.xpm.gz

title Linux # Ovo će biti ispisano u izborniku za izbor kerenla vmlinuz


root(hd0,2) # Particija gdje se nalazi naš Linux OS
kernel /vmlinuz ro root=/dev/hda2 # Mjesto odakle se učitava jezgra

title Linux-old
root(hd0,2)
kernel /vmlinux.old ro root=/dev/hda2

Grub označava particije i diskove na drugačiji način od Linux-a, prvi parametar u


zagradama je redni broj diska, a drugi parametar je redni broj particjie na pripadjućem 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 ažuriranje.

1274/1275
Sveučilište u Splitu Programski alati na Unix računalima
Stručni studij Računarstva – Zagreb Kompajliranje kernela

ZAKLJUČAK

Kao što se vidi, proces kompajliranja kernela je dosta složen, mada je ovdje obuhvaćen
samo mali broj mogućnosti suvremenih kernela na Linux-u. Vjerovatno će prvi pokušaji biti
bezuspješni i zadati će mnogo glavobolje, no nemojte odustati. Kada uspijete nekoliko puta
uspješno proći navedeni proces i malo bolje istražite područje, vidjet ćete koliko prednosti i
mogućnosti pruža free software. Činjenica da u rukama imate oko 250 MB source-a i da ga
možete prilagoditi svojim potrebama povlači za sobom pitanje gdje je svemu tome kraj.
Upravo se zbog te činjenice Linux danas vrti na uređajima kao što su mobilni telefoni,
priručna računala, komunikacijski sateliti, NASA-ina računala. Ako se malo potrudite već
danas možete stavit novi kernel na računalo koje ima jedan, dva ili možda čak 255 procesora.

1275/1275

You might also like