//compito del 29 novembre 2006 // // /* Si realizzi in ambiente Unix/C la seguente interazione tra processi: - un processo determina il proprio pid P e procede a generare processi figli fintanto che il pid di un figlio Pf assume il valore maggiore o uguale del pid del padre P maggiorato di 5 (cioe' Pf >= P+5). Discutere in quali situazioni il pid di un figlio e' maggiore del pid del padre. - Ogni processo figlio cosi' generato visualizza il proprio pid; - il processo figlio con pid minore invia un segnale a tutti gli altri processi figli e poi termina visualizzando un messaggio di terminazione; - gli altri figli non appena ricevono il segnale visualizzano un messaggio e terminano; - il padre termina dopo che sono terminati tutti i figli. Utilizzo la gestione affabile dei segnali. */ #include #include #include #include #define NUMMAXFIGLI 255 int ppid ; void sig_handler(int signo) { printf("figlio %d: ricevuto il segnale %d\n", getpid(), signo); } int main() { int i,j, pidm, nfigli, minpid; struct sigaction act; int tabpid[NUMMAXFIGLI] ; sigset_t set, zeromask; sigemptyset(&zeromask); sigemptyset(&act.sa_mask); act.sa_handler = sig_handler; act.sa_flags=0; sigemptyset(&set); sigaddset(&set, SIGUSR1); sigprocmask(SIG_BLOCK, &set, NULL); if(sigaction(SIGUSR1,&act, NULL)==-1) perror("sigaction error"); ppid=getpid(); printf("Sono il padre con pid %d\n", ppid); for(i=0;i= ppid +5) break ; } nfigli = i ; printf("padre PID %d: ho creato %d figli e ora attendo la loro terminazione\n", getpid(),nfigli+1); for(j=0; j<=nfigli; j++) wait(NULL); /*il padre attende che tutti i figli abbiano terminato*/ printf("padre PID %d: termino.\n", getpid()); exit(0); }