gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control systemdiff --git a/skripta-os2.tex b/skripta-os2.tex
--- a/skripta-os2.tex
+++ b/skripta-os2.tex
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
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;
\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;
\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;
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;
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
Listaj(Putanja);
END;
WriteLn;
-END Zad5.
+END Zad4.
\end{codeblock}
\subsection{Stvaranje novih procesa}
\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}