Aggiunte tre righe per passare il tempo
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 18 Apr 2001 18:41:55 +0000 (18:41 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 18 Apr 2001 18:41:55 +0000 (18:41 +0000)
signal.tex

index bda0f3a48e82c6e8e75ea8c992c7b238b050e54c..054ff4428f4412159db68783f2b07c5ee6a9a794 100644 (file)
@@ -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}