gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
napomena o upgradeu i izvorima softvera
[os2skripta.git] / skripta-os2.tex
index 41a2d2d..57a5b15 100644 (file)
@@ -1,7 +1,7 @@
 % skripta-os2.tex
 % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS
 % Doni Pracner, Ivan Pribela
 % skripta-os2.tex
 % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS
 % Doni Pracner, Ivan Pribela
-% 2011/12 -- 2012/13
+% 2011/12 -- 2013/14
 
 \documentclass[a4paper,twoside]{article}
 \usepackage[T1]{fontenc}
 
 \documentclass[a4paper,twoside]{article}
 \usepackage[T1]{fontenc}
@@ -13,8 +13,8 @@
 \newcommand{\inst}{Departman za matematiku i informatiku, PMF, UNS}
 \newcommand{\autorinst}{\autor \\ \inst}
 \newcommand{\naslov}{Skripta za vežbe iz predmeta operativni sistemi 2} 
 \newcommand{\inst}{Departman za matematiku i informatiku, PMF, UNS}
 \newcommand{\autorinst}{\autor \\ \inst}
 \newcommand{\naslov}{Skripta za vežbe iz predmeta operativni sistemi 2} 
-\newcommand{\datum}{Februar 2013, Novi Sad}
-\newcommand{\verzija}{ver 13a}
+\newcommand{\datum}{Februar 2014, Novi Sad}
+\newcommand{\verzija}{ver 14a}
 
 \usepackage[serbian]{babel}
 \usepackage{fancyhdr}
 
 \usepackage[serbian]{babel}
 \usepackage{fancyhdr}
@@ -30,7 +30,6 @@
 \renewcommand{\familydefault}{\sfdefault}
 
 \usepackage{pifont}
 \renewcommand{\familydefault}{\sfdefault}
 
 \usepackage{pifont}
-\usepackage{keystroke}
 
 %podesavanja outputa za pdf verzije
 \usepackage[bookmarks,pdffitwindow=false,unicode=true,%
 
 %podesavanja outputa za pdf verzije
 \usepackage[bookmarks,pdffitwindow=false,unicode=true,%
@@ -45,10 +44,33 @@ pdfauthor={\autor}%
 \usepackage{latexsym}
 \usepackage{multicol}
 
 \usepackage{latexsym}
 \usepackage{multicol}
 
+%\usepackage{keystroke}
+% ispod je dodata alternativa za ovaj paket
+
 \usepackage{tikz}
 \usepackage{tikz}
+\usetikzlibrary{shadows}
+
+\newcommand*\keystroke[1]{%
+  \tikz[baseline=(key.base)]
+    \node[%
+      draw,
+      fill=white,
+      drop shadow={shadow xshift=0.2ex,shadow yshift=-0.2ex,fill=black,opacity=0.75},
+      rectangle,
+      rounded corners=2pt,
+      inner sep=1pt,
+      line width=0.5pt,
+      font=\small\sffamily
+    ](key) {#1\strut}
+  ;
+}
+
+\newcommand*\Ctrl{\keystroke{Ctrl}} 
+\newcommand*\Tab{\keystroke{Tab}}
+\newcommand*\Esc{\keystroke{Esc}}
 
 %margine
 
 %margine
-\usepackage[top=1.5cm, bottom=1cm, left=2.5cm, right=2cm]{geometry}
+\usepackage[top=2cm, bottom=2cm, left=2.5cm, right=2cm]{geometry}
 
 \begin{document}
 
 
 \begin{document}
 
@@ -149,9 +171,12 @@ pdfauthor={\autor}%
 }
 
 \lstdefinestyle{terminal}{
 }
 
 \lstdefinestyle{terminal}{
-  frame=l,
+  frame=lt,
 %  frameround=fftt,
 %  frameround=fftt,
-  xleftmargin=4em
+  backgroundcolor=\color[gray]{.95},
+% prebreak=\P,
+  postbreak=\ding{229}\space,
+  xleftmargin=2em
 }
 
 \lstdefinestyle{numcodeblock}{
 }
 
 \lstdefinestyle{numcodeblock}{
@@ -180,6 +205,14 @@ sistemima iz Debian porodice.
 
 \section{GNU Modula 2}
 
 
 \section{GNU Modula 2}
 
+\emph{GNU Modula 2} (u daljem tekstu često skraćeno na \emph{gm2}) je
+pred procesor (\emph{front end}) za GNU kolekciju kompajlera
+(GCC). Podržava nekoliko dijalekata jezika ``Modula 2'' --
+najznačajniji su ISO standard i nekoliko varijacija koje je originalni
+autor Niklaus Virt (\emph{Niklaus Wirth}) opisao u različitima
+verzijama knjige \emph{Programming in Modula 2 (PIM)}. Uz kompajler se
+dobijaju i besplatne ISO, PIM i još neke biblioteke.
+
 \subsection{Prvi program u gm2 }
 \label{g-prvi-program}
 
 \subsection{Prvi program u gm2 }
 \label{g-prvi-program}
 
@@ -204,7 +237,7 @@ korišćenje zvanične stranice:
 \url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne
 biblioteke.
 
 \url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne
 biblioteke.
 
-Predpostavimo da smo da je fajl napravljen u trenutnom direktorijumu,
+Predpostavimo da je fajl napravljen u trenutnom direktorijumu,
 koristeći neki tesktualni editor (u dodatku~\ref{app-joe} je opisan
 ``joe'' koji se koristi na vežbama).  Kreirani fajl se tada može
 prevesti u izvršnu verziju sledećom komandom:
 koristeći neki tesktualni editor (u dodatku~\ref{app-joe} je opisan
 ``joe'' koji se koristi na vežbama).  Kreirani fajl se tada može
 prevesti u izvršnu verziju sledećom komandom:
@@ -217,7 +250,7 @@ napraviti fajl \kod{a.out}, koji se može pokrenuti sa:
 \begin{terminal}
   ./a.out
 \end{terminal}
 \begin{terminal}
   ./a.out
 \end{terminal}
-pri čemu \kod{./} naglaša da hoćemo da pokrenemo program iz trenutnog
+pri čemu \kod{./} naglašava da hoćemo da pokrenemo program iz trenutnog
 direktorijuma (koji se označava tačkom). Ako je potrebno da
 izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg
 tipa:
 direktorijuma (koji se označava tačkom). Ako je potrebno da
 izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg
 tipa:
@@ -309,8 +342,22 @@ mogla funkcija da se definiše kao \kod{PROCEDURE system(command: ARRAY
 bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna
 vrednost. 
 
 bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna
 vrednost. 
 
-Tabela pretvaranja tipova se može videti na
-\url{http://www.nongnu.org/gm2/interface_to_c.html}
+Neki primeri pretvaranja tipova su dati u Tabeli~\ref{t-pretvaranje-tipova}, preuzetoj sa \url{http://www.nongnu.org/gm2/interface_to_c.html}.
+
+\begin{table}[htp]
+\begin{center}
+\begin{tabular}{lll}
+Stvarni parametar      &  Konverzija  &   Tip vrednosti koji će biti prosleđen\\
+\hline
+123                    &  -                &   long long int\\
+"hello world"          &  -                &   const char *\\
+a: ARRAY OF CHAR       &  ADR(a)           &   char *\\
+a: ARRAY [0..5] OF CHAR&  ADR(a)           &   char *\\
+3.14                   &  -                &   long double
+\end{tabular}
+\end{center}
+\caption{Tabela pretvaranja tipova\label{t-pretvaranje-tipova}}
+\end{table}
 
 \subsubsection{Primer: Izlistavanje sadržaja direktorijuma}
 
 
 \subsubsection{Primer: Izlistavanje sadržaja direktorijuma}
 
@@ -325,40 +372,154 @@ kraju i zatvara otvoreni direktorijum. Bitno je zatvarati otvorene
 resurse jer je moguće da sistem odbije da otvori novi ako ih
 proces već ima previše otvorenih.
 
 resurse jer je moguće da sistem odbije da otvori novi ako ih
 proces već ima previše otvorenih.
 
-Kada imamo imena stavki iz direktorijuma o njima možemo dobiti više
-informacija \kod{stat}. Ona prima dva argumenta, prvi je \emph{puna}
-putanja do fajla, a drugi je pokazivač na strukturu u koju će komanda
-upisati podatke. Obratiti pažnju da zbog ovoga struktura već mora
-postojati u memoriji, ili kao lokalna promenljiva odgovarajućeg
-slogovnog tipa, ili dinamički alocirana korišćenjem pokazivača na nju.
-
 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
 sistema, a naročito utiče da li je u pitanju~32--bitni, ili~64--bitni
 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
 sistema, a naročito utiče da li je u pitanju~32--bitni, ili~64--bitni
 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
-Prva je testirana na Lubuntu 11.10 32bit, a druga je testirana na
-Kubuntu 11.10 64bit.
+Prva je testirana na Lubuntu 11.10 i 12.04 32bit, a druga je testirana
+na Kubuntu 11.10 i 12.10 64bit.
 
 \begin{codeblock}
 
 \begin{codeblock}
-DEFINITION MODULE FOR "C" Lib32;
+DEFINITION MODULE FOR "C" libdir;
+
   FROM SYSTEM IMPORT 
     ADDRESS, BYTE;
   FROM SYSTEM IMPORT 
     ADDRESS, BYTE;
-  EXPORT UNQUALIFIED opendir, readdir, closedir, stat, 
-    PDir, DirEnt, PDirEnt, Stat, PStat, PInt;
+
+  EXPORT UNQUALIFIED opendir, readdir, closedir, PDir, DirEnt, PDirEnt;
 \end{codeblock}
 \end{codeblock}
-\begin{minipage}{0.5\textwidth}
+\begin{minipage}{0.45\textwidth}
 \begin{codeblock}
 (* types for 32 bit *)
   TYPE
     PDir = ADDRESS;
     DirEnt = RECORD
 \begin{codeblock}
 (* types for 32 bit *)
   TYPE
     PDir = ADDRESS;
     DirEnt = RECORD
-         ino: INTEGER;
-         off: INTEGER;
-         reclen: SHORTCARD;
-         type: BYTE;
-         name: ARRAY [0..255] OF CHAR;
+       ino: INTEGER;
+       off: INTEGER;
+       reclen: SHORTCARD;
+       type: BYTE;
+       name: ARRAY [0..255] OF CHAR;
+    END;
+    PDirEnt = POINTER TO DirEnt;
+ \end{codeblock}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{codeblock}[frame=single,frameround=tttt]
+(* types for 64 bit *)
+  TYPE
+    PDir = ADDRESS;
+    DirEnt = RECORD
+       ino: LONGINT;
+       off: LONGINT;
+       reclen: SHORTCARD;
+       type: BYTE;
+       name: ARRAY [0..255] OF CHAR;
     END;
     PDirEnt = POINTER TO DirEnt;
     END;
     PDirEnt = POINTER TO DirEnt;
+\end{codeblock}
+\end{minipage}
+\begin{codeblock}
+  PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
+  PROCEDURE readdir(dirp: PDir): PDirEnt;
+  PROCEDURE closedir(dirp: PDir): [INTEGER];
+
+END libdir.
+\end{codeblock}
+
+\begin{codeblock}
+MODULE Zad3;
+
+FROM StrIO IMPORT
+  WriteString, WriteLn;
+FROM NumberIO IMPORT
+  WriteInt;
+FROM Args IMPORT
+  Narg, GetArg;
+  FROM libdir IMPORT
+  opendir, readdir, closedir, PDir, PDirEnt;
+FROM errno IMPORT
+  geterrno;
+
+TYPE
+  String = ARRAY [0..1023] OF CHAR;
+
+VAR
+  Putanja: String;
+  n, i: INTEGER;
+  ok: BOOLEAN;
+
+PROCEDURE Listaj(Ime: ARRAY OF CHAR);
+VAR
+  dir: PDir;
+  entry: PDirEnt;
+  c: INTEGER;
+BEGIN
+  WriteString("Folder "); WriteString(Ime); WriteLn;
+  dir:= opendir(Ime);
+  IF dir = NIL THEN
+    WriteString("  Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
+    WriteString("  Ne mogu da otvorim direktorijum."); WriteLn();
+  ELSE
+    entry:= readdir(dir);
+    WHILE entry # NIL DO
+      IF entry^.name[0] # "." THEN
+        WriteString("  "); WriteString(entry^.name); WriteLn;
+      END;
+      entry:= readdir(dir);
+    END;
+    c:= closedir(dir);
+    IF c = -1 THEN
+      WriteString("  Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
+      WriteString("  Ne mogu da zatvorim direktorijum."); WriteLn();
+    END;
+  END;
+END Listaj;
+
+BEGIN
+  n:= Narg();
+  FOR i:= 1 TO n - 1 DO
+    ok:= GetArg(Putanja, i);
+    WriteLn;
+    Listaj(Putanja);
+  END;
+  WriteLn;
+END Zad3.
+\end{codeblock}
+
+Kada imamo imena stavki iz direktorijuma o njima možemo dobiti više
+informacija koristeći sistemski poziv \kod{stat}. On prima dva
+argumenta, prvi je \emph{puna} putanja do fajla, a drugi je pokazivač
+na strukturu u koju će komanda upisati podatke. Obratiti pažnju da
+zbog ovoga struktura već mora postojati u memoriji, ili kao lokalna
+promenljiva odgovarajućeg slogovnog tipa, ili dinamički alocirana
+korišćenjem pokazivača na nju.
+
+Linux i mnogi drugi srodni sistemi za internu prezentaciju vremena
+koriste broj sekundi od početka ``epohe'', odnosno od prvog januara
+1970 godine. Za konverziju u klasičnije mere vremena se može koristiti
+poziv \kod{localtime}.
+
+\begin{codeblock}
+DEFINITION MODULE FOR "C" LibStat32;
+  FROM SYSTEM IMPORT 
+    ADDRESS, BYTE;
+  EXPORT UNQUALIFIED stat, localtime,
+    Stat, PStat, Tm, PTm, PInt,
+    fifo, character, directory, block, regular, network, link, socket;
+
+  CONST
+    fifo      =  1;
+    character =  2;
+    directory =  4;
+    block     =  6;
+    regular   =  8;
+    network   =  9;
+    link      = 10;
+    socket    = 12;
+\end{codeblock}
+\begin{minipage}{0.45\textwidth}
+\begin{codeblock}
+(* types for 32 bit *)
+  TYPE
     Stat = RECORD
          dev: LONGINT;
          ino: LONGINT;
     Stat = RECORD
          dev: LONGINT;
          ino: LONGINT;
@@ -381,15 +542,6 @@ DEFINITION MODULE FOR "C" Lib32;
 \begin{codeblock}[frame=single,frameround=tttt]
 (* types for 64 bit *)
   TYPE
 \begin{codeblock}[frame=single,frameround=tttt]
 (* types for 64 bit *)
   TYPE
-    PDir = ADDRESS;
-    DirEnt = RECORD
-         ino: LONGINT;
-         off: LONGINT;
-         reclen: SHORTCARD;
-         type: BYTE;
-         name: ARRAY [0..255] OF CHAR;
-    END;
-    PDirEnt = POINTER TO DirEnt;
     Stat = RECORD
          dev: LONGINT;
          ino: LONGINT;
     Stat = RECORD
          dev: LONGINT;
          ino: LONGINT;
@@ -409,18 +561,22 @@ DEFINITION MODULE FOR "C" Lib32;
   \end{codeblock}
 \end{minipage}
 \begin{codeblock}
   \end{codeblock}
 \end{minipage}
 \begin{codeblock}
-    PStat = POINTER TO Stat;
+    Tm = RECORD
+             sec, min, hour,
+             mday, mon, year,
+             wday, yday, isdst: INTEGER;
+         END;
+    PTm = POINTER TO Tm;
     PInt = POINTER TO INTEGER;
 
     PInt = POINTER TO INTEGER;
 
-  PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
-  PROCEDURE readdir(dirp: PDir): PDirEnt;
-  PROCEDURE closedir(dirp: PDir): [INTEGER];
   PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
   PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
-END Lib32.
+  PROCEDURE localtime(time: PInt): PTm;
+
+END LibStat32.
 \end{codeblock}
 
 \begin{codeblock}
 \end{codeblock}
 
 \begin{codeblock}
-MODULE Zad5;
+MODULE Zad4;
 
 FROM SYSTEM IMPORT
   ADR;
 
 FROM SYSTEM IMPORT
   ADR;
@@ -432,8 +588,9 @@ FROM StrLib IMPORT
   StrLen, StrConCat;
 FROM Args IMPORT
   Narg, GetArg;
   StrLen, StrConCat;
 FROM Args IMPORT
   Narg, GetArg;
-FROM Lib32 IMPORT
-  opendir, readdir, closedir, stat, PDir, PDirEnt, Stat;
+FROM LibStat32 IMPORT
+  stat, localtime, Stat, PTm;
+IMPORT LibStat32;
 FROM errno IMPORT
   geterrno;
 
 FROM errno IMPORT
   geterrno;
 
@@ -445,48 +602,104 @@ VAR
   n, i: INTEGER;
   ok: BOOLEAN;
 
   n, i: INTEGER;
   ok: BOOLEAN;
 
-PROCEDURE Listaj(Ime: ARRAY OF CHAR);
+PROCEDURE WriteMode(mode: INTEGER);
+
+  PROCEDURE WriteType(type: INTEGER);
+  BEGIN
+    IF type = lib32.fifo THEN
+      WriteString("f");
+    ELSIF type = lib32.character THEN
+      WriteString("c");
+    ELSIF type = lib32.directory THEN
+      WriteString("d");
+    ELSIF type = lib32.block THEN
+      WriteString("b");
+    ELSIF type = lib32.regular THEN
+      WriteString("-");
+    ELSIF type = lib32.network THEN
+      WriteString("n");
+    ELSIF type = lib32.link THEN
+      WriteString("l");
+    ELSIF type = lib32.socket THEN
+      WriteString("s");
+    ELSE
+      WriteString("?");
+    END;
+  END WriteType;
+
+  PROCEDURE WriteRWX(triplet: INTEGER);
+  BEGIN
+    IF ((triplet DIV 4) MOD 2) # 0 THEN
+      WriteString("r");
+    ELSE
+      WriteString("-");
+    END;
+    IF ((triplet DIV 2) MOD 2) # 0 THEN
+      WriteString("w");
+    ELSE
+      WriteString("-");
+    END;
+    IF (triplet MOD 2) # 0 THEN
+      WriteString("x");
+    ELSE
+      WriteString("-");
+    END;
+  END WriteRWX;
+
+BEGIN
+  WriteType((mode DIV 4096) MOD 16);
+  WriteRWX(mode DIV 64);
+  WriteRWX(mode DIV 8);
+  WriteRWX(mode);
+END WriteMode;
+
+PROCEDURE WriteTime(time: LONGINT);
 VAR
 VAR
-  dir: PDir;
-  entry: PDirEnt;
-  info: Stat;
-  c: INTEGER;
-  Len: CARDINAL;
-  Putanja: String;
+  tm: PTm;
 BEGIN
 BEGIN
-  dir:= opendir(Ime);
-  IF dir = NIL THEN
-    WriteString("Folder "); WriteString(Ime); WriteLn;
-    WriteString("  Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
-    WriteString("  Ne mogu da otvorim direktorijum."); WriteLn();
-  ELSE
-    Len:= StrLen(Ime);
-    IF Ime[Len - 1] # "/" THEN
-      StrConCat(Ime, "/", Ime);
+  tm:= localtime(ADR(time));
+  IF tm # NIL THEN
+    WriteInt(tm^.year + 1900, 0);
+    WriteString("-");
+    IF tm^.mon < 9 THEN
+      WriteString("0");
     END;
     END;
-    WriteString("Folder "); WriteString(Ime); WriteLn;
-    entry:= readdir(dir);
-    WHILE entry # NIL DO
-      IF entry^.name[0] # "." THEN
-        StrConCat(Ime, entry^.name, Putanja);
-        c:= stat(Putanja, ADR(info));
-        WriteString("  ");
-        IF c = -1 THEN
-          WriteString("?    ? KB");
-        ELSE
-          WriteInt(info.nlink, 3);
-          WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB ");
-        END;
-        WriteString(" "); WriteString(entry^.name); WriteLn;
-      END;
-      entry:= readdir(dir);
+    WriteInt(tm^.mon + 1, 0);
+    WriteString("-");
+    IF tm^.mday < 10 THEN
+      WriteString("0");
     END;
     END;
-    c:= closedir(dir);
-    IF c = -1 THEN
-      WriteString("  Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
-      WriteString("  Ne mogu da zatvorim direktorijum."); WriteLn();
+    WriteInt(tm^.mday, 0);
+    WriteString(" ");
+    IF tm^.hour < 10 THEN
+      WriteString("0");
+    END;
+    WriteInt(tm^.hour, 0);
+    WriteString(":");
+    IF tm^.hour < 10 THEN
+      WriteString("0");
     END;
     END;
+    WriteInt(tm^.min, 0);
+  ELSE
+    WriteString("??:??");
+  END;
+END WriteTime;
+
+PROCEDURE Listaj(Putanja: ARRAY OF CHAR);
+VAR
+  info: Stat;
+  c: INTEGER;
+BEGIN
+  c:= stat(Putanja, ADR(info));
+  IF c = -1 THEN
+    WriteString("??????????  ?    ? KB ????-??-?? ??:??");
+  ELSE
+    WriteMode(info.mode);
+    WriteInt(info.nlink, 3);
+    WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB ");
+    WriteTime(info.atime);
   END;
   END;
+  WriteString(" "); WriteString(Putanja); WriteLn;
 END Listaj;
 
 BEGIN
 END Listaj;
 
 BEGIN
@@ -497,7 +710,7 @@ BEGIN
     Listaj(Putanja);
   END;
   WriteLn;
     Listaj(Putanja);
   END;
   WriteLn;
-END Zad5.
+END Zad4.
 \end{codeblock}
 
 \subsection{Stvaranje novih procesa}
 \end{codeblock}
 
 \subsection{Stvaranje novih procesa}
@@ -587,14 +800,14 @@ END;
 \begin{minipage}{0.4\textwidth}
 \begin{tikzpicture}
 [proc/.style={circle,draw}]
 \begin{minipage}{0.4\textwidth}
 \begin{tikzpicture}
 [proc/.style={circle,draw}]
-\def \n {5}
-\node[proc] (1) at (0,0) {1};
-\foreach \s in {2,...,\n}
+\def \n {3}
+\node[proc] (top) at (0,0) {0..4};
+\foreach \s in {0,...,\n}
 {
 {
-  \node[proc] (\s) at (-3.5+\s,-2) {\s};
+  \node[proc] (\s) at (-1.5+\s,-2) {\s};
 }
 }
-\foreach \s in {2,...,\n} {
-  \draw [->] (1) to (\s);
+\foreach \s in {0,...,\n} {
+  \draw [->] (top) to (\s);
 }
 \end{tikzpicture}
 \end{minipage}
 }
 \end{tikzpicture}
 \end{minipage}
@@ -603,15 +816,16 @@ END;
 
 \begin{minipage}{0.6\textwidth}
 \begin{codeblock}
 
 \begin{minipage}{0.6\textwidth}
 \begin{codeblock}
-i := 1;
-j := 0;
-WHILE (i < n) AND (j < m) DO
+dubina := 1;
+brdece := 0;
+WHILE (dubina < maxdubina) AND 
+      (brdece < potrebnodece) DO
   pid := fork();
   IF pid # 0 THEN
   pid := fork();
   IF pid # 0 THEN
-    INC(j);
+    INC(brdece);
   ELSE
   ELSE
-    INC(i);
-    j:=0;
+    INC(dubina);
+    brdece := 0;
   END;
 END;
 \end{codeblock}
   END;
 END;
 \end{codeblock}
@@ -619,14 +833,18 @@ END;
 \begin{minipage}{0.4\textwidth}
 \begin{tikzpicture}
 [proc/.style={circle,draw},
 \begin{minipage}{0.4\textwidth}
 \begin{tikzpicture}
 [proc/.style={circle,draw},
-level 1/.style={sibling distance=20mm,level distance=10mm},
-level 2/.style={sibling distance=10mm,font=\scriptsize}
+level 1/.style={sibling distance=28mm,level distance=10mm},
+level 2/.style={sibling distance=14mm,font=\scriptsize},
+level 3/.style={sibling distance=6mm,font=\tiny}
 ]
 ]
-\node[proc] (root) {0}
-child[->] foreach \x in {1,2} {node[proc] {\x}
-  child foreach \y in {1,2} {node[proc] {\x-\y}
-    }};
-
+\node[proc] (root) {1-0}
+child[->] foreach \x in {0,1} {node[proc] {1-\x}
+  child foreach \y in {0,1} {node[proc] {2-\y}
+    child foreach \z in {0,1} {node[proc] {3-\z}
+    }}};
+
+\node[text width=0.9\textwidth] (desc) at (0,-4) {maxdubina=4, potrebnodece=2, 
+čvorovi prikazuju vrednosti pri kreiranju};
 \end{tikzpicture}
 \end{minipage}
 
 \end{tikzpicture}
 \end{minipage}
 
@@ -695,6 +913,13 @@ sudo apt-get source gm2
 
 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa.
 
 
 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa.
 
+\paragraph{Napomena:} Prilikom unapredjivanja Linux distribucije na
+sledeću verziju (npr. 13.10 na 14.04) se standardno onemogućavaju
+dodati izvori softvera i potrebno ih je ručno ponovo upaliti.  Ovo se
+može uraditi otvoranjem \kod{/etc/apt/sources.list} i uklonjanjem
+``\#'' sa početka redova koje želimo da koristimo ponovo ili
+korišćenjem adekvatnih vizuelnih alata.
+
 \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi}
 
 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
 \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi}
 
 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
@@ -720,6 +945,7 @@ treba zameniti ``x86\_64'' sa ``i386''.
 
 \skica{možda i build from source}
 
 
 \skica{možda i build from source}
 
+\newpage
 \section{Tekst editor Joe}
 \label{app-joe}
 
 \section{Tekst editor Joe}
 \label{app-joe}
 
@@ -734,39 +960,121 @@ sudo apt-get install joe
 \end{terminal}
 Ili analogno na drugim sistemima za instaliranje softvera.
 
 \end{terminal}
 Ili analogno na drugim sistemima za instaliranje softvera.
 
-Otvoranje postojećeg fajla ``hello.mod'' za uređivanje,
-odnosno otvaranje novog praznog fajla u koji ćemo unositi
-odgovarajući kod ili tekst se može postići sledećom komandom:
+Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno
+otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili
+tekst se može postići sledećom komandom:
 \begin{terminal}
 joe hello.mod
 \end{terminal}
 
 \begin{terminal}
 joe hello.mod
 \end{terminal}
 
-Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
-+\keystroke{K}\keystroke{X} (\emph{ctrl} i \emph{K} odjednom, pa onda
-\emph{X}, ova šema pritiskanja tastera važi za sve prečice), dok se
-samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba
-slučaja joe pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
-vrednost ponudi trenutno ime. Brz izlaz iz editora je moguć i sa
-\Ctrl+\keystroke{C} (što je i standardna komanda za ``ubijanje''
-trenutnog procesa u terminalu), pri čemu će joe pitati da li želimo da
-izađemo ako postoje promene koje nisu snimljene.
+\subsection{Tumačenje prečica na tastaturi}
+
+Joe je po svojoj prirodi bogat prečicama na tastaturi. U daljem tekstu
+će biti navedene mnoge od njih. Kod svih se navodi redosled
+pritiskanja tastera individualno, a ako su negde tasteri spojeni sa
+``+'' (alternativno sa ``-'') onda ih je potrebno pritisnuti
+odjednom. Neki primeri:
+
+\begin{itemize}
+\item \Ctrl +\keystroke{\_} (poništavanje poslednje promene) pristsak
+  na taster \emph{CTRL} i \emph{\_ (podvlaka)} odjednom.
+\item \Ctrl +\keystroke{K}\keystroke{H} (otvaranje sistema pomoći) 
+  pritisak na \emph{CTRL} i \emph{K} odjednom, odpustiti sve, pa onda
+  pritisak na \emph{H}.
+\item \Esc \keystroke{,} (prelazak na sledeću stranu pomoći)
+  pritisak na taster \emph{Escape}, a nakon toga pritisak na taster
+  \emph{, (zarez)}.
+\end{itemize}
+
+U okviru sistema pomoći koji je ugrađen u sam editor uglavnom se
+pojavljuju skraćeni oblici:
+\begin{itemize}
+\item \^{}D isto što i ``Ctrl-D''
+\item \^{}KH isto što i ``Ctrl-K H''
+\item \^{}[. isto što i ``Esc .''
+\end{itemize}
+
+
+\subsection{Sistem pomoći}
 
 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
 kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak
 komandi u gornjem delu editora.  Postoji nekoliko stranica ove pomoći
 
 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
 kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak
 komandi u gornjem delu editora.  Postoji nekoliko stranica ove pomoći
-kroz koje se može kretati sa \Esc \keystroke{.} i \Esc \keystroke{,}.
+kroz koje se može kretati sa \Esc \keystroke{.} (tačka) i \Esc
+\keystroke{,} (zarez).
+
+U okviru pomoći postoje maltene sve komande koje editor pruža, a na
+kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar
+ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora.
+
+\subsection{Rad sa fajlovima}
+
+Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
++\keystroke{K}\keystroke{X}, dok se
+samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba
+slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
+vrednost ponudi trenutno ime. 
 
 
-U okviru pomoći stoje i komande za označavanje blokova teksta i
-njihovo nakndadno premeštanje, kopiranje ili brisanje. Pritiskom na
-\Ctrl+\keystroke{\_} se vraća poslednja promena (undo).
+Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti
+sa \Ctrl +\keystroke{K}\keystroke{E}.  Na dnu editora će se pojaviti
+polje za kucanje imena fajla koje dozvoljava i da se putanja
+automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš
+kao i u komandnoj liniji.
+
+Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom
+na \Esc \keystroke{V}, odnosno \Esc \keystroke{U}. 
+
+Zatvaranje fajla je moguće sa \Ctrl+\keystroke{C} (što je i
+standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri
+čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene
+koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će
+se i sam editor zatvoriti.
+
+\subsection{Rad sa tekstom}
+
+Pritiskom na \Ctrl+\keystroke{\_} se poništava poslednja promena (undo).
+
+Premeštanje i kopiranje delova teksta je malo drugačije nego u
+klasičnim grafičkim programima. Prvo je potrebno označiti željeni
+tekst u dva koraka: \Ctrl +\keystroke{K}\keystroke{B} postavlja
+početak bloka na trenutnu poziciju kursora, a \Ctrl
++\keystroke{K}\keystroke{K} postavlja kraj bloka, nakon čega će
+selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom
+mestu u istom ili drugom dokumentu pritisnuti \Ctrl
++\keystroke{K}\keystroke{C} da bi se iskopirao označeni blok, odnosno
+\Ctrl +\keystroke{K}\keystroke{M} da bi se on premestio.
+Komanda \Ctrl +\keystroke{K}\keystroke{Y} briše odabrani blok.
+
+Pretraga dokumenta se započinje sa \Ctrl +\keystroke{K}\keystroke{F}.
 
 Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se
 može odabrati više opcija za rad, kao što su margine, automatsko
 prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}),
 sintaksno bojenje itd.
 
 
 Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se
 može odabrati više opcija za rad, kao što su margine, automatsko
 prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}),
 sintaksno bojenje itd.
 
+\subsection{Rad sa prozorima}
+
+``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora
+koji omogućavaju da se vidi više dokumenata, ili čak da se vide
+različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl
++\keystroke{K}\keystroke{O}. Veličina trenutnog prozora se potom može
+povećavati (\Ctrl +\keystroke{K}\keystroke{G}) ili smanjivati (\Ctrl
++\keystroke{K}\keystroke{T}) na uštrb drugih prozora. Prelazak na
+sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl
++\keystroke{K}\keystroke{N}, odnosno na \Ctrl
++\keystroke{K}\keystroke{P}. Komanda \Ctrl +\keystroke{K}\keystroke{I}
+omogućuje da se naizmenično vide svi prozori, ili samo jedan.
+
+\subsection{Problem: ``zamrzavanje'' pri snimanju} ako editor izgleda
+kao da se zaledio verovatno je problem što je stisnuta ``klasična''
+kombinacija za snimanje \Ctrl + \keystroke{S} koja ne radi u
+ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat
+se poništava pritiskom na \Ctrl + \keystroke{Q}. Za više detalja
+pogledati Glavu~\ref{g-smrzavanje}.
+
 \skica{joe i sintaksno bojenje za m2}
 
 \skica{joe i sintaksno bojenje za m2}
 
+\newpage
 \section{Putty}
 
 \emph{Putty} je program koji služi da se pod Windows operativnim
 \section{Putty}
 
 \emph{Putty} je program koji služi da se pod Windows operativnim
@@ -781,13 +1089,15 @@ uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
 lozinke.
 
 \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se}
 lozinke.
 
 \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se}
-
-Putty se može dovesti u stanje da ne prikazuje ispis unosa na ekranu,
-pritiskom na \Ctrl+\keystroke{S} (što je često velik problem jer se
-poklapa sa standardnom prečicom za snimanje u većini grafičkih
-aplikacija). Iz ovog režima rada se može izaći prečicom
-\Ctrl+\keystroke{Q}.
-Ukratko:
+\label{g-smrzavanje}
+
+Putty (kao i većina standardnih linux terminala koji koriste
+softversku kontrolu toka podataka \emph{software flow control}) se
+može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom
+na \Ctrl+\keystroke{S}. Ovo je često velik problem jer se poklapa sa
+standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se
+može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom
+\Ctrl+\keystroke{Q}.  Ukratko:
 \begin{lstlisting}[xleftmargin=10em]
 Do not press
   Ctrl S
 \begin{lstlisting}[xleftmargin=10em]
 Do not press
   Ctrl S
@@ -795,6 +1105,14 @@ If you do
   Ctrl Q
 \end{lstlisting}
 
   Ctrl Q
 \end{lstlisting}
 
+Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena
+kad su brzine protoka bile veoma male, i kada se štedelo time što bi
+se privrmeno isključio protok kada nisu neophodne povratne
+informacije, na primer kod komandi koje se dugo izvršavaju. Naravno
+ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza
+koje se plaćaju po protoku, a nekad se može i dobiti na brzini
+izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana.
+
 \skica{literatura i linkovi izdovjeni na kraju dokumenta}
 
 %\end{multicols}
 \skica{literatura i linkovi izdovjeni na kraju dokumenta}
 
 %\end{multicols}
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner