gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Vizuelna promena uvlacenja koda u odnosu na tekst.
[os2skripta.git] / skripta-os2.tex
1 % skripta-os2.tex
2 % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS
3 % Doni Pracner, Ivan Pribela
4 % 2011/12 -- 2013/14
6 \documentclass[a4paper,twoside]{article}
7 \usepackage[T1]{fontenc}
8 \usepackage[utf8]{inputenc}%definišemo da je ulaz utf-8 fajl
10 % osnovne informacije koje ce se prikazati na naslovnoj strani,
11 % kao i u informacijama u generisanom pdfu
12 \newcommand{\autor}{Doni Pracner, Ivan Pribela}
13 \newcommand{\inst}{Departman za matematiku i informatiku, PMF, UNS}
14 \newcommand{\autorinst}{\autor \\ \inst}
15 \newcommand{\naslov}{Skripta za vežbe iz predmeta operativni sistemi 2}
16 \newcommand{\datum}{Februar 2014, Novi Sad}
17 \newcommand{\verzija}{ver 14a}
19 \usepackage[serbian]{babel}
20 \usepackage{fancyhdr}
21 \pagestyle{fancy}
23 \title{\naslov \ -- \verzija}
24 \author{\autor \\ \inst}
25 \date{\datum}
27 %change the default font
28 \usepackage{lmodern}
29 \usepackage{beramono}
30 \renewcommand{\familydefault}{\sfdefault}
32 \usepackage{pifont}
34 %podesavanja outputa za pdf verzije
35 \usepackage[bookmarks,pdffitwindow=false,unicode=true,%
36 pdftitle={\naslov \ -- \verzija},%
37 pdfauthor={\autor}%
38 ]{hyperref}
40 \usepackage{graphicx}
41 \usepackage{listings}
42 \usepackage{amsthm}
43 \usepackage{amsmath}
44 \usepackage{latexsym}
45 \usepackage{multicol}
47 %\usepackage{keystroke}
48 % ispod je dodata alternativa za ovaj paket
50 \usepackage{tikz}
51 \usetikzlibrary{shadows}
53 \newcommand*\keystroke[1]{%
54 \tikz[baseline=(key.base)]
55 \node[%
56 draw,
57 fill=white,
58 drop shadow={shadow xshift=0.2ex,shadow yshift=-0.2ex,fill=black,opacity=0.75},
59 rectangle,
60 rounded corners=2pt,
61 inner sep=1pt,
62 line width=0.5pt,
63 font=\small\sffamily
64 ](key) {#1\strut}
65 ;
66 }
68 \newcommand*\Ctrl{\keystroke{Ctrl}}
69 \newcommand*\Tab{\keystroke{Tab}}
70 \newcommand*\Esc{\keystroke{Esc}}
72 %margine
73 \usepackage[top=2cm, bottom=2cm, left=2.5cm, right=2cm]{geometry}
75 \begin{document}
77 %customize the itemize environments
79 \let\olditemize=\itemize
80 \def\itemize{
81 \olditemize
82 \setlength{\itemsep}{1pt}
83 \setlength{\parskip}{0pt}
84 \setlength{\parsep}{0pt}
85 \setlength{\topsep}{-1cm}
87 }
89 %% ovi redovi daju header i footer
91 \renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
92 \fancyhf{} % delete current setting for header and footer
93 %\fancyfoot[C]{\thepage}
95 \fancyhead[LO]{\bfseries\rightmark}
96 \fancyhead[RO]{\thepage}
98 \fancyhead[RE]{Operativni sistemi 2 -- skripta}
99 \fancyhead[LE]{\thepage}
101 \renewcommand{\headrulewidth}{0.5pt}
102 \renewcommand{\headwidth}{\textwidth}
104 %\renewcommand{\footrulewidth}{0.5pt}
105 %\addtolength{\headheight}{0.5pt} % make space for the rule
106 \fancypagestyle{plain}{%
107 \fancyhead{} % get rid of headers on plain pages
108 \fancyfoot{}
109 \renewcommand{\headrulewidth}{0pt} % and the line
110 \renewcommand{\footrulewidth}{0pt} % and the line
112 \renewcommand{\headheight}{15pt}
114 %promene u marginama:
115 %\setlength{\marginparwidth}{32pt}
116 %\setlength{\textwidth}{620pt}
117 %\setlength{\textheight}{620pt}
120 %% specijalni blokovi koji služe kao podsetnici u radu ili napomene
121 \newcommand{\skica}[1]{
122 \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small** \textit{#1} }}
123 \newline }
126 \newcommand{\skicas}[1]{
127 \framebox{* \textit{#1} *}
130 %boldovane skice visokog prioriteta
131 \newcommand{\skicab}[1]{
132 \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small***
133 \textbf{#1} }} \newline } }
135 \newcommand{\kod}[1]{{\small\texttt{#1}}}
137 % ako je sledeci red odkomentarisan nista od skica nece biti ispisano
138 % u finalni dokument
140 \renewcommand{\skica}[1]{}
143 \maketitle
145 % theorems, definition etc.
146 %''''''''''''''''''''''''''
148 \theoremstyle{definition}
149 \newtheorem{def1}{Definicija}
150 \theoremstyle{plain}
151 \newtheorem{theo}{Teorema}
152 \newtheorem{lema}{Lema}
154 \lstloadlanguages{Modula-2,C++}
156 \lstset{
157 basicstyle=\ttfamily,
158 showstringspaces=false,
159 breaklines=true
162 \lstdefinestyle{codeblock}{
163 % basicstyle=\footnotesize\ttfamily,
164 keywordstyle=\textbf,
165 columns=[l]fixed,
166 breakatwhitespace=true,
167 % prebreak=\P,
168 % postbreak=\ding{229}\space,
169 language=Modula-2,
170 xleftmargin=1em
173 \lstdefinestyle{codeblock-indent}{
174 style=codeblock,
175 xleftmargin=4em
178 \lstdefinestyle{terminal}{
179 frame=lt,
180 % frameround=fftt,
181 backgroundcolor=\color[gray]{.95},
182 % prebreak=\P,
183 postbreak=\ding{229}\space,
184 xleftmargin=2em
187 \lstdefinestyle{numcodeblock}{
188 style=codeblock,
189 numbers=left,
190 firstnumber=1,
191 stepnumber=1
194 \lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{}
195 \lstnewenvironment{codeblock-indent}[1][]{\lstset{style=codeblock-indent,#1}}{}
196 \lstnewenvironment{terminal}{\lstset{style=terminal}}{}
198 % ----------------==================--------------------------------------
199 % Pravi pocetak rada
202 Programi u ovoj skripti su testirani sa kompajlerom ``GNU Modula 2'' (u
203 daljem tekstu često skraćeno na \emph{gm2}), pod operativnim
204 sistemima iz Debian porodice.
206 \tableofcontents
208 \newpage
210 %\begin{multicols}{2}
212 \section{GNU Modula 2}
214 \emph{GNU Modula 2} (u daljem tekstu često skraćeno na \emph{gm2}) je
215 pred procesor (\emph{front end}) za GNU kolekciju kompajlera
216 (GCC). Podržava nekoliko dijalekata jezika ``Modula 2'' --
217 najznačajniji su ISO standard i nekoliko varijacija koje je originalni
218 autor Niklaus Virt (\emph{Niklaus Wirth}) opisao u različitima
219 verzijama knjige \emph{Programming in Modula 2 (PIM)}. Uz kompajler se
220 dobijaju i besplatne ISO, PIM i još neke biblioteke.
222 \subsection{Prvi program u gm2 }
223 \label{g-prvi-program}
225 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
226 \begin{codeblock-indent}
227 MODULE hello;
229 FROM StrIO IMPORT WriteString, WriteLn;
231 BEGIN
232 WriteString('hello world');
233 WriteLn
234 END hello.
235 \end{codeblock-indent}
237 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
238 XDS/TopSpeed verzije M2, tamo je sve bilo u \kod{InOut}, dok se ovde
239 koristi \kod{StrIO} za rad sa stringovima, \kod{NumberIO} za rad sa
240 brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se
241 korišćenje zvanične stranice:
242 \url{http://nongnu.org/gm2/libraries.html}, odnosno
243 \url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne
244 biblioteke.
246 Predpostavimo da je fajl napravljen u trenutnom direktorijumu,
247 koristeći neki tesktualni editor (u dodatku~\ref{app-joe} je opisan
248 ``joe'' koji se koristi na vežbama). Kreirani fajl se tada može
249 prevesti u izvršnu verziju sledećom komandom:
250 \begin{terminal}
251 gm2 hello.mod
252 \end{terminal}
254 Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se
255 napraviti fajl \kod{a.out}, koji se može pokrenuti sa:
256 \begin{terminal}
257 ./a.out
258 \end{terminal}
259 pri čemu \kod{./} naglašava da hoćemo da pokrenemo program iz trenutnog
260 direktorijuma (koji se označava tačkom). Ako je potrebno da
261 izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg
262 tipa:
263 \begin{terminal}
264 gm2 -o imeIzlaznogFajla ulaznifajl
265 \end{terminal}
267 Za dalje opcije kompajlera konsultovati \kod{gm2 -{}-help} i zvaničnu
268 stranicu kompajlera.
269 %ovde je trebalo -{}- da razdvoji dva minusa, jer se inače tumače kao jedan.
271 \subsection{Korišćenje sistemskih poziva}
273 Mapiranje procedura na sistemske pozive se može izvršiti preko
274 specijalnog definicionog modula koji u zaglavlju sadrži ključne reči
275 \kod{FOR "{}C"} u kome se navode imena procedura koja se poklapaju sa
276 imenima sistemskih poziva i imaju parametre i povratne vrednosti
277 odgovarajućih tipova. Na primer, mapirajmo poziv \kod{system}, koji
278 izvršava prosleđenu komandu u novom \emph{shell}-u. Specifikaciju
279 komande možemo videti sa
280 \begin{terminal}
281 man system
282 \end{terminal}
284 odnosno videćemo da je poziv definisan na sledeći način:
285 \begin{codeblock-indent}
286 int system(const char *command);
287 \end{codeblock-indent}
288 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
289 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
290 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
291 sastoji od svih sledećih znakova u memoriji dokle god se ne naiđe na
292 0C. Srećom, sve ovo se automatski mapira kreiranjem sledećeg modula:
294 \begin{codeblock}
295 DEFINITION MODULE FOR "C" Lib;
297 EXPORT UNQUALIFIED system;
299 PROCEDURE system(command: ARRAY OF CHAR): INTEGER;
301 END Lib.
302 \end{codeblock}
304 Nije potrebno praviti prazne implementacione module. Iz ovakvog modula
305 se mogu uvoziti i koristiti procedure kao i iz bilo kakvog
306 ``normalnog'' modula, kao što se može videti u sledećem primeru, koju
307 od korisnika učitava stringove i pokušava da ih izvrši kao da su uneti
308 u komandnoj liniji, dokle god korisnik ne unese reč ``kraj'':
309 \begin{codeblock}
310 MODULE Zad2;
312 FROM StrIO IMPORT
313 ReadString, WriteString, WriteLn;
314 FROM StrLib IMPORT
315 StrEqual;
316 FROM Lib IMPORT
317 system;
319 TYPE
320 String = ARRAY [0..1023] OF CHAR;
322 VAR
323 Komanda: String;
325 PROCEDURE Izvrsi(Komanda: ARRAY OF CHAR);
326 VAR
327 c: INTEGER;
328 BEGIN
329 c:= system(Komanda);
330 END Izvrsi;
332 BEGIN
333 WriteString("?> "); ReadString(Komanda);
334 WHILE NOT StrEqual(Komanda, "kraj") DO
335 Izvrsi(Komanda);
336 WriteString("?> "); ReadString(Komanda);
337 END;
338 END Zad2.
339 \end{codeblock}
341 Prilikom mapiranja sistemskih poziva je moguće koristiti ``...'' na
342 kraju liste argumenata da se označi da je moguće proslediti
343 proizvoljan broj argumenata nakon navedenih, koji će biti premapirani
344 na odgovarajuće tipove podataka. Takođe je moguće i označiti da se
345 povratna vrednost procedure ne mora koristiti. U gornjem primeru je
346 mogla funkcija da se definiše kao \kod{PROCEDURE system(command: ARRAY
347 OF CHAR): [INTEGER];} i tada bi mogla se poziva kao obična procedura
348 bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna
349 vrednost.
351 Neki primeri pretvaranja tipova su dati u Tabeli~\ref{t-pretvaranje-tipova}, preuzetoj sa \url{http://www.nongnu.org/gm2/interface_to_c.html}.
353 \begin{table}[htp]
354 \begin{center}
355 \begin{tabular}{lll}
356 Stvarni parametar & Konverzija & Tip vrednosti koji će biti prosleđen\\
357 \hline
358 123 & - & long long int\\
359 "hello world" & - & const char *\\
360 a: ARRAY OF CHAR & ADR(a) & char *\\
361 a: ARRAY [0..5] OF CHAR& ADR(a) & char *\\
362 3.14 & - & long double
363 \end{tabular}
364 \end{center}
365 \caption{Tabela pretvaranja tipova\label{t-pretvaranje-tipova}}
366 \end{table}
368 \subsubsection{Primer: Izlistavanje sadržaja direktorijuma}
370 Korišćenje sistemskih poziva se može ilustrovati primerom čitanja
371 sadržaja direktorijuma, komandama \kod{opendir}, \kod{readdir} i
372 \kod{closedir}. Prva komanda otvara prosledjenu putanju i vraća
373 pokazivač na otvoreni direktorijum. Komanda \kod{readdir} prima ovakav
374 pokazivač kao ulazni parametar, a vraća pokazivač na slog koji
375 predstavlja sledeću stavku u otvorenom direktorijumu ili \kod{NIL} ako
376 više nema ničega. Poslednja komanda, \kod{closedir}, se izvodi na
377 kraju i zatvara otvoreni direktorijum. Bitno je zatvarati otvorene
378 resurse jer je moguće da sistem odbije da otvori novi ako ih
379 proces već ima previše otvorenih.
381 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
382 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
383 sistema, a naročito utiče da li je u pitanju~32--bitni, ili~64--bitni
384 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
385 Prva je testirana na Lubuntu 11.10 i 12.04 32bit, a druga je testirana
386 na Kubuntu 11.10 i 12.10 64bit.
388 \begin{codeblock}
389 DEFINITION MODULE FOR "C" libdir;
391 FROM SYSTEM IMPORT
392 ADDRESS, BYTE;
394 EXPORT UNQUALIFIED opendir, readdir, closedir, PDir, DirEnt, PDirEnt;
395 \end{codeblock}
396 \begin{minipage}{0.45\textwidth}
397 \begin{codeblock}
398 (* types for 32 bit *)
399 TYPE
400 PDir = ADDRESS;
401 DirEnt = RECORD
402 ino: INTEGER;
403 off: INTEGER;
404 reclen: SHORTCARD;
405 type: BYTE;
406 name: ARRAY [0..255] OF CHAR;
407 END;
408 PDirEnt = POINTER TO DirEnt;
409 \end{codeblock}
410 \end{minipage}
411 \begin{minipage}{0.45\textwidth}
412 \begin{codeblock}[frame=single,frameround=tttt]
413 (* types for 64 bit *)
414 TYPE
415 PDir = ADDRESS;
416 DirEnt = RECORD
417 ino: LONGINT;
418 off: LONGINT;
419 reclen: SHORTCARD;
420 type: BYTE;
421 name: ARRAY [0..255] OF CHAR;
422 END;
423 PDirEnt = POINTER TO DirEnt;
424 \end{codeblock}
425 \end{minipage}
426 \begin{codeblock}
427 PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
428 PROCEDURE readdir(dirp: PDir): PDirEnt;
429 PROCEDURE closedir(dirp: PDir): [INTEGER];
431 END libdir.
432 \end{codeblock}
434 \begin{codeblock}
435 MODULE Zad3;
437 FROM StrIO IMPORT
438 WriteString, WriteLn;
439 FROM NumberIO IMPORT
440 WriteInt;
441 FROM Args IMPORT
442 Narg, GetArg;
443 FROM libdir IMPORT
444 opendir, readdir, closedir, PDir, PDirEnt;
445 FROM errno IMPORT
446 geterrno;
448 TYPE
449 String = ARRAY [0..1023] OF CHAR;
451 VAR
452 Putanja: String;
453 n, i: INTEGER;
454 ok: BOOLEAN;
456 PROCEDURE Listaj(Ime: ARRAY OF CHAR);
457 VAR
458 dir: PDir;
459 entry: PDirEnt;
460 c: INTEGER;
461 BEGIN
462 WriteString("Folder "); WriteString(Ime); WriteLn;
463 dir:= opendir(Ime);
464 IF dir = NIL THEN
465 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
466 WriteString(" Ne mogu da otvorim direktorijum."); WriteLn();
467 ELSE
468 entry:= readdir(dir);
469 WHILE entry # NIL DO
470 IF entry^.name[0] # "." THEN
471 WriteString(" "); WriteString(entry^.name); WriteLn;
472 END;
473 entry:= readdir(dir);
474 END;
475 c:= closedir(dir);
476 IF c = -1 THEN
477 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
478 WriteString(" Ne mogu da zatvorim direktorijum."); WriteLn();
479 END;
480 END;
481 END Listaj;
483 BEGIN
484 n:= Narg();
485 FOR i:= 1 TO n - 1 DO
486 ok:= GetArg(Putanja, i);
487 WriteLn;
488 Listaj(Putanja);
489 END;
490 WriteLn;
491 END Zad3.
492 \end{codeblock}
494 Kada imamo imena stavki iz direktorijuma o njima možemo dobiti više
495 informacija koristeći sistemski poziv \kod{stat}. On prima dva
496 argumenta, prvi je \emph{puna} putanja do fajla, a drugi je pokazivač
497 na strukturu u koju će komanda upisati podatke. Obratiti pažnju da
498 zbog ovoga struktura već mora postojati u memoriji, ili kao lokalna
499 promenljiva odgovarajućeg slogovnog tipa, ili dinamički alocirana
500 korišćenjem pokazivača na nju.
502 Linux i mnogi drugi srodni sistemi za internu prezentaciju vremena
503 koriste broj sekundi od početka ``epohe'', odnosno od prvog januara
504 1970 godine. Za konverziju u klasičnije mere vremena se može koristiti
505 poziv \kod{localtime}.
507 \begin{codeblock}
508 DEFINITION MODULE FOR "C" LibStat32;
509 FROM SYSTEM IMPORT
510 ADDRESS, BYTE;
511 EXPORT UNQUALIFIED stat, localtime,
512 Stat, PStat, Tm, PTm, PInt,
513 fifo, character, directory, block, regular, network, link, socket;
515 CONST
516 fifo = 1;
517 character = 2;
518 directory = 4;
519 block = 6;
520 regular = 8;
521 network = 9;
522 link = 10;
523 socket = 12;
524 \end{codeblock}
525 \begin{minipage}{0.45\textwidth}
526 \begin{codeblock}
527 (* types for 32 bit *)
528 TYPE
529 Stat = RECORD
530 dev: LONGINT;
531 ino: LONGINT;
532 mode: INTEGER;
533 nlink: LONGINT;
534 uid: INTEGER;
535 gid: INTEGER;
536 pad1: LONGINT;
537 rdev: INTEGER;
538 size: INTEGER;
539 blksize: INTEGER;
540 blocks: INTEGER;
541 atime: LONGINT;
542 mtime: LONGINT;
543 ctime: LONGINT;
544 END;
545 \end{codeblock}
546 \end{minipage}
547 \begin{minipage}{0.45\textwidth}
548 \begin{codeblock}[frame=single,frameround=tttt]
549 (* types for 64 bit *)
550 TYPE
551 Stat = RECORD
552 dev: LONGINT;
553 ino: LONGINT;
554 nlink: LONGINT;
555 mode: INTEGER;
556 uid: INTEGER;
557 gid: INTEGER;
558 pad1: INTEGER;
559 rdev: LONGINT;
560 size: LONGINT;
561 blksize: LONGINT;
562 blocks: LONGINT;
563 atime: LONGINT;
564 mtime: LONGINT;
565 ctime: LONGINT;
566 END;
567 \end{codeblock}
568 \end{minipage}
569 \begin{codeblock}
570 Tm = RECORD
571 sec, min, hour,
572 mday, mon, year,
573 wday, yday, isdst: INTEGER;
574 END;
575 PTm = POINTER TO Tm;
576 PInt = POINTER TO INTEGER;
578 PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
579 PROCEDURE localtime(time: PInt): PTm;
581 END LibStat32.
582 \end{codeblock}
584 \begin{codeblock}
585 MODULE Zad4;
587 FROM SYSTEM IMPORT
588 ADR;
589 FROM StrIO IMPORT
590 WriteString, WriteLn;
591 FROM NumberIO IMPORT
592 WriteInt;
593 FROM StrLib IMPORT
594 StrLen, StrConCat;
595 FROM Args IMPORT
596 Narg, GetArg;
597 FROM LibStat32 IMPORT
598 stat, localtime, Stat, PTm;
599 IMPORT LibStat32;
600 FROM errno IMPORT
601 geterrno;
603 TYPE
604 String = ARRAY [0..1023] OF CHAR;
606 VAR
607 Putanja: String;
608 n, i: INTEGER;
609 ok: BOOLEAN;
611 PROCEDURE WriteMode(mode: INTEGER);
613 PROCEDURE WriteType(type: INTEGER);
614 BEGIN
615 IF type = lib32.fifo THEN
616 WriteString("f");
617 ELSIF type = lib32.character THEN
618 WriteString("c");
619 ELSIF type = lib32.directory THEN
620 WriteString("d");
621 ELSIF type = lib32.block THEN
622 WriteString("b");
623 ELSIF type = lib32.regular THEN
624 WriteString("-");
625 ELSIF type = lib32.network THEN
626 WriteString("n");
627 ELSIF type = lib32.link THEN
628 WriteString("l");
629 ELSIF type = lib32.socket THEN
630 WriteString("s");
631 ELSE
632 WriteString("?");
633 END;
634 END WriteType;
636 PROCEDURE WriteRWX(triplet: INTEGER);
637 BEGIN
638 IF ((triplet DIV 4) MOD 2) # 0 THEN
639 WriteString("r");
640 ELSE
641 WriteString("-");
642 END;
643 IF ((triplet DIV 2) MOD 2) # 0 THEN
644 WriteString("w");
645 ELSE
646 WriteString("-");
647 END;
648 IF (triplet MOD 2) # 0 THEN
649 WriteString("x");
650 ELSE
651 WriteString("-");
652 END;
653 END WriteRWX;
655 BEGIN
656 WriteType((mode DIV 4096) MOD 16);
657 WriteRWX(mode DIV 64);
658 WriteRWX(mode DIV 8);
659 WriteRWX(mode);
660 END WriteMode;
662 PROCEDURE WriteTime(time: LONGINT);
663 VAR
664 tm: PTm;
665 BEGIN
666 tm:= localtime(ADR(time));
667 IF tm # NIL THEN
668 WriteInt(tm^.year + 1900, 0);
669 WriteString("-");
670 IF tm^.mon < 9 THEN
671 WriteString("0");
672 END;
673 WriteInt(tm^.mon + 1, 0);
674 WriteString("-");
675 IF tm^.mday < 10 THEN
676 WriteString("0");
677 END;
678 WriteInt(tm^.mday, 0);
679 WriteString(" ");
680 IF tm^.hour < 10 THEN
681 WriteString("0");
682 END;
683 WriteInt(tm^.hour, 0);
684 WriteString(":");
685 IF tm^.hour < 10 THEN
686 WriteString("0");
687 END;
688 WriteInt(tm^.min, 0);
689 ELSE
690 WriteString("??:??");
691 END;
692 END WriteTime;
694 PROCEDURE Listaj(Putanja: ARRAY OF CHAR);
695 VAR
696 info: Stat;
697 c: INTEGER;
698 BEGIN
699 c:= stat(Putanja, ADR(info));
700 IF c = -1 THEN
701 WriteString("?????????? ? ? KB ????-??-?? ??:??");
702 ELSE
703 WriteMode(info.mode);
704 WriteInt(info.nlink, 3);
705 WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB ");
706 WriteTime(info.atime);
707 END;
708 WriteString(" "); WriteString(Putanja); WriteLn;
709 END Listaj;
711 BEGIN
712 n:= Narg();
713 FOR i:= 1 TO n - 1 DO
714 ok:= GetArg(Putanja, i);
715 WriteLn;
716 Listaj(Putanja);
717 END;
718 WriteLn;
719 END Zad4.
720 \end{codeblock}
722 \subsection{Stvaranje novih procesa}
724 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
725 (``račva''). Novi proces je identičan sa originalnim, osim u svom
726 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
727 \begin{codeblock-indent}
728 PROCEDURE fork(): INTEGER;
729 \end{codeblock-indent}
731 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
732 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
733 \kod{fork}, ukoliko je u pitanju originalni proces (``roditelj'') tada
734 je ta vrednost jednaka proces identifikatoru (\emph{pid}-u)
735 ``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom
736 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
737 da dete i roditelj rade različite stvari, to se obično rešava kodom
738 sledećeg oblika:
739 \begin{codeblock-indent}
740 pid := fork();
741 IF pid = 0 THEN
742 (* "detetove" operacije *)
743 ELSE
744 (* "roditeljske" operacije *)
745 END;
746 \end{codeblock-indent}
748 Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u
749 originalnom procesu sa efektom da se proces uspava dokle god neki od
750 procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se
751 može postići komandom \kod{waitpid} u kojoj možemo precizirati tačno
752 koji proces čekamo da se završi.
754 U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera
755 organizacije procesa.
757 \skica{treba nam propratni tekst za ovo sto sledi}
759 \subsubsection{Lanac procesa}
761 \begin{minipage}{0.6\textwidth}
762 \begin{codeblock}
763 pid := 0;
764 i := 1;
765 WHILE (pid = 0) AND (i < n) DO
766 pid := fork();
767 IF pid # 0 THEN
768 (* ... *)
769 ELSE
770 INC(i);
771 END;
772 END;
773 \end{codeblock}
774 \end{minipage}
775 \begin{minipage}{0.4\textwidth}
776 \begin{tikzpicture}
777 [proc/.style={circle,draw}]
778 \def \n {5}
779 \foreach \s in {1,...,\n}
781 \node[proc] (\s) at (\s,-\s/2) {\s};
783 \foreach \s in {2,...,\n} {
784 \pgfmathparse{int(\s-1)}
785 \draw [<-] (\s) to (\pgfmathresult);
787 \end{tikzpicture}
788 \end{minipage}
790 \subsubsection{Roditelj sa puno dece}
792 \begin{minipage}{0.6\textwidth}
793 \begin{codeblock}
794 pid := -1;
795 j := 0;
796 WHILE (pid # 0) AND (j < m) DO
797 pid := fork();
798 IF pid # 0 THEN
799 INC(j);
800 ELSE
801 (* ... *)
802 END;
803 END;
804 \end{codeblock}
805 \end{minipage}
806 \begin{minipage}{0.4\textwidth}
807 \begin{tikzpicture}
808 [proc/.style={circle,draw}]
809 \def \n {3}
810 \node[proc] (top) at (0,0) {0..4};
811 \foreach \s in {0,...,\n}
813 \node[proc] (\s) at (-1.5+\s,-2) {\s};
815 \foreach \s in {0,...,\n} {
816 \draw [->] (top) to (\s);
818 \end{tikzpicture}
819 \end{minipage}
821 \subsubsection{Stablo procesa}
823 \begin{minipage}{0.6\textwidth}
824 \begin{codeblock}
825 dubina := 1;
826 brdece := 0;
827 WHILE (dubina < maxdubina) AND
828 (brdece < potrebnodece) DO
829 pid := fork();
830 IF pid # 0 THEN
831 INC(brdece);
832 ELSE
833 INC(dubina);
834 brdece := 0;
835 END;
836 END;
837 \end{codeblock}
838 \end{minipage}
839 \begin{minipage}{0.4\textwidth}
840 \begin{tikzpicture}
841 [proc/.style={circle,draw},
842 level 1/.style={sibling distance=28mm,level distance=10mm},
843 level 2/.style={sibling distance=14mm,font=\scriptsize},
844 level 3/.style={sibling distance=6mm,font=\tiny}
846 \node[proc] (root) {1-0}
847 child[->] foreach \x in {0,1} {node[proc] {1-\x}
848 child foreach \y in {0,1} {node[proc] {2-\y}
849 child foreach \z in {0,1} {node[proc] {3-\z}
850 }}};
852 \node[text width=0.9\textwidth] (desc) at (0,-4) {maxdubina=4, potrebnodece=2,
853 čvorovi prikazuju vrednosti pri kreiranju};
854 \end{tikzpicture}
855 \end{minipage}
858 % ----------------------------------------------
860 \newpage
861 \pagenumbering{Roman}
862 \appendix
864 \section{Instalacija kompajlera GNU Modula 2}
865 \label{app-instalacija-gm2}
867 Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na
868 već postojeći GNU Linux operativni sistem iz Debian porodice, koja
869 uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i
870 mnoge druge. Kompajler je moguće bez većih problema instalirati i na
871 bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog
872 koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom
873 \url{http://www.nongnu.org/gm2/obtaining.html}.
875 Ovo uputstvo neće ulaziti u detalje kako instalirati operativni
876 sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno
877 instaliraju drugi operativni sistem, preporučujemo korišćenje
878 virtuelne mašine (npr besplatni Virtual Box,
879 \url{http://virtualbox.org}) i instaliranje sistema na nju, ili još
880 lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr
881 Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što
882 je Lubuntu, ako su performanse problematične.
884 \subsection{Instalacija na Debian platformi}
886 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
887 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
888 menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem
889 \begin{codeblock-indent}
891 # GNU Modula-2 repo
894 deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main
895 deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main
896 \end{codeblock-indent}
898 Alternativno se mogu koristiti sledeće komande:
900 \begin{terminal}
901 sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
902 sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main"
903 \end{terminal}
905 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
906 alata.
908 Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi
909 sledeće:
910 \begin{terminal}
911 sudo apt-get update
912 sudo apt-get install gm2-doc gm2
913 \end{terminal}
915 Po želji se može skinuti i izvorni kod kompajlera sledećom komandom:
916 \begin{terminal}
917 sudo apt-get source gm2
918 \end{terminal}
920 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa.
922 \paragraph{Napomena:} Prilikom unapredjivanja Linux distribucije na
923 sledeću verziju (npr. 13.10 na 14.04) se standardno onemogućavaju
924 dodati izvori softvera i potrebno ih je ručno ponovo upaliti. Ovo se
925 može uraditi otvoranjem \kod{/etc/apt/sources.list} i uklonjanjem
926 ``\#'' sa početka redova koje želimo da koristimo ponovo ili
927 korišćenjem adekvatnih vizuelnih alata.
929 \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi}
931 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
932 prijave nedostajuće fajlove \kod{crti.o, crt1.o} i/ili
933 \kod{crtn.o}. Konkretno je poznato za gcc verziju 4.6 na debianu,
934 pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i
935 na neke druge sisteme.
937 Greška se ispravlja na sledeći način (korisnik treba da
938 ima administrativna prava, zato se radi ``sudo'') ukoliko
939 je u pitanju 64-bitni sistem:
940 \begin{terminal}
941 sudo su
942 cd /usr/lib
943 ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o
944 ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o
945 ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o
946 exit
947 \end{terminal}
949 Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama
950 treba zameniti ``x86\_64'' sa ``i386''.
952 \skica{možda i build from source}
954 \newpage
955 \section{Tekst editor Joe}
956 \label{app-joe}
958 Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje
959 rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada
960 (korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može
961 koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na
962 skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim
963 sistemima se ovo može uraditi sa:
964 \begin{terminal}
965 sudo apt-get install joe
966 \end{terminal}
967 Ili analogno na drugim sistemima za instaliranje softvera.
969 Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno
970 otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili
971 tekst se može postići sledećom komandom:
972 \begin{terminal}
973 joe hello.mod
974 \end{terminal}
976 \subsection{Tumačenje prečica na tastaturi}
978 Joe je po svojoj prirodi bogat prečicama na tastaturi. U daljem tekstu
979 će biti navedene mnoge od njih. Kod svih se navodi redosled
980 pritiskanja tastera individualno, a ako su negde tasteri spojeni sa
981 ``+'' (alternativno sa ``-'') onda ih je potrebno pritisnuti
982 odjednom. Neki primeri:
984 \begin{itemize}
985 \item \Ctrl +\keystroke{\_} (poništavanje poslednje promene) pristsak
986 na taster \emph{CTRL} i \emph{\_ (podvlaka)} odjednom.
987 \item \Ctrl +\keystroke{K}\keystroke{H} (otvaranje sistema pomoći)
988 pritisak na \emph{CTRL} i \emph{K} odjednom, odpustiti sve, pa onda
989 pritisak na \emph{H}.
990 \item \Esc \keystroke{,} (prelazak na sledeću stranu pomoći)
991 pritisak na taster \emph{Escape}, a nakon toga pritisak na taster
992 \emph{, (zarez)}.
993 \end{itemize}
995 U okviru sistema pomoći koji je ugrađen u sam editor uglavnom se
996 pojavljuju skraćeni oblici:
997 \begin{itemize}
998 \item \^{}D isto što i ``Ctrl-D''
999 \item \^{}KH isto što i ``Ctrl-K H''
1000 \item \^{}[. isto što i ``Esc .''
1001 \end{itemize}
1004 \subsection{Sistem pomoći}
1006 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
1007 kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak
1008 komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći
1009 kroz koje se može kretati sa \Esc \keystroke{.} (tačka) i \Esc
1010 \keystroke{,} (zarez).
1012 U okviru pomoći postoje maltene sve komande koje editor pruža, a na
1013 kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar
1014 ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora.
1016 \subsection{Rad sa fajlovima}
1018 Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
1019 +\keystroke{K}\keystroke{X}, dok se
1020 samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba
1021 slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
1022 vrednost ponudi trenutno ime.
1024 Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti
1025 sa \Ctrl +\keystroke{K}\keystroke{E}. Na dnu editora će se pojaviti
1026 polje za kucanje imena fajla koje dozvoljava i da se putanja
1027 automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš
1028 kao i u komandnoj liniji.
1030 Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom
1031 na \Esc \keystroke{V}, odnosno \Esc \keystroke{U}.
1033 Zatvaranje fajla je moguće sa \Ctrl+\keystroke{C} (što je i
1034 standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri
1035 čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene
1036 koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će
1037 se i sam editor zatvoriti.
1039 \subsection{Rad sa tekstom}
1041 Pritiskom na \Ctrl+\keystroke{\_} se poništava poslednja promena (undo).
1043 Premeštanje i kopiranje delova teksta je malo drugačije nego u
1044 klasičnim grafičkim programima. Prvo je potrebno označiti željeni
1045 tekst u dva koraka: \Ctrl +\keystroke{K}\keystroke{B} postavlja
1046 početak bloka na trenutnu poziciju kursora, a \Ctrl
1047 +\keystroke{K}\keystroke{K} postavlja kraj bloka, nakon čega će
1048 selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom
1049 mestu u istom ili drugom dokumentu pritisnuti \Ctrl
1050 +\keystroke{K}\keystroke{C} da bi se iskopirao označeni blok, odnosno
1051 \Ctrl +\keystroke{K}\keystroke{M} da bi se on premestio.
1052 Komanda \Ctrl +\keystroke{K}\keystroke{Y} briše odabrani blok.
1054 Pretraga dokumenta se započinje sa \Ctrl +\keystroke{K}\keystroke{F}.
1056 Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se
1057 može odabrati više opcija za rad, kao što su margine, automatsko
1058 prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}),
1059 sintaksno bojenje itd.
1061 \subsection{Rad sa prozorima}
1063 ``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora
1064 koji omogućavaju da se vidi više dokumenata, ili čak da se vide
1065 različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl
1066 +\keystroke{K}\keystroke{O}. Veličina trenutnog prozora se potom može
1067 povećavati (\Ctrl +\keystroke{K}\keystroke{G}) ili smanjivati (\Ctrl
1068 +\keystroke{K}\keystroke{T}) na uštrb drugih prozora. Prelazak na
1069 sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl
1070 +\keystroke{K}\keystroke{N}, odnosno na \Ctrl
1071 +\keystroke{K}\keystroke{P}. Komanda \Ctrl +\keystroke{K}\keystroke{I}
1072 omogućuje da se naizmenično vide svi prozori, ili samo jedan.
1074 \subsection{Problem: ``zamrzavanje'' pri snimanju} ako editor izgleda
1075 kao da se zaledio verovatno je problem što je stisnuta ``klasična''
1076 kombinacija za snimanje \Ctrl + \keystroke{S} koja ne radi u
1077 ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat
1078 se poništava pritiskom na \Ctrl + \keystroke{Q}. Za više detalja
1079 pogledati Glavu~\ref{g-smrzavanje}.
1081 \skica{joe i sintaksno bojenje za m2}
1083 \newpage
1084 \section{Putty}
1086 \emph{Putty} je program koji služi da se pod Windows operativnim
1087 sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX
1088 serveru. Može se naći online na
1089 \url{http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html}.
1091 Po pokretanju se prikazuje dijalog u kome se može ukucati adresa
1092 udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta
1093 samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je
1094 uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
1095 lozinke.
1097 \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se}
1098 \label{g-smrzavanje}
1100 Putty (kao i većina standardnih linux terminala koji koriste
1101 softversku kontrolu toka podataka \emph{software flow control}) se
1102 može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom
1103 na \Ctrl+\keystroke{S}. Ovo je često velik problem jer se poklapa sa
1104 standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se
1105 može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom
1106 \Ctrl+\keystroke{Q}. Ukratko:
1107 \begin{lstlisting}[xleftmargin=10em]
1108 Do not press
1109 Ctrl S
1110 If you do
1111 Ctrl Q
1112 \end{lstlisting}
1114 Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena
1115 kad su brzine protoka bile veoma male, i kada se štedelo time što bi
1116 se privrmeno isključio protok kada nisu neophodne povratne
1117 informacije, na primer kod komandi koje se dugo izvršavaju. Naravno
1118 ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza
1119 koje se plaćaju po protoku, a nekad se može i dobiti na brzini
1120 izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana.
1122 \skica{literatura i linkovi izdovjeni na kraju dokumenta}
1124 %\end{multicols}
1125 \end{document}
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner