Ciao, per iniziare meglio spiegare il comportamento preciso della fork():
quando questa funzione viene chiamata crea un nuovo processo clonando quello che l'ha richiamata, il che significa che crea una copia esatta del processo chiamante (comprese variabili, stack, descrittori dei file, ecc...); al processo chiamante, che diventa il padre del nuovo processo la fork() ritorna il pid del processo figlio, mantre al figlio ritorna zero.
Ora vediamo il tuo programma:
l'erroreche hai commesso è quello di non considerare che la fork() duplica tutte la variabili del processo padre nel filgio e che i due processi non condividono la variabili.
#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();
// D'ora in avanti tutte le var. sono state duplicate nel processo filgio
if(pid==0)
{
// Questo codice viene eseguito solo dal figlio
child1 = getpid(); // Questa var. child1 è diversa dalla var. child1 del padre
cout << "(child1) PID->" << getpid()
<< "\t parent PID->" << getppid() << endl;
cout << "(child1) Creo un nuovo processo" << endl;
pid = fork();
if(pid==0)
{
// Questo codice viene eseguito solo dal figlio
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
{
// Codice eseguito dal padre, la var. pid contiene il PID del figlio
child2=pid;
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
{
// Codice eseguito dal padre, la var. pid contiene il PID del figlio
child1=pid;
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; // Var. child2 non inizializzata
exit(0);
}
return 0;
}
Così modificato dovrebbe funzionare. Ciao.