Raga ho provato a creare un piccolo programmino che attivi un figlio che a sua volta ne attivi un altro gestendo le rispettive terminazioni. Ecco il codice:
Nel momento in cui lo lancio ho un problema in quanto le variabili child1 e child2 non contengono l'effettivo PID del processo a cui fanno riferimento e quindi non posso gestire in maniera corretta la terminazione dei due figli.codice:#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <iostream> using namespace std; int main() { pid_t pid, child1, child2; int parent, status1, status2, ret1, ret2; pid = fork(); if(pid==0) { child1 = getpid(); cout << "(child1) PID->" << getpid() << "\t parent PID->" << getppid() << endl; cout << "(child1) Creo un nuovo processo" << endl; pid = fork(); if(pid==0) { child2 = getpid(); cout << "(child2) PID->" << getpid() << "\t parent PID->" << getppid() << endl; cout << "(child2) Mi metto a fare qualcosa prima di terminare" << endl; for(int i=0; i<2; i++) { system("sleep 1"); cout << "(child2)..." << endl; } exit(0); cout << "(child2) Processo Terminato" << endl; } else { cout << "(child1) Attendo terminazione processo child2" << endl; cout << "(child1) Mi metto a fare qualcosa prima di terminare" << endl; for(int j=0; j<2; j++) { system("sleep 1"); cout << "(child1)..." << endl; } ret1 = waitpid(child2,&status2,0); cout << "(child1) Mio figlio è terminato e ora " << "posso terminare anche io" << endl; exit(0); } } else { cout << "(parent) PID->" << getpid() << endl; cout << "(parent) Attendo terminazione processo child1" << endl; ret2 = waitpid(child1, &status1, 0); cout << "(parent) Mio figlio è terminato e ora " << "posso terminare anche io" << endl; cout << "child1:" << child1 << endl; cout << "child2:" << child2 << endl; exit(0); } return 0; }
Questa è l'uscita a terminale:
Qualcuno mi aiuta a capire questa cosa? Sto uscnedo pazzo :Scodice:(child1) PID->8129 parent PID->8128 (child1) Creo un nuovo processo (parent) PID->8128 (parent) Attendo terminazione processo child1 (parent) Mio figlio è terminato e ora posso terminare anche io child1:11026 child2:-1202902016 xxx@xxx-desktop:~/SCalls$ (child2) PID->8130 parent PID->8129 (child2) Mi metto a fare qualcosa prima di terminare (child1) Attendo terminazione processo child2 (child1) Mi metto a fare qualcosa prima di terminare (child1)... (child2)... (child1)... (child1) Mio figlio è terminato e ora posso terminare anche io (child2)...

Rispondi quotando