/* FILE: pauseala.c */ #include #include #include #include #define TRUE 1 #define FALSE 0 #define BELLS "\007\007\007" int alarm_flag = FALSE; void setflag() { alarm_flag = TRUE; } int main (int argc, char **argv) { int pid, nsecs, j; if (argc <= 2) { printf ("Errore nel numero di parametri\n"); exit(1); } /* il primo parametro deve essere il numero di minuti che deve passare prima di far scattare l'allarme e il resto dei parametri sono le stringhe che saranno scritte sullo standard output quando scatta l'allarme */ if ((nsecs = atoi(argv[1]) * 60 ) <= 0) { printf ("Errore nel valore del tempo\n"); exit(2); } switch (pid = fork()) { case -1: /* fork fallita */ printf("Errore in fork\n"); exit(1); case 0: /* figlio */ break; default: /* padre */ printf("Creazione del processo %d\n", pid); exit(0); } /* figlio */ /* installa l'azione specifica da eseguire alla ricezione del segnale SIGALRM */ signal(SIGALRM, setflag); /* attiva l'allarme per il numero di secondi calcolato dal primo parametro (fornito in minuti) */ alarm(nsecs); /* attende l'arrivo di un qualunque segnale */ pause(); /* se il segnale arrivato era quello dell'allarme, allora stampa su stadard output le stringhe passate come parametri dal secondo in poi */ if (alarm_flag == TRUE) { printf(BELLS); /* viene suonata la 'campanella' per 3 volte */ for (j=2; j < argc; j++) printf("%s ", argv[j]); printf("\n"); } exit (0); }