gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Premestanje nekih delova da moze lakse region da se kompajlira.
[os2skripta.git] / skripta-os2.tex
index 0af44a5..a1a4002 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 -- 2013/14
+% 2011/12 -- 2014/15
 
 \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 2014, Novi Sad}
-\newcommand{\verzija}{ver 14a}
+\newcommand{\datum}{Februar 2015, Novi Sad}
+\newcommand{\verzija}{ver 15a}
 
 \usepackage[serbian]{babel}
 \usepackage{fancyhdr}
 
 \usepackage[serbian]{babel}
 \usepackage{fancyhdr}
@@ -72,7 +72,80 @@ pdfauthor={\autor}%
 %margine
 \usepackage[top=2cm, bottom=2cm, left=2.5cm, right=2cm]{geometry}
 
 %margine
 \usepackage[top=2cm, bottom=2cm, left=2.5cm, right=2cm]{geometry}
 
-\begin{document}
+% theorems, definition etc.
+%''''''''''''''''''''''''''
+
+\theoremstyle{definition}
+\newtheorem{def1}{Definicija}
+\theoremstyle{plain}
+\newtheorem{theo}{Teorema}
+\newtheorem{lema}{Lema}
+
+\lstloadlanguages{Modula-2,C++}
+
+\lstset{
+       basicstyle=\ttfamily,
+        showstringspaces=false,
+       breaklines=true
+}
+
+\lstdefinestyle{codeblock}{
+%      basicstyle=\footnotesize\ttfamily,
+        keywordstyle=\textbf,
+        columns=[l]fixed,
+        breakatwhitespace=true,
+%        prebreak=\P,
+%        postbreak=\ding{229}\space,
+        language=Modula-2,
+        xleftmargin=1em
+}
+
+\lstdefinestyle{codeblock-indent}{
+  style=codeblock,
+  xleftmargin=4em
+}
+
+\lstdefinestyle{terminal}{
+  frame=lt,
+%  frameround=fftt,
+  backgroundcolor=\color[gray]{.95},
+% prebreak=\P,
+  postbreak=\ding{229}\space,
+  xleftmargin=2em
+}
+
+\lstdefinestyle{numcodeblock}{
+  style=codeblock,
+  numbers=left,
+  firstnumber=1,
+  stepnumber=1
+}
+
+\lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{}
+\lstnewenvironment{codeblock-indent}[1][]{\lstset{style=codeblock-indent,#1}}{}
+\lstnewenvironment{terminal}{\lstset{style=terminal}}{}
+
+%% specijalni blokovi koji služe kao podsetnici u radu ili napomene
+\newcommand{\skica}[1]{
+    \noindent \framebox{\parbox[c]{0.9\textwidth}{  {\small** \textit{#1}  }}
+    \newline }
+}
+
+\newcommand{\skicas}[1]{
+    \framebox{* \textit{#1} *}
+}
+
+%boldovane skice visokog prioriteta
+\newcommand{\skicab}[1]{
+  \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small***
+        \textbf{#1} }} \newline } }
+
+\newcommand{\kod}[1]{{\small\texttt{#1}}}
+
+% ako je sledeci red odkomentarisan nista od skica nece biti ispisano
+% u finalni dokument
+
+ \renewcommand{\skica}[1]{}
 
 %customize the itemize environments
 
 
 %customize the itemize environments
 
@@ -85,6 +158,8 @@ pdfauthor={\autor}%
   \setlength{\topsep}{-1cm}
 
 }
   \setlength{\topsep}{-1cm}
 
 }
+ \begin{document}
+
 
 %% ovi redovi daju header i footer
 
 
 %% ovi redovi daju header i footer
 
@@ -117,74 +192,10 @@ pdfauthor={\autor}%
 %\setlength{\textheight}{620pt}
 
 
 %\setlength{\textheight}{620pt}
 
 
-%% specijalni blokovi koji služe kao podsetnici u radu ili napomene
-\newcommand{\skica}[1]{
-    \noindent \framebox{\parbox[c]{0.9\textwidth}{  {\small** \textit{#1}  }}
-    \newline }
-}
-
-\newcommand{\skicas}[1]{
-    \framebox{* \textit{#1} *}
-}
-
-%boldovane skice visokog prioriteta
-\newcommand{\skicab}[1]{
-  \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small***
-        \textbf{#1} }} \newline } }
-
-\newcommand{\kod}[1]{{\small\texttt{#1}}}
-
-% ako je sledeci red odkomentarisan nista od skica nece biti ispisano
-% u finalni dokument
-
- \renewcommand{\skica}[1]{}
 
 
 \maketitle
 
 
 
 \maketitle
 
-% theorems, definition etc.
-%''''''''''''''''''''''''''
-
-\theoremstyle{definition}
-\newtheorem{def1}{Definicija}
-\theoremstyle{plain}
-\newtheorem{theo}{Teorema}
-\newtheorem{lema}{Lema}
-
-\lstloadlanguages{Modula-2,C++}
-
-\lstset{
-       basicstyle=\ttfamily,
-        showstringspaces=false,
-       breaklines=true
-}
-
-\lstdefinestyle{codeblock}{
-%      basicstyle=\footnotesize\ttfamily,
-        keywordstyle=\textbf,
-        columns=[l]fixed,
-        breakatwhitespace=true,
-%        prebreak=\P,
-%        postbreak=\ding{229}\space,
-        language=Modula-2,
-        xleftmargin=4em
-}
-
-\lstdefinestyle{terminal}{
-  frame=l,
-%  frameround=fftt,
-  xleftmargin=4em
-}
-
-\lstdefinestyle{numcodeblock}{
-  style=codeblock,
-  numbers=left,
-  firstnumber=1,
-  stepnumber=1
-}
-
-\lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{}
-\lstnewenvironment{terminal}{\lstset{style=terminal}}{}
 
 % ----------------==================--------------------------------------
 %                 Pravi pocetak rada
 
 % ----------------==================--------------------------------------
 %                 Pravi pocetak rada
@@ -214,7 +225,7 @@ dobijaju i besplatne ISO, PIM i još neke biblioteke.
 \label{g-prvi-program}
 
 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
 \label{g-prvi-program}
 
 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
-\begin{codeblock}
+\begin{codeblock-indent}
   MODULE hello;
 
   FROM StrIO IMPORT WriteString, WriteLn;
   MODULE hello;
 
   FROM StrIO IMPORT WriteString, WriteLn;
@@ -223,7 +234,7 @@ Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
      WriteString('hello world'); 
      WriteLn
   END hello.
      WriteString('hello world'); 
      WriteLn
   END hello.
-\end{codeblock}
+\end{codeblock-indent}
 
 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
 XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok se ovde
 
 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
 XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok se ovde
@@ -234,7 +245,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:
@@ -247,7 +258,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:
@@ -269,13 +280,13 @@ odgovarajućih tipova.  Na primer, mapirajmo poziv \kod{system}, koji
 izvršava prosleđenu komandu u novom \emph{shell}-u. Specifikaciju
 komande možemo videti sa
 \begin{terminal}
 izvršava prosleđenu komandu u novom \emph{shell}-u. Specifikaciju
 komande možemo videti sa
 \begin{terminal}
-man system
+  man system
 \end{terminal}
 
 odnosno videćemo da je poziv definisan na sledeći način:
 \end{terminal}
 
 odnosno videćemo da je poziv definisan na sledeći način:
-\begin{codeblock}
+\begin{codeblock-indent}
 int system(const char *command);
 int system(const char *command);
-\end{codeblock}
+\end{codeblock-indent}
 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
@@ -369,40 +380,159 @@ 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;
     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{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}
+
+\subsubsection{Primer: Ispis osobina pojedinih fajlova}
+
+O pojedinim fajlovima 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}.
+
+Kao i u prethodnom primeru date su dve verzije definicija nekih
+tipova.
+
+\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;
@@ -415,9 +545,13 @@ DEFINITION MODULE FOR "C" Lib32;
          size: INTEGER;
          blksize: INTEGER;
          blocks: INTEGER;
          size: INTEGER;
          blksize: INTEGER;
          blocks: INTEGER;
-         atime: LONGINT;
-         mtime: LONGINT;
-         ctime: LONGINT;
+         atime: INTEGER;
+         anano: INTEGER;
+         mtime: INTEGER;
+         mnano:INTEGER;
+         ctime:INTEGER;
+         cnano: INTEGER;
+         unused:LONGINT;
     END;
   \end{codeblock}
 \end{minipage}
     END;
   \end{codeblock}
 \end{minipage}
@@ -425,15 +559,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;
@@ -453,18 +578,23 @@ 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;
+    PStat = POINTER TO Stat;
 
 
-  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;
@@ -476,8 +606,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;
 
@@ -489,48 +620,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
@@ -541,7 +728,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}
@@ -549,9 +736,9 @@ END Zad5.
 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
 (``račva''). Novi proces je identičan sa originalnim, osim u svom
 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
 (``račva''). Novi proces je identičan sa originalnim, osim u svom
 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
-\begin{codeblock}
+\begin{codeblock-indent}
 PROCEDURE fork(): INTEGER;
 PROCEDURE fork(): INTEGER;
-\end{codeblock}
+\end{codeblock-indent}
 
 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
 
 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
@@ -561,14 +748,14 @@ je ta vrednost jednaka proces identifikatoru (\emph{pid}-u)
 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
 da dete i roditelj rade različite stvari, to se obično rešava kodom
 sledećeg oblika:
 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
 da dete i roditelj rade različite stvari, to se obično rešava kodom
 sledećeg oblika:
-\begin{codeblock}
+\begin{codeblock-indent}
 pid := fork();
 IF pid = 0 THEN
    (* "detetove" operacije *)
 ELSE
    (* "roditeljske" operacije *)
 END;
 pid := fork();
 IF pid = 0 THEN
    (* "detetove" operacije *)
 ELSE
    (* "roditeljske" operacije *)
 END;
-\end{codeblock}
+\end{codeblock-indent}
 
 Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u
 originalnom procesu sa efektom da se proces uspava dokle god neki od
 
 Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u
 originalnom procesu sa efektom da se proces uspava dokle god neki od
@@ -631,14 +818,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}
@@ -647,15 +834,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}
@@ -663,14 +851,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}
 
@@ -706,20 +898,20 @@ je Lubuntu, ako su performanse problematične.
 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
 menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem
 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
 menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem
-\begin{codeblock}
+\begin{codeblock-indent}
 #
 #  GNU Modula-2 repo
 #
 
 #
 #  GNU Modula-2 repo
 #
 
-deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main 
-deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main
-\end{codeblock}
+deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main 
+deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main
+\end{codeblock-indent}
 
 Alternativno se mogu koristiti sledeće komande:
 
 \begin{terminal}
 
 Alternativno se mogu koristiti sledeće komande:
 
 \begin{terminal}
-sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
-sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
+sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main"
+sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main"
 \end{terminal}
 
 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
 \end{terminal}
 
 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
@@ -739,6 +931,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
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner