/* Possibile soluzione per l'esercizio sull'uso di signal, kill ed exec */ ******************* PROGRAMMA MASTER ****************** #include #include #include main(int argc, char **argv) { int loop,i,ran,w; int slave1, slave2; char comando[50]; sscanf(argv[1],"%d",&loop); slave1 = fork(); if (slave1 == 0) execl("./slave1","./slave1",NULL); slave2 = fork(); if (slave2 == 0) execl("./slave2","./slave2",NULL); srand(getpid()+getppid()); for (i = 0; i < loop; i++) { ran = rand() % 10; ran++; printf("\n\nMASTER: ora aspetto %d secondi\n",ran); for (w = 0; w < ran; w++) { printf("*\n"); system("sleep 1"); } if (ran % 2 == 1) kill(slave1,SIGUSR1); else kill(slave2,SIGUSR1); } printf("\nMASTER: ora termino gli schiavi muoio anch'io\n"); kill(slave1,SIGKILL); kill(slave2,SIGKILL); exit(0); } ******************* PROGRAMMA SLAVE1 ****************** #include #include #include #include pippo() /* operazione da eseguire alla ricezione di una kill */ { printf("\nSLAVE-1: ho ricevuto il segnale dal MASTER \n"); fflush(stdout); signal(SIGUSR1,pippo); // questa istruzione e' inutile in LINUX } main() { int i,n,w; signal(SIGUSR1,pippo); printf("\n SLAVE-1: sono stato creato \n"); for(;;); } ******************* PROGRAMMA SLAVE2 ****************** #include #include #include #include pippo() /* operazione da eseguire alla ricezione di una kill */ { printf("\nSLAVE-2: ho ricevuto il segnale dal MASTER \n"); fflush(stdout); signal(SIGUSR1,pippo); // questa istruzione e' inutile in LINUX } main() { int i,n,w; signal(SIGUSR1,pippo); printf("\n SLAVE-2: sono stato creato \n"); for(;;); }