/* FILE: psignalNew.c */ #include #include #include #include #include #include /* ricordarsi di usare questo programma usando la ridirezione su /dev/null */ void catchint(int); /* prototipo/dichiarazione della funzione che rappresenta il gestore/handler del segnale SINGINT */ int main() { int i; signal(SIGINT, catchint); /* il nome di una funzione corrisponde al puntatore al suo codice */ /* aggancia il segnale alla funzione gestore/handler di nome catchint */ for (;;) /* ciclo infinito */ for (i =0 ; i < 32000; i++) printf (" i vale %d\n", i); } void catchint(int signo) /* alla funzione associata al segnale, il kernel passa il numero del segnale che l'attiva */ { int fd; char s[100] = "Segnale nro "; char s1[5]; char s2[] = " e count = "; char s3[] = "\n"; static int count = 0; /* variabile contatore definita static e quindi allocata non nello stack, ma nei daiti globali che hanno tempo di vita pari a quella del programma e quindi del processo! */ /* NON si disabilita il segnale SIGINT: dato che abbiamo verificato che si usi la semantica BSD */ sprintf(s1, "%d", signo); strcat(s, s1); strcat(s, s2); count++; sprintf(s1, "%d", count); strcat(s, s1); strcat(s, s3); /* viene usato un file di nome sig.log (che creeremo dalla shell) per memorizzare le informazioni relative al numero del segnale e al contatore */ if ((fd = open("sig.log", O_WRONLY)) < 0) exit(1); lseek(fd, 0L, 2); /* se la open ha avuto successo, spostiamo l'I/O pointer alla fine in modo da appendere la stringa che abbiamo 'costruito' */ write(fd, s, strlen(s)); /* non si prevedono azioni di terminazione: ritorno al segnalato, SENZA BISOGNO DI RIPRISTINARE la catch function sempre secondo la semantica BSD */ }