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
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}).
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}).
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.
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
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.
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\index{scheduler} e
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\index{scheduler} e
\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
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
\cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come
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
\cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come
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})
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. 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
\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}