Linguaggio C - signal()

NOME

signal() - gestione dei segnali

SINOPSI

#include <signal.h> void (*signal(int signum, void (*sighandler)(int)))(int);

DESCRIZIONE

La funzione signal() stabilisce che quando il processo corrente riceve il segnale signum, il controllo deve passare come e' specificato dal signal handler sighandler.
Per specificare il segnale signum puo' essere impiegato uno dei valori costanti definiti nell'header standard (o in un altro header da questo richiamato) oppure un valore numerico.
sighandler puo' essere o una funzione utente oppure uno dei valori SIG_IGN o SIG_DFL.
L'uso di una funzione di signal handler per un segnale e' detto "catching the signal" (cattura del segnale).

Quando il processo riceve il segnale signum, il processo puo' comportarsi in 3 modi differenti a seconda che sighandler sia stato impostato come:

SIG_IGN
Il segnale viene ignorato.
SIG_DFL
Viene eseguita l'azione di default prevista per quel segnale.
Funzione utente
Viene chiamata la funzione utente, avente come argomento il numero del segnale (signum) che ne ha provocato la chiamata.
N.B. - I segnali SIGKILL e SIGSTOP non possono essere ne' ignorati e ne' catturati.

VALORE DI RITORNO

In caso di successo la funzione signal() ritorna il precedente valore della funzione signal handler.
Viene ritornato SIG_ERR in caso di errore.

NOTA
Il prototype indicato nella sezione
SINOPSI puo' essere semplificato nella seguente forma:

#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);

Ora appare piu' leggibile quali siano il tipo degli argomenti passati alla funzione e quale sia il tipo tornato da signal().
La funzione accetta due argomenti: uno di tipo int mentre l'altro e' di tipo puntatore a funzione (la quale a sua volta accetta un argomento intero e torna void).
Il tipo ritornato da signal e' un puntatore a funzione che che accetta un argomento intero e torna void.

CONFORME A

Ansi C

PORTABILITA'

System V Alla ricezione del segnale signum la funzione di signal handler viene ripristinata al valore di default SIG_DFL prima che venga eseguita la funzione sighandler associata con signal().
In risposta alle successive ricezioni del segnale signum viene attuato il comportamento standard previsto per il segnale.
BSD Con questa versione di Unix, quando il processo riceve il segnale signum, prima che venga passato il controllo alla funzione di signal handler, vengono bloccati ulteriori riconoscimenti del segnale.
Il blocco ha termine all'uscita della funzione sighandler.

Pertanto perche' un programma che gestisce i segnali sia portabile tra le diverse versioni di Unix, occorre scrivere la funzione sighandler affinche':

  1. All'inizio della funzione sighandler venga subito chiamata la funzione signal() per il segnale signum associandolo al valore costante SIG_IGN
    Cosi' facendo i successivi arrivi del segnale signum vengono ignorati, evitando corse critiche.
  2. Implementazione del corpo della funzione sighandler
  3. Al termine della funzione sighandler deve essere chiamata ancora la funzione signal() per associare il segnale signum nuovamente a sighandler
    A questo punto successivi arrivi del segnale signum vengono gestiti correttamente dalla funzione sighandler

ESEMPIO

/* Schema di funzionamento della funzione 'signal handler' */ #include <signal.h> ... void sighandler(int segnale_ricevuto); ... int main(int argc, char *argv[]) { void (*prev_sighandler)(int); ... prev_sighandler = signal(SIGINT, sighandler); ... } void sighandler(int segnale_ricevuto) /* gestione del segnale */ { /* dichiarazioni/definizioni */ ... /* vengono ignorati altri arrivi del segnale */ signal(segnale_ricevuto, SIG_IGN); /* gestione del segnale */ ... /* ripristino del signal handler */ signal(segnale_ricevuto, sighandler); }

VEDI ANCHE

alarm() kill() killpg() pause() sleep() wait()


Indice-C Indice linguaggio C
Indice librerie Indice librerie C
At Home Umberto Zappi Home Page
Indice funzioni Indice funzioni C