From: Simone Piccardi Date: Wed, 18 Apr 2001 18:41:55 +0000 (+0000) Subject: Aggiunte tre righe per passare il tempo X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=859fc8e02d6d101216c100db86dce86a1ccdf00d;p=gapil.git Aggiunte tre righe per passare il tempo --- diff --git a/signal.tex b/signal.tex index bda0f3a..054ff44 100644 --- a/signal.tex +++ b/signal.tex @@ -199,21 +199,26 @@ anche al successivo del valore numerico assegnato all'ultimo segnale definito. \subsubsection{Segnali di errore di programma} -Questi segnali sono generati quando c'è un grave errore nel programma rilevato -dal sistema o dallo stesso hardware. In generale indicano che il programma ha -dei gravi problemi e l'esecuzione non può essere proseguita. - -Alcuni programmi usano questi segnali per riordinare le cose prima di uscire. -Ad esempio ripristinare i settaggi della console, o eliminare i file di lock. -In questo caso il manipolatore deve concludersi ripristinando l'azione di -default e rialzando il segnale, così che il programma possa concludersi come -se il manipolatore non ci fosse mai stato. - -L'azione di default per tutti questi segnali è causare la terminazione del +Questi segnali sono generati quando il sistema, o in certi casi direttamente +l'hardware (come per i page fault non valildi) rileva un qualche errore +insanabile nel programma in esecuzione. In generale la generazione di questi +segnali significa che il programma ha dei gravi problemi (ad esempio ha +dereferenziato un puntatore non valido o ha eseguito una operazione aritmetica +proibita) e l'esecuzione non può essere proseguita. + +In genere si intercettano questi segnali per permettere al programma di +terminare in maniera pulita, ad esempio per ripristinare i settaggi della +console o eliminare i file di lock prima dell'uscita. In questo caso il +manipolatore deve concludersi ripristinando l'azione di default e rialzando il +segnale, in questo modo il programma si concluderà senza effetti spiacevoli, +ma riportando lo stesso stato di uscita che avrebbe avuto se il manipolatore +non ci fosse stato. + +L'azione di default per tutti questi segnali è causare la terminazione del processo che li ha causati. In genere oltre a questo il segnale provoca pure la registrazione su disco di un \textit{core dump file} che viene scritto in un file \texttt{core} nella directory corrente del processo al momento -dell'errore. +dell'errore. Questi segnali sono: @@ -226,9 +231,26 @@ Questi segnali sono: % molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo % standard IEEE per le operazioni in virgola mobile definisce vaire eccezioni % aritmetiche e richiede che esse siano notificate. -\item \texttt{SIGFPE} Il nome deriva da \textit{illegal instruction} -\item \texttt{SIGILL} -\item \texttt{SIGSEGV} +\item \texttt{SIGILL} Il nome deriva da \textit{illegal instruction}, + significa che il programma sta cercando di eseguire una istruzione + privilegiata od inesistente, in generale del codice illegale. Poiché il + compilatore del C genera del codice valido si ottiene questo segnale se il + file eseguibile è corrotto o si stanno cercando di eseguire dei + dati. Quest'ultimo caso può accadere quando si passa un puntatore sbagliato + al posto di un puntatore a funzione, o si eccede la scrittura di un array di + una variabile locale, andando a corrompere lo stack. Lo stesso segnale viene + generato in caso di overflow dello stack o di problemi nell'esecuzione di + di un signal handler. + +\item \texttt{SIGSEGV} Il nome deriva da \textit{segment violation}, e + significa che il programma sta cercando di leggere o scrivere in una zona di + memoria protetta al di fuori di quella che gli è stata riservata dal + sistema. In genere è il meccanismo della protezione della memoria che si + accorge dell'errore ed il kernel genera il segnale. + + È tipico ottenere questo segnale dereferenziando un puntatore nullo o non + inizializzatoo leggendo al di la della fine di un vettore. + \item \texttt{SIGBUS} \item \texttt{SIGABRT} \item \texttt{SIGTRAP}