gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: e148eb5)
raw | patch | inline | side by side (parent: e148eb5)
author | Doni Pracner <quinnuendo@gmail.com> | |
Mon, 17 Feb 2014 19:25:43 +0000 (20:25 +0100) | ||
committer | Doni Pracner <quinnuendo@gmail.com> | |
Mon, 17 Feb 2014 19:25:43 +0000 (20:25 +0100) |
skripta-os2.tex | patch | blob | history |
diff --git a/skripta-os2.tex b/skripta-os2.tex
index f74696f9390bcbf7937a8081425f0fb779cff4c4..196ed8b9341fafe3f2d0e0195a8c904c119e0dfc 100644 (file)
--- 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
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;
+ mode: INTEGER;
+ nlink: LONGINT;
+ uid: INTEGER;
+ gid: INTEGER;
+ pad1: LONGINT;
+ rdev: INTEGER;
+ size: INTEGER;
+ blksize: INTEGER;
+ blocks: INTEGER;
+ atime: LONGINT;
+ mtime: LONGINT;
+ ctime: LONGINT;
+ END;
+ \end{codeblock}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{codeblock}[frame=single,frameround=tttt]
+(* types for 64 bit *)
+ TYPE
+ Stat = RECORD
+ dev: LONGINT;
+ ino: LONGINT;
+ nlink: LONGINT;
+ mode: INTEGER;
+ uid: INTEGER;
+ gid: INTEGER;
+ pad1: INTEGER;
+ rdev: LONGINT;
+ size: LONGINT;
+ blksize: LONGINT;
+ blocks: LONGINT;
+ atime: LONGINT;
+ mtime: LONGINT;
+ ctime: LONGINT;
+ END;
+ \end{codeblock}
+\end{minipage}
+\begin{codeblock}
+ Tm = RECORD
+ sec, min, hour,
+ mday, mon, year,
+ wday, yday, isdst: INTEGER;
+ END;
+ PTm = POINTER TO Tm;
+ PInt = POINTER TO INTEGER;
+
+ PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
+ PROCEDURE localtime(time: PInt): PTm;
+
+END LibStat32.
+\end{codeblock}
+
+\begin{codeblock}
+MODULE Zad4;
+
+FROM SYSTEM IMPORT
+ ADR;
+FROM StrIO IMPORT
+ WriteString, WriteLn;
+FROM NumberIO IMPORT
+ WriteInt;
+FROM StrLib IMPORT
+ StrLen, StrConCat;
+FROM Args IMPORT
+ Narg, GetArg;
+FROM LibStat32 IMPORT
+ stat, localtime, Stat, PTm;
+IMPORT LibStat32;
+FROM errno IMPORT
+ geterrno;
+
+TYPE
+ String = ARRAY [0..1023] OF CHAR;
+
+VAR
+ Putanja: String;
+ n, i: INTEGER;
+ ok: BOOLEAN;
+
+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
+ tm: PTm;
+BEGIN
+ tm:= localtime(ADR(time));
+ IF tm # NIL THEN
+ WriteInt(tm^.year + 1900, 0);
+ WriteString("-");
+ IF tm^.mon < 9 THEN
+ WriteString("0");
+ END;
+ WriteInt(tm^.mon + 1, 0);
+ WriteString("-");
+ IF tm^.mday < 10 THEN
+ WriteString("0");
+ END;
+ 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
+ n:= Narg();
+ FOR i:= 1 TO n - 1 DO
+ ok:= GetArg(Putanja, i);
+ WriteLn;
+ Listaj(Putanja);
+ END;
+ WriteLn;
+END Zad4.
+\end{codeblock}
+
\subsection{Stvaranje novih procesa}
Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira