Scrivere un programma in C che crea 10 figli con la fork(), ogni figlio aspetta 5 secondi e termina la propria esecuzione, il padre invece deve aspettare che tutti i processi figli terminino e termina a sua volta.
Soluzione:
Richiami:
fork() :
questa funzione crea un processo figlio, identico al processo chiamante, nel senso che a partire dal momento i cui viene chiamato, sia il processo figlio che il processo padre (chiamante ) condividono lo stesso codice e si eseguono in parallelo. La fork(), restituisce zero al figlio e il PID del figlio lo restituisce al padre
PID:
Process ID, numero identificativo di ogni processo in esecuzione.
sleep(secondi):
Mette il processo chiamante in attesa del tempo pari a l'argomento in secondi.
wait():
blocca l'esecuzione il processo chiamante fino a quando tutti i figli hanno terminato la loro esecuzione.
exit():
Forza la terminazione del processo chiamante
getpid():
questa funzione estrae il PID del processo che l'ha chiamato.
La strategia é quella di creare un ciclo for, e, a ogni giro creare un processo figlio e farlo terminare prima di andare al giro successivo, altrimenti si creerebbero (2^N)-1. dopodiché fare una wait affinché in padre aspetta che il figlio corrente termini prima che il flusso di esecuzione della for, vada al giro seguente.
la soluzione é dato da questo listato:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define N 10
int main ()
{
int pid, i;
for(i = 0; i < N; i++)
{
if ((pid = fork()) == 0) /* i-esimo processo figlio*/
{
printf("Step %d: my pid is: %d\n", i, getpid());
sleep(5);
exit(0);
}
else /* processo padre */
{
wait();
}
}/*end for*/
}
L'output é il seguente:
Step 0: my pid is: 7220
Step 1: my pid is: 7236
Step 2: my pid is: 7252
Step 3: my pid is: 7265
Step 4: my pid is: 7281
Step 5: my pid is: 7297
Step 6: my pid is: 7313
Step 7: my pid is: 7329
Step 8: my pid is: 7345
Step 9: my pid is: 7361
Esercizio 2:
modificare il listato 1 in mode che il processo padre termina dopo la creazione del secondo figlio.
Nessun commento:
Posta un commento