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:
Creare un processo tramite fork.
Attendere la terminazione del processo appena creato tramite wait.
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
).