#include #include #include void sigusr_handler(int signo) { printf("Processo P3 (%d): ricevuto il segnale %s - termino.\n",getpid(), (signo==SIGUSR1)?"SIGUSR1":"SIGUSR2"); exit(0); } main() { int pid2,pid3; int pipefd[2]; struct sigaction act; sigset_t sigmask, zeromask; int tiposegnale; /* P1 */ if(pipe(pipefd)<0) { perror("Creazione della pipe: "); exit(-1); } /* GESTIONE SEGNALI */ sigemptyset( &zeromask); sigemptyset( &sigmask); sigaddset(&sigmask, SIGUSR1); sigaddset(&sigmask, SIGUSR2); /* Blocco dei segnali SIGUSR1/SIGUSR2 */ sigprocmask(SIG_BLOCK, &sigmask, NULL); act.sa_handler= sigusr_handler; /* Lo stesso gestore per entrambi i segnali */ sigemptyset( &act.sa_mask); act.sa_flags= 0; sigaction(SIGUSR1, &act, NULL); sigaction(SIGUSR2, &act, NULL); if((pid2=fork())<0) { perror("Creazione del processo p2: "); exit(-1); } else if (pid2==0) { /* P2 */ srand(getpid()); sleep(1+rand()%5); printf("Processo P2 (%d): fine attesa - creo P3 \n", getpid()); if((pid3=fork())<0) { perror("Creazione del processo p3: "); exit(-1); } else if (pid3==0) { /* P3 */ sigsuspend(&zeromask); } else { /* P2 */ write(pipefd[1],&pid3,sizeof(pid3)); } } else { read(pipefd[0],&pid3,sizeof(pid3)); srand(getpid()); tiposegnale = rand()%2 ; if (tiposegnale==0) kill(pid3,SIGUSR1); else kill(pid3,SIGUSR2); printf("Processo P1 (%d): inviato il segnale %s a P3 (%d)\n", getpid(),(tiposegnale == 0)? "SIGUSR1":"SIGUSR2", pid3); } exit(0); }