From: Doni Pracner Date: Mon, 17 Feb 2014 19:25:43 +0000 (+0100) Subject: primer za koriscenje stata i localtime X-Git-Tag: v14a~5 X-Git-Url: https://svarog.pmf.uns.ac.rs/gitweb/?a=commitdiff_plain;h=878dceeedfe1c519f6af8a33860e975131e3e420;p=os2skripta.git primer za koriscenje stata i localtime --- diff --git a/skripta-os2.tex b/skripta-os2.tex index f74696f..196ed8b 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 @@ -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