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
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ă ?
fprintf(stderr, "Guardian is already running\n");
Ce afișăm dacă guardianul este rulat fără parametri în linia de comandă?
fprintf(stderr, "Usage: nume_program arg1 arg2 ...\n");
Ce afisam daca guardianul nu gaseste programul copil?
fprintf(stderr, "The child program does not exist!\n");
Se pot aplica redirectări pe programul copil?
Ce se întâmplă cu intrarea standard a procesului copil?
In ce mod deschidem fisierele pentru redirectarea procesului copil?
Ce se intampla daca numele programului exista ca fisier pe disc, dar nu este executabil?
Când guardianul oprește procesul copil, trebuie să oprească și copii acestuia?
Dacă utilizatorul rulează /bin/ls, unde se fac fişierele de log? În calea din care a fost pornit guardianul sau în /bin?
Care este ordinea în care căutăm? Întâi în $PATH, sau întâi în directorul curent?
Programul care este instrumetat va moşteni variabilele de mediu?
La restart, fişierele de logare vor fi trunchiate?
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 teme.
Rezolvare
Testare
Status
Teste
GNU/Linux 6/6
Windows 6/6
Implementări terminate
Comentarii