gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
3c071bf133d33533d3436764eb54c64eb46f286b
[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 \subsubsection{Primer: Ispis osobina pojedinih fajlova}
496 O pojedinim fajlovima možemo dobiti više informacija koristeći
497 sistemski poziv \kod{stat}. On prima dva argumenta, prvi je
498 \emph{puna} putanja do fajla, a drugi je pokazivač na strukturu u koju
499 će komanda upisati podatke. Obratiti pažnju da zbog ovoga struktura
500 već mora postojati u memoriji, ili kao lokalna promenljiva
501 odgovarajućeg slogovnog tipa, ili dinamički alocirana korišćenjem
502 pokazivača na nju.
504 Linux i mnogi drugi srodni sistemi za internu prezentaciju vremena
505 koriste broj sekundi od početka ``epohe'', odnosno od prvog januara
506 1970 godine. Za konverziju u klasičnije mere vremena se može koristiti
507 poziv \kod{localtime}.
509 Kao i u prethodnom primeru date su dve verzije definicija nekih
510 tipova.
512 \begin{codeblock}
513 DEFINITION MODULE FOR "C" LibStat32;
514 FROM SYSTEM IMPORT
515 ADDRESS, BYTE;
516 EXPORT UNQUALIFIED stat, localtime,
517 Stat, PStat, Tm, PTm, PInt,
518 fifo, character, directory, block, regular, network, link, socket;
520 CONST
521 fifo = 1;
522 character = 2;
523 directory = 4;
524 block = 6;
525 regular = 8;
526 network = 9;
527 link = 10;
528 socket = 12;
529 \end{codeblock}
530 \begin{minipage}{0.45\textwidth}
531 \begin{codeblock}
532 (* types for 32 bit *)
533 TYPE
534 Stat = RECORD
535 dev: LONGINT;
536 ino: LONGINT;
537 mode: INTEGER;
538 nlink: LONGINT;
539 uid: INTEGER;
540 gid: INTEGER;
541 pad1: LONGINT;
542 rdev: INTEGER;
543 size: INTEGER;
544 blksize: INTEGER;
545 blocks: INTEGER;
546 atime: LONGINT;
547 mtime: LONGINT;
548 ctime: LONGINT;
549 END;
550 \end{codeblock}
551 \end{minipage}
552 \begin{minipage}{0.45\textwidth}
553 \begin{codeblock}[frame=single,frameround=tttt]
554 (* types for 64 bit *)
555 TYPE
556 Stat = RECORD
557 dev: LONGINT;
558 ino: LONGINT;
559 nlink: LONGINT;
560 mode: INTEGER;
561 uid: INTEGER;
562 gid: INTEGER;
563 pad1: INTEGER;
564 rdev: LONGINT;
565 size: LONGINT;
566 blksize: LONGINT;
567 blocks: LONGINT;
568 atime: LONGINT;
569 mtime: LONGINT;
570 ctime: LONGINT;
571 END;
572 \end{codeblock}
573 \end{minipage}
574 \begin{codeblock}
575 Tm = RECORD
576 sec, min, hour,
577 mday, mon, year,
578 wday, yday, isdst: INTEGER;
579 END;
580 PTm = POINTER TO Tm;
581 PInt = POINTER TO INTEGER;
583 PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER];
584 PROCEDURE localtime(time: PInt): PTm;
586 END LibStat32.
587 \end{codeblock}
589 \begin{codeblock}
590 MODULE Zad4;
592 FROM SYSTEM IMPORT
593 ADR;
594 FROM StrIO IMPORT
595 WriteString, WriteLn;
596 FROM NumberIO IMPORT
597 WriteInt;
598 FROM StrLib IMPORT
599 StrLen, StrConCat;
600 FROM Args IMPORT
601 Narg, GetArg;
602 FROM LibStat32 IMPORT
603 stat, localtime, Stat, PTm;
604 IMPORT LibStat32;
605 FROM errno IMPORT
606 geterrno;
608 TYPE
609 String = ARRAY [0..1023] OF CHAR;
611 VAR
612 Putanja: String;
613 n, i: INTEGER;
614 ok: BOOLEAN;
616 PROCEDURE WriteMode(mode: INTEGER);
618 PROCEDURE WriteType(type: INTEGER);
619 BEGIN
620 IF type = lib32.fifo THEN
621 WriteString("f");
622 ELSIF type = lib32.character THEN
623 WriteString("c");
624 ELSIF type = lib32.directory THEN
625 WriteString("d");
626 ELSIF type = lib32.block THEN
627 WriteString("b");
628 ELSIF type = lib32.regular THEN
629 WriteString("-");
630 ELSIF type = lib32.network THEN
631 WriteString("n");
632 ELSIF type = lib32.link THEN
633 WriteString("l");
634 ELSIF type = lib32.socket THEN
635 WriteString("s");
636 ELSE
637 WriteString("?");
638 END;
639 END WriteType;
641 PROCEDURE WriteRWX(triplet: INTEGER);
642 BEGIN
643 IF ((triplet DIV 4) MOD 2) # 0 THEN
644 WriteString("r");
645 ELSE
646 WriteString("-");
647 END;
648 IF ((triplet DIV 2) MOD 2) # 0 THEN
649 WriteString("w");
650 ELSE
651 WriteString("-");
652 END;
653 IF (triplet MOD 2) # 0 THEN
654 WriteString("x");
655 ELSE
656 WriteString("-");
657 END;
658 END WriteRWX;
660 BEGIN
661 WriteType((mode DIV 4096) MOD 16);
662 WriteRWX(mode DIV 64);
663 WriteRWX(mode DIV 8);
664 WriteRWX(mode);
665 END WriteMode;
667 PROCEDURE WriteTime(time: LONGINT);
668 VAR
669 tm: PTm;
670 BEGIN
671 tm:= localtime(ADR(time));
672 IF tm # NIL THEN
673 WriteInt(tm^.year + 1900, 0);
674 WriteString("-");
675 IF tm^.mon < 9 THEN
676 WriteString("0");
677 END;
678 WriteInt(tm^.mon + 1, 0);
679 WriteString("-");
680 IF tm^.mday < 10 THEN
681 WriteString("0");
682 END;
683 WriteInt(tm^.mday, 0);
684 WriteString(" ");
685 IF tm^.hour < 10 THEN
686 WriteString("0");
687 END;
688 WriteInt(tm^.hour, 0);
689 WriteString(":");
690 IF tm^.hour < 10 THEN
691 WriteString("0");
692 END;
693 WriteInt(tm^.min, 0);
694 ELSE
695 WriteString("??:??");
696 END;
697 END WriteTime;
699 PROCEDURE Listaj(Putanja: ARRAY OF CHAR);
700 VAR
701 info: Stat;
702 c: INTEGER;
703 BEGIN
704 c:= stat(Putanja, ADR(info));
705 IF c = -1 THEN
706 WriteString("?????????? ? ? KB ????-??-?? ??:??");
707 ELSE
708 WriteMode(info.mode);
709 WriteInt(info.nlink, 3);
710 WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB ");
711 WriteTime(info.atime);
712 END;
713 WriteString(" "); WriteString(Putanja); WriteLn;
714 END Listaj;
716 BEGIN
717 n:= Narg();
718 FOR i:= 1 TO n - 1 DO
719 ok:= GetArg(Putanja, i);
720 WriteLn;
721 Listaj(Putanja);
722 END;
723 WriteLn;
724 END Zad4.
725 \end{codeblock}
727 \subsection{Stvaranje novih procesa}
729 Korišćenjem sistemske komande \kod{fork} trenutni proces se duplira
730 (``račva''). Novi proces je identičan sa originalnim, osim u svom
731 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
732 \begin{codeblock-indent}
733 PROCEDURE fork(): INTEGER;
734 \end{codeblock-indent}
736 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
737 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
738 \kod{fork}, ukoliko je u pitanju originalni proces (``roditelj'') tada
739 je ta vrednost jednaka proces identifikatoru (\emph{pid}-u)
740 ``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom
741 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
742 da dete i roditelj rade različite stvari, to se obično rešava kodom
743 sledećeg oblika:
744 \begin{codeblock-indent}
745 pid := fork();
746 IF pid = 0 THEN
747 (* "detetove" operacije *)
748 ELSE
749 (* "roditeljske" operacije *)
750 END;
751 \end{codeblock-indent}
753 Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u
754 originalnom procesu sa efektom da se proces uspava dokle god neki od
755 procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se
756 može postići komandom \kod{waitpid} u kojoj možemo precizirati tačno
757 koji proces čekamo da se završi.
759 U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera
760 organizacije procesa.
762 \skica{treba nam propratni tekst za ovo sto sledi}
764 \subsubsection{Lanac procesa}
766 \begin{minipage}{0.6\textwidth}
767 \begin{codeblock}
768 pid := 0;
769 i := 1;
770 WHILE (pid = 0) AND (i < n) DO
771 pid := fork();
772 IF pid # 0 THEN
773 (* ... *)
774 ELSE
775 INC(i);
776 END;
777 END;
778 \end{codeblock}
779 \end{minipage}
780 \begin{minipage}{0.4\textwidth}
781 \begin{tikzpicture}
782 [proc/.style={circle,draw}]
783 \def \n {5}
784 \foreach \s in {1,...,\n}
786 \node[proc] (\s) at (\s,-\s/2) {\s};
788 \foreach \s in {2,...,\n} {
789 \pgfmathparse{int(\s-1)}
790 \draw [<-] (\s) to (\pgfmathresult);
792 \end{tikzpicture}
793 \end{minipage}
795 \subsubsection{Roditelj sa puno dece}
797 \begin{minipage}{0.6\textwidth}
798 \begin{codeblock}
799 pid := -1;
800 j := 0;
801 WHILE (pid # 0) AND (j < m) DO
802 pid := fork();
803 IF pid # 0 THEN
804 INC(j);
805 ELSE
806 (* ... *)
807 END;
808 END;
809 \end{codeblock}
810 \end{minipage}
811 \begin{minipage}{0.4\textwidth}
812 \begin{tikzpicture}
813 [proc/.style={circle,draw}]
814 \def \n {3}
815 \node[proc] (top) at (0,0) {0..4};
816 \foreach \s in {0,...,\n}
818 \node[proc] (\s) at (-1.5+\s,-2) {\s};
820 \foreach \s in {0,...,\n} {
821 \draw [->] (top) to (\s);
823 \end{tikzpicture}
824 \end{minipage}
826 \subsubsection{Stablo procesa}
828 \begin{minipage}{0.6\textwidth}
829 \begin{codeblock}
830 dubina := 1;
831 brdece := 0;
832 WHILE (dubina < maxdubina) AND
833 (brdece < potrebnodece) DO
834 pid := fork();
835 IF pid # 0 THEN
836 INC(brdece);
837 ELSE
838 INC(dubina);
839 brdece := 0;
840 END;
841 END;
842 \end{codeblock}
843 \end{minipage}
844 \begin{minipage}{0.4\textwidth}
845 \begin{tikzpicture}
846 [proc/.style={circle,draw},
847 level 1/.style={sibling distance=28mm,level distance=10mm},
848 level 2/.style={sibling distance=14mm,font=\scriptsize},
849 level 3/.style={sibling distance=6mm,font=\tiny}
851 \node[proc] (root) {1-0}
852 child[->] foreach \x in {0,1} {node[proc] {1-\x}
853 child foreach \y in {0,1} {node[proc] {2-\y}
854 child foreach \z in {0,1} {node[proc] {3-\z}
855 }}};
857 \node[text width=0.9\textwidth] (desc) at (0,-4) {maxdubina=4, potrebnodece=2,
858 čvorovi prikazuju vrednosti pri kreiranju};
859 \end{tikzpicture}
860 \end{minipage}
863 % ----------------------------------------------
865 \newpage
866 \pagenumbering{Roman}
867 \appendix
869 \section{Instalacija kompajlera GNU Modula 2}
870 \label{app-instalacija-gm2}
872 Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na
873 već postojeći GNU Linux operativni sistem iz Debian porodice, koja
874 uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i
875 mnoge druge. Kompajler je moguće bez većih problema instalirati i na
876 bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog
877 koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom
878 \url{http://www.nongnu.org/gm2/obtaining.html}.
880 Ovo uputstvo neće ulaziti u detalje kako instalirati operativni
881 sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno
882 instaliraju drugi operativni sistem, preporučujemo korišćenje
883 virtuelne mašine (npr besplatni Virtual Box,
884 \url{http://virtualbox.org}) i instaliranje sistema na nju, ili još
885 lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr
886 Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što
887 je Lubuntu, ako su performanse problematične.
889 \subsection{Instalacija na Debian platformi}
891 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
892 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
893 menjanjem fajla \kod{/etc/apt/sources.list} i dodavanjem
894 \begin{codeblock-indent}
896 # GNU Modula-2 repo
899 deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main
900 deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main
901 \end{codeblock-indent}
903 Alternativno se mogu koristiti sledeće komande:
905 \begin{terminal}
906 sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main"
907 sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main"
908 \end{terminal}
910 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
911 alata.
913 Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi
914 sledeće:
915 \begin{terminal}
916 sudo apt-get update
917 sudo apt-get install gm2-doc gm2
918 \end{terminal}
920 Po želji se može skinuti i izvorni kod kompajlera sledećom komandom:
921 \begin{terminal}
922 sudo apt-get source gm2
923 \end{terminal}
925 Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa.
927 \paragraph{Napomena:} Prilikom unapredjivanja Linux distribucije na
928 sledeću verziju (npr. 13.10 na 14.04) se standardno onemogućavaju
929 dodati izvori softvera i potrebno ih je ručno ponovo upaliti. Ovo se
930 može uraditi otvoranjem \kod{/etc/apt/sources.list} i uklonjanjem
931 ``\#'' sa početka redova koje želimo da koristimo ponovo ili
932 korišćenjem adekvatnih vizuelnih alata.
934 \subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi}
936 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
937 prijave nedostajuće fajlove \kod{crti.o, crt1.o} i/ili
938 \kod{crtn.o}. Konkretno je poznato za gcc verziju 4.6 na debianu,
939 pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i
940 na neke druge sisteme.
942 Greška se ispravlja na sledeći način (korisnik treba da
943 ima administrativna prava, zato se radi ``sudo'') ukoliko
944 je u pitanju 64-bitni sistem:
945 \begin{terminal}
946 sudo su
947 cd /usr/lib
948 ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o
949 ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o
950 ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o
951 exit
952 \end{terminal}
954 Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama
955 treba zameniti ``x86\_64'' sa ``i386''.
957 \skica{možda i build from source}
959 \newpage
960 \section{Tekst editor Joe}
961 \label{app-joe}
963 Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje
964 rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada
965 (korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može
966 koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na
967 skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim
968 sistemima se ovo može uraditi sa:
969 \begin{terminal}
970 sudo apt-get install joe
971 \end{terminal}
972 Ili analogno na drugim sistemima za instaliranje softvera.
974 Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno
975 otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili
976 tekst se može postići sledećom komandom:
977 \begin{terminal}
978 joe hello.mod
979 \end{terminal}
981 \subsection{Tumačenje prečica na tastaturi}
983 Joe je po svojoj prirodi bogat prečicama na tastaturi. U daljem tekstu
984 će biti navedene mnoge od njih. Kod svih se navodi redosled
985 pritiskanja tastera individualno, a ako su negde tasteri spojeni sa
986 ``+'' (alternativno sa ``-'') onda ih je potrebno pritisnuti
987 odjednom. Neki primeri:
989 \begin{itemize}
990 \item \Ctrl +\keystroke{\_} (poništavanje poslednje promene) pristsak
991 na taster \emph{CTRL} i \emph{\_ (podvlaka)} odjednom.
992 \item \Ctrl +\keystroke{K}\keystroke{H} (otvaranje sistema pomoći)
993 pritisak na \emph{CTRL} i \emph{K} odjednom, odpustiti sve, pa onda
994 pritisak na \emph{H}.
995 \item \Esc \keystroke{,} (prelazak na sledeću stranu pomoći)
996 pritisak na taster \emph{Escape}, a nakon toga pritisak na taster
997 \emph{, (zarez)}.
998 \end{itemize}
1000 U okviru sistema pomoći koji je ugrađen u sam editor uglavnom se
1001 pojavljuju skraćeni oblici:
1002 \begin{itemize}
1003 \item \^{}D isto što i ``Ctrl-D''
1004 \item \^{}KH isto što i ``Ctrl-K H''
1005 \item \^{}[. isto što i ``Esc .''
1006 \end{itemize}
1009 \subsection{Sistem pomoći}
1011 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
1012 kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak
1013 komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći
1014 kroz koje se može kretati sa \Esc \keystroke{.} (tačka) i \Esc
1015 \keystroke{,} (zarez).
1017 U okviru pomoći postoje maltene sve komande koje editor pruža, a na
1018 kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar
1019 ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora.
1021 \subsection{Rad sa fajlovima}
1023 Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
1024 +\keystroke{K}\keystroke{X}, dok se
1025 samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba
1026 slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
1027 vrednost ponudi trenutno ime.
1029 Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti
1030 sa \Ctrl +\keystroke{K}\keystroke{E}. Na dnu editora će se pojaviti
1031 polje za kucanje imena fajla koje dozvoljava i da se putanja
1032 automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš
1033 kao i u komandnoj liniji.
1035 Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom
1036 na \Esc \keystroke{V}, odnosno \Esc \keystroke{U}.
1038 Zatvaranje fajla je moguće sa \Ctrl+\keystroke{C} (što je i
1039 standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri
1040 čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene
1041 koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će
1042 se i sam editor zatvoriti.
1044 \subsection{Rad sa tekstom}
1046 Pritiskom na \Ctrl+\keystroke{\_} se poništava poslednja promena (undo).
1048 Premeštanje i kopiranje delova teksta je malo drugačije nego u
1049 klasičnim grafičkim programima. Prvo je potrebno označiti željeni
1050 tekst u dva koraka: \Ctrl +\keystroke{K}\keystroke{B} postavlja
1051 početak bloka na trenutnu poziciju kursora, a \Ctrl
1052 +\keystroke{K}\keystroke{K} postavlja kraj bloka, nakon čega će
1053 selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom
1054 mestu u istom ili drugom dokumentu pritisnuti \Ctrl
1055 +\keystroke{K}\keystroke{C} da bi se iskopirao označeni blok, odnosno
1056 \Ctrl +\keystroke{K}\keystroke{M} da bi se on premestio.
1057 Komanda \Ctrl +\keystroke{K}\keystroke{Y} briše odabrani blok.
1059 Pretraga dokumenta se započinje sa \Ctrl +\keystroke{K}\keystroke{F}.
1061 Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se
1062 može odabrati više opcija za rad, kao što su margine, automatsko
1063 prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}),
1064 sintaksno bojenje itd.
1066 \subsection{Rad sa prozorima}
1068 ``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora
1069 koji omogućavaju da se vidi više dokumenata, ili čak da se vide
1070 različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl
1071 +\keystroke{K}\keystroke{O}. Veličina trenutnog prozora se potom može
1072 povećavati (\Ctrl +\keystroke{K}\keystroke{G}) ili smanjivati (\Ctrl
1073 +\keystroke{K}\keystroke{T}) na uštrb drugih prozora. Prelazak na
1074 sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl
1075 +\keystroke{K}\keystroke{N}, odnosno na \Ctrl
1076 +\keystroke{K}\keystroke{P}. Komanda \Ctrl +\keystroke{K}\keystroke{I}
1077 omogućuje da se naizmenično vide svi prozori, ili samo jedan.
1079 \subsection{Problem: ``zamrzavanje'' pri snimanju} ako editor izgleda
1080 kao da se zaledio verovatno je problem što je stisnuta ``klasična''
1081 kombinacija za snimanje \Ctrl + \keystroke{S} koja ne radi u
1082 ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat
1083 se poništava pritiskom na \Ctrl + \keystroke{Q}. Za više detalja
1084 pogledati Glavu~\ref{g-smrzavanje}.
1086 \skica{joe i sintaksno bojenje za m2}
1088 \newpage
1089 \section{Putty}
1091 \emph{Putty} je program koji služi da se pod Windows operativnim
1092 sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX
1093 serveru. Može se naći online na
1094 \url{http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html}.
1096 Po pokretanju se prikazuje dijalog u kome se može ukucati adresa
1097 udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta
1098 samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je
1099 uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
1100 lozinke.
1102 \subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se}
1103 \label{g-smrzavanje}
1105 Putty (kao i većina standardnih linux terminala koji koriste
1106 softversku kontrolu toka podataka \emph{software flow control}) se
1107 može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom
1108 na \Ctrl+\keystroke{S}. Ovo je često velik problem jer se poklapa sa
1109 standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se
1110 može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom
1111 \Ctrl+\keystroke{Q}. Ukratko:
1112 \begin{lstlisting}[xleftmargin=10em]
1113 Do not press
1114 Ctrl S
1115 If you do
1116 Ctrl Q
1117 \end{lstlisting}
1119 Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena
1120 kad su brzine protoka bile veoma male, i kada se štedelo time što bi
1121 se privrmeno isključio protok kada nisu neophodne povratne
1122 informacije, na primer kod komandi koje se dugo izvršavaju. Naravno
1123 ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza
1124 koje se plaćaju po protoku, a nekad se može i dobiti na brzini
1125 izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana.
1127 \skica{literatura i linkovi izdovjeni na kraju dokumenta}
1129 %\end{multicols}
1130 \end{document}
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner