Creare più processi figli

di Anonimizzato12372 il
30 risposte

30 Risposte - Pagina 2

  • Mettendo il wait fuori dal for quindi anche fuori dal processo padre logicamente fa eseguire prima il padre lo fa finire e poi tocca al figlio e fa cosi per ogni figlio che creo
    la sintassi pià corretta mi sembra questa
    
    for(i=0:i<numfigli;i++){
    fork pid[i];
    if(pid [i]==0){
    
    exit(0)
    }
    else{
    wait(&status);
    }
    
    il problema credo che deve stare nella pipe
  • mettendo il wait fuori dal for quindi anche fuori dal processo padre
    Perchè dovrebbe essere fuori anche dal processo padre?
    Prova a vedere se questo può aiutarti vengono generati 10 processi figli tutti dentro un for poi finito il for di creazione viene richiamata (dal processo padre!) la wait(), una per ciascun figlio.
  • Nell 'esempio che mi hai dato vedi che chiude l'else del padre
    
     } else { // pid <> 0 -> padre (il pid e' quello del figlio)
          printf("Ho generato il figlio %d con pid %d\n",i+1,pid);
        }
      }
    
      // Attende che dieci processi terminino
      for(i=0;i<NUMP;i++)
      {
      int status;
        wait(&status);		// Attende termine di un figlio (uno qualunque)
        printf("Terminato processo %d\n",WEXITSTATUS(status));
      }
    }
    
  • che chiude l'else del padre
    sì ma ragazzo mio, il padre poi va avanti, non fa come il figlio che termina; quindi vengono subito eseguiti altri cicli e vengono creati altri figli e alla fine del for va ad aspettare ciascun figlio con wait()
  • Ah si giusto quell'exit che ho messo! adesso però si blocca lo stesso e credo che l'errore stia nella pipe.
    Però scusami c'è un altra cosa che non mi è chiara.Se metto il wait fuori dall'else del padre mi fa tutto il processo del padre senza aspettare il figlio, e non è quello che voglio io
  • Però scusami c'è un altra cosa che non mi è chiara.Se metto il wait fuori dall'else del padre mi fa tutto il processo del padre senza aspettare il figlio, e non è quello che voglio io
    Che senso ha un padre che fa un figlio e lo aspetta? Tanto vale che faccia direttamente lui il lavoro! Un processo "proletario" fa i figli perchè questi svolgano autonomamente un compito.
    Ma a cosa ti serve la pipe?
  • Se io voglo far scrivere qlks al figlio e il padre lo deve leggere devo per forza aspettare che il figlio scriva no?
  • se io voglo far scrivere qlks al figlio e il padre lo deve leggere devo per forza aspettare che il figlio scriva no?
    Le pipe dovrebbero lavorare in maniera non bloccante tramite un buffer interno e quindi teoricamente al figlio dovrebbe bastare scrivere e poi il padre dovrebbe poter leggere tranquillamente tutti i risultati assieme.
    Cioè, crei una pipe per ciascun processo figlio che creerai; ciascun processo figlio scrive nella relativa pipe quel che ha da scrivere; alla fine il padre legge da tutte le pipe e aspetta che i processi terminino con wait().
  • E come faccio a dire a un figlio tu usa questa pipe e ad un altro usa quest'altra pipe?
  • Ciascuno ha il suo indice (il for a qualcosa servirà )
  • Certo che mi perdo in un niente XD grazie tante per l'aiuto che mi stai dando comunque basterebbe fare un controllo sulla i giusto?
  • Sì, secondo me la cosa più semplice (che poi puoi eventualmente evolvere) è di avere due pipe
    int pipe_0[2];
    int pipe_1[2];
    e nel for, in corrispondenza del processo figlio (copio da http://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html)
    if(i==0)
    {
        close(pipe_0[0]);                       /* Read end is unused */
        write(pipe_0[1], "Hello world 0\n", 14);  /* Write data on pipe */
        close(pipe_0[1]);                       /* EOF */
        exit(EXIT_SUCCESS);
    }
    else
    {
        close(pipe_1[0]);                       /* Read end is unused */
        write(pipe_1[1], "Hello world 1\n", 14);  /* Write data on pipe */
        close(pipe_1[1]);                       /* EOF */
        exit(EXIT_SUCCESS);
    }
    
  • Ho provato a fare con due pipe ma si blocca lo stesso ! mannaccia non riesco proprio a venirne a capo
  • Fai cose semplici.
    Parti da un esempio con un solo processo figlio che scrive "Hello world" e il padre che legge quel che gli ha scritto il figlio.
    Poi ci aggiungi il secondo figlio e vedi cosa succede. Buon lavoro
  • Va bene grazie per tutto! ti terrò aggiornato
    avevo dimenticato di chiudere la pipe! adesso mi da un errore "bad file descriptor" continua la mia analisi XD
Devi accedere o registrarti per scrivere nel forum
30 risposte