From 72713a0d002a46946092d2168e4ea6203698fa41 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 28 Mar 2021 17:01:13 +0200 Subject: [PATCH 01/16] Aggiunta di nuovi valori per si_code --- procadv.tex | 5 ++--- signal.tex | 58 +++++++++++++++++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/procadv.tex b/procadv.tex index fa799fb..53eb58a 100644 --- a/procadv.tex +++ b/procadv.tex @@ -1322,8 +1322,6 @@ funzione. - - \subsection{La gestione del \textit{Secure Computing}.} \label{sec:procadv_seccomp} @@ -1564,7 +1562,8 @@ all'ordinario valore nullo (dato per implicito). %TODO: trattare PR_CAP_AMBIENT, dal 4.3 %TODO: trattare PR_CAP_FP_*, dal 4.0, solo per MIPS -%TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19 +%TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19, vedi +% https://lwn.net/Articles/582712/ %TODO: trattare PR_*NO_NEW_PRIVS, dal 3.5 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} diff --git a/signal.tex b/signal.tex index 08f7b8d..d1e2d57 100644 --- a/signal.tex +++ b/signal.tex @@ -2151,23 +2151,24 @@ tab.~\ref{tab:sig_sa_flag}. Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x - con l'introduzione dei segnali \textit{real-time} (vedi + con l'itroduzione dei segnali \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune informazioni addizionali usando \var{sa\_handler} con un secondo parametro addizionale di tipo \var{sigcontext}, che adesso è deprecato.} da -specificare, a seconda dell'uso o meno del flag \const{SA\_SIGINFO}, -rispettivamente attraverso i campi \var{sa\_sigaction} o \var{sa\_handler}. -Quest'ultima è quella classica usata anche con \func{signal}, mentre la prima -permette di usare un gestore più complesso, in grado di ricevere informazioni -più dettagliate dal sistema, attraverso la struttura \struct{siginfo\_t}, -riportata in fig.~\ref{fig:sig_siginfo_t}. I due campi devono essere usati in -maniera alternativa, in certe implementazioni questi campi vengono addirittura +specificare rispettivamente attraverso i campi \var{sa\_sigaction} o +\var{sa\_handler}, a seconda dell'uso o meno del flag \const{SA\_SIGINFO}. La +forma con \var{sa\_handler} è quella classica usata anche con \func{signal}, +mentre quella con \var{sa\_sigaction} permette di usare un gestore più +complesso, in grado di ricevere informazioni più dettagliate dal sistema +attraverso la struttura \struct{siginfo\_t}, riportata in +fig.~\ref{fig:sig_siginfo_t}. I due campi devono essere usati in maniera +alternativa, in certe implementazioni questi campi vengono addirittura definiti come una \direct{union}.\footnote{la direttiva \direct{union} del linguaggio C definisce una variabile complessa, analoga a una stuttura, i cui campi indicano i diversi tipi di valori che possono essere salvati, in maniera alternativa, all'interno della stessa.} -Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile +Installando un gestore di tipo \var{sa\_sigaction} diventa possibile accedere alle informazioni restituite attraverso il puntatore a questa struttura. Tutti i segnali impostano i campi \var{si\_signo}, che riporta il numero del segnale ricevuto, \var{si\_errno}, che riporta, quando diverso da @@ -2188,10 +2189,11 @@ causato l'emissione del segnale. In generale \var{si\_code} contiene, per i segnali generici, per quelli \textit{real-time} e per tutti quelli inviati tramite da un processo con \func{kill} o affini, le informazioni circa l'origine del segnale stesso, ad -esempio se generato dal kernel, da un timer, da \func{kill}, ecc. Il valore -viene sempre espresso come una costante,\footnote{le definizioni di tutti i - valori possibili si trovano in \file{bits/siginfo.h}.} ed i valori possibili -in questo caso sono riportati in tab.~\ref{tab:sig_si_code_generic}. +esempio se generato dal kernel, da un timer, da \func{kill}, ecc. Il valore di +\var{si\_code} viene sempre espresso come una costante,\footnote{le + definizioni di tutti i valori possibili si trovano in + \file{bits/siginfo.h}.} ed i valori possibili in questo caso sono riportati +in tab.~\ref{tab:sig_si_code_generic}. \begin{table}[!htb] \footnotesize @@ -2234,7 +2236,6 @@ istruzione illecita o di violazione di memoria; mentre alcuni segnali di controllo (\signal{SIGCHLD}, \signal{SIGTRAP} e \signal{SIGPOLL}) forniscono altre informazioni specifiche. - In questo caso il valore del campo \var{si\_code} deve essere verificato nei confronti delle diverse costanti previste per ciascuno di detti segnali; dato che si tratta di costanti, e non di una maschera binaria, i valori numerici @@ -2250,7 +2251,7 @@ riferimento. \begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|p{8cm}|} + \begin{tabular}[c]{|l|p{10cm}|} \hline \textbf{Valore} & \textbf{Significato} \\ \hline @@ -2275,20 +2276,34 @@ riferimento. \hline \constd{SEGV\_MAPERR} & Indirizzo non mappato.\\ \constd{SEGV\_ACCERR} & Permessi non validi per l'indirizzo.\\ + \constd{SEGV\_BNDERR} & Controllo sui limiti di accesso (via MPX) fallito + (dal 3.19).\\ + \constd{SEGV\_PKUERR} & Accesso negato da una protezione della memoria, + vedi sez.~\ref{sec:procadv_security_misc} (dal + 4.6).\\ \hline \constd{BUS\_ADRALN} & Allineamento dell'indirizzo non valido.\\ \constd{BUS\_ADRERR} & Indirizzo fisico inesistente.\\ - \constd{BUS\_OBJERR} & Errore hardware sull'indirizzo.\\ + \constd{BUS\_OBJERR} & Errore hardware specifico sull'indirizzo.\\ + \constd{BUS\_MCEERR\_AR}& Rilevata corruzione sulla memoria utilizzata + direttamente dal processo è richiesta un'azione.\\ + \constd{BUS\_MCEERR\_AO}& Rilevata corruzione sulla memoria su memoria non + utilizzata direttamente dal processo, l'azione + è opzionale.\\ + % https://lore.kernel.org/patchwork/patch/158250/ \hline \constd{TRAP\_BRKPT} & Breakpoint sul processo.\\ \constd{TRAP\_TRACE} & Trappola di tracciamento del processo.\\ + \constd{TRAP\_BRANCH} & Il processo ha preso una branch trap.\\ + % https://stackoverflow.com/questions/45895234/what-is-process-branch-trap + \constd{TRAP\_HWBKPT} & Breakpoint/watchpoint hardware.\\ \hline \constd{CLD\_EXITED} & Il figlio è uscito.\\ \constd{CLD\_KILLED} & Il figlio è stato terminato.\\ \constd{CLD\_DUMPED} & Il figlio è terminato in modo anormale.\\ \constd{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\ \constd{CLD\_STOPPED} & Il figlio è stato fermato.\\ - \constd{CLD\_CONTINUED}& Il figlio è ripartito.\\ + \constd{CLD\_CONTINUED}& Il figlio è ripartito (dal 2.6.9).\\ \hline \constd{POLL\_IN} & Disponibili dati in ingresso.\\ \constd{POLL\_OUT} & Spazio disponibile sul buffer di uscita.\\ @@ -2297,11 +2312,14 @@ riferimento. \constd{POLL\_PRI} & Disponibili dati di alta priorità in ingresso.\\ \constd{POLL\_HUP} & Il dispositivo è stato disconnesso.\\ \hline + \constd{SYS\_SECCOMP}& Innescato da una regola di \func{seccomp}, vedi + sez.~\ref{sec:procadv_seccomp} (dal 3.5).\\ + \hline \end{tabular} \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction} impostati rispettivamente dai segnali \signal{SIGILL}, \signal{SIGFPE}, - \signal{SIGSEGV}, \signal{SIGBUS}, \signal{SIGCHLD}, \signal{SIGTRAP} e - \signal{SIGPOLL}/\signal{SIGIO}.} + \signal{SIGSEGV}, \signal{SIGBUS}, \signal{SIGCHLD}, \signal{SIGTRAP}, + \signal{SIGPOLL}/\signal{SIGIO} e \signal{SIGSYS}.} \label{tab:sig_si_code_special} \end{table} @@ -2508,7 +2526,7 @@ della funzione, vediamo allora come usando la nuova interfaccia è possibile ottenere un'implementazione, riportata in fig.~\ref{fig:sig_sleep_ok} che non presenta neanche questa necessità. -\begin{figure}[!htbp] +\begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/sleep.c} -- 2.30.2 From 655932aa7567d4979ffdb7b7676b4f2ec9cf9f8a Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 7 Jul 2021 09:30:13 +0200 Subject: [PATCH 02/16] Revisione sigprocmask --- signal.tex | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/signal.tex b/signal.tex index d1e2d57..2c8661e 100644 --- a/signal.tex +++ b/signal.tex @@ -2392,7 +2392,7 @@ In tal caso infatti le istruzioni per creare un nuovo frame nello del codice, appesantendo inutilmente il programma. Originariamente questo comportamento veniva ottenuto con delle macro, ma queste hanno tutta una serie di problemi di sintassi nel passaggio degli argomenti (si veda ad esempio -\cite{PratC}) che in questo modo possono essere evitati. +\cite{PratC}) che in questo modo possono essere evitati. @@ -2431,10 +2431,19 @@ quando si devono eseguire più operazioni su delle variabili (nell'esempio citato un controllo ed una assegnazione) o comunque eseguire una serie di istruzioni, l'atomicità non è più possibile. -In questo caso, se si vuole essere sicuri di non poter essere interrotti da un -segnale durante l'esecuzione di una sezione di codice, lo si può bloccare -esplicitamente modificando la maschera dei segnali del processo con la -funzione di sistema \funcd{sigprocmask}, il cui prototipo è: +In questo caso, se si vuole essere sicuri di non poter essere interrotti da +uno o più segnali durante l'esecuzione di una sezione di codice, li si possono +bloccare esplicitamente modificando la maschera dei segnali del processo +usando la funzione di sistema \funcd{sigprocmask},\footnote{in realtà quello + che viene usato normalmente è il \textit{wrapper} omonimo delle \acr{glibc} + dato che con l'introduzione dei segnali \textit{real time} nel kernel 2.2 le + dimensioni del tipo \type{sigset\_t} sono cambiate e la \textit{system call} + sottostante è diventata \funcm{rt\_sigprocmask} che richiede un quarto + argomento di tipo \ctyp{size\_t} per indicare questa dimensione; il + \textit{wrapper} maschera questi dettagli ed inoltre ignora in maniera + silente i tentativi di bloccare i segnali \textit{real time} impiegati per + la gestione dei \textit{thread} dalla \textit{Native Thread Posix Library} + (vedi sez.~\ref{sec:linux_ntpl}).} il cui prototipo è: \begin{funcproto}{ \fhead{signal.h} @@ -2457,7 +2466,8 @@ corrente. La modifica viene effettuata a seconda del valore dell'argomento \param{how}, secondo le modalità specificate in tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un valore non nullo per \param{oldset} la maschera dei segnali corrente viene salvata a -quell'indirizzo. +quell'indirizzo. Se è nullo \param{set} non viene eseguito nessun cambiamento +e si può usare la funzione per leggere la maschera corrente in \param{oldset}. \begin{table}[htb] \footnotesize @@ -2481,14 +2491,14 @@ quell'indirizzo. \label{tab:sig_procmask_how} \end{table} -In questo modo diventa possibile proteggere delle sezioni di codice bloccando -l'insieme di segnali voluto per poi riabilitarli alla fine della sezione -critica. La funzione permette di risolvere problemi come quelli mostrati in -fig.~\ref{fig:sig_event_wrong}, proteggendo la sezione fra il controllo del -flag e la sua cancellazione. La funzione può essere usata anche all'interno -di un gestore, ad esempio per riabilitare la consegna del segnale che l'ha -invocato, in questo caso però occorre ricordare che qualunque modifica alla -maschera dei segnali viene perduta al ritorno dallo stesso. +La funzione consente di proteggere delle sezioni di codice bloccando l'insieme +di segnali voluto per poi riabilitarli alla fine della sezione critica e +risolvere problemi come quelli mostrati in fig.~\ref{fig:sig_event_wrong}, +proteggendo la sezione fra il controllo del flag e la sua cancellazione. La +funzione può essere usata anche all'interno di un gestore, ad esempio per +riabilitare la consegna del segnale che l'ha invocato, in questo caso però +occorre ricordare che qualunque modifica alla maschera dei segnali viene +perduta al ritorno dallo stesso. Benché con l'uso di \func{sigprocmask} si possano risolvere la maggior parte dei casi di \textit{race condition} restano aperte alcune possibilità legate -- 2.30.2 From 8ef50c43a245c37e5018ecd1c3795cea0849b8cd Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 15 Aug 2021 16:46:10 +0200 Subject: [PATCH 03/16] Aggiornati elenchi signal safe functions --- signal.tex | 105 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 80 insertions(+), 25 deletions(-) diff --git a/signal.tex b/signal.tex index 2c8661e..c2446f1 100644 --- a/signal.tex +++ b/signal.tex @@ -2126,7 +2126,7 @@ tab.~\ref{tab:sig_sa_flag}. call} quando vengono interrotte dal suddetto segnale, riproduce cioè il comportamento standard di BSD.\\ - \constd{SA\_RESTORER} & Ad uso delle implementazioni delle liberie del C, + \constd{SA\_RESTORER} & Ad uso delle implementazioni delle librerie del C, non deve essere usato nelle applicazioni, serve ad indicare che il campo \var{sa\_restorer} contiene l'indirizzo di un cosiddetto \textit{signal @@ -2151,7 +2151,7 @@ tab.~\ref{tab:sig_sa_flag}. Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x - con l'itroduzione dei segnali \textit{real-time} (vedi + con l'introduzione dei segnali \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune informazioni addizionali usando \var{sa\_handler} con un secondo parametro addizionale di tipo \var{sigcontext}, che adesso è deprecato.} da @@ -2164,7 +2164,7 @@ attraverso la struttura \struct{siginfo\_t}, riportata in fig.~\ref{fig:sig_siginfo_t}. I due campi devono essere usati in maniera alternativa, in certe implementazioni questi campi vengono addirittura definiti come una \direct{union}.\footnote{la direttiva \direct{union} del - linguaggio C definisce una variabile complessa, analoga a una stuttura, i + linguaggio C definisce una variabile complessa, analoga a una struttura, i cui campi indicano i diversi tipi di valori che possono essere salvati, in maniera alternativa, all'interno della stessa.} @@ -2593,29 +2593,22 @@ principale, cosa che ad esempio può rendere problematico chiamare all'interno di un gestore di segnali la stessa funzione che dal segnale è stata interrotta. +Ad esempio se consideriamo le funzioni dell'I/O standard di +sez.~\ref{sec:files_std_interface} è chiaro che essendo basate sull'uso da +parte delle librerie del C di buffer e puntatori interni, che possono essere +stati aggiornati in maniera parziale alla ricezione di un segnale, questi +possono trovarsi, quando riutilizzate all'interno di un gestore, in uno stato +completamente inconsistente. + \index{funzioni!\textit{signal safe}|(} -Il concetto è comunque più generale e porta ad una distinzione fra quelle che +Il concetto è comunque generale e porta ad una distinzione fra quelle che POSIX chiama \textsl{funzioni insicure} (\textit{signal unsafe function}) e -\textsl{funzioni sicure} (o più precisamente \textit{signal safe function}). -Quando un segnale interrompe una funzione insicura ed il gestore chiama al suo -interno una funzione insicura il sistema può dare luogo ad un comportamento -indefinito, la cosa non avviene invece per le funzioni sicure. - -Tutto questo significa che la funzione che si usa come gestore di segnale deve -essere programmata con molta cura per evirare questa evenienza e che non è -possibile utilizzare al suo interno una qualunque funzione di sistema, se si -vogliono evitare questi problemi si può ricorrere soltanto all'uso delle -funzioni considerate sicure. - -L'elenco delle funzioni considerate sicure varia a seconda della -implementazione utilizzata e dello standard a cui si fa riferimento. Non è -riportata una lista specifica delle funzioni sicure per Linux, e si suppone -pertanto che siano quelle richieste dallo standard. Secondo quanto richiesto -dallo standard POSIX 1003.1 nella revisione del 2003, le ``\textit{signal safe - function}'' che possono essere chiamate anche all'interno di un gestore di -segnali sono tutte quelle della lista riportata in -fig.~\ref{fig:sig_safe_functions}. +\textsl{funzioni sicure} (o più precisamente \textit{signal safe function} o +funzioni \textit{async-signal-safe}). Quando un segnale interrompe una +funzione insicura ed il gestore chiama al suo interno una funzione insicura il +sistema può dare luogo ad un comportamento indefinito, la cosa non avviene +invece per le funzioni sicure. \begin{figure}[!htb] \footnotesize \centering @@ -2656,7 +2649,27 @@ fig.~\ref{fig:sig_safe_functions}. \label{fig:sig_safe_functions} \end{figure} -\index{funzioni!\textit{signal safe}|)} +Tutto questo significa che la funzione che si usa come gestore di segnale deve +essere programmata con molta cura per evirare questa evenienza e che non è +possibile utilizzare al suo interno una qualunque funzione di sistema o di +libreria. Oltre ovviamente ad essere rientrante rispetto all'uso di eventuali +variabili globali del programma se si vogliono evitare questi problemi +all'interno di un gestore di segnali si dovrà ricorrere soltanto all'uso delle +funzioni considerate sicure.\footnote{in realtà sarebbe possibile adottare + come approccio alternativo quello di bloccare i segnali nel programma + principale tutte le volte che questo chiama funzioni insicure o utilizza + dati globali utilizzati anche dal gestore di segnali per poi riabilitarli + una volta finito; la complessità di questo approccio lo rende però + sostanzialmente impraticabile, ed effettivamente non impraticato.} + +L'elenco delle funzioni considerate sicure varia a seconda della +implementazione utilizzata e dello standard a cui si fa riferimento. Non è +riportata una lista specifica delle funzioni di sistema sicure per Linux, e si +suppone pertanto che siano quelle richieste dallo standard. Secondo quanto +richiesto dallo standard POSIX 1003.1 nella revisione del 2003, le +``\textit{signal safe function}'' che possono essere chiamate anche +all'interno di un gestore di segnali sono tutte quelle della lista riportata +in fig.~\ref{fig:sig_safe_functions}. Lo standard POSIX.1-2004 modifica la lista di fig.~\ref{fig:sig_safe_functions} aggiungendo le funzioni \func{\_Exit} e @@ -2678,6 +2691,45 @@ ulteriori funzioni in fig.~\ref{fig:sig_safe_functions_posix_2008}. \label{fig:sig_safe_functions_posix_2008} \end{figure} +Nella successiva revisione di POSIX.1-2013 sono poi state aggiunte le +ulteriori funzioni \func{fchdir}, \func{pthread\_kill}, \func{pthread\_self}, +\func{pthread\_sigmask}. L'ultima revisione dello standard alla data della +scrittura di questa sezione è la POSIX.1-2016,\footnote{un elenco è comunque + ottenibile dalla documentazione di sistema, accessibile con \texttt{man + signal-safety}, da cui si sono estratti questi elenchi.} che ha aggiunto +alle \textit{signal safe function} le ulteriori funzioni di +fig.~\ref{fig:sig_safe_functions_posix_2016}. + + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{14cm} + \func{ffs}, \func{htonl}, \func{htons}, \func{longjmp}, \func{memccpy}, + \func{memchr}, \func{memcmp}, \func{memcpy}, \func{memmove}, \func{memset}, + \func{siglongjmp}, \func{stpcpy}, \func{stpncpy}, \func{strcat}, + \func{strchr}, \func{strcmp}, \func{strcpy}, \func{strcspn}, + \func{strlen}, \func{strncat}, \func{strncmp}, \func{strncpy}, + \func{strnlen}, \func{strpbrk}, \func{strrchr}, \func{strspn}, + \func{strstr}, \func{strtok\_r}, \func{wcpcpy}, \func{wcpncpy}, + \func{wcscat}, \func{wcschr}, \func{wcscmp}, \func{wcscpy}, + \func{wcscspn}, \func{wcslen}, \func{wcsncat}, \func{wcsncmp}, + \func{wcsncpy}, \func{wcsnlen}, \func{wcspbrk}, \func{wcsrchr}, + \func{wcsspn}, \func{wcsstr}, \func{wcstok}, \func{wmemchr}, + \func{wmemcmp}, \func{wmemcpy}, \func{wmemmove}, \func{wmemset}. + \end{minipage} + \normalsize + \caption{Ulteriori funzioni sicure secondo lo standard POSIX.1-2016.} + \label{fig:sig_safe_functions_posix_2016} +\end{figure} + +Rispetto a questi elenchi occorre precisare che prima della versione 2.24 +delle \acr{glibc} l'implementazione delle funzioni \fork{execl} ed +\fork{execle} non era sicura, e che tuttora non lo è quella di +\func{aio\_suspend}. Inoltre è da evitare \func{fork}, che potrebbe essere +rimossa in future revisioni dello standard, e che già POSIX-1.2003 indicava +come tale se usata in concorrenza con \func{pthread\_atfork}. + +\index{funzioni!\textit{signal safe}|)} Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni effettuate all'interno di un gestore di segnali, qualora si debbano compiere @@ -3948,10 +4000,13 @@ tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}. % LocalWords: epoch multiplexing overrun res lpthread sec nsec curr one shot % LocalWords: delete stopped gdb alpha mips emulation locking ppoll epoll PGID % LocalWords: pwait msgrcv msgsnd semop semtimedop runnable sigisemptyset HRT -% LocalWords: sigorset sigandset BOOTTIME Android request remain +% LocalWords: sigorset sigandset BOOTTIME Android request remain cap dell' %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: IPC dest left right trampoline BNDERR MPX PKUERR MCEERR async +% LocalWords: BRANCH branch HWBKPT watchpoint SECCOMP seccomp wrapper pidfd +% LocalWords: fchdir sigmask safety -- 2.30.2 From 21e461fe379f4875729fcfe1ac1876f5f166e827 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 16 Aug 2021 12:56:21 +0200 Subject: [PATCH 04/16] Aggiunto programmino di prova per i segnali real time. --- signal.tex | 107 ++++++++++++++++++++++------------------- sources/rtsigvalsend.c | 76 +++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 50 deletions(-) create mode 100644 sources/rtsigvalsend.c diff --git a/signal.tex b/signal.tex index c2446f1..a7aaa3f 100644 --- a/signal.tex +++ b/signal.tex @@ -2168,7 +2168,7 @@ definiti come una \direct{union}.\footnote{la direttiva \direct{union} del cui campi indicano i diversi tipi di valori che possono essere salvati, in maniera alternativa, all'interno della stessa.} -Installando un gestore di tipo \var{sa\_sigaction} diventa possibile +Installando un gestore di tipo \var{sa\_sigaction} diventa possibile accedere alle informazioni restituite attraverso il puntatore a questa struttura. Tutti i segnali impostano i campi \var{si\_signo}, che riporta il numero del segnale ricevuto, \var{si\_errno}, che riporta, quando diverso da @@ -2694,11 +2694,11 @@ ulteriori funzioni in fig.~\ref{fig:sig_safe_functions_posix_2008}. Nella successiva revisione di POSIX.1-2013 sono poi state aggiunte le ulteriori funzioni \func{fchdir}, \func{pthread\_kill}, \func{pthread\_self}, \func{pthread\_sigmask}. L'ultima revisione dello standard alla data della -scrittura di questa sezione è la POSIX.1-2016,\footnote{un elenco è comunque - ottenibile dalla documentazione di sistema, accessibile con \texttt{man - signal-safety}, da cui si sono estratti questi elenchi.} che ha aggiunto -alle \textit{signal safe function} le ulteriori funzioni di -fig.~\ref{fig:sig_safe_functions_posix_2016}. +scrittura di questa sezione è la POSIX.1-2016,\footnote{una lista più + aggiornata può comunque essere ottenuto dalla documentazione di sistema, + accessibile con \texttt{man signal-safety}, da cui si sono estratti questi + elenchi.} che ha aggiunto alle \textit{signal safe function} le ulteriori +funzioni di fig.~\ref{fig:sig_safe_functions_posix_2016}. \begin{figure}[!htb] @@ -2723,8 +2723,8 @@ fig.~\ref{fig:sig_safe_functions_posix_2016}. \end{figure} Rispetto a questi elenchi occorre precisare che prima della versione 2.24 -delle \acr{glibc} l'implementazione delle funzioni \fork{execl} ed -\fork{execle} non era sicura, e che tuttora non lo è quella di +delle \acr{glibc} l'implementazione delle funzioni \func{execl} ed +\func{execle} non era sicura, e che tuttora non lo è quella di \func{aio\_suspend}. Inoltre è da evitare \func{fork}, che potrebbe essere rimossa in future revisioni dello standard, e che già POSIX-1.2003 indicava come tale se usata in concorrenza con \func{pthread\_atfork}. @@ -2799,52 +2799,57 @@ accessibili in un intervallo di valori specificati dalle due costanti \constd{SIGRTMIN} e \constd{SIGRTMAX}, che specificano il numero minimo e massimo associato ad un segnale \textit{real-time}. -Su Linux di solito il primo valore è 33, mentre il secondo è \code{\_NSIG-1}, -che di norma (vale a dire sulla piattaforma i386) è 64. Questo dà un totale di -32 segnali disponibili, contro gli almeno 8 richiesti da POSIX.1b. Si tenga -presente però che i primi segnali \textit{real-time} disponibili vengono usati -dalla \acr{glibc} per l'implementazione dei \textit{thread} POSIX (vedi -sez.~\ref{sec:thread_posix_intro}), ed il valore di \const{SIGRTMIN} viene -modificato di conseguenza.\footnote{per la precisione vengono usati i primi - tre per la vecchia implementazione dei \textit{LinuxThread} ed i primi due - per la nuova NTPL (\textit{New Thread Posix Library}), il che comporta che - \const{SIGRTMIN} a seconda dei casi può assumere i valori 34 o 35.} +Su Linux i segnali \textit{real-time} vengono numerati a partire da 32, fino +ad un valore massimo di 64, per un totale di 33 segnali disponibili, contro +gli almeno 8 richiesti da POSIX.1b. Si tenga presente però che i primi segnali +\textit{real-time} disponibili vengono usati dalla \acr{glibc} per +l'implementazione dei \textit{thread} POSIX (vedi +sez.~\ref{sec:thread_posix_intro}), ed il valore di \const{SIGRTMIN} fornito +quando si usano le \acr{glibc} viene modificato di conseguenza.\footnote{per + la precisione vengono usati i primi tre per la vecchia implementazione dei + \textit{LinuxThread} ed i primi due per la nuova NTPL (\textit{New Thread + Posix Library}), il che comporta che \const{SIGRTMIN} a seconda dei casi + può assumere i valori 34 o 35.} Per questo motivo nei programmi che usano i segnali \textit{real-time} non si -deve mai usare un valore assoluto dato che si correrebbe il rischio di -utilizzare un segnale in uso alle librerie, ed il numero del segnale deve -invece essere sempre specificato in forma relativa a \const{SIGRTMIN} (come -\code{SIGRTMIN + n}) avendo inoltre cura di controllare di non aver mai -superato \const{SIGRTMAX}. - -I segnali con un numero più basso hanno una priorità maggiore e vengono -consegnati per primi, inoltre i segnali \textit{real-time} non possono -interrompere l'esecuzione di un gestore di un segnale a priorità più alta; la -loro azione predefinita è quella di terminare il programma. I segnali -ordinari hanno tutti la stessa priorità, che è più alta di quella di qualunque -segnale \textit{real-time}. Lo standard non definisce niente al riguardo ma -Linux, come molte altre implementazioni, adotta questa politica. +deve mai usare un valore numerico assoluto, dato che si potrebbe correre il +rischio di utilizzare un segnale già in uso alle librerie; il numero del +segnale deve invece essere sempre specificato in forma relativa a +\const{SIGRTMIN}, con qualcosa come \code{SIGRTMIN + n}, avendo sempre cura di +controllare di non aver indicato un valore maggiore di \const{SIGRTMAX}. + +I segnali \textit{real-time} con un numero più basso hanno una priorità +maggiore e vengono consegnati per primi, inoltre i segnali \textit{real-time} +non possono interrompere l'esecuzione di un gestore di un segnale a priorità +più alta. La loro azione predefinita è sempre quella di terminare il +programma. I segnali ordinari invece hanno tutti la stessa priorità, che è +più alta di quella di qualunque segnale \textit{real-time}.\footnote{questa è + però una caratteristica di Linux, presente comunque anche nella gran parte + degli altri kernel \textit{unix-like}, lo standard infatti non definisce + niente al riguardo.} Si tenga presente che questi nuovi segnali non sono associati a nessun evento -specifico, a meno di non richiedere specificamente il loro utilizzo in +specifico, a meno di non avere richiesto l'utilizzo di uno di essi in meccanismi di notifica come quelli per l'I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_io}) o per le code di messaggi POSIX (vedi -sez.~\ref{sec:ipc_posix_mq}), pertanto devono essere inviati esplicitamente. +sez.~\ref{sec:ipc_posix_mq}), pertanto nell'uso ordinario devono essere +inviati esplicitamente. -Inoltre, per poter usufruire della capacità di restituire dei dati, i relativi -gestori devono essere installati con \func{sigaction}, specificando per -\var{sa\_flags} la modalità \const{SA\_SIGINFO} che permette di utilizzare la -forma estesa \var{sa\_sigaction} del gestore (vedi +Inoltre, per poter usufruire della loro capacità di restituire dei dati, i +relativi gestori devono essere installati con \func{sigaction}, specificando +per \var{sa\_flags} la modalità \const{SA\_SIGINFO} che permette di utilizzare +la forma estesa \var{sa\_sigaction} del gestore (vedi sez.~\ref{sec:sig_sigaction}). In questo modo tutti i segnali \textit{real-time} possono restituire al gestore una serie di informazioni aggiuntive attraverso l'argomento \struct{siginfo\_t}, la cui definizione è stata già vista in fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori in forma estesa. -In particolare i campi utilizzati dai segnali \textit{real-time} sono -\var{si\_pid} e \var{si\_uid} in cui vengono memorizzati rispettivamente il -\ids{PID} e l'\ids{UID} effettivo del processo che ha inviato il segnale, -mentre per la restituzione dei dati viene usato il campo \var{si\_value}. +In particolare i campi di \struct{siginfo\_t} utilizzati dai segnali +\textit{real-time} sono \var{si\_pid} e \var{si\_uid} in cui vengono +memorizzati rispettivamente il \ids{PID} e l'\ids{UID} effettivo del processo +che ha inviato il segnale, ed il campo \var{si\_value} che viene usato +appositamente per poter restituire dei dati al gestore. \begin{figure}[!htb] \footnotesize \centering @@ -2857,15 +2862,17 @@ mentre per la restituzione dei dati viene usato il campo \var{si\_value}. \label{fig:sig_sigval} \end{figure} -Detto campo, identificato con il tipo di dato \type{sigval\_t}, è una -\dirct{union} di tipo \struct{sigval} (la sua definizione è in -fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico, -se usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma -\var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da -vari meccanismi di notifica per restituire dati al gestore del segnale in -\var{si\_value}. Un campo di tipo \type{sigval\_t} è presente anche nella -struttura \struct{sigevent} (definita in fig.~\ref{fig:struct_sigevent}) che -viene usata dai meccanismi di notifica come quelli per i timer POSIX (vedi +Detto campo, la cui definizione è riportata in fig.~\ref{fig:sig_sigval}, +viene indicato con il tipo di dato \type{sigval\_t}, che è una \dirct{union} +di tipo \struct{sigval} in cui può essere memorizzato o un valore numerico, se +usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma +\var{sival\_ptr}. + +L'unione viene usata dai segnali \textit{real-time} e da vari meccanismi di +notifica per restituire dati al gestore del segnale in \var{si\_value}. Un +campo di tipo \type{sigval\_t} è presente anche nella struttura +\struct{sigevent} (definita in fig.~\ref{fig:struct_sigevent}) che viene usata +dai meccanismi di notifica come quelli per i timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}), l'I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}). diff --git a/sources/rtsigvalsend.c b/sources/rtsigvalsend.c new file mode 100644 index 0000000..a9c156d --- /dev/null +++ b/sources/rtsigvalsend.c @@ -0,0 +1,76 @@ +/* test_fopen.c + * + * Copyright (C) 2021 Simone Piccardi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/**************************************************************** + * + * Program rtsigvalsend.c: + * Program to test sigqueue and sigval send + * + * Author: Simone Piccardi + * Aug 2021 + * + * Usage: ./rtsigvalsend + **********************************************************/ +/* + * Include needed headers + */ +#include /* unix standard library */ +#include /* standard I/O library */ +#include /* C standard library */ +#include /* C strings library */ +#include /* signal constants, types and functions */ +#include /* error definitions and routines */ +#include + +#define MAXLINE 256 + +void SigHand(int signum, siginfo_t *info, void *ucontext) { + printf("Signal %d\n", signum); + printf("From pid %d\n", info->si_pid); + printf("From user %d\n", info->si_uid); + printf("Value %d\n", info->si_value.sival_int); +} + +int main(int argc, char *argv[], char *envp[]) +{ + char buffer[MAXLINE+1]; + int nread; + sigval_t value; + int signo = SIGRTMIN+1; + + struct sigaction new_handl, old_handl; + new_handl.sa_sigaction = SigHand; + sigemptyset(&new_handl.sa_mask); + new_handl.sa_flags=SA_SIGINFO; + /* change action for signo signal */ + sigaction(signo, &new_handl, &old_handl); + while (1) { + nread = read(STDIN_FILENO, buffer, MAXLINE); + if (nread < 0) { + printf("Errore in lettura: %s\n", strerror(errno)); + return 0; + } + buffer[nread]=0; + value.sival_int = strtol(buffer, NULL, 10); + if (value.sival_int > 0) { + sigqueue(getpid(), signo, value); + } else { + printf("Ignoring invalid input\n"); + } + } +} -- 2.30.2 From 210bb4855906a51f6c79abd19a31fffc77a4e521 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 16 Aug 2021 13:00:11 +0200 Subject: [PATCH 05/16] Nota rimasta indietro --- fileadv.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fileadv.tex b/fileadv.tex index 2399e3d..83fbb17 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -5495,7 +5495,7 @@ copiati i puntatori. % TODO trattare qui copy_file_range (vedi http://lwn.net/Articles/659523/), -% introdotta nel kernel 4.5 +% introdotta nel kernel 4.5, vedi anche https://lwn.net/Articles/846403/ \subsection{Gestione avanzata dell'accesso ai dati dei file} \label{sec:file_fadvise} -- 2.30.2 From c2e762abed93fe970c6c4d019a8bfe95fadb4efa Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 16 Aug 2021 18:49:12 +0200 Subject: [PATCH 06/16] Sistemati alcuni nomi, l'inserimento dell'indice analitico e della bibliografia nell'indice, e documentati i gestori in forma sa_sigaction --- gapil.tex | 10 ++- listati/Signal.c | 6 +- listati/SignalRestart.c | 4 +- listati/siginfo_t.h | 16 ++-- signal.tex | 172 ++++++++++++++++++++++++++++------------ sources/Gapil.h | 12 ++- sources/SigHand.c | 72 ++++++++++++++--- sources/rtsigvalsend.c | 2 +- sources/testsignalcgi.c | 6 +- 9 files changed, 220 insertions(+), 80 deletions(-) diff --git a/gapil.tex b/gapil.tex index 4439b5b..3b1d0c9 100644 --- a/gapil.tex +++ b/gapil.tex @@ -136,7 +136,7 @@ hyperfootnotes=false]{hyperref} \begin{quote} - Copyright \copyright\ 2000-2019 Simone Piccardi. Permission is granted to + Copyright \copyright\ 2000-2021 Simone Piccardi. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being ``Un preambolo'' @@ -225,11 +225,17 @@ hyperfootnotes=false]{hyperref} \include{ringraziamenti} \include{fdl-1.3} -% at the end put the bibliography +% at the end put index and bibliography \backmatter +\cleardoublepage +\phantomsection +\addcontentsline{toc}{chapter}{Indice analitico} \printindex %\bibliographystyle{phaip} %\bibliographystyle{ieeetr} +\cleardoublepage +\phantomsection +\addcontentsline{toc}{chapter}{Bibliografia} \bibliographystyle{abstract} \bibliography{biblio} diff --git a/listati/Signal.c b/listati/Signal.c index 855faa0..4ba6fae 100644 --- a/listati/Signal.c +++ b/listati/Signal.c @@ -1,13 +1,13 @@ -typedef void SigFunc(int); -inline SigFunc * Signal(int signo, SigFunc *func) +typedef void SigHandler(int); +inline SigHandler * Signal(int signo, SigHandler *func) { struct sigaction new_handl, old_handl; + new_handl.sa_flags=0; /* init to 0 all flags */ new_handl.sa_handler = func; /* clear signal mask: no signal blocked during execution of func */ if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ return SIG_ERR; } - new_handl.sa_flags=0; /* init to 0 all flags */ /* change action for signo signal */ if (sigaction(signo, &new_handl, &old_handl)){ return SIG_ERR; diff --git a/listati/SignalRestart.c b/listati/SignalRestart.c index 89bc502..faa3904 100644 --- a/listati/SignalRestart.c +++ b/listati/SignalRestart.c @@ -1,8 +1,8 @@ -inline SigFunc * SignalRestart(int signo, SigFunc *func) +inline SigHandler * SignalRestart(int signo, SigHandler *func) { struct sigaction new_handl, old_handl; - new_handl.sa_handler = func; /* set signal handler */ new_handl.sa_flags = SA_RESTART; /* restart system call */ + new_handl.sa_handler = func; /* set signal handler */ /* clear signal mask: no signal blocked during execution of func */ if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ return SIG_ERR; diff --git a/listati/siginfo_t.h b/listati/siginfo_t.h index 3e9b488..a010075 100644 --- a/listati/siginfo_t.h +++ b/listati/siginfo_t.h @@ -17,11 +17,11 @@ siginfo_t { void * si_addr; /* Memory location which caused fault */ long si_band; /* Band event (was int before glibc 2.3.2) */ int si_fd; /* File descriptor */ - short si_addr_lsb;/* Least significant bit of address (since Linux 2.6.32) */ - void *si_lower; /* Lower bound when address violation occurred (since Linux 3.19) */ - void *si_upper; /* Upper bound when address violation occurred (since Linux 3.19) */ - int si_pkey; /* Protection key on PTE that caused fault (since Linux 4.6) */ - void *si_call_addr; /* Address of system call instruction (since Linux 3.5) */ - int si_syscall; /* Number of attempted system call (since Linux 3.5) */ - unsigned int si_arch;/* Architecture of attempted system call (since Linux 3.5) */ - } + short si_addr_lsb;/* Least significant bit of address (since 2.6.32) */ + void *si_lower; /* Lower bound when addr violation occurred (3.19) */ + void *si_upper; /* Upper bound when addr violation occurred (3.19) */ + int si_pkey; /* Protection key on PTE that caused fault (4.6) */ + void *si_call_addr; /* Address of system call instruction (3.5) */ + int si_syscall; /* Number of attempted system call (since 3.5) */ + unsigned int si_arch;/* Architecture of attempted system call (3.5) */ +} diff --git a/signal.tex b/signal.tex index a7aaa3f..78d5080 100644 --- a/signal.tex +++ b/signal.tex @@ -2198,7 +2198,7 @@ in tab.~\ref{tab:sig_si_code_generic}. \begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|p{10cm}|} + \begin{tabular}[c]{|l|p{8cm}|} \hline \textbf{Valore} & \textbf{Significato} \\ \hline @@ -2242,16 +2242,10 @@ che si tratta di costanti, e non di una maschera binaria, i valori numerici vengono riutilizzati e ciascuno di essi avrà un significato diverso a seconda del segnale a cui è associato. -L'elenco dettagliato dei nomi di queste costanti è riportato nelle diverse -sezioni di tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella -sequenza in cui si sono appena citati i rispettivi segnali, il prefisso del -nome indica comunque in maniera diretta il segnale a cui le costanti fanno -riferimento. - \begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|p{10cm}|} + \begin{tabular}[c]{|l|p{8cm}|} \hline \textbf{Valore} & \textbf{Significato} \\ \hline @@ -2323,6 +2317,12 @@ riferimento. \label{tab:sig_si_code_special} \end{table} +L'elenco dettagliato dei nomi di queste costanti è riportato nelle diverse +sezioni di tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella +sequenza in cui si sono appena citati i rispettivi segnali, il prefisso del +nome indica comunque in maniera diretta il segnale a cui le costanti fanno +riferimento. + Il resto della struttura \struct{siginfo\_t} è definito come una \dirct{union} ed i valori eventualmente presenti dipendono dal segnale ricevuto, così \signal{SIGCHLD} ed i segnali \textit{real-time} (vedi @@ -2344,18 +2344,19 @@ Benché sia possibile usare nello stesso programma sia \func{sigaction} che \func{signal} occorre molta attenzione, in quanto le due funzioni possono interagire in maniera anomala. Infatti l'azione specificata con \struct{sigaction} contiene un maggior numero di informazioni rispetto al -semplice indirizzo del gestore restituito da \func{signal}. Per questo motivo -se si usa quest'ultima per installare un gestore sostituendone uno +semplice indirizzo del gestore restituito da \func{signal}, e questo comporta +che se si usa quest'ultima per installare un gestore sostituendone uno precedentemente installato con \func{sigaction}, non sarà possibile effettuare un ripristino corretto dello stesso. -Per questo è sempre opportuno usare \func{sigaction}, che è in grado di +Per questo motivo è opportuno usare sempre \func{sigaction} che è in grado di ripristinare correttamente un gestore precedente, anche se questo è stato installato con \func{signal}. In generale poi non è il caso di usare il valore di ritorno di \func{signal} come campo \var{sa\_handler}, o viceversa, dato -che in certi sistemi questi possono essere diversi. In definitiva dunque, a -meno che non si sia vincolati all'aderenza stretta allo standard ISO C, è -sempre il caso di evitare l'uso di \func{signal} a favore di \func{sigaction}. +che in certi sistemi questi valori possono essere diversi. In definitiva +dunque, a meno che non si sia vincolati all'aderenza stretta allo standard ISO +C, è sempre il caso di evitare l'uso di \func{signal} a favore di +\func{sigaction}. \begin{figure}[!htbp] \footnotesize \centering @@ -2368,14 +2369,14 @@ sempre il caso di evitare l'uso di \func{signal} a favore di \func{sigaction}. \label{fig:sig_Signal_code} \end{figure} -Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata -che abbia le stesse caratteristiche di \func{signal}, a definire attraverso -\func{sigaction} una funzione equivalente \func{Signal}, il cui codice è -riportato in fig.~\ref{fig:sig_Signal_code} (il codice completo si trova nel -file \file{SigHand.c} nei sorgenti allegati). Anche in questo caso, per -semplificare la definizione si è poi definito un apposito tipo -\texttt{SigFunc} per esprimere in modo più comprensibile la forma di un -gestore di segnale. +Come primo esmpio si è allora provveduto, per mantenere un'interfaccia +semplificata che abbia le stesse caratteristiche di \func{signal}, a definire +attraverso \func{sigaction} una funzione equivalente, \func{Signal}, il cui +codice è riportato in fig.~\ref{fig:sig_Signal_code} (il codice completo si +trova nel file \file{SigHand.c} nei sorgenti allegati). Anche in questo caso, +per semplificare la definizione si è poi definito un apposito tipo +\texttt{SigHandler} per esprimere in modo più semplice la forma di un gestore +di segnale. Si noti come, essendo la funzione estremamente semplice, essa è definita come \dirct{inline}. Questa direttiva viene usata per dire al compilatore di @@ -2394,6 +2395,72 @@ comportamento veniva ottenuto con delle macro, ma queste hanno tutta una serie di problemi di sintassi nel passaggio degli argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono essere evitati. +La funzione \func{Signal} appena illustrata continua però ad utilizzare la +forma tradizionale del gestore di segnali, mentre abbiamo visto come +\func{sigaction} preveda la possibilità di indicare, attivando il flag +\const{SA\_SIGINFO}, un gestore nella forma avanzata \param{sa\_sigaction}, in +grado di ricevere molte più informazioni, che prevede l'utilizzo di tre +argomenti. Di nuovo facciamo un esempio di come usare \func{sigaction} in +questo caso, partendo col definire un apposito tipo, \texttt{SigAction}, per +semplificare l'indicazione del nuovo tipo di gestore: +\includecodesnip{listati/SigAction.c} + +Un gestore di segnali definito nella forma \val{sa\_sigaction} infatti, oltre +al numero di segnale ricevuto come primo argomento, otterrà dal kernel un +puntatore ad una struttura \struct{siginfo\_t} con le relative informazioni +attienti l'origine del segnale nel secondo argomento, ed infine un puntatore a +delle informazioni di contesto ad uso delle librerie del C nel terzo +argomento, che non vengono mai utilizzate nel gestore, attenendo al +funzionamento a basso livello della gestione dei segnali.\footnote{il kernel + tutte le volte che c'è un segnale pendente gestisce l'esecuzione del + relativo gestore caricando nello stack i dati del contesto di esecuzione del + processo e facendo sì che al ritorno in \textit{user-space} sia eseguito il + gestore, una volta che questo ritorna il controllo viene passato a dello + specifico codice in \textit{user-space}, detto \itindex{signal~trampoline} + \textit{signal trampoline}, che con la funzione di sistema \funcm{sigreturn} + usa le informazioni di contesto disponibili in questo argomento per far + riprendere l'esecuzione del processo al punto in cui si era stata interrotta + dal segnale; tutto ciò è gestito dal kernel e dalle librerie del C e non + interessa la programmazione ordinaria.} + +Si è riportato in fig.~\ref{fig:sig_Action_code} un equivalente della +precedente \func{Signal} che però installa un gestore di segnali di tipo +\param{sa\_sigaction}. Si noti come la funzione, una volta definito come sopra +il tipo \texttt{SigAction} per il gestore di segnali, sia praticamente +identica all'altra. + +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{\codesamplewidth} + \includecodesample{listati/Action.c} + \end{minipage} + \normalsize + \caption{La funzione \func{Action}, analoga alla precedente \func{Signal} + per l'uso dei gestori di segnali avanzati con \func{sigaction}.} + \label{fig:sig_Action_code} +\end{figure} + +Quello che cambia in questo caso è occorre indicare (\texttt{\small 4}) nel +campo \var{sa\_flags} della struttura \struct{sigaction} il valore +\const{SA\_SIGINFO}, perché poi si passerà (\texttt{\small 5}) l'indirizzo il +del gestore nel campo \var{sa\_sigaction} invece che in \var{sa\_handler} come +nel caso precedente. + +Inoltre in questo caso, ritornando la funzione l'indirizzo del gestore che è +nella nuova forma, non si può terminare in caso di errore riportanto il valore +\const{SIG\_ERR} (che è di tipo \type{sighandler\_t} e fa riferimento ad un +gestore ordinario) come in precedenza. Per questo motivo si è scelto di +ritornare come indicazione di errore il valore \val{NULL}, ma in questo caso +si deve tenere presente che questo valore non è più distinto da quello che si +utilizza per indicare la eventuale reimpostazione del gestore di default (come +era \const{SIG\_ERR} rispetto a \const{SIG\_DFL}). + +Per questo motivo questa funzione viene illustrata solo a scopo di primo +esempio, vedremo più avanti, in sez.~\ref{sec:sig_real_time}, nel contesto +dell'uso dei segnali \textit{real-time} per i quali è nata questa nuova +interfaccia, un esempio più completo dell'uso di \func{sigaction} con un +gestore in questa nuova forma, e di come utilizzare le informazioni ottenute +nella struttura \struct{siginfo\_t}. \subsection{La gestione della \textsl{maschera dei segnali} o @@ -2431,19 +2498,22 @@ quando si devono eseguire più operazioni su delle variabili (nell'esempio citato un controllo ed una assegnazione) o comunque eseguire una serie di istruzioni, l'atomicità non è più possibile. -In questo caso, se si vuole essere sicuri di non poter essere interrotti da -uno o più segnali durante l'esecuzione di una sezione di codice, li si possono -bloccare esplicitamente modificando la maschera dei segnali del processo -usando la funzione di sistema \funcd{sigprocmask},\footnote{in realtà quello - che viene usato normalmente è il \textit{wrapper} omonimo delle \acr{glibc} - dato che con l'introduzione dei segnali \textit{real time} nel kernel 2.2 le - dimensioni del tipo \type{sigset\_t} sono cambiate e la \textit{system call} - sottostante è diventata \funcm{rt\_sigprocmask} che richiede un quarto - argomento di tipo \ctyp{size\_t} per indicare questa dimensione; il - \textit{wrapper} maschera questi dettagli ed inoltre ignora in maniera - silente i tentativi di bloccare i segnali \textit{real time} impiegati per - la gestione dei \textit{thread} dalla \textit{Native Thread Posix Library} - (vedi sez.~\ref{sec:linux_ntpl}).} il cui prototipo è: +In questo caso, quando si vuole essere sicuri di non essere interrotti da uno +o più segnali durante l'esecuzione di una sezione di codice, diventa +necessario bloccarli esplicitamente. Questo si fa modificando la maschera dei +segnali del processo e per fare questa operazione con lo standard POSIX-1.2001 +è stata introdotta una apposita funzione di sistema, +\funcd{sigprocmask},\footnote{in realtà quello che viene usato normalmente è + il \textit{wrapper} omonimo delle \acr{glibc} dato che con l'introduzione + dei segnali \textit{real time} nel kernel 2.2 le dimensioni del tipo + \type{sigset\_t} sono cambiate e la \textit{system call} sottostante è + diventata \funcm{rt\_sigprocmask} che richiede un quarto argomento di tipo + \ctyp{size\_t} per indicare questa dimensione; la vecchia funzione di + sistema continua ad esistere ma è deprecata, il \textit{wrapper} maschera + questi dettagli ed inoltre ignora in maniera silente i tentativi di bloccare + i segnali \textit{real time} impiegati per la gestione dei \textit{thread} + dalla \textit{Native Thread Posix Library} (vedi + sez.~\ref{sec:linux_ntpl}).} il cui prototipo è: \begin{funcproto}{ \fhead{signal.h} @@ -2462,12 +2532,13 @@ usando la funzione di sistema \funcd{sigprocmask},\footnote{in realtà quello La funzione usa l'insieme di segnali posto all'indirizzo passato nell'argomento \param{set} per modificare la maschera dei segnali del processo -corrente. La modifica viene effettuata a seconda del valore -dell'argomento \param{how}, secondo le modalità specificate in -tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un valore non nullo -per \param{oldset} la maschera dei segnali corrente viene salvata a -quell'indirizzo. Se è nullo \param{set} non viene eseguito nessun cambiamento -e si può usare la funzione per leggere la maschera corrente in \param{oldset}. +corrente. La modifica viene effettuata a seconda del valore dell'argomento +\param{how}, secondo le modalità specificate in +tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un indirizzo non nullo +per il puntatore \param{oldset} la maschera dei segnali corrente viene salvata +a quell'indirizzo. Se invece è nullo il puntatore \param{set} non viene +eseguito nessun cambiamento e si può usare la funzione per leggere la maschera +corrente in \param{oldset}. \begin{table}[htb] \footnotesize @@ -2494,8 +2565,9 @@ e si può usare la funzione per leggere la maschera corrente in \param{oldset}. La funzione consente di proteggere delle sezioni di codice bloccando l'insieme di segnali voluto per poi riabilitarli alla fine della sezione critica e risolvere problemi come quelli mostrati in fig.~\ref{fig:sig_event_wrong}, -proteggendo la sezione fra il controllo del flag e la sua cancellazione. La -funzione può essere usata anche all'interno di un gestore, ad esempio per +proteggendo la sezione fra il controllo del flag e la sua cancellazione. + +La funzione può essere usata anche all'interno di un gestore, ad esempio per riabilitare la consegna del segnale che l'ha invocato, in questo caso però occorre ricordare che qualunque modifica alla maschera dei segnali viene perduta al ritorno dallo stesso. @@ -2506,10 +2578,12 @@ all'uso di \func{pause}. Il caso è simile a quello del problema illustrato nell'esempio di fig.~\ref{fig:sig_sleep_incomplete}, e cioè la possibilità che il processo riceva il segnale che si intende usare per uscire dallo stato di attesa invocato con \func{pause} immediatamente prima dell'esecuzione di -quest'ultima. Per poter effettuare atomicamente la modifica della maschera dei -segnali (di solito attivandone uno specifico) insieme alla sospensione del -processo lo standard POSIX ha previsto la funzione di sistema -\funcd{sigsuspend}, il cui prototipo è: +quest'ultima. + +Per poter effettuare atomicamente la modifica della maschera dei segnali (di +solito attivandone uno specifico) insieme alla sospensione del processo lo +standard POSIX ha previsto la funzione di sistema \funcd{sigsuspend}, il cui +prototipo è: \begin{funcproto}{ \fhead{signal.h} @@ -3996,7 +4070,7 @@ tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}. % LocalWords: ILL ILLOPC ILLOPN ILLADR ILLTRP PRVOPC PRVREG COPROC BADSTK FPE % LocalWords: INTDIV INTOVF FLTDIV FLTOVF FLTUND underflow FLTRES FLTINV SEGV % LocalWords: FLTSUB MAPERR ACCERR ADRALN ADRERR OBJERR BRKPT CLD EXITED MSG -% LocalWords: KILLED DUMPED TRAPPED STOPPED CONTINUED PRI HUP SigFunc jiffies +% LocalWords: KILLED DUMPED TRAPPED STOPPED CONTINUED PRI HUP SigHandler % LocalWords: SEC unsafe sockatmark execl execv faccessat fchmodat fchownat % LocalWords: fexecve fstatat futimens linkat mkdirat mkfifoat mknod mknodat % LocalWords: openat readlinkat renameat symlinkat unlinkat utimensat utimes @@ -4007,7 +4081,7 @@ tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}. % LocalWords: epoch multiplexing overrun res lpthread sec nsec curr one shot % LocalWords: delete stopped gdb alpha mips emulation locking ppoll epoll PGID % LocalWords: pwait msgrcv msgsnd semop semtimedop runnable sigisemptyset HRT -% LocalWords: sigorset sigandset BOOTTIME Android request remain cap dell' +% LocalWords: sigorset sigandset BOOTTIME Android request remain cap jiffies %%% Local Variables: diff --git a/sources/Gapil.h b/sources/Gapil.h index 429fc6f..b46672d 100644 --- a/sources/Gapil.h +++ b/sources/Gapil.h @@ -89,13 +89,19 @@ int UnlockFile(const char* path_name); /* * Signal Handling Functions */ -typedef void SigFunc(int); +typedef void SigHandler(int); +typedef void SigAction(int, siginfo_t *, void *); /* Function Signal: Initialize a signal handler. See SigHand.c */ -SigFunc * Signal(int signo, SigFunc *func); +SigHandler * Signal(int signo, SigHandler *func); /* Function SignalRestart: restart system calls. See SigHand.c */ -SigFunc * SignalRestart(int signo, SigFunc *func); +SigHandler * SignalRestart(int signo, SigHandler *func); /* Function HandSigCHLD: to handle SIGCHILD. See SigHand.c */ void HandSigCHLD(int sig); +/* Function Action: Initialize a sa_sigaction handler. See SigHand.c */ +SigAction * Action(int signo, SigAction *func); +/* Function Action: Initialize a sa_sigaction handler. See SigHand.c */ +SigAction * ActionRestart(int signo, SigAction *func); + /* * Socket/Files service functions */ diff --git a/sources/SigHand.c b/sources/SigHand.c index a37fac5..605493d 100644 --- a/sources/SigHand.c +++ b/sources/SigHand.c @@ -37,22 +37,22 @@ * Initialize a signal handler. * To enable the signal handling a process we need to tell it to * kernel; this is done writing all needed info to a sigaction structure - * named sigact, and then callind sigaction() system call passing the + * named sigact, and then calling sigaction() system call passing the * information stored in the sigact structure variable. * * Input: the signal to handle * the signal handler function - * Return: the previous sigaction structure + * Return: the previous signal handler */ -inline SigFunc * Signal(int signo, SigFunc *func) +inline SigHandler * Signal(int signo, SigHandler *func) { struct sigaction new_handl, old_handl; + new_handl.sa_flags=0; /* init to 0 all flags */ new_handl.sa_handler = func; /* set signal handler */ /* clear signal mask: no signal blocked during execution of func */ if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ return SIG_ERR; } - new_handl.sa_flags=0; /* init to 0 all flags */ /* change action for signo signal */ if (sigaction(signo, &new_handl, &old_handl)){ return SIG_ERR; @@ -65,19 +65,19 @@ inline SigFunc * Signal(int signo, SigFunc *func) * Initialize a signal handler. * To enable the signal handling a process we need to tell it to * kernel; this is done writing all needed info to a sigaction structure - * named sigact, and then callind sigaction() system call passing the + * named sigact, and then calling sigaction() system call passing the * information stored in the sigact structure variable. * This version enable BSD semantics with SA_RESTART * * Input: the signal to handle * the signal handler function - * Return: the previous sigaction structure + * Return: the previous signal handler */ -inline SigFunc * SignalRestart(int signo, SigFunc *func) +inline SigHandler * SignalRestart(int signo, SigHandler *func) { struct sigaction new_handl, old_handl; - new_handl.sa_handler = func; /* set signal handler */ new_handl.sa_flags = SA_RESTART; /* restart system call */ + new_handl.sa_handler = func; /* set signal handler */ /* clear signal mask: no signal blocked during execution of func */ if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ return SIG_ERR; @@ -89,10 +89,64 @@ inline SigFunc * SignalRestart(int signo, SigFunc *func) return (old_handl.sa_handler); } +/* + * Function Action + * Initialize a sa_sigaction signal handler. + * To enable the signal handling a process we need to tell it to + * kernel; this is done writing all needed info to a sigaction structure + * named sigact, and then calling sigaction() system call passing the + * information stored in the sigact structure variable. + * + * Input: the signal to handle + * the signal handler function (sa_sigaction type) + * Return: the previous signal handler + */ +inline SigAction * Action(int signo, SigAction *func) +{ + struct sigaction new_handl, old_handl; + new_handl.sa_flags=SA_SIGINFO; /* we use sa_sigaction handler */ + new_handl.sa_sigaction = func; /* set signal handler */ + /* clear signal mask: no signal blocked during execution of func */ + if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ + return NULL; + } + /* change action for signo signal */ + if (sigaction(signo, &new_handl, &old_handl)){ + return NULL; + } + return (old_handl.sa_sigaction); +} +/* + * Function Action + * Initialize a sa_sigaction signal handler. + * To enable the signal handling a process we need to tell it to + * kernel; this is done writing all needed info to a sigaction structure + * named sigact, and then calling sigaction() system call passing the + * information stored in the sigact structure variable. + * + * Input: the signal to handle + * the signal handler function (sa_sigaction type) + * Return: the previous signal handler + */ +inline SigAction * ActionRestart(int signo, SigAction *func) +{ + struct sigaction new_handl, old_handl; + new_handl.sa_flags=SA_SIGINFO|SA_RESTART;/* flag setup */ + new_handl.sa_sigaction = func; /* set signal handler */ + /* clear signal mask: no signal blocked during execution of func */ + if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ + return NULL; + } + /* change action for signo signal */ + if (sigaction(signo, &new_handl, &old_handl)){ + return NULL; + } + return (old_handl.sa_sigaction); +} /* * Functions: HandSigCHLD - * Generic handler for SIGCHLD signal + * Generic simple handler for SIGCHLD signal * * Simone Piccardi Dec. 2002 */ diff --git a/sources/rtsigvalsend.c b/sources/rtsigvalsend.c index a9c156d..a1e022d 100644 --- a/sources/rtsigvalsend.c +++ b/sources/rtsigvalsend.c @@ -1,4 +1,4 @@ -/* test_fopen.c +/* rtsigvalsend.c * * Copyright (C) 2021 Simone Piccardi * diff --git a/sources/testsignalcgi.c b/sources/testsignalcgi.c index b021b2f..010cef5 100644 --- a/sources/testsignalcgi.c +++ b/sources/testsignalcgi.c @@ -40,9 +40,9 @@ #include void sig_hand(int, siginfo_t *, void *); -typedef void SigFunc(int, siginfo_t *, void *); +typedef void SigAction(int, siginfo_t *, void *); /* Function Signal: Initialize a signal handler. See SigHand.c */ -SigFunc * Signal(int signo, SigFunc *func); +SigAction * Signal(int signo, SigAction *func); FILE * file; @@ -95,7 +95,7 @@ void sig_hand(int sig, siginfo_t * siginfo, void *ptr) { fprintf(file, "Printed time: %s", ctime(&t)); } -inline SigFunc * Signal(int signo, SigFunc *func) +inline SigAction * Signal(int signo, SigAction *func) { struct sigaction new_handl, old_handl; new_handl.sa_sigaction = func; /* set signal handler */ -- 2.30.2 From 381b50b7a33f32f8f262e59a6cdf16faf57c94ae Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 16 Aug 2021 20:27:48 +0200 Subject: [PATCH 07/16] Materiale rimasto indietro e segnali real time --- listati/Action.c | 15 ++++++ listati/SigAction.c | 1 + listati/rtsigvalsend.c | 28 +++++++++++ listati/rtsigvalsend_handl.c | 6 +++ signal.tex | 94 ++++++++++++++++++++++++++---------- sources/rtsigvalsend.c | 4 +- 6 files changed, 121 insertions(+), 27 deletions(-) create mode 100644 listati/Action.c create mode 100644 listati/SigAction.c create mode 100644 listati/rtsigvalsend.c create mode 100644 listati/rtsigvalsend_handl.c diff --git a/listati/Action.c b/listati/Action.c new file mode 100644 index 0000000..b119244 --- /dev/null +++ b/listati/Action.c @@ -0,0 +1,15 @@ +inline SigAction * Action(int signo, SigAction *func) +{ + struct sigaction new_handl, old_handl; + new_handl.sa_flags=SA_SIGINFO; /* we use sa_sigaction handler */ + new_handl.sa_sigaction = func; /* set signal handler */ + /* clear signal mask: no signal blocked during execution of func */ + if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ + return NULL; + } + /* change action for signo signal */ + if (sigaction(signo, &new_handl, &old_handl)){ + return NULL; + } + return (old_handl.sa_sigaction); +} diff --git a/listati/SigAction.c b/listati/SigAction.c new file mode 100644 index 0000000..adfbec2 --- /dev/null +++ b/listati/SigAction.c @@ -0,0 +1 @@ +typedef void SigAction(int, siginfo_t *, void *); diff --git a/listati/rtsigvalsend.c b/listati/rtsigvalsend.c new file mode 100644 index 0000000..9689734 --- /dev/null +++ b/listati/rtsigvalsend.c @@ -0,0 +1,28 @@ +int main(int argc, char *argv[], char *envp[]) +{ + char buffer[MAXLINE+1]; + int nread; + sigval_t value; + int signo = SIGRTMIN+1; + + struct sigaction new_handl, old_handl; + sigemptyset(&new_handl.sa_mask); + new_handl.sa_sigaction = sig_handler; + new_handl.sa_flags=SA_SIGINFO; + /* change action for signo signal */ + sigaction(signo, &new_handl, &old_handl); + while (1) { + nread = read(STDIN_FILENO, buffer, MAXLINE); + if (nread < 0) { + printf("Errore in lettura: %s\n", strerror(errno)); + return 0; + } + buffer[nread]=0; + value.sival_int = strtol(buffer, NULL, 10); + if (value.sival_int > 0) { + sigqueue(getpid(), signo, value); + } else { + printf("Ignoring invalid input\n"); + } + } +} diff --git a/listati/rtsigvalsend_handl.c b/listati/rtsigvalsend_handl.c new file mode 100644 index 0000000..a58e0be --- /dev/null +++ b/listati/rtsigvalsend_handl.c @@ -0,0 +1,6 @@ +void sig_handler(int signum, siginfo_t *info, void *ucontext) { + printf("Signal %d\n", signum); + printf("From pid %d\n", info->si_pid); + printf("From user %d\n", info->si_uid); + printf("Value %d\n", info->si_value.sival_int); +} diff --git a/signal.tex b/signal.tex index 78d5080..63a9400 100644 --- a/signal.tex +++ b/signal.tex @@ -2920,10 +2920,11 @@ stata già vista in fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori in forma estesa. In particolare i campi di \struct{siginfo\_t} utilizzati dai segnali -\textit{real-time} sono \var{si\_pid} e \var{si\_uid} in cui vengono -memorizzati rispettivamente il \ids{PID} e l'\ids{UID} effettivo del processo -che ha inviato il segnale, ed il campo \var{si\_value} che viene usato -appositamente per poter restituire dei dati al gestore. +\textit{real-time} sono \var{si\_pid} e \var{si\_uid} in cui vengono riportati +rispettivamente il \ids{PID} e l'\ids{UID} effettivo del processo che ha +inviato il segnale, e lo specifico campo \var{si\_value}. Questo campo viene +indicato in fig.~\ref{fig:sig_siginfo_t} come di tipo \type{sigval\_t}; se ne +è riportata la definizione in fig.~\ref{fig:sig_sigval}. \begin{figure}[!htb] \footnotesize \centering @@ -2936,27 +2937,24 @@ appositamente per poter restituire dei dati al gestore. \label{fig:sig_sigval} \end{figure} -Detto campo, la cui definizione è riportata in fig.~\ref{fig:sig_sigval}, -viene indicato con il tipo di dato \type{sigval\_t}, che è una \dirct{union} -di tipo \struct{sigval} in cui può essere memorizzato o un valore numerico, se -usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma -\var{sival\_ptr}. - -L'unione viene usata dai segnali \textit{real-time} e da vari meccanismi di -notifica per restituire dati al gestore del segnale in \var{si\_value}. Un -campo di tipo \type{sigval\_t} è presente anche nella struttura -\struct{sigevent} (definita in fig.~\ref{fig:struct_sigevent}) che viene usata -dai meccanismi di notifica come quelli per i timer POSIX (vedi -sez.~\ref{sec:sig_timer_adv}), l'I/O asincrono (vedi -sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi -sez.~\ref{sec:ipc_posix_mq}). -A causa delle loro caratteristiche, la funzione \func{kill} non è adatta ad -inviare segnali \textit{real-time}, poiché non è in grado di fornire alcun -valore per il campo \var{si\_value} restituito nella struttura -\struct{siginfo\_t} prevista da un gestore in forma estesa. Per questo motivo -lo standard ha previsto una nuova funzione, \funcd{sigqueue}, il cui prototipo -è: +Si tratta quindi di una unione \struct{sigval} con due possibili campi +alternativi in cui può essere memorizzato o un valore numerico, se usata con +\var{sival\_int}, o un puntatore, se usata con \var{sival\_ptr}. L'unione +viene usata dai segnali \textit{real-time}, ma anche da vari altri meccanismi +di notifica, per inviare eventuali informazioni aggiuntive al gestore del +segnale in \var{si\_value}. Ad esempio un campo di tipo \type{sigval\_t} è +presente anche nella struttura \struct{sigevent} (definita in +fig.~\ref{fig:struct_sigevent}) che viene usata da vari meccanismi di notifica +come quelli per i timer POSIX (che vedremo in sez.~\ref{sec:sig_timer_adv}), +quello dell'I/O asincrono (che vedremo in sez.~\ref{sec:file_asyncronous_io}) +o dalle code di messaggi POSIX (che vedremo in sez.~\ref{sec:ipc_posix_mq}). + +A causa di questa loro caratteristica, la funzione \func{kill}, pure essendo +utilizzabile, non è adatta ad inviare segnali \textit{real-time}, perché non è +in grado di impostare alcun valore per il campo \var{si\_value}. Per questo +motivo lo standard POSIX ha previsto una nuova funzione, \funcd{sigqueue}, il +cui prototipo è: \begin{funcproto}{ \fhead{signal.h} @@ -2978,7 +2976,6 @@ lo standard ha previsto una nuova funzione, \funcd{sigqueue}, il cui prototipo } \end{funcproto} - La funzione invia il segnale indicato dall'argomento \param{signo} al processo indicato dall'argomento \param{pid}. Per il resto il comportamento della funzione è analogo a quello di \func{kill}, ed i privilegi occorrenti ad @@ -3098,6 +3095,53 @@ 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} + \includecodesample{listati/rtsigvalsend.c} + \end{minipage} + \normalsize + \caption{Corpo principale di un programma di invio di segnali + \textit{real-time}.} + \label{fig:sig_rtsival_main} +\end{figure} + +Dopo aver definito (\texttt{\small 5}) una variabile \var{value} di tipo +\type{sigval\_t} per inviare i dati, ed 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 +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 + 20}), e poi tenta di convertire la stessa (\texttt{\small 21}) in un numero +con \func{strtol}, assegnando il risultato a \texttt{value.sival\_int}, se la +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}). + + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{\codesamplewidth} + \includecodesample{listati/rtsigvalsend_handl.c} + \end{minipage} + \normalsize + \caption{Codice del gestore.} + \label{fig:sig_rtsival_handl} +\end{figure} + + + + \subsection{La gestione avanzata delle temporizzazioni} \label{sec:sig_timer_adv} diff --git a/sources/rtsigvalsend.c b/sources/rtsigvalsend.c index a1e022d..c989488 100644 --- a/sources/rtsigvalsend.c +++ b/sources/rtsigvalsend.c @@ -39,7 +39,7 @@ #define MAXLINE 256 -void SigHand(int signum, siginfo_t *info, void *ucontext) { +void sig_handler(int signum, siginfo_t *info, void *ucontext) { printf("Signal %d\n", signum); printf("From pid %d\n", info->si_pid); printf("From user %d\n", info->si_uid); @@ -54,8 +54,8 @@ int main(int argc, char *argv[], char *envp[]) int signo = SIGRTMIN+1; struct sigaction new_handl, old_handl; - new_handl.sa_sigaction = SigHand; sigemptyset(&new_handl.sa_mask); + new_handl.sa_sigaction = sig_handler; new_handl.sa_flags=SA_SIGINFO; /* change action for signo signal */ sigaction(signo, &new_handl, &old_handl); -- 2.30.2 From f21f63518fb77f32a2474564e1a3c2f4c32cccd4 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 20 Dec 2021 18:20:40 +0100 Subject: [PATCH 08/16] Aggiornamenti di TODO --- ipc.tex | 2 ++ procadv.tex | 3 +++ 2 files changed, 5 insertions(+) diff --git a/ipc.tex b/ipc.tex index 9e7e459..7306d8e 100644 --- a/ipc.tex +++ b/ipc.tex @@ -5029,6 +5029,8 @@ testo alla terminazione di quest'ultimo. % https://lwn.net/Articles/178253/, https://lwn.net/Articles/823513/, % https://lwn.net/Articles/655044/ +% TODO: trattare futex_waitv, introdotta con il 5.16, vedi: +% https://lwn.net/Articles/866112/ % LocalWords: like fifo System POSIX RPC Calls Common Object Request Brocker diff --git a/procadv.tex b/procadv.tex index 53eb58a..a5ea67f 100644 --- a/procadv.tex +++ b/procadv.tex @@ -2301,6 +2301,9 @@ Da fare % vedi anche l'ulteriore opzione "expedited" introdotta con il kernel 4.14 % (https://lwn.net/Articles/728795/) +% TODO trattare process_mrelease introdotta con il kernel 5.16, vedi: +% https://lwn.net/Articles/864184/ + %%% Local Variables: -- 2.30.2 From 1908af4825514ac377a77717df048871f16900c8 Mon Sep 17 00:00:00 2001 From: piccardi Date: Tue, 5 Jul 2022 11:42:45 +0200 Subject: [PATCH 09/16] Materiale rimasto indietro --- domandemanpages.txt | 6 ++++++ signal.tex | 15 +++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/domandemanpages.txt b/domandemanpages.txt index a06a041..1d2bba8 100644 --- a/domandemanpages.txt +++ b/domandemanpages.txt @@ -6,3 +6,9 @@ Con readv/writev che fine ha fatto EOPNOTSUPP? tee ed il supporto per i socket ? openat e il supposto problema della race condition. + + +Con sigwait si dice che viene restituito un valore positivo in caso di errore +ma si elenca soltanto EINVAL, ma se si usa un puntatore non valido, che +succede? Prima era elencato anche EFAULT, ora no. Dal codice sembrerebbe + diff --git a/signal.tex b/signal.tex index 63a9400..b43af0a 100644 --- a/signal.tex +++ b/signal.tex @@ -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} -- 2.30.2 From 3e1677c91b3f6c2b2ad8554d923300fe61bcf7d0 Mon Sep 17 00:00:00 2001 From: piccardi Date: Sat, 17 Sep 2022 08:39:39 +0200 Subject: [PATCH 10/16] Piccole correzioni estetiche --- signal.tex | 57 +++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/signal.tex b/signal.tex index b43af0a..e6c75e6 100644 --- a/signal.tex +++ b/signal.tex @@ -3098,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} @@ -3117,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 @@ -3131,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 @@ -3138,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} @@ -3194,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 @@ -3265,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 -- 2.30.2 From eeab41391da85f635be3c2f3058e24b9a5265b85 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 5 Apr 2023 14:44:22 +0200 Subject: [PATCH 11/16] Aggiunti vari TODO --- fileadv.tex | 3 +++ filedir.tex | 3 +++ fileio.tex | 1 + othersock.tex | 2 ++ procadv.tex | 4 ++++ sockctrl.tex | 6 ++++-- 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 948f721..ba34116 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -3498,6 +3498,9 @@ raggruppati in un solo evento. % http://lwn.net/Articles/343346/ (incluso nel 2.6.36) % fanotify_mark() ha FAN_MARK_FILESYSTEM dal 4.20 % fanotify() ha FAN_OPEN_EXEC dal 4.21/5.0 +% fanotify() ha FAN_FS_ERROR dal 5.16, vedi +% https://docs.kernel.org/admin-guide/filesystem-monitoring.html +% fanotify() ha FAN_RENAME dal 5.17, vedi https://kernelnewbies.org/Linux_5.17 \subsection{L'interfaccia POSIX per l'I/O asincrono} diff --git a/filedir.tex b/filedir.tex index 6577274..bc1f5ab 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1182,6 +1182,9 @@ utilizzati solo in fase di montaggio: % * http://lwn.net/Articles/159077/ e % * Documentation/filesystems/sharedsubtree.txt +% TODO: (bassa priorità) trattare mount_setattr, vedi +% https://lwn.net/Articles/896255/ + % TODO: (bassa priorità) non documentati ma presenti in sys/mount.h: % * MS_POSIXACL % * MS_KERNMOUNT diff --git a/fileio.tex b/fileio.tex index f630562..28153b4 100644 --- a/fileio.tex +++ b/fileio.tex @@ -557,6 +557,7 @@ escludere la possibilità di far esistere il file anche in un secondo tempo. % NOTE: per O_TMPFILE vedi: http://kernelnewbies.org/Linux_3.11 % https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/ +% https://lwn.net/Articles/896153/ \begin{table}[!htb] diff --git a/othersock.tex b/othersock.tex index 325fb0d..aad32e4 100644 --- a/othersock.tex +++ b/othersock.tex @@ -801,6 +801,8 @@ stack dei protocolli. \subsection{I socket \textit{netlink}} \label{sec:socket_netlink} +Vedi \url{https://docs.kernel.org/next/userspace-api/netlink/index.html} + \subsection{I \textit{packet socket}} \label{sec:packet_socket} diff --git a/procadv.tex b/procadv.tex index a5ea67f..cefed26 100644 --- a/procadv.tex +++ b/procadv.tex @@ -1902,6 +1902,10 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. % TODO documentare PR_SET_SYSCALL_USER_DISPATCH in 5.11, vedi % https://lwn.net/Articles/826313/ +% TODO documentare PR_SET_MDWE in 6.3, vedi +% https://git.kernel.org/linus/b507808ebce2 + + \label{sec:prctl_operation} \end{basedescript} diff --git a/sockctrl.tex b/sockctrl.tex index 9d5279e..17514f5 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2669,8 +2669,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per \param{optval} un intero in cui verrà restituito il valore numerico che lo - identifica (ad esempio \const{SOCK\_STREAM}). - + identifica (ad esempio \const{SOCK\_STREAM}). + +% TODO verificare IP_LOCAL_PORT_RANGE, aggiunta con il 6.3 +% vedi https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=91d0b78c5177 \end{basedescript} -- 2.30.2 From 87fb95cc5ce9b6ef9106c6c237c69476d12834fa Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 5 Oct 2023 16:25:40 +0200 Subject: [PATCH 12/16] Note kernel 6.6 --- fileio.tex | 3 +++ procadv.tex | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/fileio.tex b/fileio.tex index 28153b4..55c076e 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1960,6 +1960,9 @@ aggiuntivo sono \textit{system call}, ad esempio \func{faccessat} e aderenza allo standard POSIX.1-2008, dato che la \textit{system call} sottostante non prevede l'argomento \param{flags}. +% TODO: nel kernel 6.6 è stata introdotta fchmodat2 che risolve il problema +% appena illustrato + % TODO: aggiornare per via di faccessat2 aggiunta con il kernel 5.8 In tab.~\ref{tab:at-functions_constant_values} si sono elencati i valori diff --git a/procadv.tex b/procadv.tex index cefed26..4b5912e 100644 --- a/procadv.tex +++ b/procadv.tex @@ -1360,6 +1360,10 @@ essere fornito in una forma di codice interpretabile fornito attraverso un socket o una \textit{pipe}, creati prima di lanciare il processo che eseguirà il codice non fidato. +% TODO: a partire dal kernel 6.6 è stato introdotto +% SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP that indicates that events from the +% watched process will be handled synchronously; that allows the kernel to +% schedule the two processes more efficiently (da LWN) % TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un % terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi -- 2.30.2 From cea75853940205e861aa8467e3e091e8dffd5763 Mon Sep 17 00:00:00 2001 From: piccardi Date: Fri, 20 Oct 2023 11:12:36 +0200 Subject: [PATCH 13/16] Note di copyright e piccole correzioni --- build.tex | 2 +- errors.tex | 2 +- fileadv.tex | 2 +- filedir.tex | 2 +- fileio.tex | 4 ++-- gapil.tex | 2 +- intro.tex | 2 +- ipc.tex | 2 +- macro.tex | 2 +- netlayer.tex | 2 +- network.tex | 2 +- othersock.tex | 2 +- preambolo.tex | 2 +- pref.tex | 2 +- session.tex | 2 +- signal.tex | 49 ++++++++++++++++++++++++------------------------- thread.tex | 2 +- trasplayer.tex | 2 +- 18 files changed, 42 insertions(+), 43 deletions(-) diff --git a/build.tex b/build.tex index cec0b2d..d515d78 100644 --- a/build.tex +++ b/build.tex @@ -1,6 +1,6 @@ %% build.tex %% -%% Copyright (C) 1999-2019 Simone Piccardi. Permission is granted to copy, +%% Copyright (C) 1999-2023 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", diff --git a/errors.tex b/errors.tex index b8b6a8f..d3c8d8d 100644 --- a/errors.tex +++ b/errors.tex @@ -1,6 +1,6 @@ %% errors.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/fileadv.tex b/fileadv.tex index ba34116..fd912c3 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1,6 +1,6 @@ %% fileadv.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/filedir.tex b/filedir.tex index bc1f5ab..a5ce4ce 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1,6 +1,6 @@ %% filedir.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/fileio.tex b/fileio.tex index 55c076e..301b98d 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1,6 +1,6 @@ -s%% fileio.tex (merge fileunix.tex - filestd.tex) +%% fileio.tex (merge fileunix.tex - filestd.tex) %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/gapil.tex b/gapil.tex index 3b1d0c9..4ad87a0 100644 --- a/gapil.tex +++ b/gapil.tex @@ -1,6 +1,6 @@ %% gapil.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.3 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", diff --git a/intro.tex b/intro.tex index 4059f5e..0929867 100644 --- a/intro.tex +++ b/intro.tex @@ -1,6 +1,6 @@ %% intro.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/ipc.tex b/ipc.tex index 7306d8e..bd310d3 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1,6 +1,6 @@ %% ipc.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/macro.tex b/macro.tex index 3cd6b92..30d64fe 100644 --- a/macro.tex +++ b/macro.tex @@ -1,6 +1,6 @@ %% macro.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/netlayer.tex b/netlayer.tex index 4ed5260..633ffbc 100644 --- a/netlayer.tex +++ b/netlayer.tex @@ -1,6 +1,6 @@ %% netlayer.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/network.tex b/network.tex index dde8230..95f54f4 100644 --- a/network.tex +++ b/network.tex @@ -1,6 +1,6 @@ %% network.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/othersock.tex b/othersock.tex index aad32e4..3772d68 100644 --- a/othersock.tex +++ b/othersock.tex @@ -1,6 +1,6 @@ %% othersock.tex %% -%% Copyright (C) 2004-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2004-2023 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", diff --git a/preambolo.tex b/preambolo.tex index 522eb13..a3f1175 100644 --- a/preambolo.tex +++ b/preambolo.tex @@ -1,6 +1,6 @@ %% preambolo.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/pref.tex b/pref.tex index 4659e92..512fced 100644 --- a/pref.tex +++ b/pref.tex @@ -1,6 +1,6 @@ %% pref.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/session.tex b/session.tex index 639cf0d..77510fe 100644 --- a/session.tex +++ b/session.tex @@ -1,6 +1,6 @@ %% session.tex %% -%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2023 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", diff --git a/signal.tex b/signal.tex index e6c75e6..e932644 100644 --- a/signal.tex +++ b/signal.tex @@ -3335,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 @@ -3381,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 @@ -3892,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 diff --git a/thread.tex b/thread.tex index 62f4dfd..afb1b62 100644 --- a/thread.tex +++ b/thread.tex @@ -1,6 +1,6 @@ %% thread.tex %% -%% Copyright (C) 2007-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2007-2023 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", diff --git a/trasplayer.tex b/trasplayer.tex index 97b0efb..978e9bb 100644 --- a/trasplayer.tex +++ b/trasplayer.tex @@ -1,6 +1,6 @@ %% tcpprot.tex %% -%% Copyright (C) 2002-2019 Simone Piccardi. Permission is granted to copy, +%% Copyright (C) 2002-2023 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", -- 2.30.2 From 9591992789144176c6d5d90920d21bbda5e4b7d7 Mon Sep 17 00:00:00 2001 From: piccardi Date: Fri, 20 Oct 2023 12:43:52 +0200 Subject: [PATCH 14/16] Altre piccole correzioni --- session.tex | 22 ++++++++-------- sources/sigwait.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 sources/sigwait.c diff --git a/session.tex b/session.tex index 77510fe..25c8146 100644 --- a/session.tex +++ b/session.tex @@ -44,9 +44,9 @@ Originariamente si trattava di dispositivi specifici (i terminali seriali, se non addirittura le telescriventi). Oggi questa interfaccia viene in genere emulata o tramite programmi o con le cosiddette console virtuali associate a monitor e tastiera, ma esiste sempre la possibilità di associarla direttamente -ad alcuni dispositivi, come eventuali linee seriali, ed in certi casi, come -buona parte dei dispositivi embedded su cui gira Linux (come router, access -point, ecc.) questa resta anche l'unica opzione per una \textit{console} di +a dispositivi specifici lelinee seriali, che in certi casi, come avviene per +buona parte dei dispositivi embedded su cui gira Linux come router, access +point, ecc. sono l'unica opzione per una avere una \textit{console} di sistema. @@ -64,7 +64,7 @@ molti terminali in contemporanea da una singola postazione di lavoro, ma il sistema è nato prima dell'esistenza di tutto ciò. Il \textit{job control} è una caratteristica opzionale, introdotta in BSD -negli anni '80, e successivamente standardizzata da POSIX.1. La sua +negli anni '80, e successivamente standardizzata da POSIX.1; la sua disponibilità nel sistema è verificabile attraverso il controllo della macro \macro{\_POSIX\_JOB\_CONTROL}. In generale il \textit{job control} richiede il supporto sia da parte della shell (quasi tutte ormai lo hanno), che da parte @@ -562,7 +562,7 @@ terminati. L'organizzazione del sistema del job control è strettamente connessa alle modalità con cui un utente accede al sistema per dare comandi, collegandosi ad esso con un terminale, che sia questo realmente tale, come un VT100 collegato -ad una seriale o virtuale, come quelli associati a schermo e tastiera o ad una +ad una seriale, o virtuale, come quelli associati a schermo e tastiera o ad una connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla fine le differenze sono nel dispositivo cui il kernel associa i file standard (vedi tab.~\ref{tab:file_std_files}) per l'I/O, tratteremo solo il caso @@ -695,12 +695,12 @@ Questi programmi, che devono essere eseguiti in modalità non interattiva e senza nessun intervento dell'utente, sono normalmente chiamati \textsl{demoni}, (o \textit{daemons}), nome ispirato dagli omonimi spiritelli della mitologia greca che svolgevano compiti che gli dei trovavano noiosi, di -cui parla anche Socrate (che sosteneva di averne uno al suo servizio). +cui parla anche Socrate, che sosteneva di averne uno al suo servizio. %TODO ricontrollare, i miei ricordi di filosofia sono piuttosto datati. Se però si lancia un programma demone dalla riga di comando in un sistema che -supporta, come Linux, il \textit{job control} esso verrà comunque associato ad +supporta il \textit{job control} come Linux, esso verrà comunque associato ad un terminale di controllo e mantenuto all'interno di una sessione, e anche se può essere mandato in background e non eseguire più nessun I/O su terminale, si avranno comunque tutte le conseguenze che abbiamo trattato in @@ -823,7 +823,7 @@ differenti meccanismi come: le modalità con cui queste azioni vengono realizzate dipendono ovviamente dal demone che si usa, per la gestione del quale si rimanda ad un testo di amministrazione di sistema.\footnote{l'argomento è ad esempio coperto dal - capitolo 3.2.3 si \cite{AGL}.} + capitolo 3.2.3 di \cite{AGL}.} La \acr{glibc} definisce una serie di funzioni standard con cui un processo può accedere in maniera generica al servizio di \textit{syslog}, che però @@ -1270,9 +1270,9 @@ al di fuori di questo. \label{sec:sess_terminal_io} Benché come ogni altro dispositivo i terminali siano accessibili come file, -essi hanno assunto storicamente, essendo stati a lungo l'unico modo di -accedere al sistema, una loro rilevanza specifica, che abbiamo già avuto modo -di incontrare nella precedente sezione. +essendo stati a lungo l'unico modo di accedere al sistema essi hanno assunto +storicamente una loro rilevanza specifica, che abbiamo già avuto modo di +incontrare nella precedente sezione. Esamineremo qui le peculiarità dell'I/O eseguito sui terminali, che per la loro particolare natura presenta delle differenze rispetto ai normali file su diff --git a/sources/sigwait.c b/sources/sigwait.c new file mode 100644 index 0000000..7dcc983 --- /dev/null +++ b/sources/sigwait.c @@ -0,0 +1,66 @@ +/* sigwait.c + * + * Copyright (C) 2021 Simone Piccardi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/**************************************************************** + * + * Program sigwait.c: + * Test program for sigwait function + * + * Author: Simone Piccardi + * Nov. 2021 + * + ****************************************************************/ +/* + * Include needed headers + */ +#define _GNU_SOURCE +#include /* unix standard library */ +#include /* signal constants, types and functions */ +#include /* error definitions and routines */ +#include /* C standard library */ +#include /* unix standard library */ +#include /* standard I/O library */ +#include /* C strings library */ + +int main(int argc, char *argv[]) +{ +/* + * Variables definition + */ + int i; + pid_t pid = 0; + int sig,res; + sigset_t set; + + sigemptyset(&set); + sigaddset(&set, SIGALRM); +// while (1) { + res=sigwait(&set, &sig); + printf("Sig was %d", sig); + if ( res > 0) { + printf("Errno was %d", errno); + perror("errore"); + printf("Result was %d", res); + printf("Error by res was %s", strerror(res)); + exit(11); + } else { + printf("Result was %d", res); + printf("Normal exit"); + } +// } +} -- 2.30.2 From f7a6ae8c2e5b4e412f1805db07582b1bc5ae4f06 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 10 Jan 2024 12:11:16 +0100 Subject: [PATCH 15/16] Note varie --- fileadv.tex | 12 +++++++++++- filedir.tex | 2 ++ procadv.tex | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fileadv.tex b/fileadv.tex index 948f721..8e83df6 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -925,6 +925,7 @@ attuale delle cose è sconsigliabile fare affidamento sul \textit{mandatory % TODO il supporto è stato reso opzionale nel 4.5, verrà eliminato nel futuro % (vedi http://lwn.net/Articles/667210/) +% è stato eliminato nel 5.15 \itindend{file~locking} @@ -3498,6 +3499,7 @@ raggruppati in un solo evento. % http://lwn.net/Articles/343346/ (incluso nel 2.6.36) % fanotify_mark() ha FAN_MARK_FILESYSTEM dal 4.20 % fanotify() ha FAN_OPEN_EXEC dal 4.21/5.0 +% fanotify() ha FAN_REPORT_PIDFD dal 5.14 \subsection{L'interfaccia POSIX per l'I/O asincrono} @@ -4733,7 +4735,9 @@ caching dei dati. % https://lwn.net/Articles/733256/). % TODO aggiunte MADV_COLD e MADV_PAGEOUT dal kernel 5.4, vedi % https://git.kernel.org/linus/9c276cc65a58 e -% https://git.kernel.org/linus/1a4e58cce84e +% https://git.kernel.org/linus/1a4e58cce84e +% TODO: aggiunte MADV_POPULATE_READ e MADV_POPULATE_WRITE (vedi +% https://lwn.net/Articles/861695/) \footnotetext{a partire dal kernel 2.6.32 è stato introdotto un meccanismo che identifica pagine di memoria identiche e le accorpa in una unica pagina @@ -5862,6 +5866,12 @@ da fare % TODO: trattare i file seal, vedi fcntl / F_ADD_SEAL e memfd_create +% TODO: con il kernel 5.14 è stata introdotta la syscall memfd_secret, vedi +% https://lwn.net/Articles/835342/ https://lwn.net/Articles/812325/ +% https://lwn.net/Articles/865256/ +% https://lwn.net/ml/linux-mm/20210729082900.1581359-1-rppt@kernel.org/ e +% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1507f51255c9 + % TODO trattare qui ioctl_ficlonerange ? % TODO trattare qui close_range, vedi https://lwn.net/Articles/789023/ diff --git a/filedir.tex b/filedir.tex index 6577274..e1e89e9 100644 --- a/filedir.tex +++ b/filedir.tex @@ -6262,6 +6262,8 @@ gestione delle quote è \funcd{quotactl}, ed il suo prototipo è: \end{funcproto} % TODO rivedere gli errori +% TODO aggiungere quotactl_fd introdotta con il kernel 5.14, vedi +% https://lwn.net/Articles/859679/ La funzione richiede che il filesystem sul quale si vuole operare, che deve essere specificato con il nome del relativo file di dispositivo nell'argomento diff --git a/procadv.tex b/procadv.tex index 53eb58a..69f81ea 100644 --- a/procadv.tex +++ b/procadv.tex @@ -1565,6 +1565,10 @@ all'ordinario valore nullo (dato per implicito). %TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19, vedi % https://lwn.net/Articles/582712/ %TODO: trattare PR_*NO_NEW_PRIVS, dal 3.5 +%TODO: trattare il core scheduling dal 5.14, vedi +%https://lwn.net/Articles/780703/ e https://lwn.net/Articles/861251/ +%TODO: trattare PR_SPEC_L1D_FLUSH vedi https://git.kernel.org/linus/b7fe54f6c2d4 + \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} \item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle -- 2.30.2 From 9ba1c62a79690cb2bdb753b2bc3728d046142d70 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 10 Jan 2024 12:18:24 +0100 Subject: [PATCH 16/16] Aggiornamento note copyright --- build.tex | 2 +- errors.tex | 2 +- fileadv.tex | 2 +- filedir.tex | 2 +- fileio.tex | 2 +- gapil.tex | 4 ++-- intro.tex | 2 +- ipc.tex | 2 +- macro.tex | 2 +- netlayer.tex | 2 +- network.tex | 2 +- othersock.tex | 2 +- preambolo.tex | 2 +- pref.tex | 2 +- process.tex | 2 +- prochand.tex | 2 +- ringraziamenti.tex | 2 +- session.tex | 2 +- signal.tex | 2 +- sockadv.tex | 2 +- sockctrl.tex | 2 +- socket.tex | 2 +- system.tex | 2 +- tcpsock.tex | 2 +- thread.tex | 2 +- trasplayer.tex | 2 +- 26 files changed, 27 insertions(+), 27 deletions(-) diff --git a/build.tex b/build.tex index d515d78..ad1ba8f 100644 --- a/build.tex +++ b/build.tex @@ -1,6 +1,6 @@ %% build.tex %% -%% Copyright (C) 1999-2023 Simone Piccardi. Permission is granted to copy, +%% Copyright (C) 1999-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", diff --git a/errors.tex b/errors.tex index d3c8d8d..18d618c 100644 --- a/errors.tex +++ b/errors.tex @@ -1,6 +1,6 @@ %% errors.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/fileadv.tex b/fileadv.tex index 189972a..1bce388 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1,6 +1,6 @@ %% fileadv.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/filedir.tex b/filedir.tex index 41f50a2..96c4b58 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1,6 +1,6 @@ %% filedir.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/fileio.tex b/fileio.tex index 301b98d..59a3614 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1,6 +1,6 @@ %% fileio.tex (merge fileunix.tex - filestd.tex) %% -%% Copyright (C) 2000-2023 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", diff --git a/gapil.tex b/gapil.tex index 4ad87a0..81c00c5 100644 --- a/gapil.tex +++ b/gapil.tex @@ -1,6 +1,6 @@ %% gapil.tex %% -%% Copyright (C) 2000-2023 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.3 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -136,7 +136,7 @@ hyperfootnotes=false]{hyperref} \begin{quote} - Copyright \copyright\ 2000-2021 Simone Piccardi. Permission is granted to + Copyright \copyright\ 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.3 or any later version published by the Free Software Foundation; with the Invariant Sections being ``Un preambolo'' diff --git a/intro.tex b/intro.tex index 0929867..74091fc 100644 --- a/intro.tex +++ b/intro.tex @@ -1,6 +1,6 @@ %% intro.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/ipc.tex b/ipc.tex index bd310d3..415b2a2 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1,6 +1,6 @@ %% ipc.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/macro.tex b/macro.tex index 30d64fe..9ede6c4 100644 --- a/macro.tex +++ b/macro.tex @@ -1,6 +1,6 @@ %% macro.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/netlayer.tex b/netlayer.tex index 633ffbc..275b00d 100644 --- a/netlayer.tex +++ b/netlayer.tex @@ -1,6 +1,6 @@ %% netlayer.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/network.tex b/network.tex index 95f54f4..7672423 100644 --- a/network.tex +++ b/network.tex @@ -1,6 +1,6 @@ %% network.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/othersock.tex b/othersock.tex index 3772d68..0f7b665 100644 --- a/othersock.tex +++ b/othersock.tex @@ -1,6 +1,6 @@ %% othersock.tex %% -%% Copyright (C) 2004-2023 Simone Piccardi. Permission is granted to +%% Copyright (C) 2004-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", diff --git a/preambolo.tex b/preambolo.tex index a3f1175..0d51e0e 100644 --- a/preambolo.tex +++ b/preambolo.tex @@ -1,6 +1,6 @@ %% preambolo.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/pref.tex b/pref.tex index 512fced..03e134f 100644 --- a/pref.tex +++ b/pref.tex @@ -1,6 +1,6 @@ %% pref.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/process.tex b/process.tex index 57b8873..349806e 100644 --- a/process.tex +++ b/process.tex @@ -1,6 +1,6 @@ %% process.tex %% -%% Copyright (C) 2000-2019 by Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2024 by 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", diff --git a/prochand.tex b/prochand.tex index 3ee2344..e02f0fd 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1,6 +1,6 @@ %% prochand.tex %% -%% Copyright (C) 2000-2019 by Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2024 by 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", diff --git a/ringraziamenti.tex b/ringraziamenti.tex index 6d4e77e..c5c75df 100644 --- a/ringraziamenti.tex +++ b/ringraziamenti.tex @@ -1,6 +1,6 @@ %% ringraziamenti.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", diff --git a/session.tex b/session.tex index 25c8146..beb46bb 100644 --- a/session.tex +++ b/session.tex @@ -1,6 +1,6 @@ %% session.tex %% -%% Copyright (C) 2000-2023 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", diff --git a/signal.tex b/signal.tex index e932644..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", diff --git a/sockadv.tex b/sockadv.tex index a9e4cd5..8eede04 100644 --- a/sockadv.tex +++ b/sockadv.tex @@ -1,6 +1,6 @@ %% sockadv.tex %% -%% Copyright (C) 2004-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2004-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", diff --git a/sockctrl.tex b/sockctrl.tex index 17514f5..19f9ddc 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1,6 +1,6 @@ %% sockctrl.tex %% -%% Copyright (C) 2004-2019 Simone Piccardi. Permission is granted to +%% Copyright (C) 2004-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 "Prefazione", diff --git a/socket.tex b/socket.tex index b01ff3a..51bdad7 100644 --- a/socket.tex +++ b/socket.tex @@ -1,6 +1,6 @@ %% socket.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", diff --git a/system.tex b/system.tex index a761b4d..671b102 100644 --- a/system.tex +++ b/system.tex @@ -1,6 +1,6 @@ %% system.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", diff --git a/tcpsock.tex b/tcpsock.tex index 5951a91..525867e 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -1,6 +1,6 @@ %% tcpsock.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", diff --git a/thread.tex b/thread.tex index afb1b62..b067920 100644 --- a/thread.tex +++ b/thread.tex @@ -1,6 +1,6 @@ %% thread.tex %% -%% Copyright (C) 2007-2023 Simone Piccardi. Permission is granted to +%% Copyright (C) 2007-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", diff --git a/trasplayer.tex b/trasplayer.tex index 978e9bb..4493730 100644 --- a/trasplayer.tex +++ b/trasplayer.tex @@ -1,6 +1,6 @@ %% tcpprot.tex %% -%% Copyright (C) 2002-2023 Simone Piccardi. Permission is granted to copy, +%% Copyright (C) 2002-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", -- 2.30.2