gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
inicijalna verzija 12d
[os2skripta.git] / skripta-os2.tex
1 % skripta-os2.tex
2 % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS
3 % 2011/2012
5 \documentclass[a4paper,twoside]{article}
6 \usepackage[T1]{fontenc}
7 \usepackage[utf8]{inputenc}%definišemo da je ulaz utf-8 fajl
9 % osnovne informacije koje ce se prikazati na naslovnoj strani,
10 % kao i u informacijama u generisanom pdfu
11 \newcommand{\autor}{Doni Pracner, Ivan Pribela}
12 \newcommand{\inst}{Departman za matematiku i informatiku, PMF, UNS}
13 \newcommand{\autorinst}{\autor \\ \inst}
14 \newcommand{\naslov}{Skripta za vežbe iz predmeta operativni sistemi 2}
15 \newcommand{\datum}{April 2012, Novi Sad}
16 \newcommand{\verzija}{ver 12d}
18 \usepackage[serbian]{babel}
19 \usepackage{fancyhdr}
20 \pagestyle{fancy}
22 \title{\naslov \ -- \verzija}
23 \author{\autor \\ \inst}
24 \date{\datum}
26 %change the default font
27 \usepackage{lmodern}
28 \renewcommand{\familydefault}{\sfdefault}
30 \usepackage{pifont}
31 \usepackage{keystroke}
33 %podesavanja outputa za pdf verzije
34 \usepackage[bookmarks,pdffitwindow=false,unicode=true,%
35 pdftitle={\naslov \ -- \verzija},%
36 pdfauthor={\autor}%
37 ]{hyperref}
39 \usepackage{graphicx}
40 \usepackage{listings}
41 \usepackage{amsthm}
42 \usepackage{amsmath}
43 \usepackage{latexsym}
44 \usepackage{multicol}
46 \usepackage{tikz}
48 %margine
49 %experiment
50 %\usepackage[top=2.5cm, bottom=1.5cm, left=2cm, right=1cm]{geometry}
51 %staro:
52 \usepackage[top=1.5cm, bottom=1cm, left=2cm, right=1cm]{geometry}
54 \begin{document}
56 %customize the itemize environments
58 \let\olditemize=\itemize
59 \def\itemize{
60 \olditemize
61 \setlength{\itemsep}{1pt}
62 \setlength{\parskip}{0pt}
63 \setlength{\parsep}{0pt}
64 \setlength{\topsep}{-1cm}
66 }
68 %% ovi redovi daju header i footer
70 \renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
71 \fancyhf{} % delete current setting for header and footer
72 %\fancyfoot[C]{\thepage}
73 \fancyhead[LO]{\bfseries\rightmark}
74 \fancyhead[RO]{\thepage}
75 \fancyhead[RE]{Operativni sistemi 2 -- skripta}
76 \fancyhead[LE]{\thepage}
77 \renewcommand{\headrulewidth}{0.5pt}
78 \renewcommand{\headwidth}{\textwidth}
79 %\renewcommand{\footrulewidth}{0.5pt}
80 %\addtolength{\headheight}{0.5pt} % make space for the rule
81 \fancypagestyle{plain}{%
82 \fancyhead{} % get rid of headers on plain pages
83 \fancyfoot{}
84 \renewcommand{\headrulewidth}{0pt} % and the line
85 \renewcommand{\footrulewidth}{0pt} % and the line
86 }
87 \renewcommand{\headheight}{15pt}
89 %promene u marginama:
90 %\setlength{\marginparwidth}{32pt}
91 %\setlength{\textwidth}{620pt}
92 %\setlength{\textheight}{620pt}
95 %% specijalni blokovi koji služe kao podsetnici u radu ili napomene
96 \newcommand{\skica}[1]{
97 \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small** \textit{#1} }}
98 \newline }
99 }
101 \newcommand{\skicas}[1]{
102 \framebox{* \textit{#1} *}
105 %boldovane skice visokog prioriteta
106 \newcommand{\skicab}[1]{
107 \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small***
108 \textbf{#1} }} \newline } }
110 \newcommand{\kod}[1]{{\small\texttt{#1}}}
112 % ako je sledeci red odkomentarisan nista od skica nece biti ispisano
113 % u finalni dokument
115 \renewcommand{\skica}[1]{}
118 \maketitle
120 % theorems, definition etc.
121 %''''''''''''''''''''''''''
123 \theoremstyle{definition}
124 \newtheorem{def1}{Definicija}
125 \theoremstyle{plain}
126 \newtheorem{theo}{Teorema}
127 \newtheorem{lema}{Lema}
129 \lstloadlanguages{Modula-2,C++}
131 \lstset{
132 basicstyle=\footnotesize\ttfamily,
133 showstringspaces=false,
134 breaklines=true
137 \lstdefinestyle{codeblock}{
138 basicstyle=\footnotesize,
139 keywordstyle=\textbf,
140 columns=[l]fixed,
141 breakatwhitespace=true,
142 % prebreak=\P,
143 % postbreak=\ding{229}\space,
144 language=Modula-2,
145 xleftmargin=4em
148 \lstdefinestyle{terminal}{
149 frame=l,
150 % frameround=fftt,
151 xleftmargin=4em
154 \lstdefinestyle{numcodeblock}{
155 style=codeblock,
156 numbers=left,
157 firstnumber=1,
158 stepnumber=1
161 \lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{}
162 \lstnewenvironment{terminal}{\lstset{style=terminal}}{}
164 % ----------------==================--------------------------------------
165 % Pravi pocetak rada
168 Programi u ovoj skripti su testirani sa kompajlerom ``GNU Modula 2'' (u
169 daljem tekstu često skraćeno na \emph{gm2}), pod operativnim
170 sistemima iz Debian porodice.
172 \tableofcontents
174 %\newpage %necemo jos da prelamamo ovde
176 %\begin{multicols}{2}
178 \section{GNU Modula 2}
180 \subsection{Prvi program u gm2 }
181 \label{g-prvi-program}
183 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
184 \begin{codeblock}
185 MODULE hello;
187 FROM StrIO IMPORT WriteString, WriteLn;
189 BEGIN
190 WriteString('hello world');
191 WriteLn
192 END hello.
193 \end{codeblock}
195 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
196 XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok ovde
197 koristimo \kod{StrIO} za rad sa stringovima, \kod{NumberIO}, za rad sa
198 brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se
199 korišćenje zvanične stranice:
200 \url{http://nongnu.org/gm2/libraries.html}, odnosno
201 \url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne
202 biblioteke.
204 Predpostavimo da smo ga napravili u trenutnom direktorijumu, koristeći
205 neki tesktualni editor (u dodatku~\ref{app-joe} je opisan ``joe'' koji
206 koristimo na vežbama). Kreirani fajl se može prevesti u izvršnu
207 verziju sledećom komandom:
208 \begin{terminal}
209 gm2 hello.mod
210 \end{terminal}
212 Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se
213 napraviti fajl \kod{a.out}, koji se može pokrenuti sa \kod{./a.out},
214 pri čemu naglašavamo da hoćemo da pokrenemo program iz trenutnog
215 direktorijuma koji se označava tačkom. Ako želimo da napravimo
216 izvršni fajl pod nekim drugim nazivom možemo koristiti poziv sledećeg
217 tipa:
218 \begin{terminal}
219 gm2 -o imeIzlaznogFajla ulaznifajl
220 \end{terminal}
222 Za dalje opcije kompajlera konsultovati \kod{gm2 -{}-help} i zvaničnu
223 stranicu kompajlera.
224 %ovde je trebalo -{}- da razdvoji dva minusa, jer se inače tumače kao jedan.
226 \subsection{Korišćenje sistemskih poziva}
228 Mapiranje procedura na sistemske pozive se može izvršiti preko
229 specijalnog definicionog modula koji u zaglavlju sadrži ključne reči
230 \kod{FOR "{}C"} u kome se navode imena procedura koja se poklapaju sa
231 imenima sistemskih poziva i imaju parametre i povratne vrednosti
232 odgovarajućih tipova. Na primer, mapirajmo poziv \kod{system}, koji
233 izvršava prosleđenu komandu u novom \emph{shell}-u. Specifikaciju
234 komande možemo videti sa
235 \begin{terminal}
236 man system
237 \end{terminal}
239 odnosno videćemo da je poziv definisan na sledeći način:
240 \begin{codeblock}
241 int system(const char *command);
242 \end{codeblock}
243 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
244 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
245 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
246 sastoji od svih sledećih znakova u memoriji dokle god se ne naiđe na
247 0C. Srećom, sve ovo se automatski mapira kreiranjem sledećeg modula:
249 \begin{codeblock}
250 DEFINITION MODULE FOR "C" Lib;
252 EXPORT UNQUALIFIED system;
254 PROCEDURE system(command: ARRAY OF CHAR): INTEGER;
256 END Lib.
257 \end{codeblock}
259 Nije potrebno praviti prazne implementacione module. Iz ovakvog modula
260 se mogu uvoziti i koristiti procedure kao i iz bilo kakvog
261 ``normalnog'' modula, kao što se može videti u sledećem primeru, koju
262 od korisnika učitava stringove i pokušava da ih izvrši kao da su uneti
263 u komandnoj liniji, dokle god korisnik ne unese reč ``kraj'':
264 \begin{codeblock}
265 MODULE Zad2;
267 FROM StrIO IMPORT
268 ReadString, WriteString, WriteLn;
269 FROM StrLib IMPORT
270 StrEqual;
271 FROM Lib IMPORT
272 system;
274 TYPE
275 String = ARRAY [0..1023] OF CHAR;
277 VAR
278 Komanda: String;
280 PROCEDURE Izvrsi(Komanda: ARRAY OF CHAR);
281 VAR
282 c: INTEGER;
283 BEGIN
284 c:= system(Komanda);
285 END Izvrsi;
287 BEGIN
288 WriteString("?> "); ReadString(Komanda);
289 WHILE NOT StrEqual(Komanda, "kraj") DO
290 Izvrsi(Komanda);
291 WriteString("?> "); ReadString(Komanda);
292 END;
293 END Zad2.
294 \end{codeblock}
296 Prilikom mapiranja sistemskih poziva je moguće koristiti ``...'' na
297 kraju liste argumenata da se označi da je moguće proslediti
298 proizvoljan broj argumenata nakon navedenih, koji će biti premapirani
299 na odgovarajuće tipove podataka. Takođe je moguće i označiti da se
300 povratna vrednost procedure ne mora koristiti. U gornjem primeru je
301 mogla funkcija da se definiše kao \kod{PROCEDURE system(command: ARRAY
302 OF CHAR): [INTEGER];} i tada bi mogla se poziva kao obična procedura
303 bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna
304 vrednost.
306 Tabela pretvaranja tipova se može videti na
307 \url{http://www.nongnu.org/gm2/interface_to_c.html}
309 \subsubsection{Primer: Izlistavanje sadržaja direktorijuma}
311 Korišćenje sistemskih poziva se može ilustrovati primerom čitanja
312 sadržaja direktorijuma, komandama \kod{opendir}, \kod{readdir} i
313 \kod{closedir}. Prva komanda otvara prosledjenu putanju i vraća
314 pokazivač na otvoreni direktorijum. Komanda \kod{readdir} prima ovakav
315 pokazivač kao ulazni parametar, a vraća pokazivač na slog koji
316 predstavlja sledeću stavku u otvorenom direktorijumu ili \kod{NIL} ako
317 više nema ničega. Poslednja komanda, \kod{closedir}, se izvodi na
318 kraju i zatvara otvoreni direktorijum. Bitno je zatvarati otvorene
319 resurse jer je moguće da sistem odbije da otvori novi ako ih
320 proces već ima previše otvorenih.
322 Kada imamo imena stavki iz direktorijuma o njima možemo dobiti više
323 informacija \kod{stat}. Ona prima dva argumenta, prvi je \emph{puna}
324 putanja do fajla, a drugi je pokazivač na strukturu u koju će komanda
325 upisati podatke. Obratiti pažnju da zbog ovoga struktura već mora
326 postojati u memoriji, ili kao lokalna promenljiva odgovarajućeg
327 slogovnog tipa, ili dinamički alocirana korišćenjem pokazivača na nju.
329 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
330 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
331 sistema, a naročito utiče da li je u pitanju~32--bitni, ili~64--bitni
332 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
333 Prva je testirana na Lubuntu 11.10 32bit, a druga je testirana na
334 Kubuntu 11.10 64bit.
336 \begin{codeblock}
337 DEFINITION MODULE FOR "C" Lib32;
338 FROM SYSTEM IMPORT
339 ADDRESS, BYTE;
340 EXPORT UNQUALIFIED opendir, readdir, closedir, stat,
341 PDir, DirEnt, PDirEnt, Stat, PStat, PInt;
342 \end{codeblock}
343 \begin{minipage}{0.5\textwidth}
344 \begin{codeblock}
345 (* types for 32 bit *)
346 TYPE
347 PDir = ADDRESS;
348 DirEnt = RECORD
349 ino: INTEGER;
350 off: INTEGER;
351 reclen: SHORTCARD;
352 type: BYTE;
353 name: ARRAY [0..255] OF CHAR;
354 END;
355 PDirEnt = POINTER TO DirEnt;
356 Stat = RECORD
357 dev: LONGINT;
358 ino: LONGINT;
359 mode: INTEGER;
360 nlink: LONGINT;
361 uid: INTEGER;
362 gid: INTEGER;
363 pad1: LONGINT;
364 rdev: INTEGER;
365 size: INTEGER;
366 blksize: INTEGER;
367 blocks: INTEGER;
368 atime: LONGINT;
369 mtime: LONGINT;
370 ctime: LONGINT;
371 END;
372 \end{codeblock}
373 \end{minipage}
374 \begin{minipage}{0.45\textwidth}
375 \begin{codeblock}[frame=single,frameround=tttt]
376 (* types for 64 bit *)
377 TYPE
378 PDir = ADDRESS;
379 DirEnt = RECORD
380 ino: LONGINT;
381 off: LONGINT;
382 reclen: SHORTCARD;
383 type: BYTE;
384 name: ARRAY [0..255] OF CHAR;
385 END;
386 PDirEnt = POINTER TO DirEnt;
387 Stat = RECORD
388 dev: LONGINT;
389 ino: LONGINT;
390 nlink: LONGINT;
391 mode: INTEGER;
392 uid: INTEGER;
393 gid: INTEGER;
394 pad1: INTEGER;
395 rdev: LONGINT;
396 size: LONGINT;
397 blksize: LONGINT;
398 blocks: LONGINT;
399 atime: LONGINT;
400 mtime: LONGINT;
401 ctime: LONGINT;
402 END;
403 \end{codeblock}
404 \end{minipage}
405 \begin{codeblock}
406 PStat = POINTER TO Stat;
407 PInt = POINTER TO INTEGER;
409 PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
410 PROCEDURE readdir(dirp: PDir): PDirEnt;
411 PROCEDURE closedir(dirp: PDir): [INTEGER];
412 PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
413 END Lib32.
414 \end{codeblock}
416 \begin{codeblock}
417 MODULE Zad5;
419 FROM SYSTEM IMPORT
420 ADR;
421 FROM StrIO IMPORT
422 WriteString, WriteLn;
423 FROM NumberIO IMPORT
424 WriteInt;
425 FROM StrLib IMPORT
426 StrLen, StrConCat;
427 FROM Args IMPORT
428 Narg, GetArg;
429 FROM Lib32 IMPORT
430 opendir, readdir, closedir, stat, PDir, PDirEnt, Stat;
431 FROM errno IMPORT
432 geterrno;
434 TYPE
435 String = ARRAY [0..1023] OF CHAR;
437 VAR
438 Putanja: String;
439 n, i: INTEGER;
440 ok: BOOLEAN;
442 PROCEDURE Listaj(Ime: ARRAY OF CHAR);
443 VAR
444 dir: PDir;
445 entry: PDirEnt;
446 info: Stat;
447 c: INTEGER;
448 Len: CARDINAL;
449 Putanja: String;
450 BEGIN
451 dir:= opendir(Ime);
452 IF dir = NIL THEN
453 WriteString("Folder "); WriteString(Ime); WriteLn;
454 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
455 WriteString(" Ne mogu da otvorim direktorijum."); WriteLn();
456 ELSE
457 Len:= StrLen(Ime);
458 IF Ime[Len - 1] # "/" THEN
459 StrConCat(Ime, "/", Ime);
460 END;
461 WriteString("Folder "); WriteString(Ime); WriteLn;
462 entry:= readdir(dir);
463 WHILE entry # NIL DO
464 IF entry^.name[0] # "." THEN
465 StrConCat(Ime, entry^.name, Putanja);
466 c:= stat(Putanja, ADR(info));
467 WriteString(" ");
468 IF c = -1 THEN
469 WriteString("? ? KB");
470 ELSE
471 WriteInt(info.nlink, 3);
472 WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB ");
473 END;
474 WriteString(" "); WriteString(entry^.name); WriteLn;
475 END;
476 entry:= readdir(dir);
477 END;
478 c:= closedir(dir);
479 IF c = -1 THEN
480 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
481 WriteString(" Ne mogu da zatvorim direktorijum."); WriteLn();
482 END;
483 END;
484 END Listaj;
486 BEGIN
487 n:= Narg();
488 FOR i:= 1 TO n - 1 DO
489 ok:= GetArg(Putanja, i);
490 WriteLn;
491 Listaj(Putanja);
492 END;
493 WriteLn;
494 END Zad5.
495 \end{codeblock}
497 \subsection{Stvaranje novih procesa}
499 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
500 (``račva''). Novi proces je identičan sa originalnim, osim u svom
501 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
502 \begin{codeblock}
503 PROCEDURE fork(): INTEGER;
504 \end{codeblock}
506 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
507 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
508 \kod{fork}, ukoliko je u pitanju originalni proces (``roditelj'') tada
509 je ta vrednost jednaka proces identifikatoru (\emph{pid}-u)
510 ``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom
511 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
512 da dete i roditelj rade različite stvari, to se obično rešava kodom
513 sledećeg oblika:
514 \begin{codeblock}
515 pid := fork();
516 IF pid = 0 THEN
517 (* "detetove" operacije *)
518 ELSE
519 (* "roditeljske" operacije *)
520 END;
521 \end{codeblock}
523 Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u
524 originalnom procesu sa efektom da se proces uspava dokle god neki od
525 procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se
526 može postići komandom \kod{waitpid} u kojoj možemo precizirati tačno
527 koji proces čekamo da se završi.
529 U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera
530 organizacije procesa.
532 \skica{treba nam propratni tekst za ovo sto sledi}
534 \subsubsection{Lanac procesa}
536 \begin{minipage}{0.6\textwidth}
537 \begin{codeblock}
538 pid := 0;
539 i := 1;
540 WHILE (pid = 0) AND (i < n) DO
541 pid := fork();
542 IF pid # 0 THEN
543 (* ... *)
544 ELSE
545 INC(i);
546 END;
547 END;
548 \end{codeblock}
549 \end{minipage}
550 \begin{minipage}{0.4\textwidth}
551 \begin{tikzpicture}
552 [proc/.style={circle,draw}]
553 \def \n {5}
554 \foreach \s in {1,...,\n}
556 \node[proc] (\s) at (\s,-\s/2) {\s};
558 \foreach \s in {2,...,\n} {
559 \pgfmathparse{int(\s-1)}
560 \draw [<-] (\s) to (\pgfmathresult);
562 \end{tikzpicture}
563 \end{minipage}
565 \subsubsection{Roditelj sa puno dece}
567 \begin{minipage}{0.6\textwidth}
568 \begin{codeblock}
569 pid := -1;
570 j := 0;
571 WHILE (pid # 0) AND (j < m) DO
572 pid := fork();
573 IF pid # 0 THEN
574 INC(j);
575 ELSE
576 (* ... *)
577 END;
578 END;
579 \end{codeblock}
580 \end{minipage}
581 \begin{minipage}{0.4\textwidth}
582 \begin{tikzpicture}
583 [proc/.style={circle,draw}]
584 \def \n {5}
585 \node[proc] (1) at (0,0) {1};
586 \foreach \s in {2,...,\n}
588 \node[proc] (\s) at (-3.5+\s,-2) {\s};
590 \foreach \s in {2,...,\n} {
591 \draw [->] (1) to (\s);
593 \end{tikzpicture}
594 \end{minipage}
596 \subsubsection{Stablo procesa}
598 \begin{minipage}{0.6\textwidth}
599 \begin{codeblock}
600 i := 1;
601 j := 0;
602 WHILE (i < n) AND (j < m) DO
603 pid := fork();
604 IF pid # 0 THEN
605 INC(j);
606 ELSE
607 INC(i);
608 j:=0;
609 END;
610 END;
611 \end{codeblock}
612 \end{minipage}
613 \begin{minipage}{0.4\textwidth}
614 \begin{tikzpicture}
615 [proc/.style={circle,draw},
616 level 1/.style={sibling distance=20mm,level distance=10mm},
617 level 2/.style={sibling distance=10mm,font=\scriptsize}
619 \node[proc] (root) {0}
620 child[->] foreach \x in {1,2} {node[proc] {\x}
621 child foreach \y in {1,2} {node[proc] {\x-\y}
622 }};
624 \end{tikzpicture}
625 \end{minipage}
628 % ----------------------------------------------
630 \newpage
631 \pagenumbering{Roman}
632 \appendix
634 \section{Instalacija kompajlera GNU Modula 2}
635 \label{app-instalacija-gm2}
637 Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na
638 već postojeći GNU Linux operativni sistem iz Debian porodice, koja
639 uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i
640 mnoge druge. Kompajler je moguće bez većih problema instalirati i na
641 bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog
642 koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom
643 \url{http://www.nongnu.org/gm2/obtaining.html}.
645 Ovo uputstvo neće ulaziti u detalje kako instalirati operativni
646 sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno
647 instaliraju drugi operativni sistem, preporučujemo korišćenje
648 virtuelne mašine (npr besplatni Virtual Box,
649 \url{http://virtualbox.org}) i instaliranje sistema na nju, ili još
650 lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr
651 Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što
652 je Lubuntu, ako su performanse problematične.
654 \subsection{Instalacija na Debian platformi}
656 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
657 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
658 menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem
659 \begin{codeblock}
661 # GNU Modula-2 repo
664 deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main
665 deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main
666 \end{codeblock}
668 Alternativno se mogu koristiti sledeće komande:
670 \begin{terminal}
671 add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
672 add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
673 \end{terminal}
675 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
676 alata.
678 Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi
679 sledeće:
680 \begin{terminal}
681 sudo apt-get update
682 sudo apt-get install gm2-doc gm2
683 \end{terminal}
685 Po želji se može skinuti i izvorni kod kompajlera sledećom komandom:
686 \begin{terminal}
687 sudo apt-get source gm2
688 \end{terminal}
690 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa.
692 \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi}
694 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
695 prijave nedostajuće fajlove \kod{crti.o, crt1.o} i/ili
696 \kod{crtn.o}. Konkretno je poznato za gcc verziju 4.6 na debianu,
697 pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i
698 na neke druge sisteme.
700 Greška se ispravlja na sledeći način (korisnik treba da
701 ima administrativna prava, zato se radi ``sudo'') ukoliko
702 je u pitanju 64-bitni sistem:
703 \begin{terminal}
704 sudo su
705 cd /usr/lib
706 ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o
707 ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o
708 ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o
709 exit
710 \end{terminal}
712 Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama
713 treba zameniti ``x86\_64'' sa ``i386''.
715 \skica{možda i build from source}
717 \section{Tekst editor Joe}
718 \label{app-joe}
720 Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje
721 rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada
722 (korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može
723 koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na
724 skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim
725 sistemima se ovo može uraditi sa:
726 \begin{terminal}
727 sudo apt-get install joe
728 \end{terminal}
729 Ili analogno na drugim sistemima za instaliranje softvera.
731 Otvoranje postojećeg fajla ``hello.mod'' za uređivanje,
732 odnosno otvaranje novog praznog fajla u koji ćemo unositi
733 odgovarajući kod ili tekst se može postići sledećom komandom:
734 \begin{terminal}
735 joe hello.mod
736 \end{terminal}
738 Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
739 +\keystroke{K}\keystroke{X} (\emph{ctrl} i \emph{K} odjednom, pa onda
740 \emph{X}, ova šema pritiskanja tastera važi za sve prečice), dok se
741 samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba
742 slučaja joe pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
743 vrednost ponudi trenutno ime. Brz izlaz iz editora je moguć i sa
744 \Ctrl+\keystroke{C} (što je i standardna komanda za ``ubijanje''
745 trenutnog procesa u terminalu), pri čemu će joe pitati da li želimo da
746 izađemo ako postoje promene koje nisu snimljene.
748 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
749 kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak
750 komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći
751 kroz koje se može kretati sa \Esc \keystroke{.} i \Esc \keystroke{,}.
753 U okviru pomoći stoje i komande za označavanje blokova teksta i
754 njihovo nakndadno premeštanje, kopiranje ili brisanje. Pritiskom na
755 \Ctrl+\keystroke{\_} se vraća poslednja promena (undo).
757 Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se
758 može odabrati više opcija za rad, kao što su margine, automatsko
759 prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}),
760 sintaksno bojenje itd.
762 \skica{joe i sintaksno bojenje za m2}
764 \section{Putty}
766 \emph{Putty} je program koji služi da se pod Windows operativnim
767 sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX
768 serveru. Može se naći online na
769 \url{http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html}.
771 Po pokretanju se prikazuje dijalog u kome se može ukucati adresa
772 udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta
773 samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je
774 uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
775 lozinke.
777 \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se}
779 Putty se može dovesti u stanje da ne prikazuje ispis unosa na ekranu,
780 pritiskom na \Ctrl+\keystroke{S} (što je često velik problem jer se
781 poklapa sa standardnom prečicom za snimanje u većini grafičkih
782 aplikacija). Iz ovog režima rada se može izaći prečicom
783 \Ctrl+\keystroke{Q}.
784 Ukratko:
785 \begin{lstlisting}[xleftmargin=10em]
786 Do not press
787 Ctrl S
788 If you do
789 Ctrl Q
790 \end{lstlisting}
792 \skica{literatura i linkovi izdovjeni na kraju dokumenta}
794 %\end{multicols}
795 \end{document}
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner