X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=b43af0a7455f22ae80e4f194f002fac96f340aec;hp=63a940027b3d5c027e23e0f5d23bbfa596701d1a;hb=HEAD;hpb=f21f63518fb77f32a2474564e1a3c2f4c32cccd4 diff --git a/signal.tex b/signal.tex index 63a9400..7b6cb8e 100644 --- a/signal.tex +++ b/signal.tex @@ -1,6 +1,6 @@ %% signal.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2024 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", @@ -2594,12 +2594,16 @@ prototipo è: {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EFAULT}] si sono specificati indirizzi non validi. - \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido. + \item[\errcode{EFAULT}] l'indirizzo di \param{mask} non è valido. + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. \end{errlist} } \end{funcproto} +La funzione imposta la maschera dei segnali indicata da \param{mask} e pone in +attesa il processo. Ritorna solo con la ricezione di un segnale, con un errore +di \errval{EINTR}, a meno che il segnale non termini il processo. + Come esempio dell'uso di queste funzioni proviamo a riscrivere un'altra volta l'esempio di implementazione di \code{sleep}. Abbiamo accennato in sez.~\ref{sec:sig_sigaction} come con \func{sigaction} sia possibile bloccare @@ -3017,11 +3021,10 @@ prima di queste è \funcd{sigwait}, il cui prototipo è: \fdecl{int sigwait(const sigset\_t *set, int *sig)} \fdesc{Attende la ricezione di un segnale.} } -{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual - caso \var{errno} assumerà uno dei valori: +{La funzione ritorna $0$ in caso di successo ed un valore positivo in caso di + errore con valore secondo la lista seguente: \begin{errlist} - \item[\errcode{EINTR}] la funzione è stata interrotta. - \item[\errcode{EINVAL}] si è specificato un valore non valido per + \item[\errcode{EINVAL}] \param{set} contiene un numero di segnale non valido \end{errlist} ed inoltre \errval{EFAULT} nel suo significato generico.} \end{funcproto} @@ -3095,14 +3098,6 @@ che venga eseguita l'azione predefinita, devono essere mascherati per tutti i \textit{thread}, compreso quello dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive. -Come esempio elementare dell'uso dei segnali \textit{real-time}, e della -possibilità di inviare informazioni al gestore degli stessi con -\func{sigqueue}, si è riportato in fig.~\ref{fig:sig_rtsival_main} il corpo -principale di un programma elementare che legge dal terminale un valore -numerico, ed utilizza un segnale \textit{real-time} per inviarlo al gestore -dello stesso. Si sono trascurati i controlli dei valori di ritorno delle varie -funzioni per brevità. - \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{\codesamplewidth} @@ -3114,11 +3109,19 @@ funzioni per brevità. \label{fig:sig_rtsival_main} \end{figure} +Come esempio elementare dell'uso dei segnali \textit{real-time}, e della +possibilità di inviare informazioni al gestore degli stessi con +\func{sigqueue}, si è riportato in fig.~\ref{fig:sig_rtsival_main} il corpo +principale di un programma elementare che legge dal terminale un valore +numerico, ed utilizza un segnale \textit{real-time} per inviarlo al gestore +dello stesso. Nel codice sono stati trascurati i controlli dei valori di +ritorno delle varie funzioni per mantenere la brevità dell'esempio. + Dopo aver definito (\texttt{\small 5}) una variabile \var{value} di tipo -\type{sigval\_t} per inviare i dati, ed aver opportunamente scelto +\type{sigval\_t} per poter inviare i dati, e dopo aver opportunamente scelto (\texttt{\small 6}) per \var{signo} un segnale \textit{real-time}, la parte iniziale del programma (\texttt{\small 8--11}) installa il relativo gestore -(la cui definizione è riportata in fig.~\ref{fig:sig_rtsival_handl}), dopo di +(la cui definizione è riportata in fig.~\ref{fig:sig_rtsival_handl}). Dopo di che il programma si pone in un ciclo infinito (\texttt{\small 14--27}) in cui prima (\texttt{\small 15--20}) legge in buffer dallo \textit{standard input} una stringa immessa dall'utente, terminandola opportunamente (\texttt{\small @@ -3128,6 +3131,10 @@ conversione ha successo e \texttt{value.sival\_int} è positivo) invia a se stesso (\texttt{\small 23}) il segnale \textit{real-time}, altrimenti stampa un avviso (\texttt{\small 24}). +Alla ricezione del segnale il gestore si limita a stampare alcune delle +informazioni ricevute nella struttura \struct{sigval\_t}, ed in particolare +(\texttt{\small 5}) stampa tramite il valore del campo \var{si\_value} il +numero che gli è stato inviato da \func{sigqueue}. \begin{figure}[!htb] \footnotesize \centering @@ -3135,14 +3142,12 @@ un avviso (\texttt{\small 24}). \includecodesample{listati/rtsigvalsend_handl.c} \end{minipage} \normalsize - \caption{Codice del gestore.} + \caption{Codice del gestore usato dal programma di + fig.~\ref{fig:sig_rtsival_main}.} \label{fig:sig_rtsival_handl} \end{figure} - - - \subsection{La gestione avanzata delle temporizzazioni} \label{sec:sig_timer_adv} @@ -3191,20 +3196,6 @@ alta definizione però erano già presenti, essendo stata introdotte insieme ad altre funzioni per il supporto delle estensioni \textit{real-time} con il rilascio del kernel 2.6, ma la risoluzione effettiva era nominale. -A tutte le implementazioni che si rifanno a queste estensioni è richiesto di -disporre di una versione \textit{real-time} almeno per l'orologio generale di -sistema, quello che mantiene il \textit{calendar time} (vedi -sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di -secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The - Epoch}). Si ricordi infatti che l'orologio ordinario usato dal -\textit{calendar time} riporta solo un numero di secondi, e che la risoluzione -effettiva normalmente non raggiunge il nanosecondo (a meno di hardware -specializzato). Oltre all'orologio generale di sistema possono essere -presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali viene -identificato da un opportuno valore di una variabile di tipo -\type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in -tab.~\ref{tab:sig_timer_clockid_types}. - \begin{table}[htb] \footnotesize \centering @@ -3262,6 +3253,19 @@ tab.~\ref{tab:sig_timer_clockid_types}. \label{tab:sig_timer_clockid_types} \end{table} +A tutte le implementazioni che si rifanno a queste estensioni è richiesto di +disporre di una versione \textit{real-time} almeno per l'orologio generale di +sistema, quello che mantiene il \textit{calendar time} (vedi +sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di +secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The + Epoch}). Si ricordi infatti che l'orologio ordinario usato dal +\textit{calendar time} riporta solo un numero di secondi, e che la risoluzione +effettiva normalmente non raggiunge il nanosecondo (a meno di hardware +specializzato). Oltre all'orologio generale di sistema possono essere +presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali viene +identificato da un opportuno valore di una variabile di tipo +\type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in +tab.~\ref{tab:sig_timer_clockid_types}. % TODO: dal 4.17 CLOCK_MONOTONIC e CLOCK_BOOTTIME sono identici vedi % https://lwn.net/Articles/751651/ e @@ -3331,17 +3335,17 @@ stata inizializzata con il valore che si vuole impostare sull'orologio, mentre per \func{clock\_gettime} verrà restituito al suo interno il valore corrente dello stesso. -Si tenga presente inoltre che per eseguire un cambiamento sull'orologio -generale di sistema \const{CLOCK\_REALTIME} occorrono i privilegi -amministrativi;\footnote{ed in particolare la \textit{capability} - \const{CAP\_SYS\_TIME}.} inoltre ogni cambiamento ad esso apportato non avrà -nessun effetto sulle temporizzazioni effettuate in forma relativa, come quelle -impostate sulle quantità di \textit{process time} o per un intervallo di tempo -da trascorrere, ma solo su quelle che hanno richiesto una temporizzazione ad -un istante preciso (in termini di \textit{calendar time}). Si tenga inoltre -presente che nel caso di Linux \const{CLOCK\_REALTIME} è l'unico orologio per -cui si può effettuare una modifica, infatti nonostante lo standard preveda la -possibilità di modifiche anche per \const{CLOCK\_PROCESS\_CPUTIME\_ID} e +Per eseguire un cambiamento sull'orologio generale di sistema +\const{CLOCK\_REALTIME} occorrono i privilegi amministrativi;\footnote{ed in + particolare la \textit{capability} \const{CAP\_SYS\_TIME}.} e che ogni +cambiamento ad esso apportato non avrà nessun effetto sulle temporizzazioni +effettuate in forma relativa, come quelle impostate sulle quantità di +\textit{process time} o per un intervallo di tempo da trascorrere, ma solo su +quelle che hanno richiesto una temporizzazione ad un istante preciso (in +termini di \textit{calendar time}). Si tenga inoltre presente che nel caso di +Linux \const{CLOCK\_REALTIME} è l'unico orologio per cui si può effettuare una +modifica, infatti nonostante lo standard preveda la possibilità di modifiche +anche per \const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID}, il kernel non le consente. Oltre alle due funzioni precedenti, lo standard POSIX prevede una terza @@ -3377,16 +3381,15 @@ voglia utilizzare nelle funzioni di impostazione che non corrisponda ad un multiplo intero di questa risoluzione, sarà troncato in maniera automatica. Gli orologi elencati nella seconda sezione di -tab.~\ref{tab:sig_timer_clockid_types} sono delle estensioni specifiche di -Linux, create per rispondere ad alcune esigenze specifiche, come quella di -tener conto di eventuali periodi di sospensione del sistema, e presenti solo -nelle versioni più recenti del kernel. In particolare gli ultimi due, -contraddistinti dal suffisso \texttt{\_ALARM}, hanno un impiego particolare, -derivato dalle esigenze emerse con Android per l'uso di Linux sui cellulari, -che consente di creare timer che possono scattare, riattivando il sistema, -anche quando questo è in sospensione. Per il loro utilizzo è prevista la -necessità di una capacità specifica, \const{CAP\_WAKE\_ALARM} (vedi -sez.~\ref{sec:proc_capabilities}). +tab.~\ref{tab:sig_timer_clockid_types} sono estensioni specifiche di Linux +presenti solo nelle versioni più recenti del kernel, create per rispondere ad +alcune esigenze specifiche come quella di tener conto di eventuali periodi di +sospensione del sistema. In particolare gli ultimi due, contraddistinti dal +suffisso \texttt{\_ALARM}, hanno un impiego particolare derivato dalle +esigenze emerse con Android per l'uso di Linux sui cellulari, che consente di +creare timer che possono scattare, riattivando il sistema, anche quando questo +è in sospensione. Per il loro utilizzo è prevista la necessità di una capacità +specifica, \const{CAP\_WAKE\_ALARM} (vedi sez.~\ref{sec:proc_capabilities}). Si tenga presente inoltre che con l'introduzione degli \textit{high resolution timer} i due orologi \const{CLOCK\_PROCESS\_CPUTIME\_ID} e @@ -3888,10 +3891,10 @@ anch'essa introdotta dallo standard POSIX.1, il suo prototipo è: La funzione permette di ricavare quali sono i segnali pendenti per il processo in corso, cioè i segnali che sono stati inviati dal kernel ma non sono stati ancora ricevuti dal processo in quanto bloccati. Non esiste una funzione -equivalente nella vecchia interfaccia, ma essa è tutto sommato poco utile, -dato che essa può solo assicurare che un segnale è stato inviato, dato che -escluderne l'avvenuto invio al momento della chiamata non significa nulla -rispetto a quanto potrebbe essere in un qualunque momento successivo. +equivalente nella vecchia interfaccia, ma essa, potendo solo assicurare che un +segnale è stato inviato, è tutto sommato poco utile dato che escluderne +l'avvenuto invio al momento della chiamata non significa nulla rispetto a +quanto potrebbe accadere in un qualunque momento successivo. Una delle caratteristiche di BSD, disponibile anche in Linux, è la possibilità di usare uno \textit{stack} alternativo per i segnali; è cioè possibile fare