X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=os2skripta.git;a=blobdiff_plain;f=skripta-os2.tex;h=57a5b151641730279501c2405fa86cb9999005ef;hp=48ce00bad10e288a786601477096264a2f042318;hb=5a7e8d6b69325e5d9c135343589a380459e819a2;hpb=0e8e29487850f177c24117f8bc6cfb74edab92b9 diff --git a/skripta-os2.tex b/skripta-os2.tex index 48ce00b..57a5b15 100644 --- a/skripta-os2.tex +++ b/skripta-os2.tex @@ -372,13 +372,6 @@ 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. -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 @@ -387,25 +380,146 @@ 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} -DEFINITION MODULE FOR "C" Lib32; +DEFINITION MODULE FOR "C" libdir; + 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} -\begin{minipage}{0.5\textwidth} +\begin{minipage}{0.45\textwidth} \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{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; @@ -428,15 +542,6 @@ DEFINITION MODULE FOR "C" Lib32; \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; @@ -456,18 +561,22 @@ DEFINITION MODULE FOR "C" Lib32; \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; - 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]; -END Lib32. + PROCEDURE localtime(time: PInt): PTm; + +END LibStat32. \end{codeblock} \begin{codeblock} -MODULE Zad5; +MODULE Zad4; FROM SYSTEM IMPORT ADR; @@ -479,8 +588,9 @@ FROM StrLib IMPORT 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; @@ -492,48 +602,104 @@ VAR 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 - dir: PDir; - entry: PDirEnt; - info: Stat; - c: INTEGER; - Len: CARDINAL; - Putanja: String; + tm: PTm; 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; - 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; - 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; + 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; + WriteString(" "); WriteString(Putanja); WriteLn; END Listaj; BEGIN @@ -544,7 +710,7 @@ BEGIN Listaj(Putanja); END; WriteLn; -END Zad5. +END Zad4. \end{codeblock} \subsection{Stvaranje novih procesa} @@ -634,14 +800,14 @@ END; \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} @@ -667,14 +833,18 @@ END; \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} @@ -743,6 +913,13 @@ sudo apt-get source gm2 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