Processo figlio usa argc e argv, se argc==2 in argv[1] c’è il nome del figlio, se argc==1 il nome del figlio è anonymous.
Ogni figlio durante la giornata fa ciclicamente ed in modo casuale, per un tempo random, queste azioni:
• mangia (1)
• gioca (2)
• piange (3)
quando inizia un'azione la visualizza a video insieme al proprio nome ed al proprio pid.
Per generare l'azione in modo casuale usare la funzione rand e generare un valore compreso tra 1 e 3.
Per generare il tempo casuale della durata dell'azione usare la funzione rand e generare un valore compreso tra 5 e 10. Usare poi la funzione sleep per sospendere il processo per il tempo generato.
(Ricordarsi di inizializzare il generatore di numeri casuali con la funzione srand(time(NULL));) Se un figlio riceve il segnale SIGUSR2 scrive a video il messaggio “--Nome-- Mi hanno detto di dormire!!!.”. e dopo aver dormito 5 secondi scrive “--Nome-- Ho dormito...”
N.B.: Il processo figlio può essere testato anche da solo mandandolo in esecuzione da terminale, usando il comando ./figlio pippo , provare poi il comando kill –USR2 pidfiglio.
--- Processo mamma è in ciclo infinito, definisce un vettore globale con 4 nomi dei suoi possibili figli ed un contatore globale del numero dei propri figli.
Quando riceve il segnale SIGUSR1 genera un figlio, che esegue il programma figlio, passando come argomento uno dei nomi che ha scelto, e salva il pid del figlio in un vettore globale di pid (incrementando il contatore dei figli).
Ogni mamma può generare fino a 4 figli (ignora il segnale SIGUSR1 quando il contatore dei filgli è arrivato a 4).
Ogni 60 secondi manda un segnale SIGUSR2 ai figli per dire che devono dormire.
Ricordarsi di installare l’handler del segnale SIGCHLD che esegua la wait() (attesa non bloccante della terminazione di un processo figlio).
Per inviare il segnale SIGUSR1 al processo mamma, da terminale, usare il comando kill -USR1 pidmamma