Windows
Sisteme de operare si sistem de calcul – un ansamblu de echipamente fizice (hardware) si programe sau date (software)Obiective lAsimilarea detaliilor de utilizare a unui sistem de operare lFamiliarizarea cu sistemele de operare WINDOWS si LINUX lIntelegerea modului de functionare a acestor sisteme lIntroducere lDefinitie lResponsabilitati lIstoric lStructura unui Sistem de operare Introducere lSistem de calcul – un ansamblu de echipamente fizice (hardware) si programe sau date (software) lPrograme utilitare – programe care asigura exploatarea sistemului de calcul (ex: translatoare, editoare de text, interpretoare) lPrograme de aplicatie (aplicatii utilizator) – programe scrise de utilizator intr-un anumit limbaj lSistemul de operare – principalul reprezentant al programelor de utilizare a resurselor unui calculator Definitie Un SISTEM DE OPERARE este un sistem de programe speciale care realizeaza 2 functii principale: 1. asigura gestionarea unui sistem de calcul, implementand algoritmi destinati sa maximizeze performantele 2. realizeaza o interfata intre utilizator (programator) si sistemul de calcul, extinzand dar si simplificand setul de operatii disponibile Responsabilitatile unui S.O. l1. Interfata cu utilizatorul – se realizeaza prin comenzi care folosesc apeluri sistem l2. Gestionarea fisierelor : - se ofera un mod de organizare a sistemului de fisiere - se ofera un mod de acces la informatia din fisiere - se asigura securitatea datelor - se realizeaza salvarea, restaurarea informatiei 3. Gestionarea perifericelor – functii care sa permita folosirea perifericelor avand o diversitate functionala 4. Gestionarea memoriei (operative si externe) - o parte a memoriei rezervata sistemului de operare - frecvent se foloseste o memorie externa ca extensie a memoriei operative (swapping) - mecanisme de accelerare (cache) 5. Gestionarea proceselor – exista simultan mai multe procese (task-uri) – activitati independente desfasurate independent (Multitasking) - implica introducerea unor mecanisme care sa permita comunicarea intre procese, alocarea de resurse pentru procese, crearea si distrugerea de procese
7. Gestionarea sistemului – mijloace oferite de sistemul de operare pentru configurare - culegere de date statistice despre performante Scurt istoric 1. Inceputul: supervizoare si sisteme de introducere/extragere la IBM 701 (IOS – Input/Output System). (gen. I de calculatoare) - SOS (Shared Operating System) la IBM 709 - FMS (Fortran Monitor System) la IBM 709 (gen. I) (suportul era banda magnetica si hartia perforata) 2. Sisteme de prelucrare in loturi – introducerea lor generata de marirea posibilitatilor hard (diskuri magnetice de 10 Kb, apare DOS) Utilizatorii nu mai au acces direct la calculator, isi pregatesc in avans lucrarile pe cartele perforate, stranse in loturi. Exista personal specializat care se ocupa de procesare si executie Ex: OS/360 pentru IBM System/360 OS/MFT – Memory Fixed Tasks OS/MVT – Memory Variable Tasks (Spooling) 3. Sisteme cu divizarea timpului – apare conceptul de multiuser – impartirea timpului si a celorlalte resurse in mod echitabil intre mai multi utilizatori (Ex. CTSS, MULTICS – MIT pe GE 35) 4. Sisteme cu memorie virtuala – ca necesitate a dezvoltarii unor programe de dimensiuni mari, ce depaseau volumul memoriei interne. Se incarca in memoria operativa de catre S.O. portiunea de program si datele strict necesare pentru desfasurarea pe un timp limitat a programelor Ex: IBM System/370 OS/MVS – Multiple Virtual Storage OS/VM – Virtual Machine 5. S.O. pentru minicalculatoare – PDP (1, 7, 8) realizate de firma DEC (Digital Equipment Corp.) A urmat PDP 11 (1970), folosea RT11- S.O. monoutilizator, monoproces, o forma primitiva de multitasking (foreground/ background). RSX 11 – multitasking, multiuser, sistem de fisiere pe 2 nivele MFD (Master File Directory) si UFD (User File Directory) VAX 11 cu S.O. VMS (Virtual Memory System) 1969 – apare UNIX ca S.O. pentru PDP 7. 6. S.O. pentru microcalculatoare si calculatoare personale Intel produce ISIS-2, nu se raspandeste; Apare CP/M (Digital Research), foarte larg utilizat; monoutilizator, pentru procesoare pe 8biti, sistem de fisiere mononivel, pentru I8080 si Z80 Odata cu I8086 (I8088) apar noi S.O. pentru procesoare pe 16 biti: DOS, derivat din CP/M si OS/2. Retele de calculatoare si sisteme distribuite ARPANET – retea dezvoltata de DOD (Department Of Defence), predecesorul Internet-ului; Apare conceptul de LAN (Local Area Network), protocolul Ethernet (10Mb/s) Apare necesitatea unor S.O. distribuite, care sa utilizeze resursele unei retele fara ca utilizatorul sa ia in considerare topologia retelei. Subiect de cercetare deschis De retinut pentru examen lDefinitie S.O. lResponsabilitatile unui sistem de operare That’s all folks! Sisteme
de operare Capitolul 2 Cuprins lOrganizarea memoriei in timpul executiei lOrganizarea codului sursa al SO lRelatia intre componentele sistemului din punctul de vedere al executiei lRelatia intre componentele sistemului din punct de vedere logic 2.1
Organizarea memoriei lO parte a memoriei active e rezervata de SO (componenta rezidenta) lComponenta rezidenta contine procedurile pentru evenimentele critice: tratarea intreruperilor, tratarea apelurilor sistem, tratarea erorilor, planificarea proceselor pentru executie lComponentele utilizate mai rar sint pastrate pe suportul extern de memorie si sint aduse in memoria activa doar daca sint solicitate lO zona a memoriei e pusa in corespondenta cu echipamentele periferice Aspecte lCare este continutul spatiului de adrese cind in executie este un program utilizator? lCare este continultul spatiului de adrese cind in executie este o componenta a SO? lCare este continutul memoriei fizice a sistemului? a) Organizarea mem. la CP/M
lCP/M nu diferentiaza cele 3 aspecte de mai sus lLa nevoie CCP poate fi acoperit de programul utilizator si apoi se reincarca lToate programele incep la 100h lZona de comanda este formata din vectorii de intrerupere (8 vectori) si alte informatii (tampon linie comanda) lNu exista multe restrictii pentru programele utilizator b) Organizarea mem. la MS-DOS
lZona de comanda este zona vectorilor de intrerupere + DTA (disk transfer area) 512B lPartea rezidenta contine functii pentru lucrul cu discul si fisierele, drivere etc. lMemoria video depinde de rezolutie lSpatiul de adrese pentru un program este compus din 1 pina la 4 segmente de 64kB c) Organizarea mem. la UNIX
lPentru UNIX nu se poate defini o anumita harta de memorie, ea depinde de arhitectura calculatorului pe care este implementat lNu exista zone comune intre spatiul de adresa a unui program utilizator si a unui program sistem lExista o protectie a SO fata de programele utilizator lOrice comunicare intre programele utilizator si SO se realizeaza prin intermediul apelurilor sistem d) Organizarea mem. la VMS (Virtual Memory System)
lVMS este construit pentru o anumita arhitectura (32 biti-4GB) lPrimul GByte este rezervat sistemului, al doilea este folosit pentru pastrarea unor informatii de comanda pentru programul in executie, al treilea este folosit pentru programul utilizator, ultimul este nefolosit lManagerul de memorie care e rezident (de exemplu primele 3 fisii) decide care fisii sint aduse in memoria fizica e) Organizarea mem. la IBM OS/MVT (Memory Variable Task)
lExista un mecanism hard-soft prin care SO este protejat de taskurile aplicatii si taskurile aplicatii sint protejate intre ele lDaca taskurile aplicatii genereaza o adresa in afara limitelor zonelor de memorie rezervata taskului respectiv SO opreste executia taskului respectiv. That’s all folks! Sisteme
de operare Curs 3 Cuprins l2.3 Interactiunea componentelor l2.4 Adaptabilitatea SO la configuratia hardware lCapitolul 3. UNIX l3.1 Istoric l3.2 Structura sistemului Unix 2.3 Interactiunea componentelor lIntr-o structura fara restrictii orice componenta a unui SO ar putea avea acces la orice alta componenta a SO sau la orice structura de date mentinuta pe sistem. Un astfel de sistem ar fi putin fiabil pentru ca nu s-ar putea determina toate consecintele unei modificari a unei componente a sistemului. l Restrictii asupra interactiunii componentelor a unui SO se pot impune atat in procesul de proiectare cat si in structura de executie. Este mai simpla si mai usor de realizat impunerea de astfel de restrictii inca de la proiectare. lPrimul sistem cunoscut in
care s-a introdus din proiectare o structura pentru interactiunea componentelor a fost THE
(Universitatea Tehnica din
lFiecare nivel al sistemului virtualizeaza o anumita categorie de resurse si ofera spre nivelele superioare resurse virtuale din categoria respectiva. Apelurile intre nivele se realizeaza de la nivelurile superioare spre cele inferioare. l -nivelul 0 -virtualizeaza procesorul sistemului de calcul. Se ofera spre nivelele superioare numarul solicitat de procese virtuale sau abstracte; l -nivelul 1-se gaseste un unic proces-administrarea memoriei virtuale. Deasupra nivelului 1, fiecare proces dispune de propria sa memorie virtuala; l -nivelul 2-un singur proces.Deasupra lui fiecare proces are imaginea ca dispune de propria lui consola l l-nivelul 3- mai multe procese (cite 1 pentru fiecare echipament periferic); l-nivelul 4- se gaseste un numar de interpretoare de comenzi, fiecare avind capacitatea sa citeasca si sa interpreteze comenzi in limbaj de comanda specific sistemului si sa controleze executia unui proces utilizator. lAceasta structurare permite o dezvoltare sistematica a proiectului pentru un nou sistem de operare si o verificare pe nivele a corectitudinii componentelor sistemului. Alegerea functiilor care se introduc intr-un anumit nivel este pasul esential in proiectarea sistemului si depinde de experienta si inspiratia proiectantului precum si de scopul pt care e realizat sistemul. Nu exista regula care sa fixeze nr. de nivele. 2.4.Adaptabilitatea SO la configuratia hardware lFiecare sistem are o serie de caracteristici la care SO trebuie sa fie adaptat: cantitatea de memorie, tipul si numarul perifericelor, prezenta sau absenta anumitor optiuni ale procesorului etc. lUn SO adaptabil este acela care permite intr-un mod simplu luarea in considerare a particularitatilor sistemului de calcul. El fie ca detecteaza automat configuratia fie ca foloseste niste fisiere de configurare care pot fi construite in mod simplu de inginerii de sistem. Capitolul 3 UNIX 3.1 Istoric l1969-Ken Thompson si Dennis Ritchie (Bell Laboratories) pe PDP 7 implementeaza Unix l1973-pe PDP 11/45 si PDP 11/20, scris in C (versiunea 3) si cu facilitati de multiprogramare l1976-apare prima versiune comerciala (versiunea 6) l1978-apare versiunea 7; a inceput sa se implementeze si pe alte calculatoare. Aceasta versiune a fost distribuita gratuit impreuna cu sursele. Apare si 32V (pe 32 biti VAX). l Firma AT&T fondeaza Unix Suport Group care avea responsabilitatea controlului si difuzarii UNIX. l1982-apare System III (inspirat din V7 si 32V) l1983-apare System V lUSG devine Unix System Development Laboratories l l -versiunea 4.1 are facilitati de gestionare a memoriei virtuale prin paginare la cerere l -versiunea 4.2 are facilitati de lucru in retele (Ethernet si Arpanet); apare C-shell pe langa Bourne lNoutati pe care le aduc BSD4 si System V: l -ameliorarea gestiunii fizice a fisierelor l -dezvoltarea bibliotecii de rutine sistem (mai ales la comunicarea interprocese) l -dezvoltarea produselor utilitare Tendinte de standardizare l1985-AT&T publica standardul SVID( System V Interface Definition ) l1988-OSF( Open Software Foundation ) au vrut un standard UNIX pornind de la AIX al IBM lIEEE: standardul POSIX (aproape identic cu SVID ) lx/open - standard pentru interfete utilizator Caracteristici ale sistemului UNIX lMultitasking lMultiuser lPortabilitate foarte mare lSistem de fisiere ierarhizat lSistemul de intrare/iesire e generalizat (perifericele sunt tratate ca fisiere obisnuite)
lProtectia informatiei e asigurata prin drepturi de acces si parole lProgramele sunt reentrante 3.2
Structura sistemului UNIX: 1. Nucleul (Kernel) – partea principala (rezidenta) 2. Programe utilitare (de exemplu Shell) Un utilizator are acces la nucleu prin: - utilitare (nivel extranucleu) - apeluri de functii-biblioteca C (de exemplu fopen) - directive sistem (de exemplu open): - pentru gestionarea fisierelor - pentru controlul executiei proceselor - pentru manipularea informatiei (parole, drept acces etc.) Sistemul de fisiere lFisier – o succesiune de octeti care nu este interpretata, interpretarea ramanand ca sarcina pentru programele utilitare. lSistemul de fisiere este arborescent. lExista trei tipuri de fisiere: - obisnuite - directoare (catalog) - speciale lFisierele obisnuite – pot avea numele de orice lungime (in unele versiuni exista o limitare la 14 caractere), nu poate contine spatiu si ‘/’ l Conventii pentru extensiile folosite: .c - fisier C .cc - fisier C++ .ps - fisier post script .p - fisier Pascal .o - fisier obiect lFisierele executabile de obicei nu au extensie lFisierele care incep cu ‘.’ (punct) sunt ascunse (nu se afiseaza de comanda ls). lFisierele pot fi: - fisiere text - contin doar coduri ASCII pana la 127. - impartite in linii terminate cu ‘n’ (LF), spre deosebire de DOS unde exista si ‘r’ (CR) - fisiere binare lDirectoarele se separa in cale prin ‘/’ lDirectorul radacina a sistemului de fisiere e notat prin ‘/’
lbin - director ce contine fisiere binare executabile: - sh - shell - csh - C shell letc - utilitare folosite de administrator + fisiere cu informatii (parole, grupuri de utilizatori, fisiere de initializare) llib - biblioteci uzuale (de exemplu C) ltmp - fisiere temporare l/usr/bin - utilitare mai putin folosite, dar furnizate impreuna cu sistemul lusers - fisierele utilizatorilor lspool - fisiere pentru imprimanta Fisiere speciale l/dev/lp - imprimanta l/dev/hd0 - discul (HDD) lExista doua categorii de terminale: -terminale cu transfer caracter cu caracter -terminale cu transfer pe blocuri (ex 512 octeti, discuri) lLa dimensiunea fisierelor speciale intervin doua numere: - major number - reprezinta categoria perifericului - minor number - identifica perifericul in cadrul categoriei Protectia fisierelor lSe face prin: - atributele r – read, w- write, x- execute, pentru proprietar (u-user), grup (g-group) si ceilalti(o-others), in total 9 biti lExista un bit SUID (set user ID); daca e setat, in momentul executiei programul va rula ca si cum ar fi lansat de proprietarul lui lUn bit SGID (set group ID); daca e setat, grupul din care face parte proprietarul e 'activ' lSticky bit- precizeaza sistemului ca fisierul e des folosit si ca e bine sa se pastreze o copie in spatiul de swapping Montarea sistemelor de fisiere lOperatia de montare: -se adauga la sistemul de fisiere de pe un disc alte sisteme de fisiere (de pe alte discuri) lExemplu: mount /dev/fd0 /pcfs Are ca efect crearea in radacina a directorului /pcfs care corespunde sistemului de fisiere de pe discheta. lOperatia de demontare: - se renunta la sistemul de fisiere montat anterior lExemplu: umount /dev/fdo Are ca efect demontarea sistemului de fisiere de pe discheta. Implementarea
sistemului de fisiere lConsideram un disc, blocuri de 512 octeti lboot – pentru incarcarea sistemului l superbloc – contine: 1.eticheta de volum 2. informatia de identificare a discului 3.numarul de i-noduri 4. dimensiunea discului 5. data ultimei actualizari 6. numarul primului i-nod liber
Structuri interne ale proceselor Operatiile facute de P1 (modificari de deplasament) sunt vazute si de P2. Putem avea si cazul procesului P3 (avem deplasamente diferite).
Structura unui proces in memorie
Lansarea in executie a proceselor
Modalitati de lansare a comenzilor l1. comanda <CR> (shell face fork si apoi wait) l 2. comanda &<CR> (shell face fork si apoi un altfel de wait, astfel incat comanda sa fie preluata in background) Comenzi
Unix Listarea continutului unui director lls [-alis] a-afiseaza toate fisierele (all) l-afiseaza toate detaliile (long) i-afiseaza numarul modului index al fisierului Afisarea si concatenarea fisierelor lcat <lista_fisiere> -afiseaza continutul fisierelor specificate in <lista_fisiere> lcat f1 f2 > f3 -concateneaza continutul fisierelor f1 si f2 in fisierul f3 Schimbarea
modului de acces lchmod [u|g|o] [+|-] [r|w|x] <nume_fisier> - se precizeaza daca vrem sa acordam (+) sau sa revocam un drept (-), pentru ce categorie (u-user, g-group, o-others), cat si dreptul acordat sau revocat (r-read, w-write, x-execute) Ex: chmod g+wx fisier1 - acorda dreptul de scriere si executie utilizatorilor din acelasi grup cu proprietarul Redirectarea iesirii unei comenzi l > nume_fisier - se creaza fisierul specificat, iar daca el exista, se goleste mai intai Ex: ls > continut l>> nume_fisier - daca fisierul exista,se adauga iesirea comenzii la sfarsitul fisierului Ex: ls >> continut That’s all folks! Sisteme
de operare Comenzi
Unix Obtinerea sintaxei unei comenzi man <nume_comanda> - va afisa sintaxa exacta a comenzii, modul de folosire, argumentele comenzii, eventualele valori returnate - revenirea se face cu combinatia Ctrl+C sau Ctrl+Z Comenzi pentru gestionarea proceselor ps - afiseaza lista proceselor care sunt active, impreuna cu diferite date (identificatorul de proces – PID, terminal asociat etc.) kill [-arg] <PID_proces> - termina executia procesului precizat prin identificatorul de proces Ex: kill -9 2245 sh <fisier> - lanseaza in executie un fisier de comenzi Shell Utilitar pentru gestionarea fisierelor si directoarelor mc - Midnight Commander, asemanator cu Norton Commander de sub DOS. - permite parcurgerea ierarhiei de directoare, operatii cu directoare si fisiere - ferestrele se pot activa / dezactiva cu combinatia Ctrl+O - iesirea se face cu F10 Comenzi pentru gestiunea directoarelor lpwd - tipareste numele directorului curent lcd <director> - schimba directorul curent de lucru lls [-adgilrst] <fisier> - afiseaza continutul unui director lmkdir <director> - creeaza directorul cu numele precizat lrmdir <director> - sterge directorul precizat, daca este gol. Comenzi
pentru gestiunea fisierelor lfind <director> <conditie> - se cauta in directoarele specificate si in toate subdirectoarele lor, fisierele care satisfac <conditie> lrm [optiuni] <fisier> - sterge fisierele indicate lmv <fisier1> <fisier2> lmv <fisier> <director> - schimba numele <fisier1> in <fisier2> sau muta <fisier> in <director> lcp <fisier1> <fisier2> lcp <fisier><director> - copiaza <fisier1> in <fisier2> sau <fisier> in <director> Comenzi pentru fisiere text lcat <lista_de_fisiere> - afiseaza la fisierul standard de iesire continutul fisierelor date in lista (se pot astfel concatena mai multe fisiere) llpr [optiuni] <fisier> - tipareste la imprimanta fisierele date ca argument lwc [optiuni] [<fisiere>] - numara caractere, cuvinte si linii in fisierele date ca argumente lgrep [optiuni] [sir_caractere] <fisier> - filtreaza liniile unui fisier, cautand sabloane (sir_caractere) Comenzi
pentru gestiunea volumelor l df [<fisier_sistem>] - afiseaza spatiul liber pe disc ldu [optiune] [<director>] - afiseaza sumarul privind utilizarea discului Alte comenzi ltest <expresie> - se evalueaza <expresie>, iar daca valoarea ei este “Adevarat” se returneaza 0 - conditiile se refera la fisiere, directoare, siruri etc. ldate - afiseaza data si ora lwho [am I] - afiseaza numele utilizatorului lecho [-n] <argumente> - afiseaza argumentele date llogin [utilizator] - intrarea in sesiunea de lucru llogout - iesirea din sesiunea de lucru That’s all folks! Sisteme
de operare Interpretoare de comenzi UNIX ( Shell ) l Interpretorul de comenzi functioneaza in acelasi timp atat ca limbaj de comanda cat si ca limbaj de programare ( lucreaza atat in regim interactiv cat si in regim de interpretor ). l Functionarea ca limbaj de comanda ( regim interactiv ) inseamna ca intrarea interpretorului este preluata direct de la tastatura, fiecare comanda fiind imediat executata. lFunctionarea ca limbaj de programare ( regim interpretativ ) inseamna ca intrarea interpretorului consta intr-un fisier de comenzi introdus in prealabil de utilizator. l Interpretorul de comenzi considerat standard in primele versiuni UNIX este cel realizat de Bourne. Pentru UNIX BSD ( varianta Berkeley ), interpretorul se numeste C-Shell, si difera de cel al lui Bourne prin sintaxa (mai apropiata de cea a limbajului C ), facilitati suplimentare, detalii semantice. Pentru domeniul public exista printre altele interpretoarele ZSH si BASH; acesta din urma porneste de la Bourne shell si este interpretorul de comenzi preferat de LINUX. Lansarea in executie a unui fisier de comenzi Daca fisierul de comenzi este fiscom, lansarea in executie se poate face sub forma : $ sh fiscom - prompterul sistemului ) Din copia curenta a interpretorului de comenzi se lanseaza o noua copie careia i se specifica drept parametru un nume de fisier ( fisier de intrare, din care isi ia comenzile si le executa ). Lansarea in executie ca si fisier executabil O a doua modalitate de lansare a unui fisier de comenzi este ca si fisier executabil. Practic, orice fisier dintr-un sistem de fisiere UNIX poate fi considerat daca este cazul, un fisier executabil. Pentru a face un fisier sa fie executabil va trebui sa setam unul sau mai multi biti de executie ai sai (x, pentru utilizator, grup, sau ceilalti) Ex: chmod +x fiscom va adauga bitul de executie pentru toate clasele de utilizatori Ex. 2: chmod u+x fiscom va adauga bitul de executie pentru utilizatorul fisierului de comenzi fiscom Ex. 3: chmod 755 fiscom va acorda dreptul de executie pentru toti utilizatorii -111 101 101 drwx rwx rwx u g o Se precizeaza valoarea fiecarui bit de executie si se citeste valoarea zecimala rezultata separat pentru utilizator, grup si ceilalti. Lansarea efectiva in executie Dupa setarea bitului de executie, lansarea in executie se poate face direct, folosind numele fisierului de comenzi: $ fiscom unde $ este prompterul (cursorul), iar fiscom este numele fisierului de comenzi In aceasta situatie, nu se lanseaza un nou Shell (o copie a interpretorului de comenzi) ci fisierul de comenzi este interpretat de Shell-ul curent. Structuri
de comanda in Shell Structura de comanda for for nume [ in w1, w2 ] do lista_comenzi done Se executa in mod repetat lista_comenzi, pentru fiecare valoare posibila a variabilei shell nume. Valorile variabilelor speciale se interpreteaza ca siruri de caractere. Daca lipseste partea optionala, nume va primi ca valori argumentele specificate in linia prin care s-a lansat in executie fisierul de comenzi respectiv. Exemplu: Fisier de comenzi pentru consultarea unei baze de date cu numere de telefon Vom creea un fisier text cu numerele de telefon, numit telefon andrei 234271 bianca 219453 costel 0216312481 radu 0723364982 Vom creea o procedura shell care ne furnizeaza numarul de telefon al numelui specificat de noi, numit tel for i do grep $i /home/student/nume/telefon done Utilizare: $ tel costel Va returna numarul de telefon care corespunde numelui precizat, daca acesta este gasit, impreuna cu numele. Comanda grep cauta un tipar intr-un fisier specificat si tipareste linia in care l-a gasit. Observatii i - nume variabila $i - valoarea variabilei Trebuie sa se precizeze calea exacta la fisierul telefon, altfel datele nu vor fi gasite Structura de comanda case case cuvant in sablon1) lista_comenzi_ ; sablon2) lista_comenzi_ ; esac Se compara cuvant cu sablon in ordinea in care sunt specificate sabloanele si daca se gaseste o potrivire se executa lista_comenzi asociata, dupa care se paraseste structura. Exemplu: procedura Shell care se apeleaza cu un nume de fisier, sau cu doua nume de fisiere ca si argumente. In caz ca exista un argument, se adauga in el de la tastatura, daca exista doua, se adauga continutul primului fisier la cel de-al doilea. Fisierul va avea numele append case $# in 1) cat >> $1 ;; 2) cat < $1 >> $2 ;; *) echo 'utilizare: append [from] to ' esac variabila Shell ce are ca voaloare numarul parametrilor propriu-zisi din linia de comanda That’s all folks! Sisteme
de operare Structuri
de comanda in Shell Structura de comanda while while lista_comenzi_1 do lista_comenzi_2 done Se executa lista de comenzi 1 si se testeaza starea de iesire a ultimei comenzi din aceasta lista. Daca starea de iesire este 0 ( zero ), se executa si lista de comenzi 2 si se reia ciclul. In caz contrar, ciclul se incheie. Exemplu
pentru while Atata vreme cat mai exista parametri in linia de comanda, se executa operatiile ce vor urma dupa do (' “), apoi se elimina parametrul din linia de comanda (se trece la urmatorul parametru din linia de comanda) cu shift. Comanda test testeaza in acest caz daca mai exista parametri in linia de comanda. while test $1 do shift done Observatie: Secventa de comenzi de mai sus (exemplul pentru while) este echivalenta, ca si functionare cu urmatoarea secventa de comenzi, care foloseste for: for i do . done Structura de comanda until until lista_comenzi_1 do lista_comenzi_2 done Se executa lista de comenzi 1 si cat timp iesirea ultimei comenzi este diferita de 0 (zero), adica pana la prima executie cu succes, se executa si lista de comenzi 2 si se reia bucla de la inceput. Practic se fac iteratii pana la prima executie cu succes a ultimei comenzi din lista_comenzi_1. Observatie: Conventia folosita la valorile returnate la aceste comenzi este: 0 = True (Adevarat) 1 = False (Fals) Exemplu pentru until until test -f fisier do sleep 300 done Se verifica existenta fisierului cu numele fisier cu comanda test. Daca nu exista fisierul, se asteapta 300 milisecunde si se reia testarea. Se iese din bucla daca fisierul a fost gasit. Structura de comanda if if lista_comenzi_1 then lista_comenzi_2 else lista_comenzi_3 fi Se executa lista de comenzi 1, daca ultima sa comanda returneaza 0 (True), se executa lista de comenzi 2, iar daca returneaza 1 (False), se executa lista de comenzi 3. Imbricarea structurii if if then else if then fi fi Gruparea comenzilor sau ( lista_comenzi ) Gruparea intre este executata de shell-ul curent; gruparea intre ( ) este executata de un nou shell ( dupa terminarea executiei, noul shell ' moare ' ). Separarea comenzilor se face cu caracterul “;” Ex. ( cd x; rm fis ) Comanda test test [ -o ] arg o – este o litera care indica optiunea dorita arg - este fie un sir, fie un nume de fisier Instructiunea Rezultatul test sir .T. daca sir este diferit de sirul vid test -f fis .T. daca fis exista ca fisier (nu catalog) test -r fis .T. daca fis poate fi citit test -w fis .T. daca fis poate fi scris test -d fis .T. daca fis este de fapt catalog O forma echivalenta pentru test –f fis este: if [ -f fis ] Variabile Shell $# numarul de parametri pozitionali dintr-o comanda ( argc ) $? starea de iesire a ultimei comenzi executate $0 numele comenzii identificatorul de proces al shell-ului curent ( se foloseste adesea pentru generarea de fisiere temporare ) identificatorul de proces al celui mai recent proces ce lucreaza in background $HOME rezulta catalogul gazda al fiecarui utilizator ( este initializat la valori specifice tot in fisierul de valori ) $PATH lista cataloagelor in care se cauta pentru a gasi comenzile Ex. PATH : . / bin : $HOME / bin : / usr / bin That’s all folks! lExista in Shell posibilitatea ca datele pentru executarea unei comenzi sa fie specificate chiar in cadrul procedurii. Portiunea respectiva se va numi document HERE. l for i __________________ l do grep $i | >> ! | l ___________| | datele necesare pentru l | alex 342171 | executie sunt specificate l | jim 190453 | direct in procedura l | vetuta 0163424851 | l | ! | l |_____ _______ ______ _____________| l done lObs. << - redirectarea intrarii ! - delimiteaza datele l La sfarsitul datelor, ' ! ' este singurul caracter de pe linie. lIntr-un document here are loc substituirea parametrilor inainte ca documentul sa fie utilizat. That’s all folks! Sisteme
de operare Variabile Shell Substitutia parametrilor Variabilele shell pot primi valori fie prin atribuire directa sau in linia de comanda prin care se lanseaza o procedura shell. Ex: $ user = fred comanda Lanseaza o procedura shell numita comanda; inainte de aceasta, variabilei user i se atribuie valoarea fred; aceasta valoare va fi utilizata in procedura shell comanda. Ambianta unui proces este formata dintr-o lista de perechi nume = valoare ce se transmit programului ca si cand ar fi o lista de argumente. La apelarea unei proceduri, shell-ul activ in momentul respectiv baleiaza ambianta procedurii si creaza cate o variabila cu valoarea corespunzatoare pe care o transmite comenzii. Orice modificari efectuate in interiorul unei proceduri shell ( crearea unor variabile noi, modificarea valorilor variabilelor vechi ) nu este vizibila in afara procedurii decat daca apare explicit o specificare export in fata numelui variabilei. Este posibil sa specificam faptul ca unele variabile nu pot fi modificate : readonly nume_variabila Daca un parametru shell nu are specificata valoarea, el primeste implicit ca valoare sirul vid: echo $d - daca d nu are valoare => sir vid. Este posibila specificarea valorii implicite: echo $ - daca d este initializat, pastreaza valoarea ce i s-a atribuit; altfel d primeste valoarea '.' echo $ -daca d nu are valoare, nu primeste ca valoare sirul vid, ci este afisat un mesaj, apoi executia procedurii este abandonata. : $ $ $ Poate fi prima linie dintr-o procedura shell (fisier de comenzi, script). Efectul ei va fi ca procedura nu se executa decat daca variabilele user, acct, bin au valori specificate. In caz contrar, daca variabilele respective nu au fost initializate se paraseste procedura fara a se executa. : este o comanda interna a shell-ului ( nume de comanda ), care doar evalueaza parametrii fara a face altceva. Substitutia comenzilor Iesirea standard a unei comenzi poate substitui parametrii de intrare standard ai altei comenzi. Ex 1: d = 'pwd' - se executa comanda pwd, iar iesirea ei (numele catalogului curent) i se atribuie variabilei d. Ex 2: ls ‘echo '$1' ' - este echivalent cu: ls $1 Intre ghilimele este permisa substitutia parametrilor (de exemplu se substituie $1). Substitutia comenzilor apare in toate contextele in care este permisa si substitutia parametrilor. Evaluare si citare Shell-ul se comporta ca un macroprocesor ce permite substitutia parametrilor, a comenzilor si generarea de nume de fisiere pentru argumentele comenzii. Inainte ca o comanda sa fie executata apar in ordine urmatoarele etape : 1.) substitutia parametrilor; 2.) substitutia comenzilor; 3.) interpretarea blank-urilor; 4.) generarea numelor de fisiere. Ex : fie o variabila x cu valoarea momentana $y: echo $x => echo $y => $y Practic se inlocuieste $x (reprezentand valoarea lui x) cu valoarea lui x, adica $y Ex 2: HOME = 'pwd' - astfel, oriunde se lanseaza comanda, HOME va fi catalogul curent. Dupa ce se realizeaza substitutia parametrilor si a comenzilor, sirul de caractere rezultat este divizat in cuvinte, separate prin generic blank (orice caracter de separare specificat). Sirul vid nu este considerat ca si cuvant decat daca este citat: echo '' echo $null - apare substitutia parametrilor; null sau este initializat pe sirul vid, sau nu e initializat si atunci se initializeaza ca fiind un sir vid, deci in final va fi un sir vid. Citarea unor caractere sau siruri apare din necesitatea de a da caracterelor sau sirurilor respective o interpretare diferita de cea normala. Exista o serie de caractere cu functie speciala × $ . Acestea sunt numite metacaractere. Ex: x - pentru specificarea caracterului x; este mecanismul de citare a caracterului x prin - pentru specificarea caracterului Sirurile se pot cita in intregime prin includerea lor intre apostroafe ' ). Mecanismul de citare prin ghilimele ' ) este tot pentru siruri. Intre ghilimele este executata substitutia parametrilor si comenzilor, nu si generarea de nume de fisiere. FUNCTII SISTEM TIPURI
DE DATE PRIMITIVE Header-ul <sys/types.h> defineste citeva tipuri de date dependente de implementare, numite tipuri de date sistem. Multe din aceste tipuri sunt definite si in alte header-e. Modul de definire este folosind typedef. Cateva tipuri de date primitive (sistem): caddr_t = adresa clock_t = contor de impuls de ceas comp_t = impulsuri de ceas comprimate dev_t = numere de dispozitiv (major/minor) fd_set = seturi de descriptori de fisiere fpos_t = pozitie in fisier gid_t = ID-uri de grup (numeric) ino_t = numere de noduri index mode_t = tip de fisier, mod de creare fisier nlink_t = contor de legaturi pentru intrari de director off_t = dimensiunea fisierului si deplasamentul in fisier (cu semn) pid_t = ID de proces si ID de grup pt procese ( cu semn) ptrdiff_t = rezultat diferenta a doi pointeri (cu semn) rlim_t = limite de resurse sig_atomic_t = tip de date care pot fi accesate atomic sigset_t = set de semnale size_t = dimensiuni de obiecte (de ex siruri) (fara semn) ssize_t = functii care returneaza contor de octeti (cu semn) time_t = contor de secunde uid_t = ID de utilizare, numeric wchar_t = poate reprezenta toate codurile distincte de caractere Definind aceste tipuri de date, programele nu vor contine detalii de implementare care pot sa difere de la un sistem la altul. Functii sistem de intrare / iesire 1. Descriptori Pentru nucleu, toate fisierele deschise sunt referite prin descriptori de fisiere. Un descriptor de fisier este un intreg nenegativ. La deschiderea unui fisier existent sau la crearea unuia nou, nucleul returneaza procesului apelant un descriptor de fisier. La citirea sau scrierea in fisier, identificam fisierul prin descriptorul returnat de functia open sau creat . Prin conventie, descriptorul 0 corespunde intrarii standard, 1 iesirii standard, 2 iesirea pentru mesaje de eroare. 2. Functia open int open (const char * cale, int oflag, /*,mode_t mode */); returneaza -1 pentru eroare, descriptorul in caz de succes Trebuie incluse <sys/types.h>, <sys/stat.h>, <fcntl.h>. Al treilea argument este utilizat numai la crearea unui fisier nou. oflag consta dintr-o expresie care contine o serie de constante, definite in <fcntl.h>, combinate prin OR binar, care precizeaza felul in care va fi deschis fisierul: O_RDONLY| O_WRONLY| O_RDWR - se exclude reciproc. Prez obligatorie O_APPEND O_CREAT - creeaza fisierul, daca acesta nu exista. O_EXCL - genereaza eroare daca se da impreuna cu O_CREAT si fisierul precizat exista. O_TRUNC - daca fisierul exista si daca e deschis cu succes pt W sau RW, il trunchiaza la lungimea 0. O_SYNC - fiecare Write asteapta scrierea efectiva la dispozitiv. That’s all folks! Sisteme
de operare Functii
sistem de intrare/iesire 3. Functia creat int creat (const char *cale, mode_t mode); Returneaza -1 in caz de eroare, sau descriptorul. Trebuie incluse aceleasi header-e ca la open. Este echivalent cu: open(cale, O_WRONLY | O_CREAT | O_TRUNC, mode); Un dezavantaj este ca fisierul este deschis doar pentru scriere. La crearea unui fisier temporar, in care se va scrie si din care se va citi, ar trebui creat/close/open. O varianta ar fi: open(cale, O_RDWR | O_CREAT | O_TRUNC, mode); 4. Functia close int close (int descfis); Trebuie inclus fisierul antet <unistd.h>. Returneaza -1 pt eroare. La terminarea unui program, toate fisierele sunt inchise automat de catre nucleu. Multe programe apeleaza la aceasta facilitate si nu inchid explicit fisierele deschise. 5. Functia lseek Fiecare fisier are asociat un deplasament curent. Acesta este un intreg nenegativ care precizeaza numarul de octeti de la inceputul fisierului pana in pozitia respectiva. Operatiile de citire sau scriere actioneaza de la acest deplasament si determina incrementarea sau decrementarea lui cu numarul de octeti scrisi sau cititi. Implicit, deplasamentul este initializat cu 0 la deschiderea fisierului, cu exceptia deschiderii cu O_APPEND, cand este pozitionat la sfarsitul fisierului. Pentru pozitionare explicita in fisier: off_t lseek (int desfis, off_t offset, int from); Returneaza -1 pentru eroare. Trebuie incluse <sys/types.h>, <unistd.h>. Interpretarea lui offset depinde de valoarea lui from : SEEK_SET - noua pozitie va fi la offset octeti de la inceputul fisierului; SEEK_CUR - se numara offset de la pozitia curenta; SEEK_END - se numara offset octeti relativ la sfirsitul fisierului. Pentru obtinerea pozitiei curente: off_t pozitie_curenta; pozitia_curenta=lseek(fd,0,SEEK_CUR); Aceeasi tehnica poate fi utilizata pentru a testa daca descriptorul respectiv suporta sau nu pozitionarea. 6. Functiile read si write ssize_t read (int fd, void *buff, size_t nbytes); Returneaza: - numarul de octeti cititi (poate fi mai mic sau egal cu nbytes) - 0 pt EOF (End Of File- sfarsit de fisier) - -1 pentru eroare ssize_t write (int fd, void *buff, size_t nbytes); Returneaza : - numarul de octeti scrisi (de obicei nbytes) - -1 pentru eroare (umplerea discului sau depasirea lungimii permise a fisierului) Trebuie inclus fisierul antet <unistd.h>. 7. Functiile dup si dup2 int dup (int fd); int dup2 (int fd, int fd2); Trebuie inclus fisierul antet <unistd.h>. Returneaza noul descriptor sau -1 pentru eroare . fd2 precizeaza valoarea noului descriptor care se asociaza. Daca fd2 este deschis, acesta este mai intai inchis. Daca fd este egal cu fd2, dup2 returneaza fd2 fara a-l inchide. Ambii descriptori, cel vechi si cel nou, indica aceiasi intrare in tabela de fisiere (aceleasi flag-uri de stare si acelasi offset). 8.
Functia fcntl int fcntl (int fd, int cmd,,/* int arg */); Trebuie incluse <sys/types.h>,<unistd.h>,<fcntl.h>. Returneaza -1 pentru eroare. Utilizari: - duplicare descriptor existent; - obtinere/setare flag-uri descriptori; - obtinere/setare flag-uri de stare fisier; - obtinere/setare caracteristica I/E asincrona; - obtinere/setare blocare acces la inregistrare; - inchidere sau nu la o functie exec; - modul in care a fost deschis fisierul. Utilitate: Programul poate opera asupra descriptorilor (mai ales 0 ), fara sa cunoasca numele fisierului asociat de shell. Exemplu: program care primeste ca argument un descriptor si afiseaza flag-urile fisierului asociat: # include <sys/types.h> # include <fcntl.h> # include <unistd.h> # include <stdio.h> int main (int argc,char *argv[]) if ((val=fcntl(atoi(argv[1]), F_FGETFL,0))< 0 ) accmode=val & O_ACCMODE; if ( accmode==O_RDONLY) printf (' read only '); else if ( accmode==O_WRONLY) printf (' write only '); else if ( accmode==O_RDWR) printf (' read write '); else printf (' mod acces necunoscut '); if (val & O_APPEND) printf (' append '); if (val & O_NONBLOCK) printf ('nonblocking '); # ifdefine (O_SYNC) if (val & O_SYNC) printf(' scriere sincrona'); # endif putchar('n') ; return (0); } Fie a.out numele fisierului executabil obtinut in urma compilarii programului. Exemple de utilizare: $a.out 0 </dev/tty va afisa: read only $a.out 1 >temp.temp $cat temp.temp va afisa: write only $a.out 2 >>temp.temp $cat temp.temp va afisa write only, append 8. Functia ioctl Este functia esentiala pentru operatiile de intrare/iesire. Foarte multe operatii nu pot fi exprimate prin una din functiile prezentate pana in prezent. Un exemplu ar fi operatiile de intrare/iesire cu terminalele. int ioctl (int fd, int cerere,); Trebuie incluse <unistd.h>, <sys/types.h>. Returneaza -1 pentru eroare. 9.
/dev/fd Sistemele noi ofera directorul /dev/fd, cu intrarile numite 0 . Deschiderea fisierului /dev/fd/n este echivalenta cu duplicarea descriptorului n. fd= open('/dev/fd/0',mode); <=> fd=dup(0); Unele sisteme ofera /dev/stdin, /dev/stdout , /dev/stderr care sunt echivalente cu celelalte 3. Utilizarea principala e in shell unde se permite programelor - care necesita un nume de cale ca argument - sa primeasca date de la intrarea standard ( tastatura ). Exemplu: cat f1 /dev/fd/0 f2 GESTIONAREA
DIRECTOARELOR 1.Functiile stat, fstat, lstat int stat (const char *cale,struct stat *buf); int fstat (int fd,struct stat *buf); int lstat (const char *cale,struct stat *buf); Returneaza -1 pt eroare, 0 in caz de succes. Trebuie incluse <sys/types.h>,<sys/stat.h>. Cele trei functii completeaza o structura de informatii despre fisier. stat primeste un nume de cale, fstat un descriptor, lstat este echivalent cu stat, dar daca fisierul este o legatura simbolica, returneaza informatii despre legatura simbolica, nu despre fisierul indicat de legatura. Structura stat este definita in <sys/stat.h> Cel mai important utilizator al functiei stat este probabil comanda ls -l. 2.Tipuri de fisiere In <sys/stat.h> sunt definite o serie de macrouri, care pot testa valoarea lui st_mode care apartine structurii stat: S_ISREG() - fisier obisnuit S_ISDIR( ) - director S_ISCHR( ) - f. special in mod caracter S_ISBLK( ) - f. special in mod bloc S_ISFIFO( )- canale (pipe) sau FIFO - tip special pentru intercomunicare intre procese S_ISLNK ( legatura simbolica S_ISSOCK ( ) –prize (sockets) - pt comunicarea in retea That’s all folks!
|