This is an old revision of the document!
Tema Asistenți - Guardian process
Tema va fi rezolvată exclusiv de asistenți.
Scopul temei
Să ofere răspunsuri la următoarele întrebări
Care este nivelul așteptat al soluțiilor temelor?
Cum arată o temă de 100p la SO?
Enunț
Să se implementeze un Guardian Process simplu, care oferă suport pentru pornirea, repornirea și oprirea unui proces. Aplicația se va asigura că o singură instanță a sa rulează la un moment dat. Output-ul generat de programul copil va fi salvat în două fișiere, pentru ieșirea standard și ieșirea standard de eroare.
Un proces guardian are rolul de repornire a unui proces/serviciu în momentul în care acesta își încheie brusc execuția. Când procesul copil moare, guardianul va trebui automat să-l repornească cu argumentele lansării anterioare.
Precizări generale
Programul se rulează astfel
Guardianul va salva ieșirile procesului protejat, nume_program, în ./nume_program.stdout și ./nume_program.stderr
./guardian ls
O singură instanță de guardian poate rula, la un moment dat, pe un sistem
Interacțiunea utilizatorului cu aplicația se va face cu semnale, pe GNU/Linux, și evenimente, pe Windows
Operația de repornire constă în oprirea și pornirea procesului copil, cu argumentele anterioare
Oprirea constă în terminarea, posibil bruscă, a execuției programului copil
Pentru oprire se poate trimite orice semnal de genul: SIGSTOP, SIGTERM sau SIGKILL
man 7 signal: “The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.”
Precizări GNU/Linux
Rulează sub forma de daemon
Guardian Process-ul va intercepta următoarele semnale
SIGCONT - repornește procesul copil
SIGINT - oprește procesul copil și se închide
Restul semnalelor se pot ignora
Dacă ignorați SIGCHLD atunci s-ar putea să nu știți când copilul reusește să execute comanda și când nu
Pentru a simplifica implementarea, puteți presupune că procesul copil nu va ieși decât cu codul 0
Precizări Windows
*Poate rula sub formă de serviciu Windows
(nu este obligatoriu)
* Windows Service este un concept ce ține de Windows programming, nu de OS programming
Guardian Process-ul va intercepta următoarele evenimente
* CTRL_BREAK_EVENT - repornește procesul copil
* CTRL_C_EVENT - oprește procesul copil și se închide
* Restul evenimentelor se pot ignora
===== Întrebări =====
- Ce afișăm dacă un guardian deja rulează ?<code>
fprintf(stderr, “Guardian is already running\n”);
</code>
- Ce afișăm dacă guardianul este rulat fără parametri în linia de comandă?<code>
fprintf(stderr, “Usage: nume_program arg1 arg2 …\n”);
</code>
- Ce afisam daca guardianul nu gaseste programul copil?<code>
fprintf(stderr, “The child program does not exist!\n”);
</code>
- Se pot aplica redirectări pe programul copil?
* Nu. Redirectările (>, 2> , &>) sunt ilegale
- Ce se întâmplă cu intrarea standard a procesului copil?
* Se redirectează din /dev/null
- In ce mod deschidem fisierele pentru redirectarea procesului copil?
* In modul append
- Ce se intampla daca numele programului exista ca fisier pe disc, dar nu este executabil?
* Daca apelul functiei din familia exec va esua, atunci raportati ca nu exista fisierul respectiv
- Când guardianul oprește procesul copil, trebuie să oprească și copii acestuia?
* Nu. Procesul copil nu va face spawn la alți copii
- Dacă utilizatorul rulează /bin/ls, unde se fac fişierele de log? În calea din care a fost pornit guardianul sau în /bin?
* În calea din care a fost pornit guardianul
- Care este ordinea în care căutăm? Întâi în $PATH, sau întâi în directorul curent?
* Ordinea în care guardianul se “uită” este stabilită de variabila $PATH; directorul curent se adaugă la sfârșitul șirului de directoare din $PATH
- Programul care este instrumetat va moşteni variabilele de mediu?
* Da, va moșteni variabilele de mediu
- La restart, fişierele de logare vor fi trunchiate?
* Nu. Se vor deschide cu append; checkerul va șterge fișierele stdout și stderr dintr-o sesiune
- Este recomandat să nu tratăm SIGSEGV și alte semnale?
* NU**, într-o aplicație reală aceste semnale trebuiesc tratate pentru că reprezintă o modalitate simplă de reparare a erorilor din codul vostru. Scopul temei nu este să ajungă o aplicație reală, ci una ușor de înțeles și care poate fi luată drept model de rezolvare pentru temele de casă
Rezolvare
Testare
Status
Teste
GNU/Linux 6/6
Windows 6/6
Implementări terminate
Comentarii