CATEGORII DOCUMENTE |
Acest capitol a acoperit suficiente notiuni pentru a explica cum lucreaza shell-ul. Figura 8.28 arata ciclul principal al shell-lui si demonstreaza executia asincrona, redirectarea iesirii si pipe-urile.
/* citeste linia de comanda pana la aparitia caracterului 'sfarsit de fisier' */
while (read(stdin, buffer, numchars))
if(/* cerere de redirectare catre o un fisier pipe */
/* a doua componenta a liniei de comanda */
close(stdin); dup(fildes[0]);
close(fildes[0]); close(fildes[1]);
/* intrarea standard este acum redirectata catre un pipe */ }
execv(command2, command2, 0); }
/* procesul parinte continua de aici
asteapta terminarea procesului fiu daca este nevoie*/
if(amper==0) retid=wait(&status);
Figura 8.28 Ciclul principal al shell-lui
Shell-ul citeste o linie de la intrarea sa standard si o interpreteaza dupa un set fixat de reguli. Descriptorii fisierelor standard de intrate si de iesire pentru shell-ul de logare in sistem sunt de obicei ai terminalului pe care utilizatorul ii foloseste asa cum s-a aratat in capitolul 6. Daca shell-ul recunoaste sirul de intrare ca fiind o comanda interna (de exemplu, comenzile cd, for, while si altele), el executa comanda intern fara a mai crea procese; altfel, presupune ca aceasta este numele unui fisier executabil.
Cea mai simpla linie de comanda contine un nume de program si cativa parametri cum ar fi:
who
grep -n include *.c
ls -1
Shell-ul executa un apel fork si creeaza un proces fiu care executa programul pe care utilizatorul l-a specificat in linia de comanda. Procesul parinte, shell-ul care este folosit de utilizator, asteapta pana cand procesul fiu termina comanda si apoi revine in ciclu pentru a citi comanda urmatoare.
Pentru a rula un proces asincron (in fundal), ca de exemplu
nroff -mm bigdocument &
shell-ul seteaza o variabila interna amper cand analizeaza caracterul &. Daca gaseste variabila setata la sfarsitul ciclului, el executa apelul wait dar reia imediat ciclul si citeste urmatoarea linie de comanda.
Figura arata ca procesul fiu are acces la copia liniei de comanda dupa executarea apelului fork. Pentru a redirecta iesirea standard catre un fisier, ca in
nroff -mm bigdocument>output
procesul fiu creeaza fisierul de iesire specificat in linia de comanda; daca apelul creat nu se incheie cu succes (de exemplu, la crearea fisierului intr-un director fara drept de acces ), procesul fiu ar trebui sa se termine imediat. Daca apelul creat se incheie cu succes, procesul fiu inchide fisierul de iesire standard anterior si duplica descriptorul de fisier al noului fisier de iesire. Descriptorul fisierului de iesire standard refera acum fisierul de iesire redirectat. Procesul fiu inchide descriptorul de fisier obtinut prin apelul creat pentru a conserva descriptorii de fisier pentru programul executat. Shell-ul redirecteaza fisierele standard de intrare si eroare intr-un mod similar.
Figura 8.29 Relatiile intre procese pentru linia de comanda ls -l|wc
Figura 8.29 arata cum trateaza shell-ul o linie de comanda ls-l|wc cu un singur pipe.
Dupa ce procesul parinte apeleaza fork si creeaza un proces fiu, fiul creeaza un pipe. Procesul fiu executa la randul sau un apel fork; el si fiul sau trateaza fiecare cate o componenta a liniei de comanda. Procesul fiu ( " nepotul " ) creat prin al doilea apel fork executa prima componenta a comenzii (ls): el scrie in pipe, asa ca inchide descriptorul fisierului sau standard de iesire, duplica descriptorul de scriere in pipe si inchide descriptorul initial de scriere in pipe pentru ca acesta nu mai este necesar. Procesul parinte (wc) al ultimului proces fiu (ls) este fiul procesului shell (vezi Figura 8.29). Acest proces (wc) inchide propriul fisier standard de intrare si duplica descriptorul de citire din pipe facandu-l sa devina propriul descriptor de fisier standard de intrare. Apoi inchide descriptorul initial de citire din pipe pentru ca nu mai are nevoie de el si executa a doua componenta a comenzii din linia de comanda. Cele doua procese care executa linia de comanda, se executa asincron, si iesirea unui proces devine intrare pentru celalalt proces. Procesul shell intre timp asteapta pentru ca procesul sau fiu (wc) sa se termine, apoi procedeaza in mod uzual: intreaga linie de comanda este executata complet atunci cand procesul care executa comanda wc se termina. Shell-ul reintra in ciclu si citeste urmatoarea comanda.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1087
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved