gitweb on Svarog

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