gitweb on Svarog

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