CODICE SORGENTE
#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;
}
|