gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
primer za koriscenje stata i localtime
[os2skripta.git] / skripta-os2.tex
index f74696f..196ed8b 100644 (file)
@@ -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
@@ -492,6 +485,234 @@ BEGIN
 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
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner