X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?a=blobdiff_plain;f=skripta-os2.tex;h=53929102384f0add3634805d9823273cecb586d0;hb=refs%2Fheads%2Fwork;hp=196ed8b9341fafe3f2d0e0195a8c904c119e0dfc;hpb=878dceeedfe1c519f6af8a33860e975131e3e420;p=os2skripta.git diff --git a/skripta-os2.tex b/skripta-os2.tex index 196ed8b..5392910 100644 --- a/skripta-os2.tex +++ b/skripta-os2.tex @@ -1,7 +1,7 @@ % skripta-os2.tex % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS % Doni Pracner, Ivan Pribela -% 2011/12 -- 2013/14 +% 2011/12 -- 2014/15 \documentclass[a4paper,twoside]{article} \usepackage[T1]{fontenc} @@ -13,8 +13,8 @@ \newcommand{\inst}{Departman za matematiku i informatiku, PMF, UNS} \newcommand{\autorinst}{\autor \\ \inst} \newcommand{\naslov}{Skripta za vežbe iz predmeta operativni sistemi 2} -\newcommand{\datum}{Februar 2014, Novi Sad} -\newcommand{\verzija}{ver 14a} +\newcommand{\datum}{Februar 2015, Novi Sad} +\newcommand{\verzija}{ver 15a} \usepackage[serbian]{babel} \usepackage{fancyhdr} @@ -167,7 +167,12 @@ pdfauthor={\autor}% % prebreak=\P, % postbreak=\ding{229}\space, language=Modula-2, - xleftmargin=4em + xleftmargin=1em +} + +\lstdefinestyle{codeblock-indent}{ + style=codeblock, + xleftmargin=4em } \lstdefinestyle{terminal}{ @@ -187,6 +192,7 @@ pdfauthor={\autor}% } \lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{} +\lstnewenvironment{codeblock-indent}[1][]{\lstset{style=codeblock-indent,#1}}{} \lstnewenvironment{terminal}{\lstset{style=terminal}}{} % ----------------==================-------------------------------------- @@ -217,7 +223,7 @@ dobijaju i besplatne ISO, PIM i još neke biblioteke. \label{g-prvi-program} Tradicionalni prvi program ``Hello World'' bi izgledao ovako: -\begin{codeblock} +\begin{codeblock-indent} MODULE hello; FROM StrIO IMPORT WriteString, WriteLn; @@ -226,7 +232,7 @@ Tradicionalni prvi program ``Hello World'' bi izgledao ovako: WriteString('hello world'); WriteLn END hello. -\end{codeblock} +\end{codeblock-indent} Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok se ovde @@ -272,13 +278,13 @@ odgovarajućih tipova. Na primer, mapirajmo poziv \kod{system}, koji izvršava prosleđenu komandu u novom \emph{shell}-u. Specifikaciju komande možemo videti sa \begin{terminal} -man system + man system \end{terminal} odnosno videćemo da je poziv definisan na sledeći način: -\begin{codeblock} +\begin{codeblock-indent} int system(const char *command); -\end{codeblock} +\end{codeblock-indent} što znači da vraća ceo broj, a prima jedan argument koji je pokazivač (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda @@ -485,19 +491,24 @@ 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. +\subsubsection{Primer: Ispis osobina pojedinih fajlova} + +O pojedinim fajlovima 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}. +Kao i u prethodnom primeru date su dve verzije definicija nekih +tipova. + \begin{codeblock} DEFINITION MODULE FOR "C" LibStat32; FROM SYSTEM IMPORT @@ -532,9 +543,13 @@ DEFINITION MODULE FOR "C" LibStat32; size: INTEGER; blksize: INTEGER; blocks: INTEGER; - atime: LONGINT; - mtime: LONGINT; - ctime: LONGINT; + atime: INTEGER; + anano: INTEGER; + mtime: INTEGER; + mnano:INTEGER; + ctime:INTEGER; + cnano: INTEGER; + unused:LONGINT; END; \end{codeblock} \end{minipage} @@ -568,6 +583,7 @@ DEFINITION MODULE FOR "C" LibStat32; END; PTm = POINTER TO Tm; PInt = POINTER TO INTEGER; + PStat = POINTER TO Stat; PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER]; PROCEDURE localtime(time: PInt): PTm; @@ -718,9 +734,9 @@ END Zad4. Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira (``račva''). Novi proces je identičan sa originalnim, osim u svom identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način: -\begin{codeblock} +\begin{codeblock-indent} PROCEDURE fork(): INTEGER; -\end{codeblock} +\end{codeblock-indent} Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu koda. Jedino po čemu se razlikuju je vrednost koju je vratio @@ -730,14 +746,14 @@ je ta vrednost jednaka proces identifikatoru (\emph{pid}-u) procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno da dete i roditelj rade različite stvari, to se obično rešava kodom sledećeg oblika: -\begin{codeblock} +\begin{codeblock-indent} pid := fork(); IF pid = 0 THEN (* "detetove" operacije *) ELSE (* "roditeljske" operacije *) END; -\end{codeblock} +\end{codeblock-indent} Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u originalnom procesu sa efektom da se proces uspava dokle god neki od @@ -880,20 +896,20 @@ je Lubuntu, ako su performanse problematične. Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem -\begin{codeblock} +\begin{codeblock-indent} # # GNU Modula-2 repo # -deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main -deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main -\end{codeblock} +deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main +deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main +\end{codeblock-indent} Alternativno se mogu koristiti sledeće komande: \begin{terminal} -sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main" -sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main" +sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main" +sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main" \end{terminal} Većina sistema omogućava i da se ovo uradi preko nekih grafičkih @@ -913,6 +929,13 @@ sudo apt-get source gm2 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa. +\paragraph{Napomena:} Prilikom unapredjivanja Linux distribucije na +sledeću verziju (npr. 13.10 na 14.04) se standardno onemogućavaju +dodati izvori softvera i potrebno ih je ručno ponovo upaliti. Ovo se +može uraditi otvoranjem \kod{/etc/apt/sources.list} i uklonjanjem +``\#'' sa početka redova koje želimo da koristimo ponovo ili +korišćenjem adekvatnih vizuelnih alata. + \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi} Pri pokušaju kompajliranja se na nekim sistemima može desiti da