From: Doni Pracner Date: Tue, 19 Feb 2013 22:59:00 +0000 (+0100) Subject: inicijalna verzija 12d X-Git-Tag: v12d X-Git-Url: https://svarog.pmf.uns.ac.rs/gitweb/?a=commitdiff_plain;h=41cc70ce0ff901eedb90c5d365f43d907f54ed42;p=os2skripta.git inicijalna verzija 12d --- 41cc70ce0ff901eedb90c5d365f43d907f54ed42 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed0b781 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +*.aux +*.dvi +*.log +*.out +*.pdf +*~ +*.toc +*.xref +*.nav +*.vrb +*.snm +auto* +*.zip +*.class +_region* +*.blg +*.bbl +*.exe +errinfo.??? \ No newline at end of file diff --git a/skripta-os2.tex b/skripta-os2.tex new file mode 100644 index 0000000..0e1509a --- /dev/null +++ b/skripta-os2.tex @@ -0,0 +1,795 @@ +% skripta-os2.tex +% Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS +% 2011/2012 + +\documentclass[a4paper,twoside]{article} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc}%definišemo da je ulaz utf-8 fajl + +% osnovne informacije koje ce se prikazati na naslovnoj strani, +% kao i u informacijama u generisanom pdfu +\newcommand{\autor}{Doni Pracner, Ivan Pribela} +\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}{April 2012, Novi Sad} +\newcommand{\verzija}{ver 12d} + +\usepackage[serbian]{babel} +\usepackage{fancyhdr} +\pagestyle{fancy} + +\title{\naslov \ -- \verzija} +\author{\autor \\ \inst} +\date{\datum} + +%change the default font +\usepackage{lmodern} +\renewcommand{\familydefault}{\sfdefault} + +\usepackage{pifont} +\usepackage{keystroke} + +%podesavanja outputa za pdf verzije +\usepackage[bookmarks,pdffitwindow=false,unicode=true,% +pdftitle={\naslov \ -- \verzija},% +pdfauthor={\autor}% +]{hyperref} + +\usepackage{graphicx} +\usepackage{listings} +\usepackage{amsthm} +\usepackage{amsmath} +\usepackage{latexsym} +\usepackage{multicol} + +\usepackage{tikz} + +%margine +%experiment +%\usepackage[top=2.5cm, bottom=1.5cm, left=2cm, right=1cm]{geometry} +%staro: +\usepackage[top=1.5cm, bottom=1cm, left=2cm, right=1cm]{geometry} + +\begin{document} + +%customize the itemize environments + +\let\olditemize=\itemize +\def\itemize{ +\olditemize + \setlength{\itemsep}{1pt} + \setlength{\parskip}{0pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{-1cm} + +} + +%% ovi redovi daju header i footer + +\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} +\fancyhf{} % delete current setting for header and footer +%\fancyfoot[C]{\thepage} +\fancyhead[LO]{\bfseries\rightmark} +\fancyhead[RO]{\thepage} +\fancyhead[RE]{Operativni sistemi 2 -- skripta} +\fancyhead[LE]{\thepage} +\renewcommand{\headrulewidth}{0.5pt} +\renewcommand{\headwidth}{\textwidth} +%\renewcommand{\footrulewidth}{0.5pt} +%\addtolength{\headheight}{0.5pt} % make space for the rule +\fancypagestyle{plain}{% +\fancyhead{} % get rid of headers on plain pages +\fancyfoot{} +\renewcommand{\headrulewidth}{0pt} % and the line +\renewcommand{\footrulewidth}{0pt} % and the line +} +\renewcommand{\headheight}{15pt} + +%promene u marginama: +%\setlength{\marginparwidth}{32pt} +%\setlength{\textwidth}{620pt} +%\setlength{\textheight}{620pt} + + +%% specijalni blokovi koji služe kao podsetnici u radu ili napomene +\newcommand{\skica}[1]{ + \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small** \textit{#1} }} + \newline } +} + +\newcommand{\skicas}[1]{ + \framebox{* \textit{#1} *} +} + +%boldovane skice visokog prioriteta +\newcommand{\skicab}[1]{ + \noindent \framebox{\parbox[c]{0.9\textwidth}{ {\small*** + \textbf{#1} }} \newline } } + +\newcommand{\kod}[1]{{\small\texttt{#1}}} + +% ako je sledeci red odkomentarisan nista od skica nece biti ispisano +% u finalni dokument + + \renewcommand{\skica}[1]{} + + +\maketitle + +% theorems, definition etc. +%'''''''''''''''''''''''''' + +\theoremstyle{definition} +\newtheorem{def1}{Definicija} +\theoremstyle{plain} +\newtheorem{theo}{Teorema} +\newtheorem{lema}{Lema} + +\lstloadlanguages{Modula-2,C++} + +\lstset{ + basicstyle=\footnotesize\ttfamily, + showstringspaces=false, + breaklines=true +} + +\lstdefinestyle{codeblock}{ + basicstyle=\footnotesize, + keywordstyle=\textbf, + columns=[l]fixed, + breakatwhitespace=true, +% prebreak=\P, +% postbreak=\ding{229}\space, + language=Modula-2, + xleftmargin=4em +} + +\lstdefinestyle{terminal}{ + frame=l, +% frameround=fftt, + xleftmargin=4em +} + +\lstdefinestyle{numcodeblock}{ + style=codeblock, + numbers=left, + firstnumber=1, + stepnumber=1 +} + +\lstnewenvironment{codeblock}[1][]{\lstset{style=codeblock,#1}}{} +\lstnewenvironment{terminal}{\lstset{style=terminal}}{} + +% ----------------==================-------------------------------------- +% Pravi pocetak rada + + +Programi u ovoj skripti su testirani sa kompajlerom ``GNU Modula 2'' (u +daljem tekstu često skraćeno na \emph{gm2}), pod operativnim +sistemima iz Debian porodice. + +\tableofcontents + +%\newpage %necemo jos da prelamamo ovde + +%\begin{multicols}{2} + +\section{GNU Modula 2} + +\subsection{Prvi program u gm2 } +\label{g-prvi-program} + +Tradicionalni prvi program ``Hello World'' bi izgledao ovako: +\begin{codeblock} + MODULE hello; + + FROM StrIO IMPORT WriteString, WriteLn; + + BEGIN + WriteString('hello world'); + WriteLn + END hello. +\end{codeblock} + +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 ovde +koristimo \kod{StrIO} za rad sa stringovima, \kod{NumberIO}, za rad sa +brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se +korišćenje zvanične stranice: +\url{http://nongnu.org/gm2/libraries.html}, odnosno +\url{http://nongnu.org/gm2/base_libraries.html} za samo osnovne +biblioteke. + +Predpostavimo da smo ga napravili u trenutnom direktorijumu, koristeći +neki tesktualni editor (u dodatku~\ref{app-joe} je opisan ``joe'' koji +koristimo na vežbama). Kreirani fajl se može prevesti u izvršnu +verziju sledećom komandom: +\begin{terminal} + gm2 hello.mod +\end{terminal} + +Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se +napraviti fajl \kod{a.out}, koji se može pokrenuti sa \kod{./a.out}, +pri čemu naglašavamo da hoćemo da pokrenemo program iz trenutnog +direktorijuma koji se označava tačkom. Ako želimo da napravimo +izvršni fajl pod nekim drugim nazivom možemo koristiti poziv sledećeg +tipa: +\begin{terminal} + gm2 -o imeIzlaznogFajla ulaznifajl +\end{terminal} + +Za dalje opcije kompajlera konsultovati \kod{gm2 -{}-help} i zvaničnu +stranicu kompajlera. +%ovde je trebalo -{}- da razdvoji dva minusa, jer se inače tumače kao jedan. + +\subsection{Korišćenje sistemskih poziva} + +Mapiranje procedura na sistemske pozive se može izvršiti preko +specijalnog definicionog modula koji u zaglavlju sadrži ključne reči +\kod{FOR "{}C"} u kome se navode imena procedura koja se poklapaju sa +imenima sistemskih poziva i imaju parametre i povratne vrednosti +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 +\end{terminal} + +odnosno videćemo da je poziv definisan na sledeći način: +\begin{codeblock} +int system(const char *command); +\end{codeblock} +š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 +sastoji od svih sledećih znakova u memoriji dokle god se ne naiđe na +0C. Srećom, sve ovo se automatski mapira kreiranjem sledećeg modula: + +\begin{codeblock} +DEFINITION MODULE FOR "C" Lib; + + EXPORT UNQUALIFIED system; + + PROCEDURE system(command: ARRAY OF CHAR): INTEGER; + +END Lib. +\end{codeblock} + +Nije potrebno praviti prazne implementacione module. Iz ovakvog modula +se mogu uvoziti i koristiti procedure kao i iz bilo kakvog +``normalnog'' modula, kao što se može videti u sledećem primeru, koju +od korisnika učitava stringove i pokušava da ih izvrši kao da su uneti +u komandnoj liniji, dokle god korisnik ne unese reč ``kraj'': +\begin{codeblock} +MODULE Zad2; + +FROM StrIO IMPORT + ReadString, WriteString, WriteLn; +FROM StrLib IMPORT + StrEqual; +FROM Lib IMPORT + system; + +TYPE + String = ARRAY [0..1023] OF CHAR; + +VAR + Komanda: String; + +PROCEDURE Izvrsi(Komanda: ARRAY OF CHAR); +VAR + c: INTEGER; +BEGIN + c:= system(Komanda); +END Izvrsi; + +BEGIN + WriteString("?> "); ReadString(Komanda); + WHILE NOT StrEqual(Komanda, "kraj") DO + Izvrsi(Komanda); + WriteString("?> "); ReadString(Komanda); + END; +END Zad2. +\end{codeblock} + +Prilikom mapiranja sistemskih poziva je moguće koristiti ``...'' na +kraju liste argumenata da se označi da je moguće proslediti +proizvoljan broj argumenata nakon navedenih, koji će biti premapirani +na odgovarajuće tipove podataka. Takođe je moguće i označiti da se +povratna vrednost procedure ne mora koristiti. U gornjem primeru je +mogla funkcija da se definiše kao \kod{PROCEDURE system(command: ARRAY + OF CHAR): [INTEGER];} i tada bi mogla se poziva kao obična procedura +bez korišćenja pomoćne promenljive \kod{c} da se dobije povratna +vrednost. + +Tabela pretvaranja tipova se može videti na +\url{http://www.nongnu.org/gm2/interface_to_c.html} + +\subsubsection{Primer: Izlistavanje sadržaja direktorijuma} + +Korišćenje sistemskih poziva se može ilustrovati primerom čitanja +sadržaja direktorijuma, komandama \kod{opendir}, \kod{readdir} i +\kod{closedir}. Prva komanda otvara prosledjenu putanju i vraća +pokazivač na otvoreni direktorijum. Komanda \kod{readdir} prima ovakav +pokazivač kao ulazni parametar, a vraća pokazivač na slog koji +predstavlja sledeću stavku u otvorenom direktorijumu ili \kod{NIL} ako +više nema ničega. Poslednja komanda, \kod{closedir}, se izvodi na +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 +sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima. +Prva je testirana na Lubuntu 11.10 32bit, a druga je testirana na +Kubuntu 11.10 64bit. + +\begin{codeblock} +DEFINITION MODULE FOR "C" Lib32; + FROM SYSTEM IMPORT + ADDRESS, BYTE; + EXPORT UNQUALIFIED opendir, readdir, closedir, stat, + PDir, DirEnt, PDirEnt, Stat, PStat, PInt; +\end{codeblock} +\begin{minipage}{0.5\textwidth} +\begin{codeblock} +(* types for 32 bit *) + TYPE + PDir = ADDRESS; + DirEnt = RECORD + ino: INTEGER; + off: INTEGER; + reclen: SHORTCARD; + type: BYTE; + name: ARRAY [0..255] OF CHAR; + END; + PDirEnt = POINTER TO DirEnt; + 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 + PDir = ADDRESS; + DirEnt = RECORD + ino: LONGINT; + off: LONGINT; + reclen: SHORTCARD; + type: BYTE; + name: ARRAY [0..255] OF CHAR; + END; + PDirEnt = POINTER TO DirEnt; + 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} + PStat = POINTER TO Stat; + PInt = POINTER TO INTEGER; + + PROCEDURE opendir(name: ARRAY OF CHAR): PDir; + PROCEDURE readdir(dirp: PDir): PDirEnt; + PROCEDURE closedir(dirp: PDir): [INTEGER]; + PROCEDURE stat(path: ARRAY OF CHAR; buf: PStat): [INTEGER]; +END Lib32. +\end{codeblock} + +\begin{codeblock} +MODULE Zad5; + +FROM SYSTEM IMPORT + ADR; +FROM StrIO IMPORT + WriteString, WriteLn; +FROM NumberIO IMPORT + WriteInt; +FROM StrLib IMPORT + StrLen, StrConCat; +FROM Args IMPORT + Narg, GetArg; +FROM Lib32 IMPORT + opendir, readdir, closedir, stat, PDir, PDirEnt, Stat; +FROM errno IMPORT + geterrno; + +TYPE + String = ARRAY [0..1023] OF CHAR; + +VAR + Putanja: String; + n, i: INTEGER; + ok: BOOLEAN; + +PROCEDURE Listaj(Ime: ARRAY OF CHAR); +VAR + dir: PDir; + entry: PDirEnt; + info: Stat; + c: INTEGER; + Len: CARDINAL; + Putanja: String; +BEGIN + dir:= opendir(Ime); + IF dir = NIL THEN + WriteString("Folder "); WriteString(Ime); WriteLn; + WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn(); + WriteString(" Ne mogu da otvorim direktorijum."); WriteLn(); + ELSE + Len:= StrLen(Ime); + IF Ime[Len - 1] # "/" THEN + StrConCat(Ime, "/", Ime); + END; + WriteString("Folder "); WriteString(Ime); WriteLn; + entry:= readdir(dir); + WHILE entry # NIL DO + IF entry^.name[0] # "." THEN + StrConCat(Ime, entry^.name, Putanja); + c:= stat(Putanja, ADR(info)); + WriteString(" "); + IF c = -1 THEN + WriteString("? ? KB"); + ELSE + WriteInt(info.nlink, 3); + WriteInt((info.size + 512) DIV 1024, 5); WriteString(" KB "); + END; + WriteString(" "); WriteString(entry^.name); WriteLn; + END; + entry:= readdir(dir); + END; + c:= closedir(dir); + IF c = -1 THEN + WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn(); + WriteString(" Ne mogu da zatvorim direktorijum."); WriteLn(); + END; + END; +END Listaj; + +BEGIN + n:= Narg(); + FOR i:= 1 TO n - 1 DO + ok:= GetArg(Putanja, i); + WriteLn; + Listaj(Putanja); + END; + WriteLn; +END Zad5. +\end{codeblock} + +\subsection{Stvaranje novih procesa} + +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} +PROCEDURE fork(): INTEGER; +\end{codeblock} + +Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu +koda. Jedino po čemu se razlikuju je vrednost koju je vratio +\kod{fork}, ukoliko je u pitanju originalni proces (``roditelj'') tada +je ta vrednost jednaka proces identifikatoru (\emph{pid}-u) +``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom +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} +pid := fork(); +IF pid = 0 THEN + (* "detetove" operacije *) +ELSE + (* "roditeljske" operacije *) +END; +\end{codeblock} + +Komanda \kod{wait} (uvezena kao sistemska) se može pozvati u +originalnom procesu sa efektom da se proces uspava dokle god neki od +procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se +može postići komandom \kod{waitpid} u kojoj možemo precizirati tačno +koji proces čekamo da se završi. + +U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera +organizacije procesa. + +\skica{treba nam propratni tekst za ovo sto sledi} + +\subsubsection{Lanac procesa} + +\begin{minipage}{0.6\textwidth} +\begin{codeblock} +pid := 0; +i := 1; +WHILE (pid = 0) AND (i < n) DO + pid := fork(); + IF pid # 0 THEN + (* ... *) + ELSE + INC(i); + END; +END; +\end{codeblock} +\end{minipage} +\begin{minipage}{0.4\textwidth} +\begin{tikzpicture} +[proc/.style={circle,draw}] +\def \n {5} +\foreach \s in {1,...,\n} +{ + \node[proc] (\s) at (\s,-\s/2) {\s}; +} +\foreach \s in {2,...,\n} { + \pgfmathparse{int(\s-1)} + \draw [<-] (\s) to (\pgfmathresult); +} +\end{tikzpicture} +\end{minipage} + +\subsubsection{Roditelj sa puno dece} + +\begin{minipage}{0.6\textwidth} +\begin{codeblock} +pid := -1; +j := 0; +WHILE (pid # 0) AND (j < m) DO + pid := fork(); + IF pid # 0 THEN + INC(j); + ELSE + (* ... *) + END; +END; +\end{codeblock} +\end{minipage} +\begin{minipage}{0.4\textwidth} +\begin{tikzpicture} +[proc/.style={circle,draw}] +\def \n {5} +\node[proc] (1) at (0,0) {1}; +\foreach \s in {2,...,\n} +{ + \node[proc] (\s) at (-3.5+\s,-2) {\s}; +} +\foreach \s in {2,...,\n} { + \draw [->] (1) to (\s); +} +\end{tikzpicture} +\end{minipage} + +\subsubsection{Stablo procesa} + +\begin{minipage}{0.6\textwidth} +\begin{codeblock} +i := 1; +j := 0; +WHILE (i < n) AND (j < m) DO + pid := fork(); + IF pid # 0 THEN + INC(j); + ELSE + INC(i); + j:=0; + END; +END; +\end{codeblock} +\end{minipage} +\begin{minipage}{0.4\textwidth} +\begin{tikzpicture} +[proc/.style={circle,draw}, +level 1/.style={sibling distance=20mm,level distance=10mm}, +level 2/.style={sibling distance=10mm,font=\scriptsize} +] +\node[proc] (root) {0} +child[->] foreach \x in {1,2} {node[proc] {\x} + child foreach \y in {1,2} {node[proc] {\x-\y} + }}; + +\end{tikzpicture} +\end{minipage} + + +% ---------------------------------------------- + +\newpage +\pagenumbering{Roman} +\appendix + +\section{Instalacija kompajlera GNU Modula 2} +\label{app-instalacija-gm2} + +Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na +već postojeći GNU Linux operativni sistem iz Debian porodice, koja +uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i +mnoge druge. Kompajler je moguće bez većih problema instalirati i na +bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog +koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom +\url{http://www.nongnu.org/gm2/obtaining.html}. + +Ovo uputstvo neće ulaziti u detalje kako instalirati operativni +sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno +instaliraju drugi operativni sistem, preporučujemo korišćenje +virtuelne mašine (npr besplatni Virtual Box, +\url{http://virtualbox.org}) i instaliranje sistema na nju, ili još +lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr +Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što +je Lubuntu, ako su performanse problematične. + +\subsection{Instalacija na Debian platformi} + +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} +# +# 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} + +Alternativno se mogu koristiti sledeće komande: + +\begin{terminal} +add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ squeeze main" +add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ squeeze main" +\end{terminal} + +Većina sistema omogućava i da se ovo uradi preko nekih grafičkih +alata. + +Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi +sledeće: +\begin{terminal} +sudo apt-get update +sudo apt-get install gm2-doc gm2 +\end{terminal} + +Po želji se može skinuti i izvorni kod kompajlera sledećom komandom: +\begin{terminal} +sudo apt-get source gm2 +\end{terminal} + +Videti Glavu~\ref{g-prvi-program} za primer kompajliranja programa. + +\subsection{Problem: nedostaje ``ctli.o'' i/ili još neki fajlovi} + +Pri pokušaju kompajliranja se na nekim sistemima može desiti da +prijave nedostajuće fajlove \kod{crti.o, crt1.o} i/ili +\kod{crtn.o}. Konkretno je poznato za gcc verziju 4.6 na debianu, +pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i +na neke druge sisteme. + +Greška se ispravlja na sledeći način (korisnik treba da +ima administrativna prava, zato se radi ``sudo'') ukoliko +je u pitanju 64-bitni sistem: +\begin{terminal} +sudo su +cd /usr/lib +ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o +ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o +ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o +exit +\end{terminal} + +Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama +treba zameniti ``x86\_64'' sa ``i386''. + +\skica{možda i build from source} + +\section{Tekst editor Joe} +\label{app-joe} + +Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje +rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada +(korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može +koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na +skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim +sistemima se ovo može uraditi sa: +\begin{terminal} +sudo apt-get install joe +\end{terminal} +Ili analogno na drugim sistemima za instaliranje softvera. + +Otvoranje postojećeg fajla ``hello.mod'' za uređivanje, +odnosno otvaranje novog praznog fajla u koji ćemo unositi +odgovarajući kod ili tekst se može postići sledećom komandom: +\begin{terminal} +joe hello.mod +\end{terminal} + +Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl ++\keystroke{K}\keystroke{X} (\emph{ctrl} i \emph{K} odjednom, pa onda +\emph{X}, ova šema pritiskanja tastera važi za sve prečice), dok se +samo snimanje izvršava sa \Ctrl +\keystroke{K}\keystroke{D}. U oba +slučaja joe pita za ime fajla koji snimamo, pri čemu kao podrazumevanu +vrednost ponudi trenutno ime. Brz izlaz iz editora je moguć i sa +\Ctrl+\keystroke{C} (što je i standardna komanda za ``ubijanje'' +trenutnog procesa u terminalu), pri čemu će joe pitati da li želimo da +izađemo ako postoje promene koje nisu snimljene. + +Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje +kombinacije \Ctrl +\keystroke{K}\keystroke{H}, koja daje spisak +komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći +kroz koje se može kretati sa \Esc \keystroke{.} i \Esc \keystroke{,}. + +U okviru pomoći stoje i komande za označavanje blokova teksta i +njihovo nakndadno premeštanje, kopiranje ili brisanje. Pritiskom na +\Ctrl+\keystroke{\_} se vraća poslednja promena (undo). + +Pritiskom na \Ctrl +\keystroke{T} se dobija meni sa opcijama u kome se +može odabrati više opcija za rad, kao što su margine, automatsko +prelamanje redova, očuvanje uvlačenja redova (\emph{auto-indent}), +sintaksno bojenje itd. + +\skica{joe i sintaksno bojenje za m2} + +\section{Putty} + +\emph{Putty} je program koji služi da se pod Windows operativnim +sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX +serveru. Može se naći online na +\url{http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html}. + +Po pokretanju se prikazuje dijalog u kome se može ukucati adresa +udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta +samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je +uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i +lozinke. + +\subsection{Problem: terminal ne odgovara na unos, ``smrznuo'' se} + +Putty se može dovesti u stanje da ne prikazuje ispis unosa na ekranu, +pritiskom na \Ctrl+\keystroke{S} (što je često velik problem jer se +poklapa sa standardnom prečicom za snimanje u većini grafičkih +aplikacija). Iz ovog režima rada se može izaći prečicom +\Ctrl+\keystroke{Q}. +Ukratko: +\begin{lstlisting}[xleftmargin=10em] +Do not press + Ctrl S +If you do + Ctrl Q +\end{lstlisting} + +\skica{literatura i linkovi izdovjeni na kraju dokumenta} + +%\end{multicols} +\end{document}