INTRODUZIONE ALLA PROGRAMMAZIONE IN C



Ricezione di segnali/signal()



int (*signal(int sig, void (*func)()))() - questo sta' ad indicare che la funzione signal() richiamera' la funzione func se il processo ricevera' un segnale sig. Signal ritorna un puntatore alla funzione func in caso di successo, oppure ritorna un errore ad errno, e -1 negli altri casi. func() puo' avere tre valori: SIG_DFL - un puntatore alla funzione di default del sistema SID_DFL(), la quale terminera' il processo al ricevimento di "sig". SIG_IGN - un puntatore alla funzione di sistema ignore SIG_IGN(), che ignorera' l'azione "sig" (a meno che non sia SIGKILL) Un indirizzo di funzione - una funzione specificata dall'utente SIG_DFL e SIG_IGN sono definiti nel file header signal.h (libreria standard). Cosi' per ignorare un comando CTRL-C dalla linea di comando, dovremo fare: signal(SIGINT, SIG_IGN); Per resettare un sistema, cosicche' SIGINT comporti l'uscita da qualsiasi posizione del nostro programma, dovremo fare: signal(SIGINT, SIG_DFL); Vediamo ora un programma per catturare un CTRL-C, ma non uscire con questo segnale. Abbiamo una funzione "sigproc()" che viene eseguita quando catturiamo in CTRL-C. Possiamo anche settare un'altra funzione per abbandonare il programma se riceve il segnale SIGQUIT, cosi' possiamo terminare il nostro programma: #include <stdio.h> void sigproc(void); void quitproc(void); main() {signal(SIGINT, sigproc); signal(SIGQUIT, quitproc); printf("CTRL-C disabled use ctrl-\\ to quit \n"); for(;;) /* loop infinito */ } void sigproc() {signal (SIGINT, sigproc); /* */ /* NOTA: alcune versioni di UNIX resetteranno "signal" al valore di default dopo ogni chiamata. Scosi', per rispettare la portabilita', facciamo un reset di "signal" ogni volta */ printf("You have pressed CTRL-C \n"); } void quitproc() {printf("ctrl-\\ pressed to quit \n"); exit(0); /* normale status di uscita */ }