gitweb on Svarog

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