Programma per creare processi con fork()

Se avete dubbi o domande sulla programmazione in generale, fatele qui
Rispondi
EdgarVillier
Newbie
Messaggi: 1
Iscritto il: 27 dicembre 2009, 23:53

Messaggio da EdgarVillier » 28 dicembre 2009, 0:43

Ho trovato questo esempio sulla creazione di un processo con fork(), ma non capisco come faccia a stampare tutti i processi dal padre a tutti i figli con un solo if ed else, non dovrebbe stapare solo il padre e l'ultimo figlio(quello con PID 0) ???? Non dovrebbe servire un ciclo for o while????

Il codice è il seguente :

#include <stdio.h> /* printf() */
#include <unistd.h> /* fork(), getpid() */
#include <stdlib.h> /* malloc(), exit() */
#include <sys/types.h> /* pid_t */
#include <sys/wait.h> /* wait() */

int main(int argc, char *argv[]) {
int n, c1, res;
pid_t *figli, corrente;

/*
* Chiediamo all'utente quanti processi
* vuole forkare.
*/
printf("Quanti processi vuoi creare? ");
scanf("%d", &n);

/*
* Allochiamo dinamicamente lo spazio necessario
* per contenere gli ID dei processi che creeremo
*/
figli = malloc(sizeof(int)*n);

/*
* Forkiamo n volte nel processo padre e facciamo
* terminare il ciclo subito se si tratta del figlio
* (ovvero se il risultato dell'ultima fork e' 0)
*/
for(c1=0;c1<n && (c1==0 || figli[c1-1]!=0);c1++)
figli[c1] = fork();

/*
* Prendiamo l'ID del processo corrente
*/
corrente = getpid();
if(figli[c1-1]!=0) {
/*
* Il padre attende la terminazione dei figli
*/
printf("Padre (%d) - Attendo la terminazione di tutti i figli.n", corrente);
wait(&res);
printf("Padre (%d) - Tutti i figli sono terminati.n", corrente);
} else {
/*
* I figli stampano un messaggio notificando la
* propria esecuzione
*/
printf("Figlio (%d) - Sono in esecuzione.n", corrente);
/*
* Il figlio termina con esito positivo
*/
exit(0);
}

return 0;
}

Gothiko
Novello Arciere
Messaggi: 36
Iscritto il: 20 novembre 2009, 17:28

Messaggio da Gothiko » 30 gennaio 2010, 14:38

quando avviene una fork il programma si "scinde" ovvero nel momento in cui viene eseguita una fork dal proc padre si crea un processo figlio tale e quale al generatore(istruzioni variabili e tutto)..
generando n fork quindi si avranno n processi figli dove ognuno eseguirà il proprio codice (nel tuo caso un printf)... lo std output del tuo codice va tutto sullo stesso terminale ed è il medesimo effetto che si ottiene iterando un printf su un unico processo ma in realtà non è cosi per i motivi suddetti....sono tanti processi che scrivono tutti la stessa cosa su un terminale :D spero di esserti stato di aiuto...
Immagine
Immagine
Immagine
Immagine

Rispondi