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