08/04/16

[C] Esercizio svolto: Uso delle funzioni sleep(), fork(), wait(), perror().

Esercizio 1:
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