From: Simone Piccardi Date: Tue, 3 Jul 2001 17:47:47 +0000 (+0000) Subject: Aggiunte descrizioni di vari segnali X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=d0e5573bf74f834c84e9adae6175f388e2f44916 Aggiunte descrizioni di vari segnali --- diff --git a/fileintro.tex b/fileintro.tex index a7df993..85098c8 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -125,15 +125,15 @@ questa sia la directory radice allora il riferimento \label{sec:fileintr_file_types} Come detto in precedenza in unix esistono vari tipi di file, in Linux questi -sono implementati come oggetti del \textit{Virtual File System} e sono -presenti in tutti i filesystem unix-like utilizzabili con Linux. L'elenco dei -vari tipi di file definiti dal Virtual File System è riportato in \ntab. +sono implementati come oggetti del \textit{Virtual File System} (vedi +\secref{sec:fileintro_vfs}) e sono presenti in tutti i filesystem unix-like +utilizzabili con Linux. L'elenco dei vari tipi di file definiti dal Virtual +File System è riportato in \ntab. Si tenga ben presente che questa classificazione non ha nulla a che fare con la classificazione sui tipi di file (che in questo caso sono sempre file di dati) in base al loro contenuto, o tipo di accesso. - \begin{table}[htb] \begin{center} \begin{tabular}[c]{l l p{7cm}} @@ -301,9 +301,9 @@ un filesystem unix. In particolare occorre tenere presente dov' la divisione fondamentale fra kernel space e user space che tracciavamo al \capref{cha:intro_unix}. -In questa sezione esamineremo allora come viene implementato l'accesso ai -files in Linux, come il kernel gestisce i vari filesystem, descrivendo poi in -maniera un po' più dettagliata il filesystem standard di Linux, +In questa sezione esamineremo come viene implementato l'accesso ai files in +Linux, come il kernel può gestire diversi tipi di filesystem, descrivendo +poi in maniera un po' più dettagliata il filesystem standard di Linux, l'\texttt{ext2}, come esempio di un filesystem unix-like. @@ -322,7 +322,7 @@ l'\texttt{ext2}, come esempio di un filesystem unix-like. % \textit{inode}, \textit{dentry}, \textit{dcache}. In Linux il concetto di \textit{everything is a file} è stato implementato -attraverso il \textit{virtual filesystem} (da qui in avanti VFS) che è +attraverso il \textit{Virtual File System} (da qui in avanti VFS) che è l'interfaccia che il kernel rende disponibile ai programmi in user space attraverso la quale vengono manipolati i files; esso provvede un livello di indirezione che permette di collegare le operazioni di manipolazione sui files @@ -333,8 +333,8 @@ di filesystem differenti all'interno dello stesso albero delle directory Quando un processo esegue una system call che opera su un file il kernel chiama sempre una funzione implementata nel VFS; la funzione eseguirà le manipolazioni sulle strutture generiche e ridirigendo la chiamata alla -opportune routine del filesystem specifico a cui si fa riferimento, saranno -queste a chiamare le funzioni di piu basso livello che eseguono le operazioni +opportune routine del filesystem specifico a cui si fa riferimento. Saranno +queste a chiamare le funzioni di più basso livello che eseguono le operazioni di I/O sul dispositivo fisico, secondo lo schema riportato in \nfig. \begin{figure}[htb] @@ -344,6 +344,14 @@ di I/O sul dispositivo fisico, secondo lo schema riportato in \nfig. \label{fig:fileintro_VFS_scheme} \end{figure} +Il VFS definisce un insieme di funzioni che tutti i filesystem devono +implementare, queste funzioni + + + +\subsection{Il funzionamento del VFS} +\label{sec:fileintr_vfs_work} + La funzione più importante implementata dal VFS è la system call \texttt{open} che permette di aprire un file. Dato un pathname viene eseguita una ricerca dentro la \textit{directory entry cache} (in breve \textit{dcache}), diff --git a/signal.tex b/signal.tex index ec3bf55..beebb00 100644 --- a/signal.tex +++ b/signal.tex @@ -342,7 +342,7 @@ stato dello stack e delle variabili al momento della ricezione del segnale. \begin{table}[htb] \centering - \begin{tabular}[c]{c p{6cm}} + \begin{tabular}[c]{c p{10cm}} A & L'azione di default è terminare il processo. \\ B & L'azione di default è ignorare il segnale. \\ C & L'azione di default è terminare il processo e scrivere un \textit{core @@ -412,19 +412,20 @@ Questi segnali sono: È tipico ottenere questo segnale dereferenziando un puntatore nullo o non inizializzato leggendo al di la della fine di un vettore. -\item \texttt{SIGBUS} In maniera analoga a \texttt{SIGSEGV} questo è un - segnale che viene generato di solito quando si dereferenzia un puntatore non - inzializzato, la differenza con con \texttt{SIGSEGV} è che questo indica un - accesso non valido su un indirizzo esistente (tipo fuori dallo heap o dallo - stack), mentre \texttt{SIGBUS} indica l'accesso ad un indirizzo non valido, - come nel caso di un puntatore non allineato. -\item \texttt{SIGABRT} Il segnale indica che il programma stesso ha rilevato - un errore che viene riportato chiamando la funzione \texttt{abort} che - genera questo segnale. +\item \texttt{SIGBUS} Il nome deriva da \textit{bus error}. Come + \texttt{SIGSEGV} questo è un segnale che viene generato di solito quando si + dereferenzia un puntatore non inzializzato, la differenza è + che\texttt{SIGSEGV} indica un accesso non permesso su un indirizzo esistente + (tipo fuori dallo heap o dallo stack), mentre \texttt{SIGBUS} indica + l'accesso ad un indirizzo non valido, come nel caso di un puntatore non + allineato. +\item \texttt{SIGABRT} Il nome deriva da \textit{abort}. Il segnale indica che + il programma stesso ha rilevato un errore che viene riportato chiamando la + funzione \texttt{abort} che genera questo segnale. \item \texttt{SIGTRAP} È il segnale generato da un'istruzione di breakpoint o dall'attivazione del tracciamento per il processo. È usato dai programmi per il debugging e se un programma normale non dovrebbe ricevere questo segnale. -\item \texttt{SIGSYS} Sta ad indicare che si è eseguta una istruzione che +\item \texttt{SIGSYS} Sta ad indicare che si è eseguita una istruzione che richiede l'esecuzione di una system call, ma si è fornito un codice sbagliato per quest'ultima. \end{description} @@ -447,29 +448,70 @@ periferica). L'azione di default di questi segnali è di terminare il processo, questi segnali sono: \begin{description} -\item \macro{SIGTERM} Questo è un segnale generico usato per causare la - conclusione di un programma. Al contrario di \macro{SIGKILL} può essere - intercettato, ignorato, bloccato. In genere lo si usa per chiedere in - maniera ``educata'' ad un processo di concludersi. -\item \macro{SIGINT} E il segnale di interruzione per il programma. È quello - che viene generato di default dal comando \cmd{kill} o dall'invio sul - terminale del carattere di interrupt (generato dalla sequenza \macro{C-\\}). -\item \macro{SIGQUIT} -\item \macro{SIGKILL} -\item \macro{SIGHUP} +\item \macro{SIGTERM} Il nome sta per \textit{terminate}. È un segnale + generico usato per causare la conclusione di un programma. Al contrario di + \macro{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si + usa per chiedere in maniera ``educata'' ad un processo di concludersi. +\item \macro{SIGINT} Il nome sta per \textit{interrupt}. È il segnale di + interruzione per il programma. È quello che viene generato di default dal + comando \cmd{kill} o dall'invio sul terminale del carattere di controllo + INTR (interrupt, generato dalla sequenza \macro{C-c}). +\item \macro{SIGQUIT} È analogo a \macro{SIGINT} con la differenze che è + controllato da un'altro carattere di controllo, QUIT, corrispondente alla + sequenza \macro{C-\\}. A differenza del precedente l'azione di default, + oltre alla terminazione del processo, comporta anche la creazione di un cor + dump. + + In genere lo si può pensare come corrispondente ad una condizione di + errore del programma rilevata dall'utente. Per questo motivo non è opportuno + fare eseguire al manipolatore di questo segnale le operazioni di pulizia + normalmente previste (tipo la cancellazione di file temporanei), dato che in + certi casi esse possono eliminare informazioni utili nell'esame dei core + dump. +\item \macro{SIGKILL} Il nomeè utilizzato per terminare in maniera immediata + qualunque programma. Questo segnale non può essere né intercettato, né + ignorato, né bloccato, per cui causa comunque la terminazione del processo. + In genere esso viene generato solo per richiesta esplicita dell'utente dal + comando (o tramite la funzione) \cmd{kill}. Dato che non lo si può + intercettare è sempre meglio usarlo come ultima risorsa quando metodi meno + brutali, come \macro{SIGTERM} o \macro{C-c} non funzionano. + + Se un processo non risponde a nessun altro segnale \macro{SIGKILL} ne causa + sempre la terminazione (in effetti il fallimento della terminazione di un + processo da parte di \macro{SIGKILL} costituirebbe un funzionamento del + kernel). Talvolta è il sistema stesso che può generare questo segnale quando + per condizioni particolari il processo non può più essere eseguito neanche + per eseguire il manipolatore. +\item \macro{SIGHUP} Il nome sta per \textit{hang-up}. Segnala che il + terminale dell'utente si è disconnesso (ad esempio perché si è interrotta la + rete). Viene usato anche per riportare la terminazione del processo di + controllo di un terminale a tutti i processi della sessione, in modo che + essi possano disconnettersi dal relativo terminale. + + Viene inoltre usato in genere per segnalare ai demoni (che non hanno un + terminale di controllo) la necessità di reinizializzarsi e rileggere il/i + file di configurazione. \end{description} \subsection{I segnali di allarme} \label{sec:sig_alarm} -Questi segnali sono generati dalla scadenza di un temporizzatore. Il loro -comportamento di default è quello di causare la terminazione del programma, ma -con questi segnali la scelta di default è irrilevante, in quanto il loro uso -presuppone sempre la necessità di un manipolatore. Questi segnali sono: +Questi segnali sono generati dalla scadenza di un timer. Il loro comportamento +di default è quello di causare la terminazione del programma, ma con questi +segnali la scelta di default è irrilevante, in quanto il loro uso presuppone +sempre la necessità di un manipolatore. Questi segnali sono: \begin{description} -\item \texttt{SIGALRM} -\item \texttt{SIGVTALRM} -\item \texttt{SIGPROF} +\item \texttt{SIGALRM} Il nome sta per \textit{alarm}. Segnale la scadenza di + un timer misurato sul tempo reale o sull'orologio di sistema. È normalente + usato dalla funzione \func{alarm}. +\item \texttt{SIGVTALRM} Il nome sta per \textit{virtual alarm}. È analogo al + precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal + processo. +\item \texttt{SIGPROF} Il nome sta per \textit{profiling}. Indica la scadenza + di un timer che misura sia il tempo di CPU speso direttamente dal processo + che quello che il sistema ha speso per conto di quest'utlimo. In genere + viene usato dai tool che servono a fare il profilo d'uso della CPU da parte + del processo. \end{description} @@ -482,24 +524,55 @@ generare questi segnali. L'azione di default è di essere ignorati. Questi segnali sono: \begin{description} -\item \texttt{SIGIO} -\item \texttt{SIGURG} -\item \texttt{SIGPOLL} +\item \texttt{SIGIO} Questo segnale viene inviato quando un file descriptor è + pronto per eseguire dell'input/output. In molti sistemi solo i socket e i + terminali possono generare questo segnale, in Linux questo può essere usato + anche per i file, posto che la \func{fcntl} abbia avuto successo. +\item \texttt{SIGURG} Questo segnale è inviato quando arrivano dei dati + urgenti o \textit{out of band} su di un socket; per maggiori dettagli al + proposito si veda \secref{sec:xxx_urgent_data}. +\item \texttt{SIGPOLL} Questo segnale è equivalente a \macro{SIGIO}, è + definito solo per compatibilità con i sistemi System V. \end{description} \subsection{I segnali per il controllo di sessione} \label{sec:sig_job_control} -Questi sono i segnali usati dal controllo di sessione, il loro uso è specifico -per questo argomento e verrà trattato quando lo affronteremo. -Questi segnali sono: -\begin{description} -\item \texttt{SIGCHLD} -\item \texttt{SIGCONT} -\item \texttt{SIGSTOP} -\item \texttt{SIGTSTP} -\item \texttt{SIGTTIN} -\item \texttt{SIGTTOU} +Questi sono i segnali usati dal controllo delle sessioni e dei processi, il +loro uso è specifico e viene trattato in maniera specifica nelle sezioni in +cui si trattano gli argomenti relativi. Questi segnali sono: +\begin{description} +\item \macro{SIGCHLD} Questo è il segnale mandato al processo padre quando un + figlio termina o viene fermato. L'azione di default è di ignorare il + segnale, la sua gestione è trattata in \secref{sec:prochand_wait}. +\item \macro{SIGCLD} Per Linux questo è solo un segnale identico al + precedente, il nome è obsoleto e andrebbe evitato. +\item \macro{SIGCONT} Il nome sta per \textit{continue}. Il segnale viene + usato per fare ripartire un programma precedentemente fermato da + \macro{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre + ripartire il processo prima della sua consegna. Il comportamento di default + è di fare solo questo; il segnale non può essere bloccato. Si può anche + installare un manipolatore, ma il segnale provoca comunque il riavvio del + processo. + + La maggior pare dei programmi non hanno necessità di intercettare il + segnale, in quanto esso è completamente trasparente rispetto all'esecuzione + che riparte senza che il programma noti niente. Si possono installare dei + manipolatori per far si che un programma produca una qualche azione speciale + se viene fermato e riavviato, come per esempio riscrivere un prompt, o + inviare un avviso. +\item \macro{SIGSTOP} Il segnale ferma un processo (lo porta in uno stato di + sleep); il segnale non può essere né intercettato, né ignorato, né bloccato. +\item \macro{SIGTSTP} Il nome sta per \textit{interactive stop}. Il segnale + ferma il processo interattivamente, ed è generato dal carattere SUSP + (prodotto dalla combinazione \macro{C-z}), ed al contrario di + \macro{SIGSTOP} può essere intercettato e ignorato. In genere un programma + installa un manipolatore per questo segnale quando vuole lasciare il sistema + o il terminale in uno stato definito prima di fermarsi; se per esempio un + programma ha disabilitato l'eco sul terminale può installare un manipolatore + per riabilitarlo prima di fermarsi. +\item \macro{SIGTTIN} +\item \macro{SIGTTOU} \end{description} \subsection{I segnali di operazioni errate}