+%% signal.tex
+%%
+%% Copyright (C) 2000-2002 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 "Prefazione",
+%% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the
+%% license is included in the section entitled "GNU Free Documentation
+%% License".
+%%
\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
\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 quando, riprendendo l'esecuzione
-del processo in questione, verifica la presenza del segnale nella
-\var{task\_struct} e mette in esecuzione il gestore.
+procedura viene effettuata dallo scheduler\index{scheduler} quando,
+riprendendo l'esecuzione del processo in questione, verifica la presenza del
+segnale nella \var{task\_struct} e mette in esecuzione il gestore.
In questa semantica un processo ha la possibilità di bloccare la consegna dei
segnali, in questo caso, se l'azione per il suddetto segnale non è quella di
In questa semantica un processo ha la possibilità di bloccare la consegna dei
segnali, in questo caso, se l'azione per il suddetto segnale non è quella di
-avviene non appena questo viene rimesso in esecuzione dallo 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 notificato.
+avviene non appena questo viene rimesso in esecuzione dallo
+scheduler\index{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
+notificato.
che i numeri dei segnali sono allocati progressivamente, essa corrisponde
anche al successivo del valore numerico assegnato all'ultimo segnale definito.
In \tabref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali
che i numeri dei segnali sono allocati progressivamente, essa corrisponde
anche al successivo del valore numerico assegnato all'ultimo segnale definito.
In \tabref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali
- \macro{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}) \\
- \macro{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}) \\
- \macro{SIGILL} &PL & C & Istruzione illecita \\
- \macro{SIGABRT} &PL & C & Segnale di abort da \func{abort} \\
- \macro{SIGFPE} &PL & C & Errore aritmetico \\
- \macro{SIGKILL} &PL &AEF& Segnale di terminazione forzata \\
- \macro{SIGSEGV} &PL & C & Errore di accesso in memoria \\
- \macro{SIGPIPE} &PL & A & Pipe spezzata \\
- \macro{SIGALRM} &PL & A & Segnale del timer da \func{alarm} \\
- \macro{SIGTERM} &PL & A & Segnale di terminazione \verb|C-\| \\
- \macro{SIGUSR1} &PL & A & Segnale utente numero 1 \\
- \macro{SIGUSR2} &PL & A & Segnale utente numero 2 \\
- \macro{SIGCHLD} &PL & B & Figlio terminato o fermato \\
- \macro{SIGCONT} &PL & & Continua se fermato \\
- \macro{SIGSTOP} &PL &DEF& Ferma il processo \\
- \macro{SIGTSTP} &PL & D & Pressione del tasto di stop sul terminale \\
- \macro{SIGTTIN} &PL & D & Input sul terminale per un processo
+ \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 \\
+ \const{SIGTTIN} &PL & D & Input sul terminale per un processo
- \macro{SIGBUS} &SL & C & Errore sul bus (bad memory access) \\
- \macro{SIGPOLL} &SL & A & \textit{Pollable event} (Sys V).
- Sinonimo di \macro{SIGIO} \\
- \macro{SIGPROF} &SL & A & Timer del profiling scaduto \\
- \macro{SIGSYS} &SL & C & Argomento sbagliato per una subroutine (SVID) \\
- \macro{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint \\
- \macro{SIGURG} &SLB& B & Ricezione di una urgent condition su un socket\\
- \macro{SIGVTALRM}&SLB& A & Virtual alarm clock \\
- \macro{SIGXCPU} &SLB& C & Ecceduto il limite sul CPU time \\
- \macro{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file \\
- \macro{SIGIOT} &L & C & IOT trap. Sinonimo di \macro{SIGABRT} \\
- \macro{SIGEMT} &L & & \\
- \macro{SIGSTKFLT}&L & A & Errore sullo stack del coprocessore \\
- \macro{SIGIO} &LB & A & L'I/O è possibile (4.2 BSD) \\
- \macro{SIGCLD} &L & & Sinonimo di \macro{SIGCHLD} \\
- \macro{SIGPWR} &L & A & Fallimento dell'alimentazione \\
- \macro{SIGINFO} &L & & Sinonimo di \macro{SIGPWR} \\
- \macro{SIGLOST} &L & A & Perso un lock sul file (per NFS) \\
- \macro{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun) \\
- \macro{SIGUNUSED}&L & A & Segnale inutilizzato (diventerà
- \macro{SIGSYS}) \\
+ \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 urgent condition su un 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} \\
+ \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) \\
+ \const{SIGUNUSED}&L & A & Segnale inutilizzato (diventerà
+ \const{SIGSYS}) \\
significa che il programma sta cercando di eseguire una istruzione
privilegiata o inesistente, in generale del codice illecito. Poiché il
compilatore del C genera del codice valido si ottiene questo segnale se il
significa che il programma sta cercando di eseguire una istruzione
privilegiata o inesistente, in generale del codice illecito. Poiché il
compilatore del C genera del codice valido si ottiene questo segnale se il
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
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
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 core dump.
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 core dump.
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
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
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
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
segnali la scelta predefinita è irrilevante, in quanto il loro uso presuppone
sempre la necessità di un gestore. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
segnali la scelta predefinita è irrilevante, in quanto il loro uso presuppone
sempre la necessità di un gestore. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
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
viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo
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
viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo
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.
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.
loro uso è specifico e viene trattato in maniera specifica nelle sezioni in
cui si trattano gli argomenti relativi. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
loro uso è specifico e viene trattato in maniera specifica nelle sezioni in
cui si trattano gli argomenti relativi. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
ripartire il processo prima della sua consegna. Il comportamento predefinito
è di fare solo questo; il segnale non può essere bloccato. Si può anche
installare un gestore, ma il segnale provoca comunque il riavvio del
ripartire il processo prima della sua consegna. Il comportamento predefinito
è di fare solo questo; il segnale non può essere bloccato. Si può anche
installare un gestore, ma il segnale provoca comunque il riavvio del
gestori 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.
gestori 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.
stato di sleep, vedi \secref{sec:proc_sched}); il segnale non può essere né
intercettato, né ignorato, né bloccato.
stato di sleep, vedi \secref{sec:proc_sched}); il segnale non può essere né
intercettato, né ignorato, né bloccato.
ferma il processo interattivamente, ed è generato dal carattere SUSP
(prodotto dalla combinazione \cmd{C-z}), ed al contrario di
ferma il processo interattivamente, ed è generato dal carattere SUSP
(prodotto dalla combinazione \cmd{C-z}), ed al contrario di
installa un gestore 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 gestore
per riabilitarlo prima di fermarsi.
installa un gestore 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 gestore
per riabilitarlo prima di fermarsi.
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 \secref{sec:sess_job_control_overview}.
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 \secref{sec:sess_job_control_overview}.
generato quando si tenta di scrivere o modificare uno dei modi del
terminale. L'azione predefinita è di fermare il processo, l'argomento è
trattato in \secref{sec:sess_job_control_overview}.
generato quando si tenta di scrivere o modificare uno dei modi del
terminale. L'azione predefinita è di fermare il processo, l'argomento è
trattato in \secref{sec:sess_job_control_overview}.
delle FIFO è necessario che, prima che un processo inizi a scrivere su di
essa, un'altro abbia aperto la pipe in lettura (si veda
\secref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
delle FIFO è necessario che, prima che un processo inizi a scrivere su di
essa, un'altro abbia aperto la pipe in lettura (si veda
\secref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
segnale è generato quando un processo tenta di estendere un file oltre le
dimensioni specificate dal limite impostato per le dimensioni massime di un
file, vedi \secref{sec:sys_resource_limit}.
segnale è generato quando un processo tenta di estendere un file oltre le
dimensioni specificate dal limite impostato per le dimensioni massime di un
file, vedi \secref{sec:sys_resource_limit}.
Raccogliamo qui infine usa serie di segnali che hanno scopi differenti non
classificabili in maniera omogenea. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
Raccogliamo qui infine usa serie di segnali che hanno scopi differenti non
classificabili in maniera omogenea. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
dell'utente che li può usare per quello che vuole. 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.
dell'utente che li può usare per quello che vuole. 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.
generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
programmi testuali per riformattare l'uscita su schermo quando si cambia
dimensione a quest'ultimo. L'azione predefinita è di essere ignorato.
generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
programmi testuali per riformattare l'uscita su schermo quando si cambia
dimensione a quest'ultimo. L'azione predefinita è di essere ignorato.
usato con il controllo di sessione, causa la stampa di informazioni da parte
del processo leader del gruppo associato al terminale di controllo, gli
altri processi lo ignorano.
usato con il controllo di sessione, causa la stampa di informazioni da parte
del processo leader del gruppo associato al terminale di controllo, gli
altri processi lo ignorano.
senso infatti fare riferimento a funzioni definite nel programma originario,
che non sono presenti nello spazio di indirizzi del nuovo programma.
Si noti che questo vale solo per le azioni per le quali è stato installato un
gestore; viene mantenuto invece ogni eventuale impostazione dell'azione a
senso infatti fare riferimento a funzioni definite nel programma originario,
che non sono presenti nello spazio di indirizzi del nuovo programma.
Si noti che questo vale solo per le azioni per le quali è stato installato un
gestore; viene mantenuto invece ogni eventuale impostazione dell'azione a
tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei
gestori controllino lo stato di uscita delle funzioni per ripeterne la
chiamata qualora l'errore fosse questo.
tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei
gestori controllino lo stato di uscita delle funzioni per ripeterne la
chiamata qualora l'errore fosse questo.
errore comune, tanto che le \acr{glibc} provvedono una macro
\code{TEMP\_FAILURE\_RETRY(expr)} che esegue l'operazione automaticamente,
ripetendo l'esecuzione dell'espressione \var{expr} fintanto che il risultato
errore comune, tanto che le \acr{glibc} provvedono una macro
\code{TEMP\_FAILURE\_RETRY(expr)} che esegue l'operazione automaticamente,
ripetendo l'esecuzione dell'espressione \var{expr} fintanto che il risultato
direttamente con una delle costanti definite in \secref{sec:sig_standard}. Il
gestore \param{handler} invece, oltre all'indirizzo della funzione da chiamare
all'occorrenza del segnale, può assumere anche i due valori costanti
direttamente con una delle costanti definite in \secref{sec:sig_standard}. Il
gestore \param{handler} invece, oltre all'indirizzo della funzione da chiamare
all'occorrenza del segnale, può assumere anche i due valori costanti
-processo che ignora i segnali \macro{SIGFPE}, \macro{SIGILL}, o
-\macro{SIGSEGV} (qualora non originino da una \func{kill} o una \func{raise})
+processo che ignora i segnali \const{SIGFPE}, \const{SIGILL}, o
+\const{SIGSEGV} (qualora non originino da una \func{kill} o una \func{raise})
- \item[\macro{EINVAL}] Il segnale specificato non esiste.
- \item[\macro{ESRCH}] Il processo selezionato non esiste.
- \item[\macro{EPERM}] Non si hanno privilegi sufficienti ad inviare il
+ \item[\errcode{EINVAL}] Il segnale specificato non esiste.
+ \item[\errcode{ESRCH}] Il processo selezionato non esiste.
+ \item[\errcode{EPERM}] Non si hanno privilegi sufficienti ad inviare il
Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per
specificare il segnale nullo. Se le funzioni vengono chiamate con questo
valore non viene inviato nessun segnale, ma viene eseguito il controllo degli
Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per
specificare il segnale nullo. Se le funzioni vengono chiamate con questo
valore non viene inviato nessun segnale, ma viene eseguito il controllo degli
esiste. Si tenga conto però che il sistema ricicla i \acr{pid} (come accennato
in \secref{sec:proc_pid}) per cui l'esistenza di un processo non significa che
esso sia realmente quello a cui si intendeva mandare il segnale.
esiste. Si tenga conto però che il sistema ricicla i \acr{pid} (come accennato
in \secref{sec:proc_pid}) per cui l'esistenza di un processo non significa che
esso sia realmente quello a cui si intendeva mandare il segnale.
Solo l'amministratore può inviare un segnale ad un processo qualunque, in
tutti gli altri casi l'userid reale o l'userid effettivo del processo
chiamante devono corrispondere all'userid reale o all'userid salvato della
destinazione. Fa eccezione il caso in cui il segnale inviato sia
Solo l'amministratore può inviare un segnale ad un processo qualunque, in
tutti gli altri casi l'userid reale o l'userid effettivo del processo
chiamante devono corrispondere all'userid reale o all'userid salvato della
destinazione. Fa eccezione il caso in cui il segnale inviato sia
stessa sessione. Inoltre, dato il ruolo fondamentale che riveste nel sistema
(si ricordi quanto visto in \secref{sec:sig_termination}), non è possibile
inviare al processo 1 (cioè a \cmd{init}) segnali per i quali esso non abbia
stessa sessione. Inoltre, dato il ruolo fondamentale che riveste nel sistema
(si ricordi quanto visto in \secref{sec:sig_termination}), non è possibile
inviare al processo 1 (cioè a \cmd{init}) segnali per i quali esso non abbia
segnali sono previste funzioni specifiche che ne effettuino l'invio. La più
comune delle funzioni usate per la temporizzazione è \func{alarm} il cui
prototipo è:
\begin{prototype}{unistd.h}{unsigned int alarm(unsigned int seconds)}
segnali sono previste funzioni specifiche che ne effettuino l'invio. La più
comune delle funzioni usate per la temporizzazione è \func{alarm} il cui
prototipo è:
\begin{prototype}{unistd.h}{unsigned int alarm(unsigned int seconds)}
La funzione fornisce un meccanismo che consente ad un processo di predisporre
un'interruzione nel futuro, (ad esempio per effettuare una qualche operazione
dopo un certo periodo di tempo), programmando l'emissione di un segnale (nel
La funzione fornisce un meccanismo che consente ad un processo di predisporre
un'interruzione nel futuro, (ad esempio per effettuare una qualche operazione
dopo un certo periodo di tempo), programmando l'emissione di un segnale (nel
\item un \textit{profiling timer} che calcola la somma dei tempi di processore
utilizzati direttamente dal processo in user space, e dal kernel nelle
system call ad esso relative (che corrisponde a quello che in
\secref{sec:sys_unix_time} abbiamo chiamato \textit{CPU time}). La scadenza
\item un \textit{profiling timer} che calcola la somma dei tempi di processore
utilizzati direttamente dal processo in user space, e dal kernel nelle
system call ad esso relative (che corrisponde a quello che in
\secref{sec:sys_unix_time} abbiamo chiamato \textit{CPU time}). La scadenza
- \macro{ITIMER\_REAL} & \textit{real-time timer}\\
- \macro{ITIMER\_VIRTUAL} & \textit{virtual timer}\\
- \macro{ITIMER\_PROF} & \textit{profiling timer}\\
+ \const{ITIMER\_REAL} & \textit{real-time timer}\\
+ \const{ITIMER\_VIRTUAL} & \textit{virtual timer}\\
+ \const{ITIMER\_PROF} & \textit{profiling timer}\\
L'ultima funzione che permette l'invio diretto di un segnale è \func{abort};
che, come accennato in \ref{sec:proc_termination}, permette di abortire
L'ultima funzione che permette l'invio diretto di un segnale è \func{abort};
che, come accennato in \ref{sec:proc_termination}, permette di abortire
prototipo è:
\begin{prototype}{stdlib.h}{void abort(void)}
Abortisce il processo corrente.
\bodydesc{La funzione non ritorna, il processo è terminato inviando il
prototipo è:
\begin{prototype}{stdlib.h}{void abort(void)}
Abortisce il processo corrente.
\bodydesc{La funzione non ritorna, il processo è terminato inviando il
\bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in
caso di errore, nel qual caso \var{errno} assumerà il valore
\bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in
caso di errore, nel qual caso \var{errno} assumerà il valore
deprecata in favore della funzione \func{nanosleep}, definita dallo standard
POSIX1.b, il cui prototipo è:
\begin{prototype}{unistd.h}{int nanosleep(const struct timespec *req, struct
deprecata in favore della funzione \func{nanosleep}, definita dallo standard
POSIX1.b, il cui prototipo è:
\begin{prototype}{unistd.h}{int nanosleep(const struct timespec *req, struct
\bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in
caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in
caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
\end{errlist}}
\end{prototype}
Lo standard richiede che la funzione sia implementata in maniera del tutto
indipendente da \func{alarm}\footnote{nel caso di Linux questo è fatto
utilizzando direttamente il timer del kernel.} e sia utilizzabile senza
\end{errlist}}
\end{prototype}
Lo standard richiede che la funzione sia implementata in maniera del tutto
indipendente da \func{alarm}\footnote{nel caso di Linux questo è fatto
utilizzando direttamente il timer del kernel.} e sia utilizzabile senza
delle strutture di tipo \var{timespec}, la cui definizione è riportata in
\figref{fig:sys_timeval_struct}, che permettono di specificare un tempo con
una precisione (teorica) fino al nanosecondo.
delle strutture di tipo \var{timespec}, la cui definizione è riportata in
\figref{fig:sys_timeval_struct}, che permettono di specificare un tempo con
una precisione (teorica) fino al nanosecondo.
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
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 e cioè un tempo che
-a seconda dei casi può arrivare fino a 1/\macro{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/\macro{HZ}.
+occorrerà almeno attendere il successivo giro di scheduler\index{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}.
\secref{sec:proc_termination} che una delle azioni eseguite dal kernel alla
conclusione di un processo è quella di inviare questo segnale al
padre.\footnote{in realtà in SVr4 eredita la semantica di System V, in cui il
\secref{sec:proc_termination} che una delle azioni eseguite dal kernel alla
conclusione di un processo è quella di inviare questo segnale al
padre.\footnote{in realtà in SVr4 eredita la semantica di System V, in cui il
segnale non viene generato ed il sistema non genera zombie (lo stato di
terminazione viene scartato senza dover chiamare una \func{wait}). L'azione
predefinita è sempre quella di ignorare il segnale, ma non attiva questo
comportamento. Linux, come BSD e POSIX, non supporta questa semantica ed usa
segnale non viene generato ed il sistema non genera zombie (lo stato di
terminazione viene scartato senza dover chiamare una \func{wait}). L'azione
predefinita è sempre quella di ignorare il segnale, ma non attiva questo
comportamento. Linux, come BSD e POSIX, non supporta questa semantica ed usa
dunque, quando non interessa elaborare lo stato di uscita di un processo, si
può completare la gestione della terminazione installando un gestore per
dunque, quando non interessa elaborare lo stato di uscita di un processo, si
può completare la gestione della terminazione installando un gestore per
-implementazione generica di una routine di gestione per \macro{SIGCHLD}, (che
-si trova nei sorgenti allegati nel file \file{HandSIGCHLD.c}); se ripetiamo i
-test di \secref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione
+implementazione generica di una routine di gestione per \const{SIGCHLD}, (che
+si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i test
+di \secref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione
che molti processi figli terminino in rapida successione. Esso inoltre si
presenta tutte le volte che un segnale viene bloccato: per quanti siano i
segnali emessi durante il periodo di blocco, una volta che quest'ultimo sarà
che molti processi figli terminino in rapida successione. Esso inoltre si
presenta tutte le volte che un segnale viene bloccato: per quanti siano i
segnali emessi durante il periodo di blocco, una volta che quest'ultimo sarà
ritorni un valore nullo, segno che non resta nessun processo di cui si debba
ancora ricevere lo stato di terminazione (si veda \secref{sec:proc_wait} per
la sintassi della funzione). Si noti anche come la funzione venga invocata con
ritorni un valore nullo, segno che non resta nessun processo di cui si debba
ancora ricevere lo stato di terminazione (si veda \secref{sec:proc_wait} per
la sintassi della funzione). Si noti anche come la funzione venga invocata con
nostra implementazione di sarà quello di installare il relativo gestore
salvando il precedente (\texttt{\small 14-17}). Si effettuerà poi una
chiamata ad \func{alarm} per specificare il tempo d'attesa per l'invio del
nostra implementazione di sarà quello di installare il relativo gestore
salvando il precedente (\texttt{\small 14-17}). Si effettuerà poi una
chiamata ad \func{alarm} per specificare il tempo d'attesa per l'invio del
processo viene interrotto fra la chiamata di \func{alarm} e \func{pause} può
capitare (ad esempio se il sistema è molto carico) che il tempo di attesa
scada prima dell'esecuzione quest'ultima, cosicché essa sarebbe eseguita dopo
processo viene interrotto fra la chiamata di \func{alarm} e \func{pause} può
capitare (ad esempio se il sistema è molto carico) che il tempo di attesa
scada prima dell'esecuzione quest'ultima, cosicché essa sarebbe eseguita dopo
\bodydesc{Le prime quattro funzioni ritornano 0 in caso di successo, mentre
\func{sigismember} ritorna 1 se \param{signum} è in \param{set} e 0
altrimenti. In caso di errore tutte ritornano -1, con \var{errno}
\bodydesc{Le prime quattro funzioni ritornano 0 in caso di successo, mentre
\func{sigismember} ritorna 1 se \param{signum} è in \param{set} e 0
altrimenti. In caso di errore tutte ritornano -1, con \var{errno}
- \item[\macro{EINVAL}] Si è specificato un numero di segnale invalido o si è
- cercato di installare il gestore per \macro{SIGKILL} o
- \macro{SIGSTOP}.
- \item[\macro{EFAULT}] Si sono specificati indirizzi non validi.
+ \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido o si è
+ cercato di installare il gestore per \const{SIGKILL} o
+ \const{SIGSTOP}.
+ \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi.
\secref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di
allarme avesse interrotto un altro gestore questo non sarebbe stato
eseguito correttamente; la cosa poteva essere prevenuta installando gli altri
\secref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di
allarme avesse interrotto un altro gestore questo non sarebbe stato
eseguito correttamente; la cosa poteva essere prevenuta installando gli altri
loro esecuzione. Il valore di \var{sa\_flag} permette di specificare vari
aspetti del comportamento di \func{sigaction}, e della reazione del processo
ai vari segnali; i valori possibili ed il relativo significato sono riportati
loro esecuzione. Il valore di \var{sa\_flag} permette di specificare vari
aspetti del comportamento di \func{sigaction}, e della reazione del processo
ai vari segnali; i valori possibili ed il relativo significato sono riportati
- fermato da uno dei segnali \macro{SIGSTOP},
- \macro{SIGTSTP}, \macro{SIGTTIN} o
- \macro{SIGTTOU}.\\
- \macro{SA\_ONESHOT} & Ristabilisce l'azione per il segnale al valore
+ fermato da uno dei segnali \const{SIGSTOP},
+ \const{SIGTSTP}, \const{SIGTTIN} o
+ \const{SIGTTOU}.\\
+ \const{SA\_ONESHOT} & Ristabilisce l'azione per il segnale al valore
predefinito una volta che il gestore è stato
lanciato, riproduce cioè il comportamento della
semantica inaffidabile.\\
predefinito una volta che il gestore è stato
lanciato, riproduce cioè il comportamento della
semantica inaffidabile.\\
ottenere alcune informazioni addizionali usando \var{sa\_handler} con un
secondo parametro addizionale di tipo \var{struct sigcontext}, che adesso è
deprecato.} di utilizzare due forme diverse di gestore, da
ottenere alcune informazioni addizionali usando \var{sa\_handler} con un
secondo parametro addizionale di tipo \var{struct sigcontext}, che adesso è
deprecato.} di utilizzare due forme diverse di gestore, da
rispettivamente attraverso i campi \var{sa\_sigaction} o \var{sa\_handler},
(che devono essere usati in maniera alternativa, in certe implementazioni
questi vengono addirittura definiti come \ctyp{union}): la prima è quella
rispettivamente attraverso i campi \var{sa\_sigaction} o \var{sa\_handler},
(che devono essere usati in maniera alternativa, in certe implementazioni
questi vengono addirittura definiti come \ctyp{union}): la prima è quella
real-time e per tutti quelli inviati tramite \func{kill}, informazioni circa
l'origine del segnale (se generato dal kernel, da un timer, da \func{kill},
ecc.). Alcuni segnali però usano \var{si\_code} per fornire una informazione
real-time e per tutti quelli inviati tramite \func{kill}, informazioni circa
l'origine del segnale (se generato dal kernel, da un timer, da \func{kill},
ecc.). Alcuni segnali però usano \var{si\_code} per fornire una informazione
-specifica: ad esempio i vari segnali di errore (\macro{SIGFPE},
-\macro{SIGILL}, \macro{SIGBUS} e \macro{SIGSEGV}) lo usano per fornire
+specifica: ad esempio i vari segnali di errore (\const{SIGFPE},
+\const{SIGILL}, \const{SIGBUS} e \const{SIGSEGV}) lo usano per fornire
altre informazioni speecifiche. In tutti i casi il valore del campo è
riportato attraverso delle costanti (le cui definizioni si trovano
\file{bits/siginfo.h}) il cui elenco dettagliato è disponibile nella pagina di
manuale di di \func{sigaction}.
Il resto della struttura è definito come \ctyp{union} ed i valori
altre informazioni speecifiche. In tutti i casi il valore del campo è
riportato attraverso delle costanti (le cui definizioni si trovano
\file{bits/siginfo.h}) il cui elenco dettagliato è disponibile nella pagina di
manuale di di \func{sigaction}.
Il resto della struttura è definito come \ctyp{union} ed i valori
-al processo che ha emesso il segnale, \macro{SIGILL}, \macro{SIGFPE},
-\macro{SIGSEGV} e \macro{SIGBUS} avvalorano \var{si\_addr} con l'indirizzo cui
-è avvenuto l'errore, \macro{SIGIO} (vedi \secref{sec:file_asyncronous_io})
+al processo che ha emesso il segnale, \const{SIGILL}, \const{SIGFPE},
+\const{SIGSEGV} e \const{SIGBUS} avvalorano \var{si\_addr} con l'indirizzo cui
+è avvenuto l'errore, \const{SIGIO} (vedi \secref{sec:file_asyncronous_io})
Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata
che abbia le stesse caratteristiche di \func{signal}, a definire una funzione
equivalente attraverso \func{sigaction}; la funzione è \code{Signal}, e si
Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata
che abbia le stesse caratteristiche di \func{signal}, a definire una funzione
equivalente attraverso \func{sigaction}; la funzione è \code{Signal}, e si
-permettono si bloccare temporaneamente (o di eliminare completamente, impostando
-\macro{SIG\_IGN} come azione) la consegna dei segnali ad un processo. Questo è
-fatto specificando la cosiddetta \textsl{maschera dei segnali} (o
-\textit{signal mask}) del processo\footnote{nel caso di Linux essa è mantenuta
- dal campo \var{blocked} della \var{task\_struct} del processo.} cioè
-l'insieme dei segnali la cui consegna è bloccata. Abbiamo accennato in
-\secref{sec:proc_fork} che la \textit{signal mask} viene ereditata dal padre
-alla creazione di un processo figlio, e abbiamo visto al paragrafo precedente
-che essa può essere modificata, durante l'esecuzione di un gestore,
-attraverso l'uso dal campo \var{sa\_mask} di \var{sigaction}.
+permettono si bloccare temporaneamente (o di eliminare completamente,
+impostando \const{SIG\_IGN} come azione) la consegna dei segnali ad un
+processo. Questo è fatto specificando la cosiddetta \textsl{maschera dei
+ segnali} (o \textit{signal mask}) del processo\footnote{nel caso di Linux
+ essa è mantenuta dal campo \var{blocked} della \var{task\_struct} del
+ processo.} cioè l'insieme dei segnali la cui consegna è bloccata. Abbiamo
+accennato in \secref{sec:proc_fork} che la \textit{signal mask} viene
+ereditata dal padre alla creazione di un processo figlio, e abbiamo visto al
+paragrafo precedente che essa può essere modificata, durante l'esecuzione di
+un gestore, attraverso l'uso dal campo \var{sa\_mask} di \var{sigaction}.
\end{errlist}}
\end{prototype}
Come esempio dell'uso di queste funzioni proviamo a riscrivere un'altra volta
l'esempio di implementazione di \code{sleep}. Abbiamo accennato in
\secref{sec:sig_sigaction} come con \func{sigaction} sia possibile bloccare
\end{errlist}}
\end{prototype}
Come esempio dell'uso di queste funzioni proviamo a riscrivere un'altra volta
l'esempio di implementazione di \code{sleep}. Abbiamo accennato in
\secref{sec:sig_sigaction} come con \func{sigaction} sia possibile bloccare
poter usare l'implementazione vista in \secref{fig:sig_sleep_incomplete} senza
interferenze. Questo però comporta una precauzione ulteriore al semplice uso
della funzione, vediamo allora come usando la nuova interfaccia è possibile
poter usare l'implementazione vista in \secref{fig:sig_sleep_incomplete} senza
interferenze. Questo però comporta una precauzione ulteriore al semplice uso
della funzione, vediamo allora come usando la nuova interfaccia è possibile
evitare che esso possa essere ricevuto dal processo fra l'esecuzione di
\func{alarm} (\texttt{\small 21}) e la sospensione dello stesso. Nel fare
questo si salva la maschera corrente dei segnali, che sarà ripristinata alla
fine (\texttt{\small 27}), e al contempo si prepara la maschera dei segnali
evitare che esso possa essere ricevuto dal processo fra l'esecuzione di
\func{alarm} (\texttt{\small 21}) e la sospensione dello stesso. Nel fare
questo si salva la maschera corrente dei segnali, che sarà ripristinata alla
fine (\texttt{\small 27}), e al contempo si prepara la maschera dei segnali
chiamata di \func{sigsuspend}. Questo metodo è assolutamente generale e può
essere applicato a qualunque altra situazione in cui si deve attendere per un
segnale, i passi sono sempre i seguenti:
chiamata di \func{sigsuspend}. Questo metodo è assolutamente generale e può
essere applicato a qualunque altra situazione in cui si deve attendere per un
segnale, i passi sono sempre i seguenti:
\item Usare la funzione \func{sigaltstack} per rendere noto al sistema
l'esistenza e la locazione dello stack alternativo.
\item Quando si installa un gestore occorre usare \func{sigaction}
\item Usare la funzione \func{sigaltstack} per rendere noto al sistema
l'esistenza e la locazione dello stack alternativo.
\item Quando si installa un gestore occorre usare \func{sigaction}
dire al sistema di usare lo stack alternativo durante l'esecuzione del
gestore.
\end{enumerate*}
In genere il primo passo viene effettuato allocando un'opportuna area di
memoria con \code{malloc}; in \file{signal.h} sono definite due costanti,
dire al sistema di usare lo stack alternativo durante l'esecuzione del
gestore.
\end{enumerate*}
In genere il primo passo viene effettuato allocando un'opportuna area di
memoria con \code{malloc}; in \file{signal.h} sono definite due costanti,
allocare una quantità di spazio opportuna, in modo da evitare overflow. La
prima delle due è la dimensione canonica per uno stack di segnali e di norma è
sufficiente per tutti gli usi normali. La seconda è lo spazio che occorre al
allocare una quantità di spazio opportuna, in modo da evitare overflow. La
prima delle due è la dimensione canonica per uno stack di segnali e di norma è
sufficiente per tutti gli usi normali. La seconda è lo spazio che occorre al
- \item[\macro{ENOMEM}] La dimensione specificata per il nuovo stack è minore
- di \macro{MINSIGSTKSZ}.
- \item[\macro{EPERM}] Uno degli indirizzi non è valido.
- \item[\macro{EFAULT}] Si è cercato di cambiare lo stack alternativo mentre
+ \item[\errcode{ENOMEM}] La dimensione specificata per il nuovo stack è minore
+ di \const{MINSIGSTKSZ}.
+ \item[\errcode{EPERM}] Uno degli indirizzi non è valido.
+ \item[\errcode{EFAULT}] Si è cercato di cambiare lo stack alternativo mentre
inizializzare \var{ss\_sp} e \var{ss\_size} rispettivamente al puntatore e
alla dimensione della memoria allocata, mentre \var{ss\_flags} deve essere
nullo. Se invece si vuole disabilitare uno stack occorre indicare
inizializzare \var{ss\_sp} e \var{ss\_size} rispettivamente al puntatore e
alla dimensione della memoria allocata, mentre \var{ss\_flags} deve essere
nullo. Se invece si vuole disabilitare uno stack occorre indicare
In genere si installa uno stack alternativo per i segnali quando si teme di
avere problemi di esaurimento dello stack standard o di superamento di un
limite imposto con chiamata de tipo \code{setrlimit(RLIMIT\_STACK, \&rlim)}.
In genere si installa uno stack alternativo per i segnali quando si teme di
avere problemi di esaurimento dello stack standard o di superamento di un
limite imposto con chiamata de tipo \code{setrlimit(RLIMIT\_STACK, \&rlim)}.
Queste nuove caratteristiche (eccetto l'ultima, che, come visto in
\secref{sec:sig_sigaction}, è parzialmente disponibile anche con i segnali
ordinari) si applicano solo ai nuovi segnali real-time; questi ultimi sono
Queste nuove caratteristiche (eccetto l'ultima, che, come visto in
\secref{sec:sig_sigaction}, è parzialmente disponibile anche con i segnali
ordinari) si applicano solo ai nuovi segnali real-time; questi ultimi sono
-accessibili in un range di valori specificati dalle due macro \macro{SIGRTMIN}
-e \macro{SIGRTMAX},\footnote{in Linux di solito il primo valore è 32, ed il
+accessibili in un range di valori specificati dalle due macro \const{SIGRTMIN}
+e \const{SIGRTMAX},\footnote{in Linux di solito il primo valore è 32, ed il
secondo \code{\_NSIG-1}, che di norma è 63, per un totale di 32 segnali
disponibili, contro gli almeno 8 richiesti da POSIX.1b.} che specificano il
numero minimo e massimo associato ad un segnale real-time.
secondo \code{\_NSIG-1}, che di norma è 63, per un totale di 32 segnali
disponibili, contro gli almeno 8 richiesti da POSIX.1b.} che specificano il
numero minimo e massimo associato ad un segnale real-time.
quanto inviato con \param{value}. Se invece si è installato un gestore
nella forma classica il segnale sarà generato, ma tutte le caratteristiche
tipiche dei segnali real-time (priorità e coda) saranno perse.
quanto inviato con \param{value}. Se invece si è installato un gestore
nella forma classica il segnale sarà generato, ma tutte le caratteristiche
tipiche dei segnali real-time (priorità e coda) saranno perse.
errore, nel qual caso \var{errno} assumerà uno dei valori già visti per
\func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}:
\begin{errlist}
errore, nel qual caso \var{errno} assumerà uno dei valori già visti per
\func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}:
\begin{errlist}