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:
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;
}
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.
Questa è l'uscita a terminale:
codice:
(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)...
Qualcuno mi aiuta a capire questa cosa? Sto uscnedo pazzo :S