[C++] Processo padre che crea 2 figli

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
alukard990
Prode Principiante
Messaggi: 187
Iscrizione: venerdì 14 febbraio 2014, 16:03
Desktop: Mate
Distribuzione: 20.04, 64bit

[C++] Processo padre che crea 2 figli

Messaggio 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.
Ultima modifica di alukard990 il sabato 10 maggio 2014, 13:05, modificato 1 volta in totale.
alukard990
Prode Principiante
Messaggi: 187
Iscrizione: venerdì 14 febbraio 2014, 16:03
Desktop: Mate
Distribuzione: 20.04, 64bit

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

Messaggio da alukard990 »

up
DavideDaSerra
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: domenica 15 febbraio 2009, 15:26
Desktop: xubuntu
Distribuzione: Ubuntu12.10 x86_64
Località: Da qualche parte in quel di Modena

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

Messaggio 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
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti