Pagina 1 di 1

[C++] Processo padre che crea 2 figli

Inviato: venerdì 9 maggio 2014, 10:50
da alukard990
Quello che segue è un codice dove 2 processi figli si riferiscono allo stesso padre.

Codice: Seleziona tutto

#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

using namespace std;

int main()
{
 pid_t pid;
 int i=0,st;

 for(i=0;i<2;i++)
 {
  try
  {
    pid=fork();
  }
  catch(pid_t err)
  {
   if(err==-1)
    cout<<"Fork fallita!"<<endl;
    exit(-1);
  }
  if(pid > 0)
   {
    cout<<"Sono il processo padre con pid "<<getpid()<<endl;
    cout<<"Pid di mio padre "<<getppid()<<endl;
    wait(&st);
    cout<<"Mio figlio ha terminato l'esecuzione con stato "<<st<<endl; 
   }
  else
  {
   cout<<"Sono il processo figlio con pid "<<getpid()<<endl;
   cout<<"Pid di mio padre "<<getppid()<<endl;
   exit(0);  
  }
 }
 return 0;
}
Lo so che il tutto avviene tramite la chiamata di sistema "fork", ma quello che non riesco a capire è che se nel codice del figlio inserisco

Codice: Seleziona tutto

exit(0) 
i 2 figli si riferiscono allo stesso padre, mentre se non vi è quella funzione ad ogni fork vengono creati un processo padre col proprio figlio cosa alquanto ragionevole.

Re: [C++] Processo padre che crea 2 figli

Inviato: sabato 10 maggio 2014, 9:44
da alukard990
up

Re: [C++] Processo padre che crea 2 figli

Inviato: sabato 10 maggio 2014, 15:52
da DavideDaSerra
perché padre e figlio condividono le stesse istruzioni, pertanto se nel figlio non metti una exit() torni al for che crea un nuovo figlio e così fino a esaurire le risorse. Per questo genere di esercizi il consiglio è di fare nelsorgente una funzione figlio separata da finire con una return e quando chiami la funzione nel figlio di fare una cosa del tipo

Codice: Seleziona tutto

int figlio(int parametro1){
// qui codice figlio
return 0;
}

int main (int argc, char **argv){
....
while(condizione){
...
pid=fork()
if(pid>0)exit(figlio(parametro1));
if(pid<0) exit(-1);

}
//di qui in giù padre
...
exit(0);
}
così hai sempre l'exit value (reperibile all'occorrenza con una wait()) e da non rischiare cicli infiniti