gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system 1 % skripta-os2.tex
2 % Skripta za predmet Operativni Sistemi 2, DMI, PMF, NS
3 % Doni Pracner, Ivan Pribela
4 % 2011/12 -- 2014/15
10 % osnovne informacije koje ce se prikazati na naslovnoj strani,
11 % kao i u informacijama u generisanom pdfu
27 %change the default font
34 %podesavanja outputa za pdf verzije
47 %\usepackage{keystroke}
48 % ispod je dodata alternativa za ovaj paket
56 draw,
57 fill=white,
59 rectangle,
60 rounded corners=2pt,
61 inner sep=1pt,
62 line width=0.5pt,
63 font=\small\sffamily
65 ;
66 }
72 %margine
75 % theorems, definition etc.
76 %''''''''''''''''''''''''''
87 basicstyle=\ttfamily,
88 showstringspaces=false,
89 breaklines=true
90 }
93 % basicstyle=\footnotesize\ttfamily,
94 keywordstyle=\textbf,
96 breakatwhitespace=true,
97 % prebreak=\P,
98 % postbreak=\ding{229}\space,
99 language=Modula-2,
100 xleftmargin=1em
101 }
104 style=codeblock,
105 xleftmargin=4em
106 }
109 frame=lt,
110 % frameround=fftt,
112 % prebreak=\P,
114 xleftmargin=2em
115 }
118 style=codeblock,
119 numbers=left,
120 firstnumber=1,
121 stepnumber=1
122 }
128 %% specijalni blokovi koji služe kao podsetnici u radu ili napomene
132 }
136 }
138 %boldovane skice visokog prioriteta
145 % ako je sledeci red odkomentarisan nista od skica nece biti ispisano
146 % u finalni dokument
150 %customize the itemize environments
154 \olditemize
160 }
164 %% ovi redovi daju header i footer
168 %\fancyfoot[C]{\thepage}
179 %\renewcommand{\footrulewidth}{0.5pt}
180 %\addtolength{\headheight}{0.5pt} % make space for the rule
186 }
189 %promene u marginama:
190 %\setlength{\marginparwidth}{32pt}
191 %\setlength{\textwidth}{620pt}
192 %\setlength{\textheight}{620pt}
197 \maketitle
200 % ----------------==================--------------------------------------
201 % Pravi pocetak rada
204 Programi u ovoj skripti su testirani sa kompajlerom ``GNU Modula 2'' (u
206 sistemima iz Debian porodice.
208 \tableofcontents
210 \newpage
212 %\begin{multicols}{2}
218 (GCC). Podržava nekoliko dijalekata jezika ``Modula 2'' --
219 najznačajniji su ISO standard i nekoliko varijacija koje je originalni
222 dobijaju i besplatne ISO, PIM i još neke biblioteke.
227 Tradicionalni prvi program ``Hello World'' bi izgledao ovako:
229 MODULE hello;
231 FROM StrIO IMPORT WriteString, WriteLn;
233 BEGIN
234 WriteString('hello world');
235 WriteLn
236 END hello.
239 Primećuje se razlika u modulu iz koga se uvoze komande u odnosu na
242 brojevima i tako dalje. Za pregled dostupnih biblioteka predlaže se
243 korišćenje zvanične stranice:
246 biblioteke.
248 Predpostavimo da je fajl napravljen u trenutnom direktorijumu,
250 ``joe'' koji se koristi na vežbama). Kreirani fajl se tada može
251 prevesti u izvršnu verziju sledećom komandom:
253 gm2 hello.mod
256 Ako je kod ispravan (kao onaj gore) u istom direktorijumu će se
259 ./a.out
262 direktorijuma (koji se označava tačkom). Ako je potrebno da
263 izvršni fajl ima neki drugi naziv može se koristiti poziv sledećeg
264 tipa:
266 gm2 -o imeIzlaznogFajla ulaznifajl
270 stranicu kompajlera.
271 %ovde je trebalo -{}- da razdvoji dva minusa, jer se inače tumače kao jedan.
275 Mapiranje procedura na sistemske pozive se može izvršiti preko
276 specijalnog definicionog modula koji u zaglavlju sadrži ključne reči
278 imenima sistemskih poziva i imaju parametre i povratne vrednosti
281 komande možemo videti sa
283 man system
286 odnosno videćemo da je poziv definisan na sledeći način:
288 int system(const char *command);
290 što znači da vraća ceo broj, a prima jedan argument koji je pokazivač
291 (što se označava *) na znak. Ovo je zapravo ceo string, pošto se u C
292 jeziku oni predstavljaju kao pokazivač na prvi znak, a string se onda
293 sastoji od svih sledećih znakova u memoriji dokle god se ne naiđe na
294 0C. Srećom, sve ovo se automatski mapira kreiranjem sledećeg modula:
297 DEFINITION MODULE FOR "C" Lib;
299 EXPORT UNQUALIFIED system;
301 PROCEDURE system(command: ARRAY OF CHAR): INTEGER;
303 END Lib.
306 Nije potrebno praviti prazne implementacione module. Iz ovakvog modula
307 se mogu uvoziti i koristiti procedure kao i iz bilo kakvog
308 ``normalnog'' modula, kao što se može videti u sledećem primeru, koju
309 od korisnika učitava stringove i pokušava da ih izvrši kao da su uneti
310 u komandnoj liniji, dokle god korisnik ne unese reč ``kraj'':
312 MODULE Zad2;
314 FROM StrIO IMPORT
315 ReadString, WriteString, WriteLn;
316 FROM StrLib IMPORT
317 StrEqual;
318 FROM Lib IMPORT
319 system;
321 TYPE
324 VAR
325 Komanda: String;
327 PROCEDURE Izvrsi(Komanda: ARRAY OF CHAR);
328 VAR
329 c: INTEGER;
330 BEGIN
331 c:= system(Komanda);
332 END Izvrsi;
334 BEGIN
335 WriteString("?> "); ReadString(Komanda);
336 WHILE NOT StrEqual(Komanda, "kraj") DO
337 Izvrsi(Komanda);
338 WriteString("?> "); ReadString(Komanda);
339 END;
340 END Zad2.
343 Prilikom mapiranja sistemskih poziva je moguće koristiti ``...'' na
344 kraju liste argumenata da se označi da je moguće proslediti
345 proizvoljan broj argumenata nakon navedenih, koji će biti premapirani
346 na odgovarajuće tipove podataka. Takođe je moguće i označiti da se
347 povratna vrednost procedure ne mora koristiti. U gornjem primeru je
351 vrednost.
353 Neki primeri pretvaranja tipova su dati u Tabeli~\ref{t-pretvaranje-tipova}, preuzetoj sa \url{http://www.nongnu.org/gm2/interface_to_c.html}.
358 Stvarni parametar & Konverzija & Tip vrednosti koji će biti prosleđen\\
359 \hline
360 123 & - & long long int\\
361 "hello world" & - & const char *\\
362 a: ARRAY OF CHAR & ADR(a) & char *\\
364 3.14 & - & long double
372 Korišćenje sistemskih poziva se može ilustrovati primerom čitanja
376 pokazivač kao ulazni parametar, a vraća pokazivač na slog koji
379 kraju i zatvara otvoreni direktorijum. Bitno je zatvarati otvorene
380 resurse jer je moguće da sistem odbije da otvori novi ako ih
381 proces već ima previše otvorenih.
383 Budući da su u pitanju sistemski pozivi niskog nivoa, veličine tipova
384 su nažalost promenljive i mogu zavisiti od konkretnog operativnog
386 sistem. Zbog ovoga su date dve varijante bibilioteke sa tipovima.
391 DEFINITION MODULE FOR "C" libdir;
393 FROM SYSTEM IMPORT
394 ADDRESS, BYTE;
396 EXPORT UNQUALIFIED opendir, readdir, closedir, PDir, DirEnt, PDirEnt;
400 (* types for 32 bit *)
401 TYPE
402 PDir = ADDRESS;
403 DirEnt = RECORD
404 ino: INTEGER;
405 off: INTEGER;
406 reclen: SHORTCARD;
407 type: BYTE;
409 END;
410 PDirEnt = POINTER TO DirEnt;
415 (* types for 64 bit *)
416 TYPE
417 PDir = ADDRESS;
418 DirEnt = RECORD
419 ino: LONGINT;
420 off: LONGINT;
421 reclen: SHORTCARD;
422 type: BYTE;
424 END;
425 PDirEnt = POINTER TO DirEnt;
429 PROCEDURE opendir(name: ARRAY OF CHAR): PDir;
430 PROCEDURE readdir(dirp: PDir): PDirEnt;
433 END libdir.
437 MODULE Zad3;
439 FROM StrIO IMPORT
440 WriteString, WriteLn;
441 FROM NumberIO IMPORT
442 WriteInt;
443 FROM Args IMPORT
444 Narg, GetArg;
445 FROM libdir IMPORT
446 opendir, readdir, closedir, PDir, PDirEnt;
447 FROM errno IMPORT
448 geterrno;
450 TYPE
453 VAR
454 Putanja: String;
455 n, i: INTEGER;
456 ok: BOOLEAN;
458 PROCEDURE Listaj(Ime: ARRAY OF CHAR);
459 VAR
460 dir: PDir;
461 entry: PDirEnt;
462 c: INTEGER;
463 BEGIN
464 WriteString("Folder "); WriteString(Ime); WriteLn;
465 dir:= opendir(Ime);
466 IF dir = NIL THEN
467 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
468 WriteString(" Ne mogu da otvorim direktorijum."); WriteLn();
469 ELSE
470 entry:= readdir(dir);
471 WHILE entry # NIL DO
473 WriteString(" "); WriteString(entry^.name); WriteLn;
474 END;
475 entry:= readdir(dir);
476 END;
477 c:= closedir(dir);
478 IF c = -1 THEN
479 WriteString(" Greska broj "); WriteInt(geterrno(), 0); WriteString("."); WriteLn();
480 WriteString(" Ne mogu da zatvorim direktorijum."); WriteLn();
481 END;
482 END;
483 END Listaj;
485 BEGIN
486 n:= Narg();
488 ok:= GetArg(Putanja, i);
489 WriteLn;
490 Listaj(Putanja);
491 END;
492 WriteLn;
493 END Zad3.
498 O pojedinim fajlovima možemo dobiti više informacija koristeći
501 će komanda upisati podatke. Obratiti pažnju da zbog ovoga struktura
502 već mora postojati u memoriji, ili kao lokalna promenljiva
503 odgovarajućeg slogovnog tipa, ili dinamički alocirana korišćenjem
504 pokazivača na nju.
506 Linux i mnogi drugi srodni sistemi za internu prezentaciju vremena
507 koriste broj sekundi od početka ``epohe'', odnosno od prvog januara
508 1970 godine. Za konverziju u klasičnije mere vremena se može koristiti
511 Kao i u prethodnom primeru date su dve verzije definicija nekih
512 tipova.
515 DEFINITION MODULE FOR "C" LibStat32;
516 FROM SYSTEM IMPORT
517 ADDRESS, BYTE;
518 EXPORT UNQUALIFIED stat, localtime,
519 Stat, PStat, Tm, PTm, PInt,
520 fifo, character, directory, block, regular, network, link, socket;
522 CONST
523 fifo = 1;
524 character = 2;
525 directory = 4;
526 block = 6;
527 regular = 8;
528 network = 9;
529 link = 10;
530 socket = 12;
534 (* types for 32 bit *)
535 TYPE
536 Stat = RECORD
537 dev: LONGINT;
538 ino: LONGINT;
539 mode: INTEGER;
540 nlink: LONGINT;
541 uid: INTEGER;
542 gid: INTEGER;
543 pad1: LONGINT;
544 rdev: INTEGER;
545 size: INTEGER;
546 blksize: INTEGER;
547 blocks: INTEGER;
548 atime: INTEGER;
549 anano: INTEGER;
550 mtime: INTEGER;
551 mnano:INTEGER;
552 ctime:INTEGER;
553 cnano: INTEGER;
554 unused:LONGINT;
555 END;
560 (* types for 64 bit *)
561 TYPE
562 Stat = RECORD
563 dev: LONGINT;
564 ino: LONGINT;
565 nlink: LONGINT;
566 mode: INTEGER;
567 uid: INTEGER;
568 gid: INTEGER;
569 pad1: INTEGER;
570 rdev: LONGINT;
571 size: LONGINT;
572 blksize: LONGINT;
573 blocks: LONGINT;
574 atime: LONGINT;
575 mtime: LONGINT;
576 ctime: LONGINT;
577 END;
581 Tm = RECORD
582 sec, min, hour,
583 mday, mon, year,
584 wday, yday, isdst: INTEGER;
585 END;
586 PTm = POINTER TO Tm;
587 PInt = POINTER TO INTEGER;
588 PStat = POINTER TO Stat;
591 PROCEDURE localtime(time: PInt): PTm;
593 END LibStat32.
597 MODULE Zad4;
599 FROM SYSTEM IMPORT
600 ADR;
601 FROM StrIO IMPORT
602 WriteString, WriteLn;
603 FROM NumberIO IMPORT
604 WriteInt;
605 FROM StrLib IMPORT
606 StrLen, StrConCat;
607 FROM Args IMPORT
608 Narg, GetArg;
609 FROM LibStat32 IMPORT
610 stat, localtime, Stat, PTm;
611 IMPORT LibStat32;
612 FROM errno IMPORT
613 geterrno;
615 TYPE
618 VAR
619 Putanja: String;
620 n, i: INTEGER;
621 ok: BOOLEAN;
623 PROCEDURE WriteMode(mode: INTEGER);
625 PROCEDURE WriteType(type: INTEGER);
626 BEGIN
627 IF type = lib32.fifo THEN
628 WriteString("f");
629 ELSIF type = lib32.character THEN
630 WriteString("c");
631 ELSIF type = lib32.directory THEN
632 WriteString("d");
633 ELSIF type = lib32.block THEN
634 WriteString("b");
635 ELSIF type = lib32.regular THEN
636 WriteString("-");
637 ELSIF type = lib32.network THEN
638 WriteString("n");
639 ELSIF type = lib32.link THEN
640 WriteString("l");
641 ELSIF type = lib32.socket THEN
642 WriteString("s");
643 ELSE
644 WriteString("?");
645 END;
646 END WriteType;
648 PROCEDURE WriteRWX(triplet: INTEGER);
649 BEGIN
651 WriteString("r");
652 ELSE
653 WriteString("-");
654 END;
656 WriteString("w");
657 ELSE
658 WriteString("-");
659 END;
661 WriteString("x");
662 ELSE
663 WriteString("-");
664 END;
665 END WriteRWX;
667 BEGIN
669 WriteRWX(mode DIV 64);
670 WriteRWX(mode DIV 8);
671 WriteRWX(mode);
672 END WriteMode;
674 PROCEDURE WriteTime(time: LONGINT);
675 VAR
676 tm: PTm;
677 BEGIN
678 tm:= localtime(ADR(time));
679 IF tm # NIL THEN
681 WriteString("-");
682 IF tm^.mon < 9 THEN
683 WriteString("0");
684 END;
686 WriteString("-");
687 IF tm^.mday < 10 THEN
688 WriteString("0");
689 END;
690 WriteInt(tm^.mday, 0);
691 WriteString(" ");
692 IF tm^.hour < 10 THEN
693 WriteString("0");
694 END;
695 WriteInt(tm^.hour, 0);
696 WriteString(":");
697 IF tm^.hour < 10 THEN
698 WriteString("0");
699 END;
700 WriteInt(tm^.min, 0);
701 ELSE
702 WriteString("??:??");
703 END;
704 END WriteTime;
706 PROCEDURE Listaj(Putanja: ARRAY OF CHAR);
707 VAR
708 info: Stat;
709 c: INTEGER;
710 BEGIN
711 c:= stat(Putanja, ADR(info));
712 IF c = -1 THEN
713 WriteString("?????????? ? ? KB ????-??-?? ??:??");
714 ELSE
715 WriteMode(info.mode);
716 WriteInt(info.nlink, 3);
718 WriteTime(info.atime);
719 END;
720 WriteString(" "); WriteString(Putanja); WriteLn;
721 END Listaj;
723 BEGIN
724 n:= Narg();
726 ok:= GetArg(Putanja, i);
727 WriteLn;
728 Listaj(Putanja);
729 END;
730 WriteLn;
731 END Zad4.
737 (``račva''). Novi proces je identičan sa originalnim, osim u svom
738 identifikacionom broj. Komanda ne prima parametre i vraća jedan integer, pa se može mapirati na sledeći način:
740 PROCEDURE fork(): INTEGER;
743 Oba procesa se nakon račvanja nastavljaju odvijati u sledećem redu
744 koda. Jedino po čemu se razlikuju je vrednost koju je vratio
747 ``deteta'', i može se koristiti za komunikaciju sa detetom, a u novom
748 procesu je ova vrednost jednaka nuli. Budući da je najčešće potrebno
749 da dete i roditelj rade različite stvari, to se obično rešava kodom
750 sledećeg oblika:
752 pid := fork();
753 IF pid = 0 THEN
754 (* "detetove" operacije *)
755 ELSE
756 (* "roditeljske" operacije *)
757 END;
761 originalnom procesu sa efektom da se proces uspava dokle god neki od
762 procesa dece ne završi sa radom. Veća kontrola nad ovim ponašanjem se
764 koji proces čekamo da se završi.
766 U sledećim sekcijama će biti ilustrovano nekoliko klasičnih primera
767 organizacije procesa.
775 pid := 0;
776 i := 1;
777 WHILE (pid = 0) AND (i < n) DO
778 pid := fork();
779 IF pid # 0 THEN
780 (* ... *)
781 ELSE
782 INC(i);
783 END;
784 END;
792 {
794 }
798 }
806 pid := -1;
807 j := 0;
808 WHILE (pid # 0) AND (j < m) DO
809 pid := fork();
810 IF pid # 0 THEN
811 INC(j);
812 ELSE
813 (* ... *)
814 END;
815 END;
824 {
826 }
829 }
837 dubina := 1;
838 brdece := 0;
839 WHILE (dubina < maxdubina) AND
840 (brdece < potrebnodece) DO
841 pid := fork();
842 IF pid # 0 THEN
843 INC(brdece);
844 ELSE
845 INC(dubina);
846 brdece := 0;
847 END;
848 END;
857 ]
862 }}};
865 čvorovi prikazuju vrednosti pri kreiranju};
870 % ----------------------------------------------
872 \newpage
874 \appendix
879 Ova sekcija treba da omogući instalaciju kompajlera GNU Modula 2 na
880 već postojeći GNU Linux operativni sistem iz Debian porodice, koja
881 uključuje i sve varijante Ubuntu distribucije, kao i Linux Mint i
882 mnoge druge. Kompajler je moguće bez većih problema instalirati i na
883 bilo koji drugi Linux (a i OSX i Windows), kompajliranjem iz izvornog
884 koda, za šta preporučujemo konsultovanje sa zvaničnom stranicom
887 Ovo uputstvo neće ulaziti u detalje kako instalirati operativni
888 sistem. Za one koje koriste Windows i nisu sigurni kako da paralelno
889 instaliraju drugi operativni sistem, preporučujemo korišćenje
890 virtuelne mašine (npr besplatni Virtual Box,
892 lakše skinuti već instaliranu mašinu sa nekim od Debian sistema, npr
893 Ubuntu ili Kubuntu, ili eventualno neku manje zahtevnu verziju kao što
894 je Lubuntu, ako su performanse problematične.
898 Prvi korak za instalaciju dodatnog kompajlera GNU Modula 2 je
899 dodavanje repozitorijuma softvera u sistem. Ovo se može uraditi ručnim
902 #
903 # GNU Modula-2 repo
904 #
906 deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main
907 deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main
910 Alternativno se mogu koristiti sledeće komande:
913 sudo add-apt-repository "deb http://floppsie.comp.glam.ac.uk/debian/ wheezy main"
914 sudo add-apt-repository "deb-src http://floppsie.comp.glam.ac.uk/debian/ wheezy main"
917 Većina sistema omogućava i da se ovo uradi preko nekih grafičkih
918 alata.
920 Nakon dodavanja novog izvora za softver potrebno je u konzoli uraditi
921 sledeće:
923 sudo apt-get update
924 sudo apt-get install gm2-doc gm2
927 Po želji se može skinuti i izvorni kod kompajlera sledećom komandom:
929 sudo apt-get source gm2
936 dodati izvori softvera i potrebno ih je ručno ponovo upaliti. Ovo se
938 ``\#'' sa početka redova koje želimo da koristimo ponovo ili
939 korišćenjem adekvatnih vizuelnih alata.
943 Pri pokušaju kompajliranja se na nekim sistemima može desiti da
946 pošto postoji problem u pakovanju kompajlera, ali moguće je da utiče i
947 na neke druge sisteme.
949 Greška se ispravlja na sledeći način (korisnik treba da
950 ima administrativna prava, zato se radi ``sudo'') ukoliko
951 je u pitanju 64-bitni sistem:
953 sudo su
954 cd /usr/lib
955 ln -sv /usr/lib/x86_64-linux-gnu/crti.o crti.o
956 ln -sv /usr/lib/x86_64-linux-gnu/crt1.o crt1.o
957 ln -sv /usr/lib/x86_64-linux-gnu/crtn.o crtn.o
958 exit
961 Za 32-bitne sisteme važi ista ispravka, jedino što se u komandama
962 treba zameniti ``x86\_64'' sa ``i386''.
966 \newpage
970 Ukratko ćemo predstaviti editor ``joe''. Odabran je zbog svoje
971 rasprostranjenosti, potpune funkcionalnosti u tekstualnom modu rada
972 (korišćenje iz terminala) te vrlo jasnom sistemu pomoći koji se može
973 koristiti pri radu. Na nekim sistemima on dolazi već instaliran, a na
974 skoro svima se lako može dodati iz repozitorijuma. Na Ubuntu i sličnim
975 sistemima se ovo može uraditi sa:
977 sudo apt-get install joe
979 Ili analogno na drugim sistemima za instaliranje softvera.
981 Otvaranje postojećeg fajla ``hello.mod'' za uređivanje, odnosno
982 otvaranje novog praznog fajla u koji ćemo unositi odgovarajući kod ili
983 tekst se može postići sledećom komandom:
985 joe hello.mod
990 Joe je po svojoj prirodi bogat prečicama na tastaturi. U daljem tekstu
991 će biti navedene mnoge od njih. Kod svih se navodi redosled
992 pritiskanja tastera individualno, a ako su negde tasteri spojeni sa
993 ``+'' (alternativno sa ``-'') onda ih je potrebno pritisnuti
994 odjednom. Neki primeri:
1007 U okviru sistema pomoći koji je ugrađen u sam editor uglavnom se
1008 pojavljuju skraćeni oblici:
1018 Za pomoć pri korišćenju ediora ``joe'' preporučujemo pritiskanje
1020 komandi u gornjem delu editora. Postoji nekoliko stranica ove pomoći
1024 U okviru pomoći postoje maltene sve komande koje editor pruža, a na
1025 kraju su čak uključene i ASCII tabele znakova. Preporučuje se makar
1026 ovlašno upoznavanje sa stranicama pomoći i mogućnostima editora.
1030 Snimanje sa izlaskom iz programa se može uraditi sa \Ctrl
1033 slučaja ``joe'' pita za ime fajla koji snimamo, pri čemu kao podrazumevanu
1034 vrednost ponudi trenutno ime.
1036 Joe može raditi sa više fajlova odjednom. Novi fajl se može otvoriti
1038 polje za kucanje imena fajla koje dozvoljava i da se putanja
1039 automatski dopunjava mogućnostima pritiskom na taster \Tab (Tab), baš
1040 kao i u komandnoj liniji.
1042 Prelazak na sledeći, odnosno prethodni, otvoreni fajl se dobija pritiskom
1046 standardna komanda za ``ubijanje'' trenutnog procesa u terminalu), pri
1047 čemu će ``joe'' pitati da li želimo da izađemo ako postoje promene
1048 koje nisu snimljene. Ako je u pitanju bio jedini otvoren fajl, tada će
1049 se i sam editor zatvoriti.
1055 Premeštanje i kopiranje delova teksta je malo drugačije nego u
1056 klasičnim grafičkim programima. Prvo je potrebno označiti željeni
1058 početak bloka na trenutnu poziciju kursora, a \Ctrl
1060 selekcija biti i vizuelno označena. Sada je moguće na proizvoljnom
1061 mestu u istom ili drugom dokumentu pritisnuti \Ctrl
1069 može odabrati više opcija za rad, kao što su margine, automatsko
1071 sintaksno bojenje itd.
1075 ``Joe'' ima mogućnosti i da podeli radnu površinu na nekoliko prozora
1076 koji omogućavaju da se vidi više dokumenata, ili čak da se vide
1077 različiti delovi istog dokumenta. Prozor se deli na dva komandom \Ctrl
1081 sledeći, odnosno prethodni prozor se dobija pristikom na \Ctrl
1084 omogućuje da se naizmenično vide svi prozori, ili samo jedan.
1087 kao da se zaledio verovatno je problem što je stisnuta ``klasična''
1089 ovom programu, a nažalost izaziva prekid osvežavanja ekrana. Efekat
1095 \newpage
1099 sistemom otvori terminal (konzola, komandna linija) na udaljenom UNIX
1100 serveru. Može se naći online na
1103 Po pokretanju se prikazuje dijalog u kome se može ukucati adresa
1104 udaljenog računara i konfigurisati mnogi parametri. Najčešće je dosta
1105 samo uneti adresu računara i pokrenuti konekciju. Nakon toga (ako je
1106 uspešno povezivanje) biće prikazan ekran za unos korisničkog imena i
1107 lozinke.
1112 Putty (kao i većina standardnih linux terminala koji koriste
1114 može dovesti u stanje da ne prikazuje ispis unosa na ekranu, pritiskom
1116 standardnom prečicom za snimanje u većini grafičkih aplikacija, pa se
1117 može nehotično aktivirati. Iz ovog režima rada se može izaći prečicom
1120 Do not press
1121 Ctrl S
1122 If you do
1123 Ctrl Q
1126 Smisao postojanja ovakve opcije je dobrim delom istorijski, iz vremena
1127 kad su brzine protoka bile veoma male, i kada se štedelo time što bi
1128 se privrmeno isključio protok kada nisu neophodne povratne
1129 informacije, na primer kod komandi koje se dugo izvršavaju. Naravno
1130 ovo ima svoje primene i danas kod slabijih veza, ili kod mobilnih veza
1131 koje se plaćaju po protoku, a nekad se može i dobiti na brzini
1132 izvršavanja programa, ako se ne gubi vreme na osvežavanje ekrana.
1136 %\end{multicols}