1) N processi inizializzano un generatore pseudo casuale con il proprio PID. Successivamente, per K volte inviano un ITEM al processo N+1 utilizzando una pipe con nome, dopo aver atteso un tempo casuale compreso fra 0 e getpid()%10 secondi. Quest'ultimo processo stampa gli ITEM ricevuti insieme al tempo di arrivo (wall clock time). La pipe utilizzata per la comunicazione viene creata dal primo processo che la utilizza e distrutta dal processo N+1 dopo che ha ricevuto K*N ITEM. Il tipo item é definito da: typedef struct { int i; } ITEM; 2) La sincronizzazione a barriera blocca il chiamante fino a quando tutti gli altri processi hanno chiamato la stessa primitiva. Si realizzi una implementazione della sincronizzazione a barriera in termini di segnali e pipe e se ne dia un esempio di applicazione per N processi. 3) Si implementi un programma C che, utilizzando le primitive del sistema Unix, mandi “contemporaneamente” in esecuzione tutti gli eseguibili prog_i passati come parametri sulla linea di comando e che consenta all'utente di provocare la terminazione forzata dell'esecuzione di un particolare prog_i specificato interattivamente (ad esempio intercettando e chiedendo il numero del processo da terminare).