FEW - Fork-Exit-Wait

 1#include <unistd.h>
 2#include <stdio.h>
 3#include <stdlib.h>
 4#include <sys/wait.h>
 5
 6int main(){
 7    int res, status;
 8    printf("I'm a process and I'm going to create a child\n");
 9    res = fork();
10    if(res < 0) printf("I cannot create a child");
11    else if(res == 0){
12        sleep(5);
13        printf("I'm the child!\n");
14        exit(1);
15    }
16    else{
17        printf("I'm now a parent and I'll wait for my child to die...\n");
18        wait(&status);
19        printf("My child has invoked exit(%d)\n", WEXITSTATUS(status));
20        printf("My child is dead, so it's my time to die\n");
21    }
22    exit(0);
23}

Fork-Exit-Wait (FEW ) è un semplice programma C per:

  1. Creare un processo tramite fork.

  2. Attendere la terminazione del processo appena creato tramite wait.

  3. Terminare il processo corrente utilizzando exit.

Il main thread esegue la stampa di riga 8 e successivamente invoca la fork per creare un processo child.

8    printf("I'm a process and I'm going to create a child\n");
9    res = fork();

Se la fork fallisce (res == -1), il processo principale termina. Altrimenti, entrambi i processi eseguono a partire dalla terminazione della fork.

Per differenziare il flusso di esecuzione tra il processo parent ed il processo child occorre analizzare il risultato della fork. Il processo child legge res == 0, mentre il processo parent res != 0 (più precisamente res contiene il pid del processo child). A questo punto il child esegue:

12        sleep(5);
13        printf("I'm the child!\n");
14        exit(1);

ossia va in stato di sleep per 5 secondi, esegue una stampa e termina con codice di terminazione 1 invocando la syscall exit.

Il parent esegue:

17        printf("I'm now a parent and I'll wait for my child to die...\n");
18        wait(&status);
19        printf("My child has invoked exit(%d)\n", WEXITSTATUS(status));
20        printf("My child is dead, so it's my time to die\n");

Nello specifico attende la terminazione di uno generico thread child tramite la system call wait. Grazie a questa chiamata, può inoltre ottenere il codice di terminazione dalla variabile status grazie alla macro WEXITSTATUS (il codice è memorizzato nel secondo byte di status).

Riferimenti