gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
vizuelne promene za prikaz terminala
[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 -- 2013/14
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 2014, Novi Sad}
17 \newcommand{\verzija}{ver 14a}
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=2cm, bottom=2cm, 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=lt,
175 % frameround=fftt,
176 backgroundcolor=\color[gray]{.95},
177 xleftmargin=2em
180 \lstdefinestyle{numcodeblock}{
181 style=codeblock,
182 numbers=left,
183 firstnumber=1,
184 stepnumber=1
187 \lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{}
188 \lstnewenvironment{terminal}{\lstset{style=terminal}}{}
190 % ----------------==================--------------------------------------
191 % Pravi pocetak rada
194 Programi u ovoj skripti su testirani sa kompajlerom ``GNU Modula 2'' (u
195 daljem tekstu često skraćeno na \emph{gm2}), pod operativnim
196 sistemima iz Debian porodice.
198 \tableofcontents
200 \newpage
202 %\begin{multicols}{2}
204 \section{GNU Modula 2}
206 \emph{GNU Modula 2} (u daljem tekstu često skraćeno na \emph{gm2}) je
207 pred procesor (\emph{front end}) za GNU kolekciju kompajlera
208 (GCC). Podržava nekoliko dijalekata jezika ``Modula 2'' --
209 najznačajniji su ISO standard i nekoliko varijacija koje je originalni
210 autor Niklaus Virt (\emph{Niklaus Wirth}) opisao u različitima
211 verzijama knjige \emph{Programming in Modula 2 (PIM)}. Uz kompajler se
212 dobijaju i besplatne ISO, PIM i još neke biblioteke.
214 \subsection{Prvi program u gm2 }
215 \label{g-prvi-program}
217 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
218 \begin{codeblock}
219 MODULE hello;
221 FROM StrIO IMPORT WriteString, WriteLn;
223 BEGIN
224 WriteString('hello world');
225 WriteLn
226 END hello.
227 \end{codeblock}
229 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
230 XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok se ovde
231 koristi \kod{StrIO} za rad sa stringovima, \kod{NumberIO} za rad sa
232 brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se
233 korišćenje zvanične stranice:
234 \url{http://nongnu.org/gm2/libraries.html}, odnosno
235 \url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne
236 biblioteke.
238 Predpostavimo da smo da je fajl napravljen u trenutnom direktorijumu,
239 koristeći neki tesktualni editor (u dodatku~\ref{app-joe} je opisan
240 ``joe'' koji se koristi na vežbama). Kreirani fajl se tada može
241 prevesti u izvršnu verziju sledećom komandom:
242 \begin{terminal}
243 gm2 hello.mod
244 \end{terminal}
246 Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se
247 napraviti fajl \kod{a.out}, koji se može pokrenuti sa:
248 \begin{terminal}
249 ./a.out
250 \end{terminal}
251 pri čemu \kod{./} naglaša da hoćemo da pokrenemo program iz trenutnog
252 direktorijuma (koji se označava tačkom). Ako je potrebno da
253 izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg
254 tipa:
255 \begin{terminal}
256 gm2 -o imeIzlaznogFajla ulaznifajl
257 \end{terminal}
259 Za dalje opcije kompajlera konsultovati \kod{gm2 -{}-help} i zvaničnu
260 stranicu kompajlera.
261 %ovde je trebalo -{}- da razdvoji dva minusa, jer se inače tumače kao jedan.
263 \subsection{Korišćenje sistemskih poziva}
265 Mapiranje procedura na sistemske pozive se može izvršiti preko
266 specijalnog definicionog modula koji u zaglavlju sadrži ključne reči
267 \kod{FOR "{}C"} u kome se navode imena procedura koja se poklapaju sa
268 imenima sistemskih poziva i imaju parametre i povratne vrednosti
269 odgovarajućih tipova. Na primer, mapirajmo poziv \kod{system}, koji
270 izvršava prosleđenu komandu u novom \emph{shell}-u. Specifikaciju
271 komande možemo videti sa
272 \begin{terminal}
273 man system
274 \end{terminal}
276 odnosno videćemo da je poziv definisan na sledeći način:
277 \begin{codeblock}
278 int system(const char *command);
279 \end{codeblock}
280 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
281 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
282 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
283 sastoji od svih sledećih znakova u memoriji dokle god se ne naiđe na
284 0C. Srećom, sve ovo se automatski mapira kreiranjem sledećeg modula:
286 \begin{codeblock}
287 DEFINITION MODULE FOR "C" Lib;
289 EXPORT UNQUALIFIED system;
291 PROCEDURE system(command: ARRAY OF CHAR): INTEGER;
293 END Lib.
294 \end{codeblock}
296 Nije potrebno praviti prazne implementacione module. Iz ovakvog modula
297 se mogu uvoziti i koristiti procedure kao i iz bilo kakvog
298 ``normalnog'' modula, kao što se može videti u sledećem primeru, koju
299 od korisnika učitava stringove i pokušava da ih izvrši kao da su uneti
300 u komandnoj liniji, dokle god korisnik ne unese reč ``kraj'':
301 \begin{codeblock}
302 MODULE Zad2;
304 FROM StrIO IMPORT
305 ReadString, WriteString, WriteLn;
306 FROM StrLib IMPORT
307 StrEqual;
308 FROM Lib IMPORT
309 system;
311 TYPE
312 String = ARRAY [0..1023] OF CHAR;
314 VAR
315 Komanda: String;
317 PROCEDURE Izvrsi(Komanda: ARRAY OF CHAR);
318 VAR
319 c: INTEGER;
320 BEGIN
321 c:= system(Komanda);
322 END Izvrsi;
324 BEGIN
325 WriteString("?> "); ReadString(Komanda);
326 WHILE NOT StrEqual(Komanda, "kraj") DO
327 Izvrsi(Komanda);
328 WriteString("?> "); ReadString(Komanda);
329 END;
330 END Zad2.
331 \end{codeblock}
333 Prilikom mapiranja sistemskih poziva je moguće koristiti ``...'' na
334 kraju liste argumenata da se označi da je moguće proslediti
335 proizvoljan broj argumenata nakon navedenih, koji će biti premapirani
336 na odgovarajuće tipove podataka. Takođe je moguće i označiti da se
337 povratna vrednost procedure ne mora koristiti. U gornjem primeru je
338 mogla funkcija da se definiše kao \kod{PROCEDURE system(command: ARRAY
339 OF CHAR): [INTEGER];} i tada bi mogla se poziva kao obična procedura
340 bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna
341 vrednost.
343 Neki primeri pretvaranja tipova su dati u Tabeli~\ref{t-pretvaranje-tipova}, preuzetoj sa \url{http://www.nongnu.org/gm2/interface_to_c.html}.
345 \begin{table}[htp]
346 \begin{center}
347 \begin{tabular}{lll}
348 Stvarni parametar & Konverzija & Tip vrednosti koji će biti prosleđen\\
349 \hline
350 123 & - & long long int\\
351 "hello world" & - & const char *\\
352 a: ARRAY OF CHAR & ADR(a) & char *\\
353 a: ARRAY [0..5] OF CHAR& ADR(a) & char *\\
354 3.14 & - & long double
355 \end{tabular}
356 \end{center}
357 \caption{Tabela pretvaranja tipova\label{t-pretvaranje-tipova}}
358 \end{table}
360 \subsubsection{Primer: Izlistavanje sadržaja direktorijuma}
362 Korišćenje sistemskih poziva se može ilustrovati primerom čitanja
363 sadržaja direktorijuma, komandama \kod{opendir}, \kod{readdir} i
364 \kod{closedir}. Prva komanda otvara prosledjenu putanju i vraća
365 pokazivač na otvoreni direktorijum. Komanda \kod{readdir} prima ovakav
366 pokazivač kao ulazni parametar, a vraća pokazivač na slog koji
367 predstavlja sledeću stavku u otvorenom direktorijumu ili \kod{NIL} ako
368 više nema ničega. Poslednja komanda, \kod{closedir}, se izvodi na
369 kraju i zatvara otvoreni direktorijum. Bitno je zatvarati otvorene
370 resurse jer je moguće da sistem odbije da otvori novi ako ih
371 proces već ima previše otvorenih.
373 Kada imamo imena stavki iz direktorijuma o njima možemo dobiti više
374 informacija \kod{stat}. Ona prima dva argumenta, prvi je \emph{puna}
375 putanja do fajla, a drugi je pokazivač na strukturu u koju će komanda
376 upisati podatke. Obratiti pažnju da zbog ovoga struktura već mora
377 postojati u memoriji, ili kao lokalna promenljiva odgovarajućeg
378 slogovnog tipa, ili dinamički alocirana korišćenjem pokazivača na nju.
380 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
381 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
382 sistema, a naročito utiče da li je u pitanju~32--bitni, ili~64--bitni
383 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
384 Prva je testirana na Lubuntu 11.10 32bit, a druga je testirana na
385 Kubuntu 11.10 64bit.
387 \begin{codeblock}
388 DEFINITION MODULE FOR "C" Lib32;
389 FROM SYSTEM IMPORT
390 ADDRESS, BYTE;
391 EXPORT UNQUALIFIED opendir, readdir, closedir, stat,
392 PDir, DirEnt, PDirEnt, Stat, PStat, PInt;
393 \end{codeblock}
394 \begin{minipage}{0.5\textwidth}
395 \begin{codeblock}
396 (* types for 32 bit *)
397 TYPE
398 PDir = ADDRESS;
399 DirEnt = RECORD
400 ino: INTEGER;
401 off: INTEGER;
402 reclen: SHORTCARD;
403 type: BYTE;
404 name: ARRAY [0..255] OF CHAR;
405 END;
406 PDirEnt = POINTER TO DirEnt;
407 Stat = RECORD
408 dev: LONGINT;
409 ino: LONGINT;
410 mode: INTEGER;
411 nlink: LONGINT;
412 uid: INTEGER;
413 gid: INTEGER;
414 pad1: LONGINT;
415 rdev: INTEGER;
416 size: INTEGER;
417 blksize: INTEGER;
418 blocks: INTEGER;
419 atime: LONGINT;
420 mtime: LONGINT;
421 ctime: LONGINT;
422 END;
423 \end{codeblock}
424 \end{minipage}
425 \begin{minipage}{0.45\textwidth}
426 \begin{codeblock}[frame=single,frameround=tttt]
427 (* types for 64 bit *)
428 TYPE
429 PDir = ADDRESS;
430 DirEnt = RECORD
431 ino: LONGINT;
432 off: LONGINT;
433 reclen: SHORTCARD;
434 type: BYTE;
435 name: ARRAY [0..255] OF CHAR;
436 END;
437 PDirEnt = POINTER TO DirEnt;
438 Stat = RECORD
439 dev: LONGINT;
440 ino: LONGINT;
441 nlink: LONGINT;
442 mode: INTEGER;
443 uid: INTEGER;
444 gid: INTEGER;
445 pad1: INTEGER;
446 rdev: LONGINT;
447 size: LONGINT;
448 blksize: LONGINT;
449 blocks: LONGINT;
450 atime: LONGINT;
451 mtime: LONGINT;
452 ctime: LONGINT;
453 END;
454 \end{codeblock}
455 \end{minipage}
456 \begin{codeblock}
457 PStat = POINTER TO Stat;
458 PInt = POINTER TO INTEGER;
460 PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
461 PROCEDURE readdir(dirp: PDir): PDirEnt;
462 PROCEDURE closedir(dirp: PDir): [INTEGER];
463 PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
464 END Lib32.
465 \end{codeblock}
467 \begin{codeblock}
468 MODULE Zad5;
470 FROM SYSTEM IMPORT
471 ADR;
472 FROM StrIO IMPORT
473 WriteString, WriteLn;
474 FROM NumberIO IMPORT
475 WriteInt;
476 FROM StrLib IMPORT
477 StrLen, StrConCat;
478 FROM Args IMPORT
479 Narg, GetArg;
480 FROM Lib32 IMPORT
481 opendir, readdir, closedir, stat, PDir, PDirEnt, Stat;
482 FROM errno IMPORT
483 geterrno;
485 TYPE
486 String = ARRAY [0..1023] OF CHAR;
488 VAR
489 Putanja: String;
490 n, i: INTEGER;
491 ok: BOOLEAN;
493 PROCEDURE Listaj(Ime: ARRAY OF CHAR);
494 VAR
495 dir: PDir;
496 entry: PDirEnt;
497 info: Stat;
498 c: INTEGER;
499 Len: CARDINAL;
500 Putanja: String;
501 BEGIN
502 dir:= opendir(Ime);
503 IF dir = NIL THEN
504 WriteString("Folder "); WriteString(Ime); WriteLn;
505 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
506 WriteString(" Ne mogu da otvorim direktorijum."); WriteLn();
507 ELSE
508 Len:= StrLen(Ime);
509 IF Ime[Len - 1] # "/" THEN
510 StrConCat(Ime, "/", Ime);
511 END;
512 WriteString("Folder "); WriteString(Ime); WriteLn;
513 entry:= readdir(dir);
514 WHILE entry # NIL DO
515 IF entry^.name[0] # "." THEN
516 StrConCat(Ime, entry^.name, Putanja);
517 c:= stat(Putanja, ADR(info));
518 WriteString(" ");
519 IF c = -1 THEN
520 WriteString("? ? KB");
521 ELSE
522 WriteInt(info.nlink, 3);
523 WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB ");
524 END;
525 WriteString(" "); WriteString(entry^.name); WriteLn;
526 END;
527 entry:= readdir(dir);
528 END;
529 c:= closedir(dir);
530 IF c = -1 THEN
531 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
532 WriteString(" Ne mogu da zatvorim direktorijum."); WriteLn();
533 END;
534 END;
535 END Listaj;
537 BEGIN
538 n:= Narg();
539 FOR i:= 1 TO n - 1 DO
540 ok:= GetArg(Putanja, i);
541 WriteLn;
542 Listaj(Putanja);
543 END;
544 WriteLn;
545 END Zad5.
546 \end{codeblock}
548 \subsection{Stvaranje novih procesa}
550 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
551 (``račva''). Novi proces je identičan sa originalnim, osim u svom
552 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
553 \begin{codeblock}
554 PROCEDURE fork(): INTEGER;
555 \end{codeblock}
557 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
558 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
559 \kod{fork}, ukoliko je u pitanju originalni proces (``roditelj'') tada
560 je ta vrednost jednaka proces identifikatoru (\emph{pid}-u)
561 ``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom
562 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
563 da dete i roditelj rade različite stvari, to se obično rešava kodom
564 sledećeg oblika:
565 \begin{codeblock}
566 pid := fork();
567 IF pid = 0 THEN
568 (* "detetove" operacije *)
569 ELSE
570 (* "roditeljske" operacije *)
571 END;
572 \end{codeblock}
574 Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u
575 originalnom procesu sa efektom da se proces uspava dokle god neki od
576 procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se
577 može postići komandom \kod{waitpid} u kojoj možemo precizirati tačno
578 koji proces čekamo da se završi.
580 U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera
581 organizacije procesa.
583 \skica{treba nam propratni tekst za ovo sto sledi}
585 \subsubsection{Lanac procesa}
587 \begin{minipage}{0.6\textwidth}
588 \begin{codeblock}
589 pid := 0;
590 i := 1;
591 WHILE (pid = 0) AND (i < n) DO
592 pid := fork();
593 IF pid # 0 THEN
594 (* ... *)
595 ELSE
596 INC(i);
597 END;
598 END;
599 \end{codeblock}
600 \end{minipage}
601 \begin{minipage}{0.4\textwidth}
602 \begin{tikzpicture}
603 [proc/.style={circle,draw}]
604 \def \n {5}
605 \foreach \s in {1,...,\n}
607 \node[proc] (\s) at (\s,-\s/2) {\s};
609 \foreach \s in {2,...,\n} {
610 \pgfmathparse{int(\s-1)}
611 \draw [<-] (\s) to (\pgfmathresult);
613 \end{tikzpicture}
614 \end{minipage}
616 \subsubsection{Roditelj sa puno dece}
618 \begin{minipage}{0.6\textwidth}
619 \begin{codeblock}
620 pid := -1;
621 j := 0;
622 WHILE (pid # 0) AND (j < m) DO
623 pid := fork();
624 IF pid # 0 THEN
625 INC(j);
626 ELSE
627 (* ... *)
628 END;
629 END;
630 \end{codeblock}
631 \end{minipage}
632 \begin{minipage}{0.4\textwidth}
633 \begin{tikzpicture}
634 [proc/.style={circle,draw}]
635 \def \n {5}
636 \node[proc] (1) at (0,0) {1};
637 \foreach \s in {2,...,\n}
639 \node[proc] (\s) at (-3.5+\s,-2) {\s};
641 \foreach \s in {2,...,\n} {
642 \draw [->] (1) to (\s);
644 \end{tikzpicture}
645 \end{minipage}
647 \subsubsection{Stablo procesa}
649 \begin{minipage}{0.6\textwidth}
650 \begin{codeblock}
651 i := 1;
652 j := 0;
653 WHILE (i < n) AND (j < m) DO
654 pid := fork();
655 IF pid # 0 THEN
656 INC(j);
657 ELSE
658 INC(i);
659 j:=0;
660 END;
661 END;
662 \end{codeblock}
663 \end{minipage}
664 \begin{minipage}{0.4\textwidth}
665 \begin{tikzpicture}
666 [proc/.style={circle,draw},
667 level 1/.style={sibling distance=20mm,level distance=10mm},
668 level 2/.style={sibling distance=10mm,font=\scriptsize}
670 \node[proc] (root) {0}
671 child[->] foreach \x in {1,2} {node[proc] {\x}
672 child foreach \y in {1,2} {node[proc] {\x-\y}
673 }};
675 \end{tikzpicture}
676 \end{minipage}
679 % ----------------------------------------------
681 \newpage
682 \pagenumbering{Roman}
683 \appendix
685 \section{Instalacija kompajlera GNU Modula 2}
686 \label{app-instalacija-gm2}
688 Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na
689 već postojeći GNU Linux operativni sistem iz Debian porodice, koja
690 uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i
691 mnoge druge. Kompajler je moguće bez većih problema instalirati i na
692 bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog
693 koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom
694 \url{http://www.nongnu.org/gm2/obtaining.html}.
696 Ovo uputstvo neće ulaziti u detalje kako instalirati operativni
697 sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno
698 instaliraju drugi operativni sistem, preporučujemo korišćenje
699 virtuelne mašine (npr besplatni Virtual Box,
700 \url{http://virtualbox.org}) i instaliranje sistema na nju, ili još
701 lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr
702 Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što
703 je Lubuntu, ako su performanse problematične.
705 \subsection{Instalacija na Debian platformi}
707 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
708 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
709 menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem
710 \begin{codeblock}
712 # GNU Modula-2 repo
715 deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main
716 deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main
717 \end{codeblock}
719 Alternativno se mogu koristiti sledeće komande:
721 \begin{terminal}
722 sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
723 sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
724 \end{terminal}
726 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
727 alata.
729 Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi
730 sledeće:
731 \begin{terminal}
732 sudo apt-get update
733 sudo apt-get install gm2-doc gm2
734 \end{terminal}
736 Po želji se može skinuti i izvorni kod kompajlera sledećom komandom:
737 \begin{terminal}
738 sudo apt-get source gm2
739 \end{terminal}
741 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa.
743 \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi}
745 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
746 prijave nedostajuće fajlove \kod{crti.o, crt1.o} i/ili
747 \kod{crtn.o}. Konkretno je poznato za gcc verziju 4.6 na debianu,
748 pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i
749 na neke druge sisteme.
751 Greška se ispravlja na sledeći način (korisnik treba da
752 ima administrativna prava, zato se radi ``sudo'') ukoliko
753 je u pitanju 64-bitni sistem:
754 \begin{terminal}
755 sudo su
756 cd /usr/lib
757 ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o
758 ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o
759 ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o
760 exit
761 \end{terminal}
763 Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama
764 treba zameniti ``x86\_64'' sa ``i386''.
766 \skica{možda i build from source}
768 \newpage
769 \section{Tekst editor Joe}
770 \label{app-joe}
772 Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje
773 rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada
774 (korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može
775 koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na
776 skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim
777 sistemima se ovo može uraditi sa:
778 \begin{terminal}
779 sudo apt-get install joe
780 \end{terminal}
781 Ili analogno na drugim sistemima za instaliranje softvera.
783 Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno
784 otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili
785 tekst se može postići sledećom komandom:
786 \begin{terminal}
787 joe hello.mod
788 \end{terminal}
790 \subsection{Tumačenje prečica na tastaturi}
792 Joe je po svojoj prirodi bogat prečicama na tastaturi. U daljem tekstu
793 će biti navedene mnoge od njih. Kod svih se navodi redosled
794 pritiskanja tastera individualno, a ako su negde tasteri spojeni sa
795 ``+'' (alternativno sa ``-'') onda ih je potrebno pritisnuti
796 odjednom. Neki primeri:
798 \begin{itemize}
799 \item \Ctrl +\keystroke{\_} (poništavanje poslednje promene) pristsak
800 na taster \emph{CTRL} i \emph{\_ (podvlaka)} odjednom.
801 \item \Ctrl +\keystroke{K}\keystroke{H} (otvaranje sistema pomoći)
802 pritisak na \emph{CTRL} i \emph{K} odjednom, odpustiti sve, pa onda
803 pritisak na \emph{H}.
804 \item \Esc \keystroke{,} (prelazak na sledeću stranu pomoći)
805 pritisak na taster \emph{Escape}, a nakon toga pritisak na taster
806 \emph{, (zarez)}.
807 \end{itemize}
809 U okviru sistema pomoći koji je ugrađen u sam editor uglavnom se
810 pojavljuju skraćeni oblici:
811 \begin{itemize}
812 \item \^{}D isto što i ``Ctrl-D''
813 \item \^{}KH isto što i ``Ctrl-K H''
814 \item \^{}[. isto što i ``Esc .''
815 \end{itemize}
818 \subsection{Sistem pomoći}
820 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
821 kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak
822 komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći
823 kroz koje se može kretati sa \Esc \keystroke{.} (tačka) i \Esc
824 \keystroke{,} (zarez).
826 U okviru pomoći postoje maltene sve komande koje editor pruža, a na
827 kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar
828 ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora.
830 \subsection{Rad sa fajlovima}
832 Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
833 +\keystroke{K}\keystroke{X}, dok se
834 samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba
835 slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
836 vrednost ponudi trenutno ime.
838 Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti
839 sa \Ctrl +\keystroke{K}\keystroke{E}. Na dnu editora će se pojaviti
840 polje za kucanje imena fajla koje dozvoljava i da se putanja
841 automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš
842 kao i u komandnoj liniji.
844 Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom
845 na \Esc \keystroke{V}, odnosno \Esc \keystroke{U}.
847 Zatvaranje fajla je moguće sa \Ctrl+\keystroke{C} (što je i
848 standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri
849 čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene
850 koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će
851 se i sam editor zatvoriti.
853 \subsection{Rad sa tekstom}
855 Pritiskom na \Ctrl+\keystroke{\_} se poništava poslednja promena (undo).
857 Premeštanje i kopiranje delova teksta je malo drugačije nego u
858 klasičnim grafičkim programima. Prvo je potrebno označiti željeni
859 tekst u dva koraka: \Ctrl +\keystroke{K}\keystroke{B} postavlja
860 početak bloka na trenutnu poziciju kursora, a \Ctrl
861 +\keystroke{K}\keystroke{K} postavlja kraj bloka, nakon čega će
862 selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom
863 mestu u istom ili drugom dokumentu pritisnuti \Ctrl
864 +\keystroke{K}\keystroke{C} da bi se iskopirao označeni blok, odnosno
865 \Ctrl +\keystroke{K}\keystroke{M} da bi se on premestio.
866 Komanda \Ctrl +\keystroke{K}\keystroke{Y} briše odabrani blok.
868 Pretraga dokumenta se započinje sa \Ctrl +\keystroke{K}\keystroke{F}.
870 Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se
871 može odabrati više opcija za rad, kao što su margine, automatsko
872 prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}),
873 sintaksno bojenje itd.
875 \subsection{Rad sa prozorima}
877 ``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora
878 koji omogućavaju da se vidi više dokumenata, ili čak da se vide
879 različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl
880 +\keystroke{K}\keystroke{O}. Veličina trenutnog prozora se potom može
881 povećavati (\Ctrl +\keystroke{K}\keystroke{G}) ili smanjivati (\Ctrl
882 +\keystroke{K}\keystroke{T}) na uštrb drugih prozora. Prelazak na
883 sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl
884 +\keystroke{K}\keystroke{N}, odnosno na \Ctrl
885 +\keystroke{K}\keystroke{P}. Komanda \Ctrl +\keystroke{K}\keystroke{I}
886 omogućuje da se naizmenično vide svi prozori, ili samo jedan.
888 \subsection{Problem: ``zamrzavanje'' pri snimanju} ako editor izgleda
889 kao da se zaledio verovatno je problem što je stisnuta ``klasična''
890 kombinacija za snimanje \Ctrl + \keystroke{S} koja ne radi u
891 ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat
892 se poništava pritiskom na \Ctrl + \keystroke{Q}. Za više detalja
893 pogledati Glavu~\ref{g-smrzavanje}.
895 \skica{joe i sintaksno bojenje za m2}
897 \newpage
898 \section{Putty}
900 \emph{Putty} je program koji služi da se pod Windows operativnim
901 sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX
902 serveru. Može se naći online na
903 \url{http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html}.
905 Po pokretanju se prikazuje dijalog u kome se može ukucati adresa
906 udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta
907 samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je
908 uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
909 lozinke.
911 \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se}
912 \label{g-smrzavanje}
914 Putty (kao i većina standardnih linux terminala koji koriste
915 softversku kontrolu toka podataka \emph{software flow control}) se
916 može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom
917 na \Ctrl+\keystroke{S}. Ovo je često velik problem jer se poklapa sa
918 standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se
919 može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom
920 \Ctrl+\keystroke{Q}. Ukratko:
921 \begin{lstlisting}[xleftmargin=10em]
922 Do not press
923 Ctrl S
924 If you do
925 Ctrl Q
926 \end{lstlisting}
928 Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena
929 kad su brzine protoka bile veoma male, i kada se štedelo time što bi
930 se privrmeno isključio protok kada nisu neophodne povratne
931 informacije, na primer kod komandi koje se dugo izvršavaju. Naravno
932 ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza
933 koje se plaćaju po protoku, a nekad se može i dobiti na brzini
934 izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana.
936 \skica{literatura i linkovi izdovjeni na kraju dokumenta}
938 %\end{multicols}
939 \end{document}
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner