Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Driverele de terminale - UNIX

linux



+ Font mai mare | - Font mai mic



Driverele de terminale - UNIX

Driverele de terminal au aceeasi functie ca celelalte drivere: sa controleze transmisia datelor la si de la terminale. Totusi, terminalele sunt speciale deoarece ele sunt interfata utilizatorului cu sistemul. Pentru acomodarea cu folosirea interactiva a sistemului UNIX, driverele de terminal contin o interfata interna pentru modulele de disciplina a liniei care interpreteaza intrarile si iesirile. In modul canonic, disciplina de linie converteste secventele de date de tip caracter de la tastatura la o forma canonica, inainte de trimiterea datelor la procesul care trebuie sa le receptioneze. Disciplina de linie converteste, de asemenea, secventa de caractere scrisa la iesire de un proces la un format pe care utilizatorul il asteapta. In modul caracter, disciplina de linie transmite datele intre procese si terminal fara astfel de conversii.



De exemplu, programatorii sunt rapizi dar predispusi greselilor. Terminalele furnizeaza o cheie de "stergere" asa incat utilizatorul poate sterge logic parti din secventa tiparita si poate introduce corectiile. Terminalul trimite masinii intreaga secventa, incluzand caracterele sterse. In modul canonic, disciplina de linie pastreaza datele in linii ( secvente de caractere ce se incheie cu CR) si procesele sterg caracterele intern inainte de trimiterea secventei revizuite la procesul cititor.

Functiile unei discipline de linie sunt:

- sa imparta sirurile de intrare in linii,

- sa proceseze un caracter "kill" ce invalideaza toate caracterele tiparite in continuare pe linia curenta,

- sa scrie caracterele receptionate la terminal,

- sa extinda iesirea, cum ar fi caracterele "tab" la o secventa de spatii

-sa genereze semnale proceselor pentru intreruperile de terminal, intreruperile de linii sau ca raspuns la apasarea de catre utilizator a tastei "delete ",

- sa permita un mod caracter care nu interpreteaza caracterele speciale, cum ar fi "erase", "kill" sau "CR ",

Suportul modului caracter implica utilizarea unui terminal asincron, deoarece procesele pot citi caractere cand ele sunt tiparite, in loc sa astepte pana ce un utilizator apasa "CR".

Figura 6.9 arata fluxul logic de date prin driverul de terminal, disciplina de linie si fluxul de control corespunzator prin driverul de terminal. Utilizatorii pot specifica care disciplina de linie trebuie sa fie utilizata printr-un apel ioctl , dar este dificil sa se implementeze o schema astfel incat un dispozitiv sa foloseasca mai multe discipline de linie simultan, unde fiecare modul de disciplina de linie apeleaza succesiv urmatorul modul pentru a procesa datele.

Figura 6.9. Secventa de apel si flux de date prin disciplina de linie

Liste de caractere

Disciplina de linie manipuleaza datele pe liste de caractere. O lista de caractere este o lista inlantuita de lungime variabila de blocuri de caractere si contine un contor care memoreaza numarul de caractere din lista. Un bloc de caractere contine un pointer spre urmatorul bloc de caractere din lista inlantuita, un mic sir de caractere care contine datele si un set de adrese care indica pozitia datelor valide in blocul de caractere (Figura 6.10). Adresa de start indica prima locatie a datelor valide din sir si adresa de sfarsit indica prima locatie de date care nu sunt valide.

Figura 6.10. Un bloc de caractere

Nucleul pastreaza o lista inlantuita a blocurilor de caractere libere si are sase operatii pentru blocuri si liste de caractere.

1. Are operatia de asignare a unui bloc de caractere din lista blocurilor libere

de la un driver .

2. De asemenea are o operatie de adaugare a unui bloc de caractere la lista

blocurilor libere.

3. Nucleul poate recupera primul caracter dintr-o lista de caractere: el scoate primul caracter din primul bloc de caractere din lista si ajusteaza numarul caracterelor din lista si indicii in bloc asa incat urmatoarele operatii nu vor accesa acelasi caracter. Daca o operatie de accesare consuma ultimul caracter al blocului, nucleul plaseaza blocul gol in lista blocurilor libere si ajusteaza pointerii. Daca o lista nu contine caractere cand se executa o operatie de recuperare , nucleul returneaza caracterul null.

4. Nucleul poate plasa un caracter la sfarsitul unei liste prin gasirea ultimului bloc din lista, punand caracterul in el si ajustand valoarea deplasamentului. Daca blocul este plin, nucleul aloca un nou bloc, il leaga la sfarsitul listei si plaseaza caracterul in noul bloc.

5. Nucleul poate scoate un grup de caractere de la inceputul unei liste, intr-o operatie aceasta fiind echivalent cu scoaterea tuturor caracterelor din bloc intr-o singura operatiune.

6. Nucleul poate plasa un bloc de caractere la sfarsitul unei liste.

Listele de caractere furnizeaza un mecanism de buffer-are simplu, folositor pentru volume mici de date de transmis tipice dispozitivelor lente cum sunt terminalele. Ele permit manipularea datelor caracter la un moment dat sau in grupuri de blocuri de caractere. De exemplu, figura 6.11 arata modul de scoatere a caracterelor din lista (Figura 6.11 a-c ) pana cand nu mai sunt caractere in bloc ( Figura 6.11 d ); apoi, el ajusteaza pointerul clistei sa pointeze la urmatorul cbloc, care devine primul din lista inlantuita. Similar, figura 6.12 descrie cum nucleul pune caractere in lista de caractere: presupunand ca un bloc are o capacitate de 8 caractere, nucleul leaga un nou bloc la sfarsitul listei inlantuite ( Figura 6.12 d ).

Figura 6.11. Scoaterea caracterelor dintr-o lista


Figura 6.12. Plasarea unui caracter intr-o lista

Driverul de terminal in modul canonic

Structurile de date pentru driverele de terminal au 3 liste de caractere asociate cu ele: prima lista pentru a memora datele de iesire la terminal , o a doua lista pentru a memora datele de intrare de tip caracter furnizate prin rutina de tratare a intreruperii de terminal asa cum le-a tastat utilizatorul si o a treia lista pentru a memora datele de intrare prelucrate, dupa ce disciplina de linie converteste caracterele speciale intr-o lista de caractere, cum ar fi caracterele " erase " si " kill ".

algoritmul terminal_write

copiaza blocul de date din spatiul utilizator in lista de iesire:

disciplina de linie converteste caracterele "tab",etc;

}

incepe operatia de scriere la hardware a datelor din lista de iesire;

}

Figura 6.13. Algoritmul pentru scrierea datelor la un terminal

Cand un proces scrie la un terminal ( Figura 6.13 ), driverul de terminal invoca disciplina de linie. Aceasta executa un ciclu, citind caracterele rezultate din spatiul de adrese utilizator si le plaseaza in lista de iesire, pana cand se epuizeaza datele. Disciplina de linie proceseaza aceste caractere, expandand caracterele "tab" la o serie de spatii, de exemplu. Daca numarul de caractere din lista de iesire devine mai mare decat limita superioara, disciplina de linie apeleaza procedurile driverului pentru a transmite datele din lista de iesire la terminal si pune procesul care a scris datele in asteptare. Cand cantitatea de date din lista de iesire scade sub limita inferioara, rutina de tratare a intreruperii trezeste toate procesele adormite pe evenimentul "terminalul poate accepta mai multe date". Disciplina de linie termina ciclul sau, avand copiate toate datele de iesire din spatiul utilizator in lista de iesire si apeleaza procedurile driverului pentru a transmite datele la terminal.

Daca mai multe procese scriu la un terminal, ele urmaresc procedura data independent. Datele scrise de procese pot fi intercalate intre ele la terminal. Aceasta se poate intampla deoarece un proces poate scrie la terminal folosind mai multe apeluri sistem write . Nucleul poate comuta contextul in timp ce procesul este in modul utilizator intre doua apeluri sistem write succesive si un nou proces planificat poate scrie la terminal in timp ce procesul initial este in asteptare. Datele de iesire pot fi, de asemenea, amestecate la un terminal deoarece un proces care scrie se poate pune in asteptare in mijlocul unui apel sistem write in timp ce datele de iesire anterioare sunt scoase din sistem. Nucleul poate planifica alte procese care scriu la terminal inainte ca procesul initial sa fie replanificat. Din cauza aceasta, nucleul nu garanteaza ca continutul buffer-ului de date ce urmeaza sa fie scos la iesire printr-un apel sistem write apare contiguu la terminal .

Consideram programul din figura 6.14. Procesul parinte creeaza 18 fii; fiecare proces fiu formateaza un sir ( prin functia de biblioteca sprintf ) in variabila output, care include un mesaj si valoarea lui "i " in momentul apelului fork si apoi intra in bucla, scriind sirul la fisierul standard de iesire in timpul fiecarei iteratii. Daca iesirea standard este terminalul, driverul de terminal regleaza fluxul de date la terminal. Sirul de iesire este mai mare decat 64 de caractere , prea mare sa incapa intr-un bloc (64 de octeti lungime ) in implementarea System V. Din acest motiv, driverul de terminal are nevoie de mai mult de un bloc pentru fiecare apel sistem write si iesirea poate deveni amestecata.

char formst = "acesta este un sir de caractere de iesire pentru procesul fiu"

main()

}

}

Figura 6.14. Supraincarcarea iesirii standard cu date

De exemplu, liniile urmatoare au fost parti ale iesirii produse cand s-a rulat programul pe un calculator AT&T 3B20:

acesta este un sir obisnuit de caractere pentru procesul fiu 1

acesta este o iesire obisnuita care consta dintr-un sir obisnuit de caractere

pentru procesul fiu 0

Citirea datelor de la un terminal in modul canonic este o operatie mult mai complexa. Apelul sistem read specifica numarul de octeti pe care procesul doreste sa-l citeasca, dar disciplina de linie satisface citirea la receptionarea unui CR, chiar daca numarul caracterelor nu este satisfacut. Aceasta este o modalitate practica, pentru ca este imposibil ca un proces sa prevada cat de multe caractere va introduce utilizatorul de la tastatura si nu are sens sa astepte ca utilizatorul sa tasteze un numar mare de caractere. De exemplu, utilizatorul introduce linii de comanda shell si se asteapta ca shell-ul sa raspunda la comanda pe receptionarea unui caracter CR. Nu este nici o diferenta daca comanda este simpla, cum ar fi "date" sau "who" sau daca este o secventa de comanda mai complicata cum ar fi:

pic file *|tbl|eqn|troff - mm - Taps|apsend

Driverul de terminal si disciplina de linie nu stiu nimic despre sintaxa shell-ului, si asa este corect, deoarece alte programe care citesc de la terminale ( cum ar fi editoarele ) au sintaxe diferite pentru comenzi. Din acest motiv, disciplina de linie satisface apelul read la receptionarea unui CR.

algoritmul terminal_read

if ( tty este in modul caracter )

copiaza toate datele din lista de caractere in lista de caracter

canonica;

else /* tty este in modul canonic */

}

}

while ( sunt caractere in lista canonica si contorul de citire nu este

satisfacut)

copiaza din blocurile de caractere din lista canonica in spatiul de

adrese utilizator;

}

Figura 6.15. Algoritmul pentru citirea unui terminal

Figura 6.15 arata algoritmul pentru citirea unui terminal. Presupunem ca terminalul este in modul canonic. Sectiunea 6.3.3. va trata cazul modului caracter. Daca nu sunt date in nici o lista de intrare, procesele care citesc se pun in asteptare pana la sosirea unei linii de date. Cand datele au fost introduse, rutina de tratare a intreruperii de terminal invoca disciplina de linie "rutina de tratare a intreruperii ", care plaseaza datele in lista de caractere pentru intrarea proceselor care citesc si in lista de iesire pentru ecou la terminal. Daca sirul de intrare contine un CR, rutina de tratare a intreruperii trezeste toate procesele cititor adormite. Cand un proces cititor ruleaza, driverul scoate caracterele din lista de caractere, face procesarea caracterelor "erase" si "kill" si plaseaza caracterele in lista canonica. Apoi copiaza caracterele in spatiul de adrese utilizator pana la caracterul CR sau pana se satisface numarul de caractere care trebuiesc in apelul sistem read.

Totusi, un proces poate constata ca datele pentru care a fost trezit nu mai exista. Alte procese pot citi terminalul si scoate datele din lista de caracter inainte ca primul proces sa fie replanificat. Acest lucru este similar cu ceea ce se intampla cand mai multe procese citesc datele dintr-un pipe.

Procesarea caracterului in directiile de intrare si de iesire este asimetrica, evidentiata prin cele doua liste de intrare si numai o lista de iesire. Disciplina de linie scoate la iesire datele din spatiul utilizator, le proceseaza si le plaseaza in lista de iesire. Ca sa fie simetric, ar trebui sa fie numai o clista de intrare. Oricum, aceasta ar cere rutinei de tratare a intreruperii sa proceseze caracterele "erase" si "kill", facand-o mai complexa, consumand timp si blocand alte intreruperi intr-un moment critic.

Cu toate acestea, rutina de tratare a intreruperii pune caracterele de intrare imediat in lista de iesire.

Figura 6.16 prezinta un program unde un proces creeaza mai multe procese, care citesc fisierele lor standard de intrare, fiecare incercand sa citeasca date de la terminal. Intrarea terminalului este de obicei prea lenta pentru a satisface toate procesele care vor sa citeasca, asa ca procesele vor petrece majoritatea timpului lor asteptand in algoritmul terminal - read introducerea datelor. Cand un utilizator introduce o linie de date, rutina de tratare a intreruperii de terminal trezeste toate procesele care vor sa citeasca date; pentru ca ele au adormit pe acelasi nivel de prioritate, sunt eligibile sa ruleze la aceeasi prioritate. Utilizatorul nu poate prevedea care proces ruleaza si citeste linia de date; procesul care ruleaza va tipari valoarea lui "i " la momentul la care a inceput sa ruleze. Toate celelalte procese vor fi, eventual, replanificate sa ruleze , dar este posibil ca ele sa nu mai gaseasca date in lista de intrare si sa se puna din nou in asteptare. Intreaga procedura este repetata pentru fiecare linie de intrare.

char input [256];

main()

}

}

}

Figura 6.16. Concurenta pentru datele de intrare ale terminalului

Este inerenta ambiguitatea ce rezulta din citirea de la un terminal de catre mai multe procese, dar nucleul rezolva situatia. Pe de alta parte, nucleul trebuie sa permita mai multor procese sa citeasca un terminal, altfel procesele create de shell care citesc intrarea standard nu vor lucra niciodata .Pe scurt, procesele trebuie sa-si sincronizeze accesul la terminal la nivel utilizator .

Cand utilizatorul introduce caracterul EOF(end-of-file cu codul ASCII CTRL_D), disciplina de linie satisface citirile de la terminal, dar nu include caracterul EOF in sirul citit. Ea nu returneaza date ( returneaza valoarea 0 ) pentru apelul sistem read ce contine numai sfarsitul de fisier in liste de caractere; procesul apelant este responsabil sa recunoasca daca el a citit EOF. Referindu-ne la exemplele pentru shell din capitolul 8, bucla shell-ului se termina cand un utilizator introduce CTRL_D: apelul read returneaza 0, si shell-ulse termina.

Teminalele inteligente isi pregatesc singure intrarile in periferice, eliberand UCP-ul pentru alte sarcini.

Driverul de terminal in modul caracter

Utilizatorii seteaza parametrii terminalului, cum ar fi caracterele "erase" si "kill" si recupereaza valorile setarilor curente cu apelul sistem ioctl. Similar, ei controleaza daca terminalul afiseaza intrarea (ecoul) , seteaza rata de transfer a terminalului, golesc listele de caractere de intrare si de iesire, sau pornesc si opresc manual afisarea caracterelor de iesire. Structura de date a driverului de terminal salveaza diferite setari de control si disciplina de linie primeste parametrii apelului ioctl si seteaza sau preia campurile relevante din structura de date a terminalului. Cand un proces seteaza parametrii terminalului, el face aceasta pentru toate procesele care utilizeaza terminalul. Setarile terminalului nu sunt sterse automat cand procesul care le-a fixat se termina.

Procesele pot, de asemenea, sa seteze terminalul in modul caracter, unde disciplina de linie transmite caracterele exact cum le tasteaza utilizatorul: nu se face nici o procesare asupra lor. Totusi nucleul trebuie sa stie cand sa satisfaca apelurile read ale utilizatorului din moment ce tasta CR este tratata ca un caracter de intrare obisnuit. El satisface apelurile sistem read dupa ce un numar minim de caractere a fost introdus de la terminal sau dupa ce asteapta o perioada de timp fixata de la receptionarea unui caracter oarecare de la terminal . In ultimul caz, nucleul cronometreaza introducerea de caractere de la terminal plasandu-le in tabela callout (capitolul 9).

Ambele criterii ( numar minim de caractere si perioada de timp fixata ) sunt setate printr-un apel ioctl . Cand este intalnit un criteriu particular, rutina de tratare a intreruperii a disciplinei de linie trezeste toate procesele adormite. Driverul muta toate caracterele din lista de caractere intr-o lista de caractere canonica si satisface cererea de citire a procesului, urmand acelasi algoritm ca in cazul canonic. Modul caracter este important mai ales pentru aplicatiile orientate ecran, cum ar fi editorul vi , care are multe comenzi ce nu se termina cu caracterul CR . De exemplu, comanda dw sterge cuvantul de la pozitia curenta a cursorului.

Figura 6.17 prezinta un program care face un apel ioctl pentru salvarea setarilor terminalului pentru descriptorul de fisier 0, fisierul standard de intrare. Comanda ioctl TCGETA instruieste driverul sa obtina setarile si le salveaza in structura "savetty", in spatiul de adrese utilizator. Aceasta comanda e folosita in mod curent pentru a determina daca un fisier este un terminal sau nu, deoarece acesta (fisierul) nu schimba nimic in sistem: daca comanda da gres, procesul presupune ca nu este terminal. Aici procesul face un alt apel ioctl pentru a seta terminalul in modul caracter.

#include <signal.h>

#include <termio.h>

struct termio savetty;

main()

newtty = savetty;

newtty.c_lflag &=~CANON; /*se dezactiveaza modul canonic */

newtty.c_lflag &=~ECHO; /*se dezactiveaza ecoul */

newtty.c_cc[VMIN] = 5; /*minim 5 caractere */

newtty.c_cc[VTIME] = 10; /*interval 10 secunde */

if (ioctl(0, TCSETAF, &newtty) ==-1

for (;;)

}

sigcatch()

Figura 6.17. Modul caracter

Procesul dezactiveaza ecoul si seteaza satisfacerea citirilor de la terminal la receptionarea a cel putin 5 caractere de la terminal sau la 10 secunde de la receptionarea primului caracter. Cand procesul primeste un semnal de intrerupere, procesul reseteaza optiunile initiale ale terminalului si se termina.

Verificarea terminalelor

Este avantajos uneori sa se verifice un dispozitiv, pentru a-l citi daca exista date sau pentru a continua procesarea obisnuita in celelalte cazuri. Programul din figura 6.18 ilustreaza acest caz: prin deschiderea unui terminal cu optiunea "fara intarziere ", apelurile read urmatoare nu vor astepta daca nu exista date si programul se va termina imediat ( vezi algoritmul terminal -read, figura 6.15.). O astfel de metoda este buna daca un proces monitorizeaza mai multe dispozitive: el poate deschide fiecare dispozitiv cu optiunea "fara intarziere" si sa le verifice pe toate, asteptand o intrare de la oricare dintre ele. Totusi aceasta metoda scade puterea de procesare.

#include <fcntl.h>

main()

else /*nu sunt date de citit */

n++;

}

}

Figura 6.18.Verificarea unui terminal

Sistemul BSD are un apel sistem select care permite verificarea unui dispozitiv . Sintaxa pentru apel este:

select (nfds,rfds,wfds,efds,timeout)

unde nfds da numarul descriptorilor de fisiere selectati, rfds,wfds si efds pointeaza la mastile de bit care "selecteaza" descriptorii fisierelor deschise. Adica, bitul 1 << fd ( bitul1 deplasat la stanga cu valoarea descriptorului de fisier ) este setat daca un utilizator doreste sa selecteze acel descriptor de fisier. Timeout indica cat de mult ar trebui sa astepte apelul select, pana la sosirea datelor, de exemplu; daca datele sosesc pentru oricare din descriptorii de fisiere si valoarea timeout nu a expirat, apelul select se incheie, indicand in mastile de bit care din descriptorii de fisier au fost selectati. De exemplu, daca un utilizator a dorit sa astepte pana la receptionarea de intrari pe descriptorii de fisiere 0,1 sau 2 , rfds trebuia sa pointeze la masca de bit 7; cand apelul select se incheie, masca de bit trebuie rescrisa cu o masca care sa indice care descriptor de fisier are date pregatite. Masca de bit wfds are o functie similara pentru descriptori de fisier pentru scriere si masca efds indica cand exista conditii exceptionale pentru descriptorii de fisier particulari, folositoare in cazul retelelor.

Stabilirea unui terminal de control

Terminalul de control este terminalul pe care un utilizator se logheaza in sistem si controleaza procesele pe care utilizatorul le lanseaza de la terminal. Cand un proces deschide un terminal, driverul de terminal deschide disciplina de linie. Daca procesul este liderul de grup de procese ca rezultat al unui apel sistem setpgrp si daca procesul nu are un terminal de control asociat, disciplina de linie transforma terminalul deschis in terminal de control. Acesta memoreaza numarul minor si numarul major ale fisierului dispozitiv in zona uArea si memoreaza numarul de grup de procese al procesului care a deschis terminalul in structura de date a driverului de terminal. Procesul care a deschis terminalul este procesul de control, de obicei shell-ul.

Terminalul de control joaca un rol important in tratarea semnalelor. Cand un utilizator apasa tastele delete, break,robout sau quit, rutina de tratare a intreruperii invoca disciplina de linie care trimite semnalul corespunzator tuturor proceselor din grupul procesului de control. In mod similar, daca un utilizator intrerupe terminalul, rutina de tratare a intreruperii de terminal primeste o instiintare de intrerupere de la hardware iar disciplina de linie trimite semnalul hangup tuturor proceselor din grupul de procese. In acest fel, toate procesele initiate la un terminal particular primesc semnalul hangup; reactia implicita a celor mai multor procese este sa se termine la receptionarea semnalului. Acesta este modul in care procesele ratacite sunt terminate cand un utilizator inchide dintr-o data un terminal. Dupa trimiterea semnalului hangup, rutina de tratare a intreruperii desparte terminalul de grupul de procese astfel incat procesele din grupul de procese nu mai receptioneaza semnale de la terminal pentru mult timp.

Driverul de terminal indirect

Procesele au nevoie deseori sa citeasca sau sa scrie date direct la terminalul de control, desi intrarea si iesirea standard ar putea fi redirectate catre alte fisiere. De exemplu, un program shell poate trimite mesaje urgente direct la terminal desi fisierele standard de iesire si eroare ar putea fi redirectate altundeva. Sistemul UNIX furnizeaza acces indirect la terminal prin fisierul de dispozitiv "/dev/tty" care desemneaza terminalul de control pentru fiecare proces care are unul. Utilizatorii logati pe terminale separate pot accesa "/dev/tty", dar ei acceseaza terminale diferite.

Exista doua modalitati pentru nucleu de a gasi terminalul de control plecand de la numele fisierului "/dev/tty". In primul caz, nucleul poate defini un numar de dispozitiv special pentru fisierul de terminal indirect cu o intrare speciala in tabela de comutare a dispozitivelor de tip caracter . Cand se invoca terminalul indirect, driverul acestuia obtine numarul minor si numarul major ale terminalului din uArea si invoca driverul terminalului real prin aceeasi tabela. In al doilea caz nucleul testeaza daca numarul major este al terminalului indirect inaintea apelarii rutinei open. Daca este asa, elibereaza inodul pentru "/dev/tty", aloca inodul pentru terminalul de control, reseteaza intrarea in tabela de fisiere pentru a pointa la inodul terminalului de control si apeleaza rutina open . Descriptorul de fisier returnat la deschiderea "/dev/tty" refera direct terminalul de control si driverul lui.

Logarea in sistem

Asa cum se va arata, procesul 1, init , executa o bucla infinita citind fisierul "/etc/inittab" pentru instructiuni de intrare in sistem ( de exemplu, verificare un singur utilizator sau multi-utilizator ). In starea multi-utilizator, prima responsabilitate a procesului init este sa permita utilizatorilor logarea la terminal . El creeaza procesele numite gettty si pastreaza numarul procesului gettty care a deschis terminalul; fiecare proces gettty reseteaza numarul sau de grup folosind apelul sistem setpgrp, deschide o linie terminal si astepta pana cand simte o conectare hardware de terminal. Cand se termina apelul open, procesul gettty executa programul login care cere utilizatorilor sa se identifice prin nume si parola. Daca utilizatorul se logheaza cu succes, programul login executa in final shell-ul. Procesul shell are acelasi identificator ca procesul initial gettty si shell-ul este deci un lider de procese. Daca un utilizator nu se logheaza cu succes, procesul login se termina dupa o limita de timp potrivita, inchizand linia terminal iar init creeaza alt proces gettty pentru linie.

Init ingheata pana la receptionarea semnalului "terminare fiu" . La trezire, el afla daca procesul in starea zombie a fost shell-ul si daca da, creeaza alt proces gettty pentru a deschide terminalul in locul procesului celui care a fost suprimat.

algoritmul login

else

numara incercarile de logare, incearca din nou pana la un

punct;

}

}

Figura 6.19. Algoritmul pentru logare in sistem



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1021
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved