Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica

Calculatoare


Qdidactic » stiinta & tehnica » informatica » calculatoare
Comenzi Unix - interpretorul de comenzi (Executia comenzilor)



Comenzi Unix - interpretorul de comenzi (Executia comenzilor)




Interpretorul de comenzi


Dialogul cu Unix are loc prin intermediul unui terminal (emulator de terminal). Faza de atasare se compune din :


Login : user

Password : xxxxx


Contul si parola sunt specifice fiecarui utilizator fiind atribuite de catre administrator. Daca nu apare nici un mesaj trebuie incercat cu tasta <ENTER> de mai multe ori. Atit numele de cont cit si parola sunt case sensitive (conteaza daca sunt litere mari sau mici). Parola nu este afisata in ecou pe ecran. Incheierea operatiei de admitere a utilizatorului in sistem este marcata prin afisarea (la terminal) a unui mesaj special numit promt. Forma acestuia difera de la un sistem la altul, putind fi un simplu caracter ($ ,#) sau o succesiune de caractere. Semnificatia comuna a acestor mesaje, indiferent de forma lor particulara, este ca sistemul asteapta receptia unei comenzi de la utilizator.


$_


sau alte promptere. Fiecare utilizator isi poate schimba propria parola cu


$passwd




Pentru a termina sesiunea de lucru se apasa <CONTROL> D sau se tasteaza exit. Nu se va inchide terminalul pina ce nu apare din nou login: (se pot pierde actualizari de fisiere).


Modul cel mai simplu de folosire a unui sistem UNIX este cel interactiv: utilizatorul introduce o comanda; sistemul executa comanda si transmite rezultatul;sistemul afiseaza promptul, asteptind transmiterea unei noi comenzi.


In realitate, lucrurile sunt putin mai complicate, preluarea comenzii transmisa de utilizator fiind realizata de un program, iar executia sa de un altul.Comenzile sunt preluate de unul din cele mai importante programe ale sistemului UNIX, interpretorul de comenzi, numit shell in terminologia UNIX. El primeste fiecare comanda, o analizeaza, o interpreteaza si lanseaza apoi programul care executa comanda. La terminarea acestuia, interpretorul de comenzi preia controlul, afiseaza promptul si asteapta o noua comanda. Exista, desigur, si comenzi simple pe care interpretorul le executa fara a apela la alte programe (comenzi interne).


Notiuni introductive despre procese. Executia comenzilor.

Comanda date


In termenii utilizati in sistemul de operare UNIX, fiecare program in executie este un proces. Folosind aceasta notiune, se poate da descrierea corespunzatoare executiei unei comenzi dupa cum urmeaza. Comanda


$date


folosita pentru a afla ora si data curente, declanseaza urmatoarea secventa de actiuni:


* interpretorul de comenzi primeste comanda si o analizeaza;

* interpretorul de comenzi lanseaza procesul date, intrind totodata in

asteptarea terminarii acestuia; se spune ca el trece in starea sleeping

pe durata executiei comenzii;

* procesul date afiseaza informatia referitoare la data curenta, in forma


Wed Mar 27 09:14:33 EET 1996


* la terminarea procesului date, interpretorul de comenzi trece in running,

preia controlul si afiseaza mesajul prompt.

Daca, din greseala, utilizatorul da comanda


$deita


interpretorul de comenzi cauta in directoarele /bin sau /usr/bin saau local, nu gaseste procesul cu numele deita, depisteaza eroarea si transmite un mesaj de avertisment


bash: deita: command not found


dupa care afiseaza promptul si asteapta o noua comanda.


Este usor de inteles ca, la un moment dat, mai multe procese pot fi incepute si neterminate. Spunem ca ele sunt active (gata de executie). De exemplu, la executia comenzii date sunt active interpretorul si procesul date insusi. Subliniem ca daca doua procese sunt active, nu inseamna ca ele se executa simultan (procesorul este unul), ci doar ca executia ambelor a inceput si nu s-a terminat. In exemplul precedent, in timp ce se executa date, interpretorul de comenzi astepta terminarea lui. Ambele sunt considerate active, executia ambelor fiind inceputa, dar neterminata. Lista proceselor active ale unui utilizator poate fi aflata prin comanda ps - process status.


$ps

PID TTY STAT TIME COMMAND

13 S 0:00 -bash

13 R 0:00 ps


Informatiile afisate includ (pentru fiecare proces in parte): identificatorul procesului (PID), numarul terminalului de la care este lansat procesul (TTY, numar fizic sau identificator logic, de exe pp2), starea procesului STAT (in exemplul dat R inseamna in executie - running, S - sleeping, T - stopped, I - idle), timpul alocat de sistem pentru proces (TIME), numele procesului (COMMAND : ps).

Unix este un sistem multiuser si multitasking. Aceasta inseamna ca mai multi utilizatori se pot conecta la sistem si il pot utiliza simultan. Unix asigura fiecarui proces o cuanta de timp si apoi acorda cite o cuanta de timp celorlalte] procese. Ciclindu-se rapid intre toate procesele active, se da senzatia ca fiecare proces are dedicat calculatorul.

Optiuni pentru ps :

-ps -a afiseaza starea tuturor proceselor active din sistem (ps

afiseaza numai procesele active de la respectivul terminal, numai

unul este R celelalte fiind S, T, I etc)

-ps -l produce un format lung de afisare

-ps -x afiseaza informatii utile despre procese. Cele mai active procese

sunt afisate primele. Cimpul USER este numele de login, %CPU si %MEM

reprezinta procentul din timpul CPU si memoria reala dedicate proceselor,

SIZE si RSS reprezinta dimensiunea programului in kb si a partii rezidente.

-ps -v afiseaza statistici privind memoria virtuala


Daca se doreste lansarea unui proces in background trebuie folosit dupa numele lui &. Controlul va fi predat in continuare in foreground la terminal, in timp ce in background ruleaza procesul dat. Astfel


$sleep 10


intirzie afisarea prompterului aprox 10s. Daca se introduce


$sleep 10&

21079


se va crea un proces in background cu pid=21079, vizibil cu ps.


Notiuni introductive despre fisiere


Ca si in alte sisteme de operare (de exemplu MS DOS), si in UNIX fisierele constituie unitatile de memorare a informatiilor (date sau programe) totalitatea acestora alcatuind sistemul de fisiere. Pentru mai buna lor manevrare, evidenta fisierelor se pastreaza in cataloage (directoare), care nu sunt altceva decit tot fisiere, dar de un tip deosebit. Fisierele apartinind unui catalog pot fi, la rindul lor, cataloage, astfel incit sistemul de fisiere are o organizare ierarhica, arborescenta. Unix recunoaste patru tipuri de fisirere :


-fisiere normale

-fisiere speciale

-directoare (cataloage)

-fisiere pipe sau canale de comunicatie intre procese


Pentru a face o tratare uniforma a datelor, sistemul UNIX considera ca echipamentele periferice sunt tot fisiere, dar fisiere speciale. Marea majoritate a comenzilor relative la fisiere se aplica in egala masura fisierelor speciale.

Arborele sistemului de fisiere este construit pornind da la un catalog unic, radacina (root), notat cu /. Desemnarea celorlalte fisiere se face insirind numele cataloagelor succesive aflate pe calea de la radacina la fisierul dorit. In cazul nostru, pentru a desemna fisierul calc.c aflat in catalogul val, care la rindul sau se afla in catalogul user din radacina putem scrie /user/val/calc.c. Notatia mentionata constituie calea absoluta de acces la fisier (se observa diferenta fata de DOS unde in cale apare ). Asociat fievcarui fisier avem :


-o pozitie in ierarhie

-un nume

-o dimensiune

-un numar de blocuri continind datele fisierului


Pentru a usura scrierea, sistemul permite stabilirea unui catalog curent - cel ale carui fisiere sunt mai des utilizate. Se poate folosi astfel o cale de acces relativa la catalogul curent. Prin aceasta, fisierul /user/val/calc.c este desemnat prin notatia calc.c, daca user este catalogul curent. Dupa cum se observa, notatia relativa contine sirul cataloagelor aflate pe calea dintre catalogul curent si cel desemnat, incepind cu fiul catalogului curent din arborele sistemului de fisiere.


Prin conventie, sunt adoptate urmatoarele notatii, relative la catalogul curent:


* . desemneaza catalogul curent insusi;

* .. desemneaza tatal catalogului curent.


In exemplul dat, tatal lui val este user. Aceste notatii usureaza uneori desemnarea unui fisier, facind apel la tatal catalogului curent, sau la tatal tatalui. Astfel, daca val este catalogul curent, atunci


../franc este echivalent cu /user/franc, iar

../../dev este echivalent cu notatia absoluta /dev (in cazul de fata

mai simpla decit precedenta).


Exista un numar de conventii de instalare comune tuturor versiunilor Unix


/bin utilitare, programe executabile

/dev fisiere speciale, drivere de intrare-iesire

/lib biblioteci

/lost+found fisiere defecte pentru a fi recuperate

/src surse


Tot prin conventie, la admiterea fiecarui utilizator in sistem se stabileste implicit catalogul sau curent. Acest catalog de referinta (home directory) constituie radacina arborelui de fisiere pe care utilizatorul si-l poate construi prin comenzi specifice. Numele complet al directorului home directory este salvata intr-o zona numita context. Afisarea contextului se face cu


$set


Schimbarea si aflarea catalogului curent. Comenzile cd si pwd


Utilizatorul poate schimba catalogul curent prin comanda cd (change directory - schimba catalogul curent). Daca val este catalogul curent, atunci comanda


$cd ..


determina schimbarea acestuia in user (tatal lui), iar comanda


$cd


determina revenirea la catalogul de referinta (indiferent care este catalogul curent, prin comanda pwd - print working directory- care afiseaza catalogul de lucru (curent):


$pwd

/user

$


Rezultatul arata ca /user este acum catalogul curent.


Mutarea, copierea si stergerea fisierelor. Comenzile mv, cp si rm


Comenzile de mutare, copiere si stergere de fisiere sunt frecvent utilizate in sesiunile de lucru. Comanda mv muta un fisier dintr-un loc in altul al sistemului de fisiere. De exemplu


$mv fis1 fis2


muta fisierul fis1 in fisierul fis2, facind practic o redenumire a acestuia. Dupa mutare, fisierul fis1 nu mai exista. Mutarea poate fi mai importanta, schimbindu-se catalogul in care este plasat fisierul. De exemplu


$mv fis1 /usr/tmp/fis2


face mutarea intr-un fisier din alt catalog decit cel curent. Daca fisierul in care se face mutarea exista deja, atunci continutul lui este inlocuit cu continutul fisierului mutat. Protectia si proprietarul fisierului destinatie nu se modifica. Altfel, fisierul este creat, si abia apoi se face mutarea. Protectia noului fisier este cea a fisierului de origine.


Destinatarul poate fi un catalog. In acest caz, fisierul se muta in noul catalog pastrind numele din catalogul sursa. In plus este posibila mutarea mai multor fisiere:



$mv fisier1 fisier2 fisier3 catalog1


Forma generala a comenzii de mutare este urmatoarea:


mv [-i][-f][-] fisier1 fisier2

mv [-i][-f][-] fisier catalog


Daca fisier2 exista, el este sters inainte de mutarea lui fisier1; daca el este protejat la stergere, atunci se cere confirmarea utilizatorului. In a doua forma fisierele pastreaza numele originale.

Optiunile sunt urmatoarele:

permite ca numele unui fisier sa inceapa cu caracterul -;

-f      forteaza mutarea, indiferent de drepturile de acces la fisiere (modul

fisierelor);

-i      cere confirmarea utilizatorului, pentru mutari care modifica fisiere

destinatare.


Copierea fisierelor are un efect similar, dar fisierele care se copiaza raqmin in continuare in sistem. Comenzile prezentate ca exemple la comanda anterioara devin:


$cp fis1 fis2

$cp fis1/usr/tmp/fis2

$cp fisier1 fisier2 fisier3 catalog1


Prima copiaza continutul unui fisier in altul. Daca fisier2 exista deja, atunci proprietarul si modul sunt pastrate. Astfel, se imprumuta valorile de la fisier1.A doua forma copiaza unul sau mai multe fisiere intr-un catalog, pastrind numele originale. In a treia forma, unul sau mai multe cataloage sursa sunt copiate intr-un catalog destinatar, cu numele de fisiere originale.


Optiunile au urmatoarele semnificatii:


-f      forteaza stergerea numelor existente pentru caile destinatiei, inainte de

copiere;

-i      cere confirmarea utilizatorului pentru toate fisierele destinatie afectate

de comanda;

-p      pastreaza informatiile caracteristice ale fisierelor (data modificarii,

proprietar etc);

-r      copiaza recursiv cataloage, cu toate subcataloagele lor.


Desi poate parea ciudata discutia despre stergerea fisierelor, atiat timp cit nu s-a prezentat modalitatea de creare a lor, importanta pe care aceasta operatie o are in activitatea utilizatorului justifica prezentarea ei cit mai devreme. Comanda care permite stergerea fisierelor este rm (remove). Comanda provoaca stergerea fisierelor specificate. Ea are forma generala


rm [-f][-r][-i][-] fisier /catalog


unde optiunile se refera la urmatoarele:


-i      se cere o confirmare a utilizatorului la fiecare fisier

-r      forteaza stergerea fara confirmare

numele fisierului incepe cu semnul -

-r      sterge recursiv toate fisierele din catalogul indicat si apoi sterge si

catalogul


Exemple privind utilizarea comenzii vor fi date in continuare.


Crearea si distrugerea cataloagelor. Comenzile mkdir si rmdir


Comanda mkdir este folosita pentru crearea unui catalog. Forma generala a comenzii este


mkdir nume_catalog


Ca efect, se creeaza catalogul nume_catalog, ca sub-catalog al catalogului curent. La crearea unui nou catalog, in el se inscriu automat cele doua intrari (. si ..) corespunzatoare catalogului insusi si tatalui acestuia.


Comanda rmdir sterge un catalog. Forma ei este urmatoarea:


rmdir nume_catalog


Stergerea unui catalog presupune stergerea prealabila a tuturor fisierelor inregistrate in el (comanda de stergere a fisierelor este rm). Daca un catalog nu contine alte subcataloage, atunci comanda rm nume_catalog/* face acest lucru, daca utilizatorul poseda toate fisierele din nume_catalog si are drept de scriere

in el.


Protectia fisierelor


Intr-un sistem in care coexista mai multi utilizatori, apare fireasca intrebarea:'poate un utilizator sa foloseasca (intentionat sau accidental) fisierele altuia?Mecanismul de protectie a fisierelor reprezinta raspunsul acestei intrebari. Fiecarui fisier ii este asociat un ansamblu de indicatori care specifica drepturile de acces ale urmatoarelor categorii de utilizatori:


* proprietarul fisierului;

* utilizatorii care apartin aceluiasi grup cu proprietarul;

* ceilalti utilizatori.


Dreptul de acces al fiecarei categorii este stabilit la crearea fisierului si poate fi modificat de proprietar. In plus, administratorul (sau superutilizatorul) are drepturi de acces neconditionat in orice fisier. Dreptul de acces se poate reduce la simpla citire a fisierului, la modificarea lui, la executia programului continut de fisier sau la orice combinatie a acestor drepturi elementare.Drepturile de acces asociate fisierelor pot fi cunoscute la listarea catalogului care le contine prin comanda ls, ca in exemplul ce urmeaza:


$ls -l

total 2

drwxr-x-x 2 valentin 512 Apr 1 15:20 bin

-rw------ 1 valentin 157 May 6 16:38 exemplu

$


Aici, -l (log-list) reprezinta o optiune care cere sistemului sa afiseze informatii detaliate despre fisiere. Primul cimp al fiecarei linii precizeaza tipul fisierului (- obisnuit, d director, b fisier special de blocuri, c fisier special de caractere, p fisier pipe etc).


Drepturile sunt mentionate in ordinea proprietar-grup-oricare, iar conventiile

folosite pentru desemnarea lor sunt:


r pentru drept de citire (read);

w pentru drept de scriere (write);

x pentru drept de executie (execute);

pentru inhibarea dreptului respectiv.


Pentru a afisa fisiere speciale sau invizibile se poate folosi


$ls -a


Cu comanda ln se pot crea nume alias pentru fisiere.


$ln f1 f2


Folosind apoi ls -i, se observa efectul lui ln, prin atribuirea unui alias

unui fisier deja existent.


$ls -i f1

1562 f1

$ln f1 f2

$ls -i f1 f2

1562 f1

1562 f2

$


Avem acum doua nume, f1 si f2, pentru acelasi fisier fizic. Observatia care trebuie facuta este ca nu se pot crea aliasuri pentru directoare.


Pentru a afisa continutul fisierelor se poate folosi cat


$cat nume_fisier


Daca nu se introduce nici un parametru, cat citeste de la terminal primele 512 caractere sau pina ce se introduce ctrl-d. Cat permite afisarea mai multor fisiere, sau concatenarea lor intr-unul singur


$cat f1 f2 f3

$cat f1 f2 f3 > f4


Se poate crea un fisier vid f1 cu


$cat /dev/null > f1


sau se pot introduce informatii intr-un fisier


$cat > f1

Oh, Dane

Oh, Ioane

^D

$


Pentru a determina unde se gasesc unele fisiere se poate folosi find.Find cauta recursiv, descendent in arborele de fisiere, de la un punct specificat si verifica fiecare fisier pentru verificarea conditiei.


$find nume expresie


Astfel


$find / -name '*.doc' -print


se cauta din root (/) iar conditia este ca extensia sa fie doc.


$find /usr/ana -name '*.doc' -print


aceeasi conditie in directorul /usr/ana


Comanda grep cauta intr-o lista de fisiere , linie cu linie, indeplinirea unei conditii


$grep test lista


Comanda wc contorizeaza linii, cuvinte si caractere din fisiere sau din standard input daca nu este specificat nici un fisier


$wc test

16 312 1564 test

$ls|wc -l

10


va contoriza numarul de fisiere din directorul curent.


Despre utilizatori. Comenzile who si finger


Asa cum am vazut, pentru admiterea unui utilizator in sistem, el trebuie sa fie inregistrat in fisierul de conturi si sa execute o secventa de actiuni de intrare (login). Pe baza numelui, sistemul determina drepturile de acces ale utilizatorului si valideaza sau inhiba actiunile sale, punind astfel in practica protectia. Orice incercare a utilizatorului de a depasi limitele protectiei stabilite de sistem este sanctionata cu unh mesaj de eroare transmis de sistem, comanda nefiind executata. Astfel, incercarea de a scrie intr-un fisier pentru care utilizatorul nu are drept de scriere provoaca transmiterea unui mesaj Permission denied, actiunea nefiind executata.


Este interesant ca sistemul permite ca un acelasi utilizator sa lucreze simultan la mai multe terminale (sau ca utilizatori diferiti sa foloseasca acelasi cont -acelasi nume si aceeasi parola de intrare). Lista utilizatorilor, impreuna cu terminalele asociate si cu momentele intrarii in sistem pot fi aflate prin comanda who:


$who

root tty2 Mar 27 10:48

root tty1 Mar 27 10:47

marni ttyp5 Mar 27 10:50 (marn37.cs.tuiasi.ro)

$


Aici, in a treia linie, marni este numele utilizatorului, ttyp5 este terminalul iar Mar 27 10:50 este momentul deschiderii sesiunii de lucru (luna, ziua, ora,minutul). Domeniul din care face parte utilizatorul este marn37.cs.tuiasi.ro.


Pentru a afla numele utilizatorului de la terminalul curent trebuie introdus


$who am i

sigma!marni ttyp5 Mar 27 10:52 (marn37.cs.tuiasi.ro)


Daca dorim sa aflam informatii despre alti utilizatori din sistem, atunci putem folosi comanda finger. Ea furnizeaza urmatoarele informatii despre utilizatori: numele de login, numele complet, numele terminalului de acces, timpul nefolosit (idle), momentul inceperii sesiunii, locul de lucru si adresa. Daca este interzisa scrierea la terminal, numele acestuia este precedat de un asterisc.

Timpul nefolosit este specificat in minute, sau ore si minute. De exemplu:


$finger

Login name TTY Idle Login Time Office

ion Popescu Ion q2 Wed 13:09 cs144.cs.tuiasi.

vasile Vasile Ionel p3 22 Wed 11:43 cs142.cs.tuiasi.


Orice comanda poate fi invatata prin inspectarea manualului,


$man -k cuvint_cheie


Comanda are mai multe optiuni, care permit selectia unor pagini de manual, a unor sectiuni, a formei de prezentare a continutului manualului si altele. Comanda man man ofera posibilitatea cunoasterii tuturor amanuntelor despre utilizarea comenzii man. Pentru majoritatea cazurilor, forma man titlu, unde prin titlu se intelege numele unei comenzi, este suficienta. Exista mai multe versiuni de manuale, dar varianta implicita este /usr/ucb/man. Aflarea versiunii curente se face cu comanda which man, la care uzual se primeste raspunsul mentionat. Se poate cauta si dupa cuvint cheie dat ca parametru. Elementele din lista pot fi folosite apoi la inspectarea anumitor pagini din manualul interactiv.


Pentru comanda echo, sistemul ne furnizeaza urmatorul raspuns:


$man echo


Name

echo - echo arguments


Syntax

echo [-u][arg]


Description

The echo command writes its arguments separated by blanks and

terminated by the new line on the standard output.


Options

-n Suppress newlines from output


Examples

The echo command is useful for producing diagnostics in shell

programs and for writting constant data on pipes.

To send diagnostics to the standard error file , type the

following :


echo 1>&2


Concluzie :


Forma generala a unei comenzi UNIX este urmatoarea :


nume_comanda [optiune fisier]


unde

delimiteaza un element optional al comenzii

optiune particularizeaza efectul comenzii; o optiune are forma unui caracter,

precedat de semnul -;

fisier desemneaza un fisier caruia i se aplica comanda.

Punctele de suspensie indica posibila repetare a componentei respective a

comenzii


In general, pe o linie se scrie o singura comanda. Este insa permisa scrierea unei comenzi pe mai multe linii, folosind ca semn de continuare caracterul ''.

De exemplu :


$echo

comanda aceasta este scrisa

pe mai multe linii

comanda aceasta este scrisa pe mai multe linii

$


De asemenea, se pot da mai multe comenzi pe aceeasi linie. Comenzile aflate pe aceeasi linie trebuie separate intre ele prin semnul ';'. De exemplu :


$ pwd; ls

/user2/home/valentin

bin exemplu

$


Despre numele fisierelor. Caracterele * , []


In general, o comanda admite mai multe fisiere, care pot fi specificate uneori printr-o notatie prescurtata, folosind caracterele generice ?, * si [], cu urmatoarele semnificatii :


semnifica orice caracter;

semnifica orice sir de caractere, inclusiv sirul vid;

[lista_de_caractere] un caracter, oricare din cele mentionate in

lista_de_caractere.


Citeva exemple ilustreaza utilitatea lor :


cot semnifica toate numele de patru caractere, primele trei fiind cot (cota,

cotb, cotc, );

cas semnifica toate numele avind oricite caractere, primele trei fiind cas

(cas, casa, castor, );

coc[i-m] semnifica toate numele de patru caractere, ultimul fiind unul dintre

i,j,k,l,m; deci coci, cocj, cock, cocl, cocm.


Din cele prezentate nu trebuie inteles ca interpretorul inlocuieste notatia generica cu toate instantele posibile, alcatuind astfel o lista echivalenta. Notatia generica constituie un tipar cu care sint comparate numele fisierelor asupra carora comanda curenta poate avea efect, fiind selectate acelea care se incadreaza in tipar. Astfel, comanda


$rm *.h


sterge toate fisierele cu extensia h, aflate in catalogul curent, iar comanda


$rm *


sterge toate fisierele din catalogul curent. Similar, comanda


$ls/dev/d?

d1 d2 d3 d4

$


afiseaza numele fisierelor din catalogul /dev care au doua caractere, dintre care primul este caracterul d, adica d1, d2, d3 si d4. Exista situatii in care utilizatorul poate dori ca sistemul sa interpreteze caracterele generice ca si caracterele obisnuite. In aceste cazuri, exista urmatoarele variante :


* caracterul generic este precedat de caracterul ;

*textul ce cuprinde caracterul generic este incadrat de ' (apostrof);

*textul ce cuprinde caracterul generic este incadrat de '.


Astfel, mas*, 'mas*' si 'mas*' sint interpretate ca mas* si nu ca un tipar de

patru caractere, in care primele trei sint mas.


Interpretarea executiei unei comenzi


Unele comenzi sint simple si cu o durata de executie scurta. Altele sint mai complicate si de durata mare. Executia lor poate poate presupune un dialog cu utilizatorul, pentru furnizarea unor informatii suplimentare sau pentru transmiterea unor comenzi specifice. De exemplu, o comanda de editare a unui fisier pune in executie un editor. Comenzile de editare sint adresate editorului si nu interpretorului. Abia la terminarea editarii, editorul preia controlul, urmind ca el sa primeasca urmatoarea comanda. Programatorul trebuie sa stie, in orice moment, programul care-i preia comenzile si sa foloseasca numai acele comenzi pe care programul le cunoaste si le accepta.Este posibil ca programatorul sa doreasca oprirea unui program inaintea terminarii executiei sale. El are la dispozitie un caracter special, de intrerupere. Forma sa cea mai raspindita este ^C, ^D, Del. Utilizarea lui provoaca terminarea fortata a programului si reluarea controlului de catre interpretorul de comenzi. Putem proba functionarea caracterului de intrerupere, cerind afisarea descrierii unei comenzi oarecare, de exemplu :


$man date

Name

date - print date and time

.

.

--More--(16%)


Sistemul afiseaza o pagina din aceasta descriere, asteptind interventia

utilizatorului pentru a continua cu pagina urmatoare. Evident, in acest

moment, programul man care face afisarea nu este terminat. Apasarea unei taste

oarecare determina continuarea executiei lui.Utilizatorul poate determina

terminarea executiei (si deci a sfirsitului descrierii) prin apasarea ^C. Ca

urmare, sistemul nu mai afiseaza restul descrierii fiind reactivat interpretorul

de comenzi.



Fisiere


Sistemul de fisiere constituie locul unde se memoreaza pe suport fizic fisierele sistem si cele utilizator. Sistemul de fisiere este caracterizat prin trei aspecte:


- structura ierarhica;

- independenta ridicata fata de hardware;

- o mare flexibilitate.


Structura ierarhica este organizata sub forma unui arbore cu un director radacina (/). Directorul radacina poate contine fisiere, legaturi sau alte directoare, numite subdirectoare. Subdirectoarele sunt noduri in arbore, iar fisierele sunt frunze. Independenta fata de hardware rezulta din faptul ca fisierele sunt privite ca o succesiune de octeti. Flexibilitatea se bazeaza pe posibilitatea de a monta sau demonta, la orice nivel in ierarhia de fisiere, noi structuri arborescente de directoare si fisiere.


Nivelul de sub radacina este tipic, fiind comun tuturor sistemelor de operare compatibile UNIX. In orice sistem Unix, subdirectorul radacina se gasesc urmatoarele subdirectoare: bin, dev, etc, lib, tmp, usr (care la rindul lui contine subdirectoarele: bin, include, lib, user, man) s.a.m.d.


Structura arborescenta a sistemului de fisiere ofera utilizatorului posibilitatea de a crea si gestiona un numar mare de fisiere.


Principalele particularitati ale sistemului de fisiere sunt:


- un fisier frunza poate fi legat la mai multe directoare chiar daca

acesta nu se afla la acelasi nivel in arbore;

- fiecare director contine cel putin doua intrari: '.', care refera

directorul curent si '..', care refera directorul superior (numit si parinte);

- orice director este legat la nivelul superior printr-o singura legatura

aceasta fiind '..'.


Numele unui fisier poate fi de orice lungime (versiunile vechi limitau numele unui fisier la maxim 14 caractere) si poate contine orice caractere, mai putin caracterele slash (/) si caracterul NULL (marcajul de sfirsit de sir).Caracterul '/' e folosit pe post de separator de nume de fisiere, iar daca se afla pe prima pozitie indica directorul radacina.


Accesul la un fisier se face prin indicarea pozitiei lui in arbore. Pentru aceasta se indica calea spre acel fisier. O secventa de zero sau mai multe nume separate prin '/', optional prefixata de caracterul '/', formeaza un nume de cale.Calea prcizata din directorul radacina se numeste cale completa, iar calea precizata din directorul curent se numeste cale relativa.


In Unix se deosebesc patru tipuri de fisiere: ordinare, speciale, fisierele pipe si directoare. Din punct de vedere al sistemului de operare un fisier este un sir de octeti de lungime nedefinita terminat cu caracterul special de sfirsit de fisier (EOF). Citirea sau scrierea incepe de la o locatie de octet specificata prin pointerul de fisier (sau marker), care poate fi pozitionat oriunde in fisier.


Un fisier ordinar este creat de un proces. El poate contine o sursa (text) sau un fisier executabil (binar). Doua sau mai multe procese pot sa citeasca si sa scrie concurent acelasi fisier. Rezultatul depinde de ordinea in care cererile individuale de I/E apar si este in general imprevizibil. Informatiile despre un fisier se pastreaza intr-o structura de date numita i-node. Acesta nu contine insa numele fisierului si nici octeti de date ai fisierului.


Fisierele speciale sunt fisiere atasate dispozitivelor de I/E. In directorul /dev se gasesc toate referintele la dispozitivele de I/E: discuri,benzi magnetice, terminale, imprimante, mouse etc. Acestea sunt considerate fisiere speciale. De exemplu, pentru fiecare partitie a unui hard disc se gaseste cite un fisier special. Un fisier special are un i-node, care insa nu refera un bloc de date pe disc. In schimb, acest i-node contine un numar de dispozitiv, care este folosit ca index intr-o tabela de proceduri, din nucleu, pentru dispozitive periferice. Pentru identificarea fiecarui dispozitiv se folosesc doua numere: minor (identifica numarul dispozitivului de tipul dat) si major (identifica tipul dispozitivului).


Exista doua tipuri de dispozitive pentru fisiere speciale: in mod bloc si in mod caracter. Cele in mod bloc contin un vector de blocuri de dimensiune fixa, iar tampoanele nucleu sunt folosite ca si cache pentru cresterea vitezei operatiilor de I/E. Cele in mod caracter realizeaza operatiile de I/E la nivel de caracter sau la nivel de pista.


Acelasi dispozitiv fizic poate detine fisiere speciale atit in mod caracter cit si in mod bloc. Fisierele ordinare si directoarele sunt accesate de sistemul de fisiere printr-un fisier special in mod bloc, pentru a beneficia de avantajele tampoanelor cache. Pe de alta parte, unele aplicatii (baze de date) necesita un acces direct. Multe sisteme Unix folosesc un fisier special in mod caracter care transfera datele direct intre spatiul de adrese al procesului si disc (folosind DMA).


Din punct de vedere utilizator nu exista nici o diferenta intre lucrul cu fisiere ordinare si cele speciale. De exemplu:

$ cp prg.c /usr/acct/k/prg1.c #copiere simpla

$ cp prg.c /dev/lp0 #listare la imprimanta


Fisierele pipe si fisierele FIFO vor fi tratate pe larg intr-un laborator urmator.


Un fisier face legatura intre numele fisierelor si i-node. El nu contine efectiv fisierele care ii apartin ci doar referintele la acestea, sub forma unei succesiuni neordonate de intrari. Orice intrare director este formata din numele fisierului si un numar de identificare. Acesta din urma refera un nod de identificare, i-node, in care sunt pastrate informatiile referitoare la fisierul in cauza.


Fiecare fisier are un singur i-node care contine:


Proprietarul fisierului si drepturile de acces ale celorlalti utilizatori.

Superuser-ul ignora drepturile indicate in acest cimp.

Tipul fisierului.

Drepturile de acces la nivel de utilizator, grup si altii.

Timpul ultimului acces si ultimei modificari, data si ora ultimei

modificari efectuate asupra i-node-ului.

Numarul de legaturi sau contorul de legaturi.

Adresele disc ale sectoarelor ce contin datele fisierului.

Lungimea fisierului in octeti.


Directorul este pastrat ca un fisier ordinar, dar este marcat ca director in i-node. Un fisier director poate fi citit ca orice fisier, dar nu poate fi scris in mod direct, ci numai prin intermediul anumitor programe.


O pereche (nume_fisier, i-node) este numita in Unix legatura. In Unix este posibil ca doua legaturi, din acelasi director sau din directoare diferite,sa refere acelasi i-node. Aceasta inseamna ca un fisier poate fi identificat sub mai multe nume (fara a exista ambiguitate). Daca i-node-ul este 0, intrarea respectiva este vida, adica legatura a fost stearsa.


Pentru legarea la orice director a unui fisier dintr-un director se poate

folosi comanda ln (link). Sintaxa ei este:


ln <nume_cale_veche> <nume_cale_noua>


Comanda este identica cu functia de sistem link. Stergerea unei legaturi se poate realiza prin comanda sau apelul de sistem unlink. La stergerea unei legaturi dintr-un director i-node-ul si blocurile de date asociate nu sunt disponibilizate caci s-ar putea sa mai existe un alt fisier care sa refere acelasi i-node. Din acest motiv i-node-ul contine in structura sa un cimp numit contorul de legaturi. Stergerea unei legaturi implica decrementarea contorului de legaturi Cind acesta ajunge la 0 nucleul elibereaza i-node-ul si blocurile de date aferente fisierului.


Legarea directoarelor este posibila, dar numai de catre superuser.


O alta caracteristica a sistemului Unix este posibilitatea de a monta un intreg arbore de fisiere undeva in structura altui sistem de fisiere. Nucleul sistemului de operare Unix recunoaste un singur director radacina. Dar este posibil ca fisierele sa se gaseasca pe mai multe suporturi fizice sau logice, fiecare volum avind un sistem de fisiere propriu. Este posibila suprapunerea radacinii unui astfel de sistem de fisiere pe un director al sistemului de fisiere recunoscut de nucleu. Aceasta operatie se numeste montare si poate fi realizata de superuser prin comanda mount. Directorul la care se face montarea (trebuie sa fie gol) este numit punct de montare. Daca montarea nu mai este necesara se recomanda demontarea si eliberarea punctului de montare prin comanda umount.


Operatii de I/E


Un proces poate accesa un fisier prin descriptorul de fisier. La crearea sau deschiderea unui fisier nucleul intoarce prin functiile de sistem folosite descriptorul atasat fisierului.

Prin conventie, shell-ul deschide automat la executia unui program trei descriptori pentru: standardul de intrare (0), standardul de iesire (1) si standardul de erori(2).

Operatiile de I/E fara tampon sunt realizate prin functiile open, read, write, lseek si close. Toate acestea au ca prim argument descriptorul de fisier. Functiile standard de I/E furnizeaza o interfata cu tampon deasupra functiilor de I/E fara tampon. Programele ce folosesc aceste functii includ fisierul antet stdio.h, deoarece acesta contine prototipul functiilor standard de I/E.


Redirectarea fisierelor standard. Conectarea

programelor prin pipe


La deschiderea fiecarei sesiuni utilizator shell-ul deschide in mod automat cele trei trei fisiere: fisierul standard de intrare, fisiereul standard de iesire si fisierul standard de afisare a erorilor si sint atribuite terminalului la care s-a deschis sesiunea respectiva. Daca se executa o comanda, procesul fiu creat de shell mosteneste fisierele deschise, inclusiv cele standard.

Este posibila redirectarea fisierelor standard de I/E catre alte dispozitive periferice sau fisiere:


a) operatorii '>' si '>>' redirecteaza fisierul standard de iesire.

Exemple:

a1) $ls -1 > fis1 si

a2) $ls -1 >> fis1


comanda a1) determina listarea directorului curent in fisierul fis1 (stergind continutul anterior al acestuia), in timp ce comanda a2) determina adaugarea continutului directorului la sfirsitul lui fis1.


b) operatorul '<' redirecteaza fisierul standard de intrare. Exemplu

$ mail user1 < letter


realizeaza trimiterea catre utilizatorul user1 a unui mesaj citit din fisierul letter si nu de la tastatura.    Pe linga facilitatile de indirectare/redirectare, shell-ul ofera si posibilitatea conectarii iesirii unei comenzi la intrarea alteia. Aceasta operatie se realizeaza prin intermediul mecanismului de pipe. La nivelul liniei de comanda pipe-ul shell-ului este marcat prin caracterul '|'. De exemplu linia de comanda:


$ who | lpr


solicita executia comenzii who in mod concurent cu comanda lpr, iesirea lui who fiind conectata direct la intrarea programului lpr. Astfel, acesta pereche de comenzi va lista numele utilizatorilor conectati la sistem pe imprimanta si nu pe ecranul videoterminalului. La prima vedere, efectul este acelasi cu situatia in care s-ar fi introdus comenzile:


$ who > fisier_temporar

$ lpr < fisier_temporar

$ rm fisier_temporar


Intre cele doua solutii exista insa urmatoarele diferente majore:

-in cazul pipe-ului comenzile sint lansate in executie simultan, in timp ce in

al doilea caz comenzile se executa strict secvential;

-executia prin pipe este sincronizata de catre nucleul sistemului de

operare;

-in cel de-al doilea caz se utilizeaza un fisier temporar care trebuie

controlat de catre utilizator (acesta trebuie sa aiba drepturi de acces cores-

punzatoare pentru a se putea executa comenzile fara erori).

Secventa de instructiuni care simuleaza pipe-ul shell din exemplul de

mai sus este urmatoarea:


int p[2], status, child1, child2;

pipe(p);

if (child = fork()) == 0)

if (child2 = fork()) == 0)

while ((child2 != wait (&status)));

exit (status);



Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright