Mediul Shell
Apelurile fork si execIn Unix, apelul de sistem fork determina producerea unui nou proces. Apelul exec face ca un nou program sa se suprapuna peste noul proces. Dupa fiecare apel fork ce genereaza un nou proces, vechiul proces se executa in continuare avand continutul intact. Noul proces este identic cu parintele sau pana cand exec se suprapune cu imaginea noului program. Acest eveniment apare, de regula, la executia unei comenzi. Apelul de sistem wait suspenda executia shell-ului pana cand noul proces este terminat. Atunci cand apelul de sistem exec se autoapeleaza la prompterul shell, continututl procesului vechi se pierde. Procesul original este suprapus cu imaginea noului program. Spre exemplu, puteti considera comanda: exec ls -lIn acest caz, comanda anterioara este suprapusa peste procesul shell; in momentul executiei sale, shell-ul se termina si de aceea utilizatorul este confruntat cu prompterul de login. Un proces este un program in executie, fiecare proces avand o arie de memorie unde este stocata informatia despre acesta. Un proces aflat in executie este descris de o tabela de procese. Tabela de procese contine informatii precum:
Procesul in sine contine codul ce va fi executat, avand, de asemenea, asociat o portiune de date in memorie ce contine informatii referitoare la mediul sistemului (variabilele de mediu). Modalitati de grupare a comenzilor shellExista o serie de modalitati de grupare a comenzilor shell:
Comunicarea dintre procesele in executie este stabilita de un fisier special pipe. sort bigfile > outfile1& pid1=$! sort bigfile > outfile2& pid2=$! ... wait $pid1 wait $pid2 diff outfile1 outfile2 >&1 Modalitati de apel al shell-uluiExista doua modalitati de apel al shell-ului:
Comanda shO posibilitate de folosire a acestei comenzi este aceea de a folosi optiunea -r prin intermediul careia se porneste un shell restrictionat (rsh - restricted shell). Acest shell reduce posibilitatile de actiune ale utilizatorului fata de actiunile permise in cadrul shell-ului obisnuit (de regula comanda este folosita pentru utilizatorii noi din sistem). Restrictiile sunt:
Alte optiuni ale comenzii: Subshell-uriEste important in Unix sa cunoastem modul de executie a comenzilor si shellscript-urilor din punct de vedere al "locului" de rulare a acestora. Astfel, atunci cand o comanda este oferita spre executie shell-ului este creat un subshell, care este un proces copil. Cea mai uzuala metoda de a rula o comanda este aceea de a introduce comanda la prompter-ul Unix. Totusi, comanda poate fi executata si: $sh <comanda>Fiecare metoda creeaza de fapt cate un subshell. Ce este important de stiut este faptul ca modificarile aduse mediului de catre subshell nu sunt valabile si in shell-ul parinte. Fie programul cdtest: Comenzile env si setShell-ul ofera posibilitatea modificarii mediului de executie prin:
$env VAR=1 EXPORTED=vt100Atunci cand folosim set fara argumente, se asteapta o lista a tuturor variabilelor din mediul shell-ului utilizatorului (variabile locale sau exportate). Exemplu: $set PATH=/home/razvan:/bin:/usr/bin TERM=vt220 VAR1=1 EXPORTED=vt100 $Formatul general al comenzii env este: env [-] [<nume=valoare ...>][<comanda>] Exemplu: $env TERM=tvi050 vi myfileScopul lui env este modificarea temporara a mediului shell. Atunci cand env este folosita fara -, preia mediul curent si il modifica in concordanta cu atribuirile specificate, executind apoi comanda ce apare in mediul temporar. Daca apare -, mediul mostenit este ignorat si se executa comanda respectiva folosind mediul specificat. Formatul general al lui set este: set [<optiuni>] [<argumente>]Atunci cand sunt specificate valori drept argumente, sunt setate valorile parametrilor pozitionali corespunzatori. Atunci cand set este folosita cu optiuni, ea modifica executia shell-ului curent. Optiunile sunt activate daca sunt precedate de - si dezactivate cand sunt precedate de +. Una dintre utilizarile majore ale lui set este aceea de depanare a shellscript-urilor folosind optiunea -v care urmareste executia shellscript-ului. Optiunile pentru set sunt:
Fie shellscript-ul test: set -x cmd=wc cat fisier | $cmd -lExecutia shellscript-ului este: $ + cat fisier + wc -l $ Un shellscript poate stabili care dintre optiunile set sunt activate folosind variabila speciala $-. SemnaleEste necesar uneori ca shellscript-ul sa poata fi intrerupt pentru a ne intoarce la prompter. Putem apasa DELETE, BREAK sau CTRL+C. In functie de necesitati, uneori este necesar sa executam o operatie de intretinere atunci cand un shellscript este intrerupt (trebuie sa inchidem sau sa stergem fisierele temporare). In alte circumstante, se poate dori indeplinirea unei anumite sarcini fara intrerupere. Unix ofera posibilitatea manevrarii exprese a evenimentelor initiate de lumea din afara prin folosirea semnalelor. In functie de versiunea de Unix folosita, numarul de semnale recunoscute variaza intre 15 si 30. Lista acestora este:
Observatie: de regula, semnalele sunt interceptate de apelul de sistem signal ce poate fi folosit in programe C. Exemplu: fie o instructiune dintr-un program C ce face o impartire la zero: printf("Impartire la zero:%d",6/0); in acest caz este semnalat un SIGFPE, iar programul trebuie sa includa cod care sa receptioneze acest semnal: signal(SIGFPE,f_cleanup), unde f_cleanup este functia ce rezolva problema si afiseaza un mesaj corespunzator.O alta modalitate de interceptare a mesajelor este prin intermediul comenzii interne trap. Aceasta permite interceptarea si prelucrarea semnalelor ce ar afecta shellscript-ul intr-o maniera imprevizibila. Formatul general al comenzii este: trap <comenzi> <semnale><comenzi> reprezinta comenzi ce se executa la aparitia unuia dintre semnale. Fie: $trap "rm tmp*;echo interrupt!;exit 3" 1 2Aceasta comanda poate inhiba intreruperile in cazul proiectarii unor interfete prietenoase cu utilizatorii. De exemplui, o interfata utilizator poate sa ignore apasarea tastelor DEL, BREAK sau CTRL+C. Urmatoarea comanda face ca semnalele respective sa fie ignorate: $trap "" 1 2 3 15Atunci cand trap este folosita pentru a ignora semnale, afecteaza toate subshell-urile. Cand trap este folosita sa ia actiune, nu le afecteaza. daca se doreste ca actiunea lui trap sa aiba efect in subshell-uri, trebuie specificat in mod explicit in fiecare subshell. Totusi, nu orice semnale pot fi ignorate; in caz contrar nu ar mai putea fi intrerupte anumite programe sub nici o forma! Exista SIGKILL care nu poate fi ignorat! Acest semnal este generat de comanda interna kill. Exemplu: $kill -9 12345 unde 12345 este identificatorul procesului ce trebuie terminat |
|
|