Salve a tutti. Ho un piccolo problema con un compito che non riesco a risolvere. La consegna è questa:

  1. Dato il set di numeri (21, 312312, 2412343431), per ogni numero "x", trovi il più piccolo numero primo >= x
  2. lo faccia utilizzando più processi lanciati da un processo padre che poi ne aspetterà la chiusura.

Ho creato una funzione che svolge alla perfezione il punto 1. Mi sono però bloccato al punto 2. Scrivo il pezzo di codice che ho creato:

      int pids[4];
      for (i=0; i<4; i++){
           if(( pid = fork() <0 ) ){
                // errore
            }

            if (pid == 0){
                find_primo(numeri_da_cercare[i]);
                exit(0);
            }else{
                // processo padre
                pids[i] = pid;
            }
        }

In pratica ho aperto un nuovo processo per ogni numero immesso. Il problema è nella seconda consegna del punto 2. Come faccio a far aspettare ad ogni processo padre che il figlio sia concluso? Immagino si debba usare wait o waitpid, ma non ho capito come funzionano!

chiesto 14 Feb '14, 16:29

vale_glr's gravatar image

vale_glr
20224

modificato 14 Feb '14, 17:25

rpadovani's gravatar image

rpadovani ♦♦
3.1k51351


Senza introdurre eccessive complicazioni, una variabile che conta i processi, e un corrispondente numero di attese, alla fine:

      // numero di processi
      int count = 0;

      int pids[4];
      for (i=0; i<4; i++){

           // incrementa il numero di processi
           count++;

           if(( pid = fork() <0 ) ){
                // errore
            }

            if (pid == 0){
                find_primo(numeri_da_cercare[i]);
                exit(0);
            }else{
                // processo padre
                pids[i] = pid;
            }
        }

        // attesa della terminazione dei processi
        while (count-- > 0)
            wait(0);
coll. permanente

ha risposto 14 Feb '14, 23:59

enzotib's gravatar image

enzotib ♦♦
14.0k112186

grazie per la risposta, ma non funziona... Credo di aver sbagliato io qualcosa nel codice: infatti quando lancio il programma si blocca e non fa partire la funzione find_primo. Secondo te ho sbagliato qualcosa nel pezzo del processo figlio?

(16 Feb '14, 16:43) vale_glr vale_glr's gravatar image

@vale_gr: riesci a capire dove si blocca? forse sulla wait? per quanto figuarda la funzione find_primo non saprei dirti, dato che non l'hai riportata

(16 Feb '14, 20:10) enzotib ♦♦ enzotib's gravatar image

@enzotib: Per fare una prova ho tolto la funzione find_primo e al suo posto ho aggiunto:

printf("Sono il figlio numero %d\n", count);

Quando faccio partire il programma mi stampa a video:

Sono il figlio numero 1

valerio@VM:/~programmi/processi$ Sono il figlio numero 1

e si blocca

(17 Feb '14, 11:17) vale_glr vale_glr's gravatar image

Nessuna idea?

(21 Feb '14, 18:10) vale_glr vale_glr's gravatar image

@vale_glr: ho individuato un errore nella riga
if ((pid = fork() < 0)) {
che dev'essere invece
if ((pid = fork()) < 0) {

(21 Feb '14, 23:00) enzotib ♦♦ enzotib's gravatar image

Ottimo grazie mille! Non pensavo fosse un semplice errore di scrittura! Grazie ancora!

(24 Feb '14, 15:53) vale_glr vale_glr's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×103
×22

domanda posta: 14 Feb '14, 16:29

domanda visualizzata: 1,248 volte

ultimo aggiornamento: 24 Feb '14, 15:53

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.