Citiți dezvoltarea aplicațiilor online în mediul Linux

Când liderul sesiunii (shell-ul) este terminat, grupurile sale de proces se află într-o situație dificilă. În cazul în care aceștia sunt activi, aceștia nu pot utiliza fluxurile stdin și stdout standard.





deoarece terminalul este închis. Dacă acestea sunt oprite, probabil nu va fi niciodată repornit, aceasta nu deoarece utilizatorul terminalului posibilitatea de a le reporni, în afară de faptul că nu poate fi pornit, de asemenea, înseamnă că acestea nu pot fi întrerupte.







În această situație, fiecare astfel de grup de procese devine numele unui hanging (orfan). Standardul POSIX definește ca un grup de proces, al cărui părinte este, de asemenea, un membru al acestui grup sau nu este membru al acestei sesiuni de grup. Cu alte cuvinte, grupul de proces nu este atârnat până când nu are un proces părinte aparținând aceleiași sesiuni, ci unui alt grup.

Deși ambele definiții par complicate, conceptul este destul de simplu. Dacă grupul de proces este suspendat și nu există nici un proces care să-l forțeze să reia, atunci acest grup devine agățat [33].

Când shell-ul de comandă iese, toate procesele copilului său devin copii ai procesului de inițiere, rămânând în sesiunile lor inițiale. Presupunând că toate programele din sesiune sunt descendenții coajelor, toate grupurile de procese din această sesiune se agață [34]. Când un grup de procese se transformă într-un grup suspendat, fiecare proces din acest grup primește un semnal SIGHUP. care de obicei întrerupe programul.

Programe care nu sunt întrerupte de semnalul SIGHUP. primiți un semnal SIGCONT. care continuă executarea proceselor suspendate. O astfel de secvență întrerupe majoritatea proceselor și oferă angajaților rămași posibilitatea de a lucra (adică asigură că nu vor fi în stare de suspendare) [35].

Odata ce procesul este agățat, acesta este deconectat de forța de la terminalul său de control (care permite unui utilizator nou să utilizeze terminalul, dacă este necesar). Dacă programele care rulează încearcă să acceseze terminalul, aceste încercări generează erori care stabilesc eroare la EIO. Procesele rămân în aceeași sesiune și ID-ul sesiunii nu este utilizat pentru identificatorii de procese noi până când toate procesele din sesiune sunt terminate.

10.7. Introducere în ladsh

Pentru a ilustra ideile discutate în cartea noastră, în secțiunile următoare ale cărții vom dezvolta un subset al shell-ului Unix. În cele din urmă, shell-ul nostru va sprijini următoarele.

• Comenzi simple încorporate.

• Porniți comenzile externe.

• Redirectarea I / O (>. | Și așa mai departe).

Textul complet sursă al versiunii finale a acestei coajă, ladsh4.s. este prezentată în Anexa B. Pe măsură ce noi instrumente sunt adăugate la ladsh, modificările textului sursă sunt descrise în textul cărții. Pentru a reduce numărul de modificări pe care le facem între versiuni, unele versiuni anterioare sunt oarecum mai complexe decât ar fi necesar. Aceste mici complicații, cu toate acestea, mai departe în carte simplifica dezvoltarea de coajă, deci fiți răbdători. Doar pentru moment, cred că aceste fragmente de cod sunt necesare; toate acestea vor fi explicate mai târziu.

10.7.1. Executarea programelor externe folosind ladsh

Aici este prima (și cea mai simplă) versiune a lui ladsh. numit ladsh1.

3: #include

4: #include

5: #include

6: #include

7: #include

8: #include

9: #include

10: #include

11: #include

12: #include

14: #define MAX_COMMAND_LEN 250 / * lungimea maximă a unei persoane

15: linia de comandă * /

16: #define JOB_STATUS_FORMAT "[.]% - 22s% .40s \ n"

18: struct jobSet

19: struct job * cap; / * titlul listei sarcinilor care rulează * /

20: struct job * fg; / * lucrare curentă în prim plan * /

23: struct childprogram

24: pid_t Pid; / * 0 la ieșire * /

25: char ** argv; / * nume de program cu argumente * /

29: id job int; / * numărul sarcinii * /

30: int numProgs; / * numărul total de programe în sarcină * /

31: int runningProgs; / * numărul de programe care rulează * /

32: char * text; / * job name * /

33: char * cmdBuf; / * tampon de diferite argv * /

34: pid_t pgrp; / * ID-ul grupului de activități proces * /

35: Structura copiluluiProgram * progs; / * array de programe în sarcina * /

36: struct job * următor; / * pentru urmărirea programelor de fundal * /

39: void freeJob (struct job * cmd)

42: pentru (i = 0; inumProgs; i ++)

43: liber (cmd-> progs [i] .argv);

Dar, poate, nu imediat. Este posibil să existe un grup de proces care conține procese ale căror părinți aparțin unui alt grup în aceeași sesiune. Având în vedere că relația „copil-părinte“ între procesele de a forma un copac, uneori, se poate întâmpla ca exista un grup de procese, care conține doar acele procese ale căror mamă este o cochilie, iar atunci când acest grup de procese este terminată, celălalt devine o marionetă.

Discuția va deveni mai clară după ce ați citit capitolele privind semnalele (capitolul 12) și gestionarea sarcinilor (capitolul 15).







Articole similare

Trimiteți-le prietenilor: