Fork Join in linguaggio C

Di seguito si mostra un esempio del costrutto Fork Join utilizzando le funzioni fork() e wait() del linguaggio C. In particolare sia il processo padre che il processo figlio eseguiranno in parallelo dei calcoli ed in fine il processo padre sommerà i risultati dei calcoli paralleli.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int potenza(int n, int e){
	int k=n;
	int i;
	printf("1.1 elab. parallela processo figlio\n");
	for(i=1;i<e;i++) k=k*n;
	return k;
}

int fattoriale(int n){
	int k=n;
	int i;
	printf("1 elab. parallela processo del padre\n");
	for(i=n-1;i>0;i--) k=k*i;
	return k;
}

int somma(int a, int b){
	int k;
	printf("2 elab. finale padre \n");
	k=(a+b);
	return k;
}

int main(){
	int x, y, z, retv;
	pid_t pid;
	pid=fork();				//inizio elaborazione parallela
	if(pid == 0){
		x=potenza(3,3);		//esecuzione parallela calcoli figlio
		exit(x);			//termina processo figlio
	}
	else{
		y=fattoriale(4);	//esecuzione parallela calcoli padre
	}
	printf(".. join: padre aspetta \n");
	wait(&retv);			//join: il padre aspetta il figlio
	x = WEXITSTATUS(retv);	//prende il risultato del figlio
	z = somma(x,y);			//esegue gli ultimi calcoli
	printf("-> risultato finale z = %d \n", z);
}