gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
d4e728f79ed03472ba90d9ef342517492709c83a
[os2skripta.git] / skripta-os2.tex
1 % skripta-os2.tex
2 % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS
3 % Doni Pracner, Ivan Pribela
4 % 2011/12 -- 2012/13
6 \documentclass[a4paper,twoside]{article}
7 \usepackage[T1]{fontenc}
8 \usepackage[utf8]{inputenc}%definišemo da je ulaz utf-8 fajl
10 % osnovne informacije koje ce se prikazati na naslovnoj strani,
11 % kao i u informacijama u generisanom pdfu
12 \newcommand{\autor}{Doni Pracner, Ivan Pribela}
13 \newcommand{\inst}{Departman za matematiku i informatiku, PMF, UNS}
14 \newcommand{\autorinst}{\autor \\ \inst}
15 \newcommand{\naslov}{Skripta za vežbe iz predmeta operativni sistemi 2}
16 \newcommand{\datum}{Februar 2013, Novi Sad}
17 \newcommand{\verzija}{ver 13a}
19 \usepackage[serbian]{babel}
20 \usepackage{fancyhdr}
21 \pagestyle{fancy}
23 \title{\naslov \ -- \verzija}
24 \author{\autor \\ \inst}
25 \date{\datum}
27 %change the default font
28 \usepackage{lmodern}
29 \usepackage{beramono}
30 \renewcommand{\familydefault}{\sfdefault}
32 \usepackage{pifont}
34 %podesavanja outputa za pdf verzije
35 \usepackage[bookmarks,pdffitwindow=false,unicode=true,%
36 pdftitle={\naslov \ -- \verzija},%
37 pdfauthor={\autor}%
38 ]{hyperref}
40 \usepackage{graphicx}
41 \usepackage{listings}
42 \usepackage{amsthm}
43 \usepackage{amsmath}
44 \usepackage{latexsym}
45 \usepackage{multicol}
47 %\usepackage{keystroke}
48 % ispod je dodata alternativa za ovaj paket
50 \usepackage{tikz}
51 \usetikzlibrary{shadows}
53 \newcommand*\keystroke[1]{%
54 \tikz[baseline=(key.base)]
55 \node[%
56 draw,
57 fill=white,
58 drop shadow={shadow xshift=0.2ex,shadow yshift=-0.2ex,fill=black,opacity=0.75},
59 rectangle,
60 rounded corners=2pt,
61 inner sep=1pt,
62 line width=0.5pt,
63 font=\small\sffamily
64 ](key) {#1\strut}
65 ;
66 }
68 \newcommand*\Ctrl{\keystroke{Ctrl}}
69 \newcommand*\Tab{\keystroke{Tab}}
70 \newcommand*\Esc{\keystroke{Esc}}
72 %margine
73 \usepackage[top=1.5cm, bottom=1cm, left=2.5cm, right=2cm]{geometry}
75 \begin{document}
77 %customize the itemize environments
79 \let\olditemize=\itemize
80 \def\itemize{
81 \olditemize
82 \setlength{\itemsep}{1pt}
83 \setlength{\parskip}{0pt}
84 \setlength{\parsep}{0pt}
85 \setlength{\topsep}{-1cm}
87 }
89 %% ovi redovi daju header i footer
91 \renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
92 \fancyhf{} % delete current setting for header and footer
93 %\fancyfoot[C]{\thepage}
95 \fancyhead[LO]{\bfseries\rightmark}
96 \fancyhead[RO]{\thepage}
98 \fancyhead[RE]{Operativni sistemi 2 -- skripta}
99 \fancyhead[LE]{\thepage}
101 \renewcommand{\headrulewidth}{0.5pt}
102 \renewcommand{\headwidth}{\textwidth}
104 %\renewcommand{\footrulewidth}{0.5pt}
105 %\addtolength{\headheight}{0.5pt} % make space for the rule
106 \fancypagestyle{plain}{%
107 \fancyhead{} % get rid of headers on plain pages
108 \fancyfoot{}
109 \renewcommand{\headrulewidth}{0pt} % and the line
110 \renewcommand{\footrulewidth}{0pt} % and the line
112 \renewcommand{\headheight}{15pt}
114 %promene u marginama:
115 %\setlength{\marginparwidth}{32pt}
116 %\setlength{\textwidth}{620pt}
117 %\setlength{\textheight}{620pt}
120 %% specijalni blokovi koji služe kao podsetnici u radu ili napomene
121 \newcommand{\skica}[1]{
122 \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small** \textit{#1} }}
123 \newline }
126 \newcommand{\skicas}[1]{
127 \framebox{* \textit{#1} *}
130 %boldovane skice visokog prioriteta
131 \newcommand{\skicab}[1]{
132 \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small***
133 \textbf{#1} }} \newline } }
135 \newcommand{\kod}[1]{{\small\texttt{#1}}}
137 % ako je sledeci red odkomentarisan nista od skica nece biti ispisano
138 % u finalni dokument
140 \renewcommand{\skica}[1]{}
143 \maketitle
145 % theorems, definition etc.
146 %''''''''''''''''''''''''''
148 \theoremstyle{definition}
149 \newtheorem{def1}{Definicija}
150 \theoremstyle{plain}
151 \newtheorem{theo}{Teorema}
152 \newtheorem{lema}{Lema}
154 \lstloadlanguages{Modula-2,C++}
156 \lstset{
157 basicstyle=\ttfamily,
158 showstringspaces=false,
159 breaklines=true
162 \lstdefinestyle{codeblock}{
163 % basicstyle=\footnotesize\ttfamily,
164 keywordstyle=\textbf,
165 columns=[l]fixed,
166 breakatwhitespace=true,
167 % prebreak=\P,
168 % postbreak=\ding{229}\space,
169 language=Modula-2,
170 xleftmargin=4em
173 \lstdefinestyle{terminal}{
174 frame=l,
175 % frameround=fftt,
176 xleftmargin=4em
179 \lstdefinestyle{numcodeblock}{
180 style=codeblock,
181 numbers=left,
182 firstnumber=1,
183 stepnumber=1
186 \lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{}
187 \lstnewenvironment{terminal}{\lstset{style=terminal}}{}
189 % ----------------==================--------------------------------------
190 % Pravi pocetak rada
193 Programi u ovoj skripti su testirani sa kompajlerom ``GNU Modula 2'' (u
194 daljem tekstu često skraćeno na \emph{gm2}), pod operativnim
195 sistemima iz Debian porodice.
197 \tableofcontents
199 \newpage
201 %\begin{multicols}{2}
203 \section{GNU Modula 2}
205 \subsection{Prvi program u gm2 }
206 \label{g-prvi-program}
208 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
209 \begin{codeblock}
210 MODULE hello;
212 FROM StrIO IMPORT WriteString, WriteLn;
214 BEGIN
215 WriteString('hello world');
216 WriteLn
217 END hello.
218 \end{codeblock}
220 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
221 XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok se ovde
222 koristi \kod{StrIO} za rad sa stringovima, \kod{NumberIO} za rad sa
223 brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se
224 korišćenje zvanične stranice:
225 \url{http://nongnu.org/gm2/libraries.html}, odnosno
226 \url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne
227 biblioteke.
229 Predpostavimo da smo da je fajl napravljen u trenutnom direktorijumu,
230 koristeći neki tesktualni editor (u dodatku~\ref{app-joe} je opisan
231 ``joe'' koji se koristi na vežbama). Kreirani fajl se tada može
232 prevesti u izvršnu verziju sledećom komandom:
233 \begin{terminal}
234 gm2 hello.mod
235 \end{terminal}
237 Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se
238 napraviti fajl \kod{a.out}, koji se može pokrenuti sa:
239 \begin{terminal}
240 ./a.out
241 \end{terminal}
242 pri čemu \kod{./} naglaša da hoćemo da pokrenemo program iz trenutnog
243 direktorijuma (koji se označava tačkom). Ako je potrebno da
244 izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg
245 tipa:
246 \begin{terminal}
247 gm2 -o imeIzlaznogFajla ulaznifajl
248 \end{terminal}
250 Za dalje opcije kompajlera konsultovati \kod{gm2 -{}-help} i zvaničnu
251 stranicu kompajlera.
252 %ovde je trebalo -{}- da razdvoji dva minusa, jer se inače tumače kao jedan.
254 \subsection{Korišćenje sistemskih poziva}
256 Mapiranje procedura na sistemske pozive se može izvršiti preko
257 specijalnog definicionog modula koji u zaglavlju sadrži ključne reči
258 \kod{FOR "{}C"} u kome se navode imena procedura koja se poklapaju sa
259 imenima sistemskih poziva i imaju parametre i povratne vrednosti
260 odgovarajućih tipova. Na primer, mapirajmo poziv \kod{system}, koji
261 izvršava prosleđenu komandu u novom \emph{shell}-u. Specifikaciju
262 komande možemo videti sa
263 \begin{terminal}
264 man system
265 \end{terminal}
267 odnosno videćemo da je poziv definisan na sledeći način:
268 \begin{codeblock}
269 int system(const char *command);
270 \end{codeblock}
271 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
272 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
273 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
274 sastoji od svih sledećih znakova u memoriji dokle god se ne naiđe na
275 0C. Srećom, sve ovo se automatski mapira kreiranjem sledećeg modula:
277 \begin{codeblock}
278 DEFINITION MODULE FOR "C" Lib;
280 EXPORT UNQUALIFIED system;
282 PROCEDURE system(command: ARRAY OF CHAR): INTEGER;
284 END Lib.
285 \end{codeblock}
287 Nije potrebno praviti prazne implementacione module. Iz ovakvog modula
288 se mogu uvoziti i koristiti procedure kao i iz bilo kakvog
289 ``normalnog'' modula, kao što se može videti u sledećem primeru, koju
290 od korisnika učitava stringove i pokušava da ih izvrši kao da su uneti
291 u komandnoj liniji, dokle god korisnik ne unese reč ``kraj'':
292 \begin{codeblock}
293 MODULE Zad2;
295 FROM StrIO IMPORT
296 ReadString, WriteString, WriteLn;
297 FROM StrLib IMPORT
298 StrEqual;
299 FROM Lib IMPORT
300 system;
302 TYPE
303 String = ARRAY [0..1023] OF CHAR;
305 VAR
306 Komanda: String;
308 PROCEDURE Izvrsi(Komanda: ARRAY OF CHAR);
309 VAR
310 c: INTEGER;
311 BEGIN
312 c:= system(Komanda);
313 END Izvrsi;
315 BEGIN
316 WriteString("?> "); ReadString(Komanda);
317 WHILE NOT StrEqual(Komanda, "kraj") DO
318 Izvrsi(Komanda);
319 WriteString("?> "); ReadString(Komanda);
320 END;
321 END Zad2.
322 \end{codeblock}
324 Prilikom mapiranja sistemskih poziva je moguće koristiti ``...'' na
325 kraju liste argumenata da se označi da je moguće proslediti
326 proizvoljan broj argumenata nakon navedenih, koji će biti premapirani
327 na odgovarajuće tipove podataka. Takođe je moguće i označiti da se
328 povratna vrednost procedure ne mora koristiti. U gornjem primeru je
329 mogla funkcija da se definiše kao \kod{PROCEDURE system(command: ARRAY
330 OF CHAR): [INTEGER];} i tada bi mogla se poziva kao obična procedura
331 bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna
332 vrednost.
334 Neki primeri pretvaranja tipova su dati u Tabeli~\ref{t-pretvaranje-tipova}, preuzetoj sa \url{http://www.nongnu.org/gm2/interface_to_c.html}.
336 \begin{table}[htp]
337 \begin{center}
338 \begin{tabular}{lll}
339 Stvarni parametar & Konverzija & Tip vrednosti koji će biti prosleđen\\
340 \hline
341 123 & - & long long int\\
342 "hello world" & - & const char *\\
343 a: ARRAY OF CHAR & ADR(a) & char *\\
344 a: ARRAY [0..5] OF CHAR& ADR(a) & char *\\
345 3.14 & - & long double
346 \end{tabular}
347 \end{center}
348 \caption{Tabela pretvaranja tipova\label{t-pretvaranje-tipova}}
349 \end{table}
351 \subsubsection{Primer: Izlistavanje sadržaja direktorijuma}
353 Korišćenje sistemskih poziva se može ilustrovati primerom čitanja
354 sadržaja direktorijuma, komandama \kod{opendir}, \kod{readdir} i
355 \kod{closedir}. Prva komanda otvara prosledjenu putanju i vraća
356 pokazivač na otvoreni direktorijum. Komanda \kod{readdir} prima ovakav
357 pokazivač kao ulazni parametar, a vraća pokazivač na slog koji
358 predstavlja sledeću stavku u otvorenom direktorijumu ili \kod{NIL} ako
359 više nema ničega. Poslednja komanda, \kod{closedir}, se izvodi na
360 kraju i zatvara otvoreni direktorijum. Bitno je zatvarati otvorene
361 resurse jer je moguće da sistem odbije da otvori novi ako ih
362 proces već ima previše otvorenih.
364 Kada imamo imena stavki iz direktorijuma o njima možemo dobiti više
365 informacija \kod{stat}. Ona prima dva argumenta, prvi je \emph{puna}
366 putanja do fajla, a drugi je pokazivač na strukturu u koju će komanda
367 upisati podatke. Obratiti pažnju da zbog ovoga struktura već mora
368 postojati u memoriji, ili kao lokalna promenljiva odgovarajućeg
369 slogovnog tipa, ili dinamički alocirana korišćenjem pokazivača na nju.
371 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
372 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
373 sistema, a naročito utiče da li je u pitanju~32--bitni, ili~64--bitni
374 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
375 Prva je testirana na Lubuntu 11.10 32bit, a druga je testirana na
376 Kubuntu 11.10 64bit.
378 \begin{codeblock}
379 DEFINITION MODULE FOR "C" Lib32;
380 FROM SYSTEM IMPORT
381 ADDRESS, BYTE;
382 EXPORT UNQUALIFIED opendir, readdir, closedir, stat,
383 PDir, DirEnt, PDirEnt, Stat, PStat, PInt;
384 \end{codeblock}
385 \begin{minipage}{0.5\textwidth}
386 \begin{codeblock}
387 (* types for 32 bit *)
388 TYPE
389 PDir = ADDRESS;
390 DirEnt = RECORD
391 ino: INTEGER;
392 off: INTEGER;
393 reclen: SHORTCARD;
394 type: BYTE;
395 name: ARRAY [0..255] OF CHAR;
396 END;
397 PDirEnt = POINTER TO DirEnt;
398 Stat = RECORD
399 dev: LONGINT;
400 ino: LONGINT;
401 mode: INTEGER;
402 nlink: LONGINT;
403 uid: INTEGER;
404 gid: INTEGER;
405 pad1: LONGINT;
406 rdev: INTEGER;
407 size: INTEGER;
408 blksize: INTEGER;
409 blocks: INTEGER;
410 atime: LONGINT;
411 mtime: LONGINT;
412 ctime: LONGINT;
413 END;
414 \end{codeblock}
415 \end{minipage}
416 \begin{minipage}{0.45\textwidth}
417 \begin{codeblock}[frame=single,frameround=tttt]
418 (* types for 64 bit *)
419 TYPE
420 PDir = ADDRESS;
421 DirEnt = RECORD
422 ino: LONGINT;
423 off: LONGINT;
424 reclen: SHORTCARD;
425 type: BYTE;
426 name: ARRAY [0..255] OF CHAR;
427 END;
428 PDirEnt = POINTER TO DirEnt;
429 Stat = RECORD
430 dev: LONGINT;
431 ino: LONGINT;
432 nlink: LONGINT;
433 mode: INTEGER;
434 uid: INTEGER;
435 gid: INTEGER;
436 pad1: INTEGER;
437 rdev: LONGINT;
438 size: LONGINT;
439 blksize: LONGINT;
440 blocks: LONGINT;
441 atime: LONGINT;
442 mtime: LONGINT;
443 ctime: LONGINT;
444 END;
445 \end{codeblock}
446 \end{minipage}
447 \begin{codeblock}
448 PStat = POINTER TO Stat;
449 PInt = POINTER TO INTEGER;
451 PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
452 PROCEDURE readdir(dirp: PDir): PDirEnt;
453 PROCEDURE closedir(dirp: PDir): [INTEGER];
454 PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
455 END Lib32.
456 \end{codeblock}
458 \begin{codeblock}
459 MODULE Zad5;
461 FROM SYSTEM IMPORT
462 ADR;
463 FROM StrIO IMPORT
464 WriteString, WriteLn;
465 FROM NumberIO IMPORT
466 WriteInt;
467 FROM StrLib IMPORT
468 StrLen, StrConCat;
469 FROM Args IMPORT
470 Narg, GetArg;
471 FROM Lib32 IMPORT
472 opendir, readdir, closedir, stat, PDir, PDirEnt, Stat;
473 FROM errno IMPORT
474 geterrno;
476 TYPE
477 String = ARRAY [0..1023] OF CHAR;
479 VAR
480 Putanja: String;
481 n, i: INTEGER;
482 ok: BOOLEAN;
484 PROCEDURE Listaj(Ime: ARRAY OF CHAR);
485 VAR
486 dir: PDir;
487 entry: PDirEnt;
488 info: Stat;
489 c: INTEGER;
490 Len: CARDINAL;
491 Putanja: String;
492 BEGIN
493 dir:= opendir(Ime);
494 IF dir = NIL THEN
495 WriteString("Folder "); WriteString(Ime); WriteLn;
496 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
497 WriteString(" Ne mogu da otvorim direktorijum."); WriteLn();
498 ELSE
499 Len:= StrLen(Ime);
500 IF Ime[Len - 1] # "/" THEN
501 StrConCat(Ime, "/", Ime);
502 END;
503 WriteString("Folder "); WriteString(Ime); WriteLn;
504 entry:= readdir(dir);
505 WHILE entry # NIL DO
506 IF entry^.name[0] # "." THEN
507 StrConCat(Ime, entry^.name, Putanja);
508 c:= stat(Putanja, ADR(info));
509 WriteString(" ");
510 IF c = -1 THEN
511 WriteString("? ? KB");
512 ELSE
513 WriteInt(info.nlink, 3);
514 WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB ");
515 END;
516 WriteString(" "); WriteString(entry^.name); WriteLn;
517 END;
518 entry:= readdir(dir);
519 END;
520 c:= closedir(dir);
521 IF c = -1 THEN
522 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
523 WriteString(" Ne mogu da zatvorim direktorijum."); WriteLn();
524 END;
525 END;
526 END Listaj;
528 BEGIN
529 n:= Narg();
530 FOR i:= 1 TO n - 1 DO
531 ok:= GetArg(Putanja, i);
532 WriteLn;
533 Listaj(Putanja);
534 END;
535 WriteLn;
536 END Zad5.
537 \end{codeblock}
539 \subsection{Stvaranje novih procesa}
541 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
542 (``račva''). Novi proces je identičan sa originalnim, osim u svom
543 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
544 \begin{codeblock}
545 PROCEDURE fork(): INTEGER;
546 \end{codeblock}
548 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
549 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
550 \kod{fork}, ukoliko je u pitanju originalni proces (``roditelj'') tada
551 je ta vrednost jednaka proces identifikatoru (\emph{pid}-u)
552 ``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom
553 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
554 da dete i roditelj rade različite stvari, to se obično rešava kodom
555 sledećeg oblika:
556 \begin{codeblock}
557 pid := fork();
558 IF pid = 0 THEN
559 (* "detetove" operacije *)
560 ELSE
561 (* "roditeljske" operacije *)
562 END;
563 \end{codeblock}
565 Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u
566 originalnom procesu sa efektom da se proces uspava dokle god neki od
567 procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se
568 može postići komandom \kod{waitpid} u kojoj možemo precizirati tačno
569 koji proces čekamo da se završi.
571 U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera
572 organizacije procesa.
574 \skica{treba nam propratni tekst za ovo sto sledi}
576 \subsubsection{Lanac procesa}
578 \begin{minipage}{0.6\textwidth}
579 \begin{codeblock}
580 pid := 0;
581 i := 1;
582 WHILE (pid = 0) AND (i < n) DO
583 pid := fork();
584 IF pid # 0 THEN
585 (* ... *)
586 ELSE
587 INC(i);
588 END;
589 END;
590 \end{codeblock}
591 \end{minipage}
592 \begin{minipage}{0.4\textwidth}
593 \begin{tikzpicture}
594 [proc/.style={circle,draw}]
595 \def \n {5}
596 \foreach \s in {1,...,\n}
598 \node[proc] (\s) at (\s,-\s/2) {\s};
600 \foreach \s in {2,...,\n} {
601 \pgfmathparse{int(\s-1)}
602 \draw [<-] (\s) to (\pgfmathresult);
604 \end{tikzpicture}
605 \end{minipage}
607 \subsubsection{Roditelj sa puno dece}
609 \begin{minipage}{0.6\textwidth}
610 \begin{codeblock}
611 pid := -1;
612 j := 0;
613 WHILE (pid # 0) AND (j < m) DO
614 pid := fork();
615 IF pid # 0 THEN
616 INC(j);
617 ELSE
618 (* ... *)
619 END;
620 END;
621 \end{codeblock}
622 \end{minipage}
623 \begin{minipage}{0.4\textwidth}
624 \begin{tikzpicture}
625 [proc/.style={circle,draw}]
626 \def \n {5}
627 \node[proc] (1) at (0,0) {1};
628 \foreach \s in {2,...,\n}
630 \node[proc] (\s) at (-3.5+\s,-2) {\s};
632 \foreach \s in {2,...,\n} {
633 \draw [->] (1) to (\s);
635 \end{tikzpicture}
636 \end{minipage}
638 \subsubsection{Stablo procesa}
640 \begin{minipage}{0.6\textwidth}
641 \begin{codeblock}
642 i := 1;
643 j := 0;
644 WHILE (i < n) AND (j < m) DO
645 pid := fork();
646 IF pid # 0 THEN
647 INC(j);
648 ELSE
649 INC(i);
650 j:=0;
651 END;
652 END;
653 \end{codeblock}
654 \end{minipage}
655 \begin{minipage}{0.4\textwidth}
656 \begin{tikzpicture}
657 [proc/.style={circle,draw},
658 level 1/.style={sibling distance=20mm,level distance=10mm},
659 level 2/.style={sibling distance=10mm,font=\scriptsize}
661 \node[proc] (root) {0}
662 child[->] foreach \x in {1,2} {node[proc] {\x}
663 child foreach \y in {1,2} {node[proc] {\x-\y}
664 }};
666 \end{tikzpicture}
667 \end{minipage}
670 % ----------------------------------------------
672 \newpage
673 \pagenumbering{Roman}
674 \appendix
676 \section{Instalacija kompajlera GNU Modula 2}
677 \label{app-instalacija-gm2}
679 Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na
680 već postojeći GNU Linux operativni sistem iz Debian porodice, koja
681 uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i
682 mnoge druge. Kompajler je moguće bez većih problema instalirati i na
683 bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog
684 koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom
685 \url{http://www.nongnu.org/gm2/obtaining.html}.
687 Ovo uputstvo neće ulaziti u detalje kako instalirati operativni
688 sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno
689 instaliraju drugi operativni sistem, preporučujemo korišćenje
690 virtuelne mašine (npr besplatni Virtual Box,
691 \url{http://virtualbox.org}) i instaliranje sistema na nju, ili još
692 lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr
693 Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što
694 je Lubuntu, ako su performanse problematične.
696 \subsection{Instalacija na Debian platformi}
698 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
699 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
700 menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem
701 \begin{codeblock}
703 # GNU Modula-2 repo
706 deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main
707 deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main
708 \end{codeblock}
710 Alternativno se mogu koristiti sledeće komande:
712 \begin{terminal}
713 sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
714 sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
715 \end{terminal}
717 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
718 alata.
720 Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi
721 sledeće:
722 \begin{terminal}
723 sudo apt-get update
724 sudo apt-get install gm2-doc gm2
725 \end{terminal}
727 Po želji se može skinuti i izvorni kod kompajlera sledećom komandom:
728 \begin{terminal}
729 sudo apt-get source gm2
730 \end{terminal}
732 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa.
734 \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi}
736 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
737 prijave nedostajuće fajlove \kod{crti.o, crt1.o} i/ili
738 \kod{crtn.o}. Konkretno je poznato za gcc verziju 4.6 na debianu,
739 pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i
740 na neke druge sisteme.
742 Greška se ispravlja na sledeći način (korisnik treba da
743 ima administrativna prava, zato se radi ``sudo'') ukoliko
744 je u pitanju 64-bitni sistem:
745 \begin{terminal}
746 sudo su
747 cd /usr/lib
748 ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o
749 ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o
750 ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o
751 exit
752 \end{terminal}
754 Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama
755 treba zameniti ``x86\_64'' sa ``i386''.
757 \skica{možda i build from source}
759 \newpage
760 \section{Tekst editor Joe}
761 \label{app-joe}
763 Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje
764 rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada
765 (korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može
766 koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na
767 skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim
768 sistemima se ovo može uraditi sa:
769 \begin{terminal}
770 sudo apt-get install joe
771 \end{terminal}
772 Ili analogno na drugim sistemima za instaliranje softvera.
774 Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno
775 otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili
776 tekst se može postići sledećom komandom:
777 \begin{terminal}
778 joe hello.mod
779 \end{terminal}
781 \subsection{Sistem pomoći}
783 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
784 kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak
785 komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći
786 kroz koje se može kretati sa \Esc \keystroke{.} (tačka) i \Esc
787 \keystroke{,} (zarez).
789 U okviru pomoći postoje maltene sve komande koje editor pruža, a na
790 kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar
791 ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora.
793 \subsection{Rad sa fajlovima}
795 Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
796 +\keystroke{K}\keystroke{X} (\emph{ctrl} i \emph{K} odjednom, pa onda
797 \emph{X} -- ova šema pritiskanja tastera važi za sve prečice), dok se
798 samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba
799 slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
800 vrednost ponudi trenutno ime.
802 Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti
803 sa \Ctrl +\keystroke{K}\keystroke{E}. Na dnu editora će se pojaviti
804 polje za kucanje imena fajla koje dozvoljava i da se putanja
805 automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš
806 kao i u komandnoj liniji.
808 Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom
809 na \Esc \keystroke{V}, odnosno \Esc \keystroke{U}.
811 Zatvaranje fajla je moguće sa \Ctrl+\keystroke{C} (što je i
812 standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri
813 čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene
814 koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će
815 se i sam editor zatvoriti.
817 \subsection{Rad sa tekstom}
819 Pritiskom na \Ctrl+\keystroke{\_} se poništava poslednja promena (undo).
821 Premeštanje i kopiranje delova teksta je malo drugačije nego u
822 klasičnim grafičkim programima. Prvo je potrebno označiti željeni
823 tekst u dva koraka: \Ctrl +\keystroke{K}\keystroke{B} postavlja
824 početak bloka na trenutnu poziciju kursora, a \Ctrl
825 +\keystroke{K}\keystroke{K} postavlja kraj bloka, nakon čega će
826 selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom
827 mestu u istom ili drugom dokumentu pritisnuti \Ctrl
828 +\keystroke{K}\keystroke{C} da bi se iskopirao označeni blok, odnosno
829 \Ctrl +\keystroke{K}\keystroke{M} da bi se on premestio.
830 Komanda \Ctrl +\keystroke{K}\keystroke{Y} briše odabrani blok.
832 Pretraga dokumenta se započinje sa \Ctrl +\keystroke{K}\keystroke{F}.
834 Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se
835 može odabrati više opcija za rad, kao što su margine, automatsko
836 prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}),
837 sintaksno bojenje itd.
839 \subsection{Rad sa prozorima}
841 ``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora
842 koji omogućavaju da se vidi više dokumenata, ili čak da se vide
843 različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl
844 +\keystroke{K}\keystroke{O}. Veličina trenutnog prozora se potom može
845 povećavati (\Ctrl +\keystroke{K}\keystroke{G}) ili smanjivati (\Ctrl
846 +\keystroke{K}\keystroke{T}) na uštrb drugih prozora. Prelazak na
847 sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl
848 +\keystroke{K}\keystroke{N}, odnosno na \Ctrl
849 +\keystroke{K}\keystroke{P}. Komanda \Ctrl +\keystroke{K}\keystroke{I}
850 omogućuje da se naizmenično vide svi prozori, ili samo jedan.
852 \subsection{Problem: ``zamrzavanje'' pri snimanju} ako editor izgleda
853 kao da se zaledio verovatno je problem što je stisnuta ``klasična''
854 kombinacija za snimanje \Ctrl + \keystroke{S} koja ne radi u
855 ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat
856 se poništava pritiskom na \Ctrl + \keystroke{Q}. Za više detalja
857 pogledati Glavu~\ref{g-smrzavanje}.
859 \skica{joe i sintaksno bojenje za m2}
861 \newpage
862 \section{Putty}
864 \emph{Putty} je program koji služi da se pod Windows operativnim
865 sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX
866 serveru. Može se naći online na
867 \url{http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html}.
869 Po pokretanju se prikazuje dijalog u kome se može ukucati adresa
870 udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta
871 samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je
872 uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
873 lozinke.
875 \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se}
876 \label{g-smrzavanje}
878 Putty (kao i većina standardnih linux terminala koji koriste
879 softversku kontrolu toka podataka \emph{software flow control}) se
880 može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom
881 na \Ctrl+\keystroke{S}. Ovo je često velik problem jer se poklapa sa
882 standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se
883 može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom
884 \Ctrl+\keystroke{Q}. Ukratko:
885 \begin{lstlisting}[xleftmargin=10em]
886 Do not press
887 Ctrl S
888 If you do
889 Ctrl Q
890 \end{lstlisting}
892 Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena
893 kad su brzine protoka bile veoma male, i kada se štedelo time što bi
894 se privrmeno isključio protok kada nisu neophodne povratne
895 informacije, na primer kod komandi koje se dugo izvršavaju. Naravno
896 ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza
897 koje se plaćaju po protoku, a nekad se može i dobiti na brzini
898 izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana.
900 \skica{literatura i linkovi izdovjeni na kraju dokumenta}
902 %\end{multicols}
903 \end{document}
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner