X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=signal.tex;h=edd354a26e321b065c95919387238df87f86803e;hb=1df343113e14ea885c3c3fdb985b2cb84230bd62;hp=dcef54c8b7c6a4fec26afecc8d110beb48b34996;hpb=8247284097011dd78d9207d05efab85da02b7833;p=gapil.git diff --git a/signal.tex b/signal.tex index dcef54c..edd354a 100644 --- a/signal.tex +++ b/signal.tex @@ -1,6 +1,6 @@ %% signal.tex %% -%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -68,7 +68,7 @@ dall'utente o da un altro processo) comporta l'intervento diretto da parte del kernel che causa la generazione di un particolare tipo di segnale. Quando un processo riceve un segnale, invece del normale corso del programma, -viene eseguita una azione predefinita o una apposita routine di gestione +viene eseguita una azione predefinita o una apposita funzione di gestione (quello che da qui in avanti chiameremo il \textsl{gestore} del segnale, dall'inglese \textit{signal handler}) che può essere stata specificata dall'utente (nel qual caso si dice che si \textsl{intercetta} il segnale). @@ -85,7 +85,7 @@ individuare due tipologie fondamentali di comportamento dei segnali (dette \textit{unreliable}). Nella \textsl{semantica inaffidabile} (quella implementata dalle prime -versioni di Unix) la routine di gestione del segnale specificata dall'utente +versioni di Unix) la funzione di gestione del segnale specificata dall'utente non resta attiva una volta che è stata eseguita; è perciò compito dell'utente stesso ripetere l'installazione all'interno del \textsl{gestore} del segnale, in tutti quei casi in cui si vuole che esso resti attivo. @@ -136,7 +136,7 @@ Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese \textit{delivered}) quando viene eseguita l'azione per esso prevista, mentre per tutto il tempo che passa fra la generazione del segnale e la sua consegna esso è detto \textsl{pendente} (o \textit{pending}). In genere questa -procedura viene effettuata dallo scheduler\itindex{scheduler} quando, +procedura viene effettuata dallo scheduler \itindex{scheduler} quando, riprendendo l'esecuzione del processo in questione, verifica la presenza del segnale nella \struct{task\_struct} e mette in esecuzione il gestore. @@ -209,7 +209,7 @@ ignorarlo). Normalmente l'invio al processo che deve ricevere il segnale è immediato ed avviene non appena questo viene rimesso in esecuzione dallo -scheduler\itindex{scheduler} che esegue l'azione specificata. Questo a meno +scheduler \itindex{scheduler} che esegue l'azione specificata. Questo a meno che il segnale in questione non sia stato bloccato prima della notifica, nel qual caso l'invio non avviene ed il segnale resta \textsl{pendente} indefinitamente. Quando lo si sblocca il segnale \textsl{pendente} sarà subito @@ -305,8 +305,8 @@ definiti in vari standard. \hline A & L'azione predefinita è terminare il processo. \\ B & L'azione predefinita è ignorare il segnale. \\ - C & L'azione predefinita è terminare il processo e scrivere un \textit{core - dump}. \\ + C & L'azione predefinita è terminare il processo e scrivere un + \itindex{core~dump} \textit{core dump}. \\ D & L'azione predefinita è fermare il processo. \\ E & Il segnale non può essere intercettato. \\ F & Il segnale non può essere ignorato.\\ @@ -360,49 +360,50 @@ momento della ricezione del segnale. \hline \hline \const{SIGHUP} &PL & A & Hangup o terminazione del processo di - controllo \\ - \const{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}) \\ - \const{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}) \\ - \const{SIGILL} &PL & C & Istruzione illecita \\ - \const{SIGABRT} &PL & C & Segnale di abort da \func{abort} \\ - \const{SIGFPE} &PL & C & Errore aritmetico \\ - \const{SIGKILL} &PL &AEF& Segnale di terminazione forzata \\ - \const{SIGSEGV} &PL & C & Errore di accesso in memoria \\ - \const{SIGPIPE} &PL & A & Pipe spezzata \\ - \const{SIGALRM} &PL & A & Segnale del timer da \func{alarm} \\ - \const{SIGTERM} &PL & A & Segnale di terminazione \verb|C-\| \\ - \const{SIGUSR1} &PL & A & Segnale utente numero 1 \\ - \const{SIGUSR2} &PL & A & Segnale utente numero 2 \\ - \const{SIGCHLD} &PL & B & Figlio terminato o fermato \\ - \const{SIGCONT} &PL & & Continua se fermato \\ - \const{SIGSTOP} &PL &DEF& Ferma il processo \\ - \const{SIGTSTP} &PL & D & Pressione del tasto di stop sul terminale \\ + controllo. \\ + \const{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}). \\ + \const{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}). \\ + \const{SIGILL} &PL & C & Istruzione illecita. \\ + \const{SIGABRT} &PL & C & Segnale di abort da \func{abort}. \\ + \const{SIGFPE} &PL & C & Errore aritmetico. \\ + \const{SIGKILL} &PL &AEF& Segnale di terminazione forzata. \\ + \const{SIGSEGV} &PL & C & Errore di accesso in memoria. \\ + \const{SIGPIPE} &PL & A & Pipe spezzata. \\ + \const{SIGALRM} &PL & A & Segnale del timer da \func{alarm}. \\ + \const{SIGTERM} &PL & A & Segnale di terminazione \texttt{C-\bslash}. \\ + \const{SIGUSR1} &PL & A & Segnale utente numero 1. \\ + \const{SIGUSR2} &PL & A & Segnale utente numero 2. \\ + \const{SIGCHLD} &PL & B & Figlio terminato o fermato. \\ + \const{SIGCONT} &PL & & Continua se fermato. \\ + \const{SIGSTOP} &PL &DEF& Ferma il processo. \\ + \const{SIGTSTP} &PL & D & Pressione del tasto di stop sul terminale. \\ \const{SIGTTIN} &PL & D & Input sul terminale per un processo - in background \\ + in background. \\ \const{SIGTTOU} &PL & D & Output sul terminale per un processo - in background \\ - \const{SIGBUS} &SL & C & Errore sul bus (bad memory access) \\ - \const{SIGPOLL} &SL & A & \textit{Pollable event} (Sys V). - Sinonimo di \const{SIGIO} \\ - \const{SIGPROF} &SL & A & Timer del profiling scaduto \\ - \const{SIGSYS} &SL & C & Argomento sbagliato per una subroutine (SVID) \\ - \const{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint \\ + in background. \\ + \const{SIGBUS} &SL & C & Errore sul bus (bad memory access). \\ + \const{SIGPOLL} &SL & A & \textit{Pollable event} (Sys V); + Sinonimo di \const{SIGIO}. \\ + \const{SIGPROF} &SL & A & Timer del profiling scaduto. \\ + \const{SIGSYS} &SL & C & Argomento sbagliato per una subroutine (SVID).\\ + \const{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint. \\ \const{SIGURG} &SLB& B & Ricezione di una \textit{urgent condition} su - un socket\index{socket}\\ - \const{SIGVTALRM}&SLB& A & Virtual alarm clock \\ - \const{SIGXCPU} &SLB& C & Ecceduto il limite sul CPU time \\ - \const{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file \\ - \const{SIGIOT} &L & C & IOT trap. Sinonimo di \const{SIGABRT} \\ + un socket. \\ + \const{SIGVTALRM}&SLB& A & Virtual alarm clock. \\ + \const{SIGXCPU} &SLB& C & Ecceduto il limite sul tempo di CPU. \\ + \const{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file. \\ + \const{SIGIOT} &L & C & IOT trap. Sinonimo di \const{SIGABRT}. \\ \const{SIGEMT} &L & & \\ - \const{SIGSTKFLT}&L & A & Errore sullo stack del coprocessore \\ - \const{SIGIO} &LB & A & L'I/O è possibile (4.2 BSD) \\ - \const{SIGCLD} &L & & Sinonimo di \const{SIGCHLD} \\ - \const{SIGPWR} &L & A & Fallimento dell'alimentazione \\ - \const{SIGINFO} &L & & Sinonimo di \const{SIGPWR} \\ - \const{SIGLOST} &L & A & Perso un lock sul file (per NFS) \\ - \const{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun) \\ +% TODO che roba e` SIGEMT + \const{SIGSTKFLT}&L & A & Errore sullo stack del coprocessore. \\ + \const{SIGIO} &LB & A & L'I/O è possibile (4.2 BSD). \\ + \const{SIGCLD} &L & & Sinonimo di \const{SIGCHLD}. \\ + \const{SIGPWR} &L & A & Fallimento dell'alimentazione. \\ + \const{SIGINFO} &L & & Sinonimo di \const{SIGPWR}. \\ + \const{SIGLOST} &L & A & Perso un lock sul file (per NFS). \\ + \const{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun). \\ \const{SIGUNUSED}&L & A & Segnale inutilizzato (diventerà - \const{SIGSYS}) \\ + \const{SIGSYS}). \\ \hline \end{tabular} \caption{Lista dei segnali in Linux.} @@ -511,22 +512,26 @@ segnali sono: \const{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si usa per chiedere in maniera ``\textsl{educata}'' ad un processo di concludersi. + \item[\const{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 \cmd{C-c}). -\item[\const{SIGQUIT}] È analogo a \const{SIGINT} con la differenza che è - controllato da un altro carattere di controllo, QUIT, corrispondente alla - sequenza \verb|C-\|. A differenza del precedente l'azione predefinita, oltre - alla terminazione del processo, comporta anche la creazione di un + +\item[\const{SIGQUIT}] È analogo a \const{SIGINT} con la differenza + che è controllato da un altro carattere di controllo, QUIT, + corrispondente alla sequenza \texttt{C-\bslash}. A differenza del + precedente l'azione predefinita, oltre alla terminazione del + processo, comporta anche la creazione di un \itindex{core~dump}\textit{core 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 gestore 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. + 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 gestore 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 \textit{core dump}. + \itindex{core~dump} + \item[\const{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. @@ -541,6 +546,7 @@ segnali sono: kernel). Talvolta è il sistema stesso che può generare questo segnale quando per condizioni particolari il processo non può più essere eseguito neanche per eseguire un gestore. + \item[\const{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 @@ -564,9 +570,11 @@ sempre la necessit \item[\const{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente usato dalla funzione \func{alarm}. + \item[\const{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[\const{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'ultimo. In genere @@ -585,12 +593,15 @@ segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{SIGIO}] Questo segnale viene inviato quando un file descriptor è pronto per eseguire dell'input/output. In molti sistemi solo i - socket\index{socket} e i terminali possono generare questo segnale, in Linux + 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[\const{SIGURG}] Questo segnale è inviato quando arrivano dei dati - urgenti o \textit{out-of-band} su di un socket\index{socket}; per maggiori - dettagli al proposito si veda sez.~\ref{sec:TCP_urgent_data}. + urgenti o \itindex{out-of-band} \textit{out-of-band} su di un + socket; per maggiori dettagli al proposito si veda + sez.~\ref{sec:TCP_urgent_data}. + \item[\const{SIGPOLL}] Questo segnale è equivalente a \const{SIGIO}, è definito solo per compatibilità con i sistemi System V. \end{basedescript} @@ -606,8 +617,10 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: \item[\const{SIGCHLD}] Questo è il segnale mandato al processo padre quando un figlio termina o viene fermato. L'azione predefinita è di ignorare il segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}. + \item[\const{SIGCLD}] Per Linux questo è solo un segnale identico al precedente, il nome è obsoleto e andrebbe evitato. + \item[\const{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene usato per fare ripartire un programma precedentemente fermato da \const{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre @@ -625,6 +638,7 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: \item[\const{SIGSTOP}] Il segnale ferma un processo (lo porta cioè in uno stato di sleep, vedi sez.~\ref{sec:proc_sched}); il segnale non può essere né intercettato, né ignorato, né bloccato. + \item[\const{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale ferma il processo interattivamente, ed è generato dal carattere SUSP (prodotto dalla combinazione \cmd{C-z}), ed al contrario di @@ -633,12 +647,14 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: o il terminale in uno stato definito prima di fermarsi; se per esempio un programma ha disabilitato l'eco sul terminale può installare un gestore per riabilitarlo prima di fermarsi. + \item[\const{SIGTTIN}] Un processo non può leggere dal terminale se esegue una sessione di lavoro in \textit{background}. Quando un processo in background tenta di leggere da un terminale viene inviato questo segnale a tutti i processi della sessione di lavoro. L'azione predefinita è di fermare il processo. L'argomento è trattato in sez.~\ref{sec:sess_job_control_overview}. + \item[\const{SIGTTOU}] Segnale analogo al precedente \const{SIGTTIN}, ma generato quando si tenta di scrivere o modificare uno dei modi del terminale. L'azione predefinita è di fermare il processo, l'argomento è @@ -690,7 +706,7 @@ classificabili in maniera omogenea. Questi segnali sono: possono essere utili per implementare una comunicazione elementare fra processi diversi, o per eseguire a richiesta una operazione utilizzando un gestore. L'azione predefinita è di terminare il processo. -\item[\const{SIGUSR2}] È il secondo segnale a dispozione degli utenti. Vedi +\item[\const{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Vedi quanto appena detto per \const{SIGUSR1}. \item[\const{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in @@ -806,7 +822,7 @@ presenta questa situazione \begin{itemize*} \item la lettura da file che possono bloccarsi in attesa di dati non ancora presenti (come per certi file di dispositivo\index{file!di~dispositivo}, i - socket\index{socket} o le pipe); + socket o le pipe); \item la scrittura sugli stessi file, nel caso in cui dati non possano essere accettati immediatamente (di nuovo comune per i socket); \item l'apertura di un file di dispositivo che richiede operazioni non @@ -924,7 +940,7 @@ comportamento della versione originale della funzione, il cui uso per i motivi visti in sez.~\ref{sec:sig_semantics}, può essere ottenuto chiamando \func{sysv\_signal}, una volta che si sia definita la macro \macro{\_XOPEN\_SOURCE}. In generale, per evitare questi problemi, l'uso di -\func{signal} (ed ogni eventuale ridefinizine della stessa) è da evitare; +\func{signal} (ed ogni eventuale ridefinizione della stessa) è da evitare; tutti i nuovi programmi dovrebbero usare \func{sigaction}. È da tenere presente che, seguendo lo standard POSIX, il comportamento di un @@ -1360,16 +1376,17 @@ Chiaramente, anche se il tempo pu nanosecondo, la precisione di \func{nanosleep} è determinata dalla risoluzione temporale del timer di sistema. Perciò la funzione attenderà comunque il tempo specificato, ma prima che il processo possa tornare ad essere eseguito -occorrerà almeno attendere il successivo giro di scheduler\itindex{scheduler} +occorrerà almeno attendere il successivo giro di scheduler \itindex{scheduler} e cioè un tempo che a seconda dei casi può arrivare fino a 1/\const{HZ}, (sempre che il sistema sia scarico ed il processa venga immediatamente rimesso in esecuzione); per questo motivo il valore restituito in \param{rem} è sempre arrotondato al multiplo successivo di 1/\const{HZ}. In realtà è possibile ottenere anche pause più precise del centesimo di -secondo usando politiche di scheduling real-time come \const{SCHED\_FIFO} o -\const{SCHED\_RR}; in tal caso infatti il meccanismo di scheduling ordinario -viene evitato, e si raggiungono pause fino ai 2~ms con precisioni del $\mu$s. +secondo usando politiche di \itindex{scheduler} scheduling real-time come +\const{SCHED\_FIFO} o \const{SCHED\_RR}; in tal caso infatti il meccanismo di +\itindex{scheduler} scheduling ordinario viene evitato, e si raggiungono pause +fino ai 2~ms con precisioni del $\mu$s. @@ -1395,7 +1412,7 @@ gestore per \const{SIGCHLD} il cui unico compito sia quello di chiamare la formazione di zombie\index{zombie}. In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una -implementazione generica di una routine di gestione per \const{SIGCHLD}, (che +implementazione generica di una funzione di gestione per \const{SIGCHLD}, (che si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i test di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione \cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come @@ -1820,8 +1837,8 @@ al processo che ha emesso il segnale, \const{SIGILL}, \const{SIGFPE}, \const{SIGSEGV} e \const{SIGBUS} avvalorano \var{si\_addr} con l'indirizzo in cui è avvenuto l'errore, \const{SIGIO} (vedi sez.~\ref{sec:file_asyncronous_io}) avvalora \var{si\_fd} con il numero del -file descriptor e \var{si\_band} per i dati urgenti su un -socket\index{socket}. +file descriptor e \var{si\_band} per i \itindex{out-of-band} dati urgenti (vedi +sez.~\ref{sec:TCP_urgent_data}) su un socket. Benché sia possibile usare nello stesso programma sia \func{sigaction} che \func{signal} occorre molta attenzione, in quanto le due funzioni possono @@ -2435,7 +2452,7 @@ immediatamente; in questo modo si pu dover essere bloccati qualora esso non sia presente. L'uso di queste funzioni è principalmente associato alla gestione dei segnali -com i thread. In genere esse vengono chiamate dal thread incaricato della +con i thread. In genere esse vengono chiamate dal thread incaricato della gestione, che al ritorno della funzione esegue il codice che usualmente sarebbe messo nel gestore, per poi ripetere la chiamata per mettersi in attesa del segnale successivo. Questo ovviamente comporta che non devono essere @@ -2449,3 +2466,36 @@ dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive. %%% mode: latex %%% TeX-master: "gapil" %%% End: + +% LocalWords: kernel POSIX timer shell control ctrl kill raise signal handler +% LocalWords: reliable unreliable fig race condition sez struct process table +% LocalWords: delivered pending scheduler sigpending l'I suspend SIGKILL wait +% LocalWords: SIGSTOP sigaction waitpid dump stack debugger nell'header NSIG +% LocalWords: tab BSD SUSv SIGHUP PL Hangup SIGINT Interrupt SIGQUIT Quit AEF +% LocalWords: SIGILL SIGABRT abort SIGFPE SIGSEGV SIGPIPE SIGALRM alarm SIGUSR +% LocalWords: SIGTERM SIGCHLD SIGCONT SIGTSTP SIGTTIN SIGTTOU SIGBUS bad SL of +% LocalWords: memory access SIGPOLL Pollable event Sys SIGIO SIGPROF profiling +% LocalWords: SIGSYS SVID SIGTRAP breakpoint SIGURG urgent socket Virtual IOT +% LocalWords: clock SIGXCPU SIGXFSZ SIGIOT trap SIGEMT SIGSTKFLT SIGCLD SIGPWR +% LocalWords: SIGINFO SIGLOST lock NFS SIGWINCH Sun SIGUNUSED fault point heap +% LocalWords: exception l'overflow illegal instruction overflow segment error +% LocalWords: violation system call interrupt INTR hang SIGVTALRM virtual SUSP +% LocalWords: profilazione fcntl descriptor sleep interactive Broken FIFO lost +% LocalWords: EPIPE Resource advisory client limit exceeded size window change +% LocalWords: strsignal psignal SOURCE strerror string char int signum perror +% LocalWords: void sig const sys siglist L'array decr fork exec DFL IGN ioctl +% LocalWords: EINTR glibc TEMP FAILURE RETRY expr multitasking SVr sighandler +% LocalWords: ERR libc bsd sysv XOPEN EINVAL pid errno ESRCH EPERM getpid init +% LocalWords: killpg pidgrp group unistd unsigned seconds all' setitimer which +% LocalWords: itimerval value ovalue EFAULT ITIMER it interval timeval ms VIRT +% LocalWords: getitimer stdlib stream atexit exit usleep long usec nanosleep +% LocalWords: timespec req rem HZ scheduling SCHED RR SigHand forktest WNOHANG +% LocalWords: deadlock longjmp setjmp sigset sigemptyset sigfillset sigaddset +% LocalWords: sigdelset sigismember act oldact restorer mask NOCLDSTOP ONESHOT +% LocalWords: RESETHAND RESTART NOMASK NODEFER ONSTACK sigcontext union signo +% LocalWords: siginfo bits uid addr fd inline like blocked atomic sigprocmask +% LocalWords: how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc +% LocalWords: SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB +% LocalWords: RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr +% LocalWords: SIGRTMIN SIGRTMAX sigval sival sigevent sigqueue EAGAIN sysctl +% LocalWords: QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB