gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
primer za koriscenje stata i localtime
authorDoni Pracner <quinnuendo@gmail.com>
Mon, 17 Feb 2014 19:25:43 +0000 (20:25 +0100)
committerDoni Pracner <quinnuendo@gmail.com>
Mon, 17 Feb 2014 19:25:43 +0000 (20:25 +0100)
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.
 
 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
 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}
 
 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
 \subsection{Stvaranje novih procesa}
 
 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner