Aggiornamento date copyright più TODO 5.3
[gapil.git] / ipc.tex
diff --git a/ipc.tex b/ipc.tex
index 3acb75179058b6ed02e260fbaa28c50efc6a8c63..f50eeacf5de91bf3e075ddbcbf35d5ecf1fb3da4 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -1,6 +1,6 @@
 %% ipc.tex
 %%
-%% Copyright (C) 2000-2016 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2019 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",
@@ -96,7 +96,7 @@ con le frecce che indicano la direzione del flusso dei dati.
 \end{figure}
 
 Della funzione di sistema esiste una seconda versione, \funcd{pipe2},
-introdotta con il kernel 2.6.27 e le \acr{glibc} 2.9 e specifica di Linux
+introdotta con il kernel 2.6.27 e la \acr{glibc} 2.9 e specifica di Linux
 (utilizzabile solo definendo la macro \macro{\_GNU\_SOURCE}), che consente di
 impostare atomicamente le caratteristiche dei file descriptor restituiti, il
 suo prototipo è:
@@ -221,9 +221,9 @@ Per realizzare quanto voluto useremo in sequenza i programmi \cmd{barcode} e
 \cmd{gs}, il primo infatti è in grado di generare immagini PostScript di
 codici a barre corrispondenti ad una qualunque stringa, mentre il secondo
 serve per poter effettuare la conversione della stessa immagine in formato
-JPEG. Usando una \textit{pipe} potremo inviare l'output del primo sull'input del
-secondo, secondo lo schema mostrato in fig.~\ref{fig:ipc_pipe_use}, in cui la
-direzione del flusso dei dati è data dalle frecce continue.
+JPEG. Usando una \textit{pipe} potremo inviare l'output del primo sull'input
+del secondo, secondo lo schema mostrato in fig.~\ref{fig:ipc_pipe_use}, in cui
+la direzione del flusso dei dati è data dalle frecce continue.
 
 Si potrebbe obiettare che sarebbe molto più semplice salvare il risultato
 intermedio su un file temporaneo. Questo però non tiene conto del fatto che un
@@ -366,7 +366,7 @@ La funzione restituisce il puntatore ad uno stream associato alla
 \textit{pipe} creata, che sarà aperto in sola lettura (e quindi associato allo
 \textit{standard output} del programma indicato) in caso si sia indicato
 \code{r}, o in sola scrittura (e quindi associato allo \textit{standard
-  input}) in caso di \code{w}. A partire dalla versione 2.9 delle \acr{glibc}
+  input}) in caso di \code{w}. A partire dalla versione 2.9 della \acr{glibc}
 (questa è una estensione specifica di Linux) all'argomento \param{type} può
 essere aggiunta la lettera ``\texttt{e}'' per impostare automaticamente il
 flag di \textit{close-on-exec} sul file descriptor sottostante (si ricordi
@@ -1072,8 +1072,8 @@ Il secondo livello di controllo è quello delle varie funzioni che accedono
 direttamente (in lettura o scrittura) all'oggetto. In tal caso lo schema dei
 controlli è simile a quello dei file, ed avviene secondo questa sequenza:
 \begin{itemize*}
-\item se il processo ha i privilegi di amministratore (più precisamente la
-  capacità \const{CAP\_IPC\_OWNER}) l'accesso è sempre consentito.
+\item se il processo ha i privilegi di amministratore (più precisamente
+  \const{CAP\_IPC\_OWNER}) l'accesso è sempre consentito.
 \item se l'\ids{UID} effettivo del processo corrisponde o al valore del campo
   \var{cuid} o a quello del campo \var{uid} ed il permesso per il proprietario
   in \var{mode} è appropriato\footnote{per appropriato si intende che è
@@ -1362,7 +1362,7 @@ come \ctyp{short}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{.90\textwidth}
+  \begin{minipage}[c]{.91\textwidth}
     \includestruct{listati/msqid_ds.h}
   \end{minipage} 
   \normalsize 
@@ -1397,7 +1397,7 @@ riguarda gli altri campi invece:
 %   primo e ultimo messaggio sono inizializzati a \val{NULL} e
 %   \var{msg\_cbytes}, che esprime la dimensione in byte dei messaggi presenti è
 %   inizializzato a zero. Questi campi sono ad uso interno dell'implementazione
-%   e non devono essere utilizzati da programmi in user space).
+%   e non devono essere utilizzati da programmi in \textit{user space}).
 \end{itemize*}
 
 Una volta creata una coda di messaggi le operazioni di controllo vengono
@@ -1945,7 +1945,7 @@ processo, e la gestione diventa più complicata.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{.80\textwidth}
+  \begin{minipage}[c]{.85\textwidth}
     \includestruct{listati/semid_ds.h}
   \end{minipage} 
   \normalsize 
@@ -1975,7 +1975,7 @@ quanto riguarda gli altri campi invece:
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{.80\textwidth}
+  \begin{minipage}[c]{.85\textwidth}
     \includestruct{listati/sem.h}
   \end{minipage} 
   \normalsize 
@@ -2095,10 +2095,10 @@ unificare detto argomento esso deve essere passato come una unione
 \struct{semun}, la cui definizione, con i possibili valori che può assumere, è
 riportata in fig.~\ref{fig:ipc_semun}.
 
-Nelle versioni più vecchie delle \acr{glibc} questa unione veniva definita in
+Nelle versioni più vecchie della \acr{glibc} questa unione veniva definita in
 \file{sys/sem.h}, ma nelle versioni più recenti questo non avviene più in
 quanto lo standard POSIX.1-2001 richiede che sia sempre definita a cura del
-chiamante. In questa seconda evenienza le \acr{glibc} definiscono però la
+chiamante. In questa seconda evenienza la \acr{glibc} definisce però la
 macro \macrod{\_SEM\_SEMUN\_UNDEFINED} che può essere usata per controllare la
 situazione.
 
@@ -2140,7 +2140,7 @@ i seguenti:
   \param{semnum} dell'insieme \param{semid} (corrispondente al campo
   \var{sempid} di \struct{sem}). Va invocata con tre argomenti.  Occorre avere
   il permesso di lettura.
-\item[\constd{GETVAL}] Restituisce come valore di ritorno della funzione il il
+\item[\constd{GETVAL}] Restituisce come valore di ritorno della funzione il 
   valore corrente del semaforo \param{semnum} dell'insieme \param{semid}
   (corrispondente al campo \var{semval} di \struct{sem}). Va invocata con tre
   argomenti.  Occorre avere il permesso di lettura.
@@ -2243,7 +2243,7 @@ vettore \param{sops}.
 
 Con lo standard POSIX.1-2001 è stata introdotta una variante di \func{semop}
 che consente di specificare anche un tempo massimo di attesa. La nuova
-funzione di sistema, disponibile a partire dal kernel 2.4.22 e dalle
+funzione di sistema, disponibile a partire dal kernel 2.4.22 e dalla
 \acr{glibc} 2.3.3, ed utilizzabile solo dopo aver definito la macro
 \macro{\_GNU\_SOURCE}, è \funcd{semtimedop}, ed il suo prototipo è:
 
@@ -2304,7 +2304,7 @@ un valore nullo di \var{sem\_num}.
 
 Il campo \var{sem\_flg} è un flag, mantenuto come maschera binaria, per il
 quale possono essere impostati i due valori \const{IPC\_NOWAIT} e
-\constd{SEM\_UNDO}.  Impostando \const{IPC\_NOWAIT} si fa si che in tutti quei
+\constd{SEM\_UNDO}.  Impostando \const{IPC\_NOWAIT} si fa sì che in tutti quei
 casi in cui l'esecuzione di una operazione richiederebbe di porre il processo
 vada nello stato di \textit{sleep}, invece di bloccarsi \func{semop} ritorni
 immediatamente (abortendo così le eventuali operazioni restanti) con un errore
@@ -2427,7 +2427,7 @@ struttura \struct{sembuf}) e al processo corrente (nel campo \var{sleeper})
 poi quest'ultimo viene messo stato di attesa e viene invocato lo
 \textit{scheduler} per passare all'esecuzione di un altro processo.
 
-Se invece tutte le operazioni possono avere successo queste vengono eseguite
+Se invece tutte le operazioni possono avere successo vengono eseguite
 immediatamente, dopo di che il kernel esegue una scansione della coda di
 attesa (a partire da \var{sem\_pending}) per verificare se qualcuna delle
 operazioni sospese in precedenza può essere eseguita, nel qual caso la
@@ -2780,10 +2780,9 @@ si ha a cuore la portabilità. Questi comandi aggiuntivi sono:
   salvata su disco dal meccanismo della memoria virtuale. Come illustrato in
   sez.~\ref{sec:proc_mem_lock} fino al kernel 2.6.9 solo l'amministratore
   poteva utilizzare questa capacità,\footnote{che richiedeva la
-    \textit{capability} \const{CAP\_IPC\_LOCK}.} a partire dal dal kernel
-  2.6.10 anche gli utenti normali possono farlo fino al limite massimo
-  determinato da \const{RLIMIT\_MEMLOCK} (vedi
-  sez.~\ref{sec:sys_resource_limit}).
+    \textit{capability} \const{CAP\_IPC\_LOCK}.} a partire dal kernel 2.6.10
+  anche gli utenti normali possono farlo fino al limite massimo determinato da
+  \const{RLIMIT\_MEMLOCK} (vedi sez.~\ref{sec:sys_resource_limit}).
 \item[\constd{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento
   di memoria condivisa.  Fino al kernel 2.6.9 solo l'amministratore poteva
   utilizzare questo comando in corrispondenza di un segmento da lui bloccato.
@@ -2849,8 +2848,8 @@ stato marcato per la cancellazione.
 
 L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{lo standard
   SVID prevede che l'argomento \param{shmaddr} sia di tipo \ctyp{char *}, così
-  come il valore di ritorno della funzione; in Linux è stato così con le
-  \acr{libc4} e le \acr{libc5}, con il passaggio alla \acr{glibc} il tipo di
+  come il valore di ritorno della funzione; in Linux è stato così con la
+  \acr{libc4} e la \acr{libc5}, con il passaggio alla \acr{glibc} il tipo di
   \param{shmaddr} è divenuto un \ctyp{const void *} e quello del valore di
   ritorno un \ctyp{void *} seguendo POSIX.1-2001.} deve essere associato il
 segmento, se il valore specificato è \val{NULL} è il sistema a scegliere
@@ -2869,9 +2868,9 @@ riferiti all'indirizzo di partenza del segmento).
 
 L'argomento \param{shmflg} permette di cambiare il comportamento della
 funzione; esso va specificato come maschera binaria, i bit utilizzati al
-momento sono sono tre e sono identificati dalle costanti \const{SHM\_RND},
+momento sono tre e sono identificati dalle costanti \const{SHM\_RND},
 \const{SHM\_RDONLY} e \const{SHM\_REMAP} che vanno combinate con un OR
-aritmetico.  
+aritmetico.
 
 Specificando \constd{SHM\_RND} si evita che \func{shmat} ritorni un errore
 quando \param{shmaddr} non è allineato ai confini di una pagina. Si può quindi
@@ -3554,6 +3553,8 @@ sez.~\ref{sec:ipc_sysv_shm} che possa restituisca i risultati via rete.
 % TODO: con il kernel 3.17 è stata introdotta una fuunzionalità di
 % sigillatura dei file mappati in memoria e la system call memfd
 % (capire se va messo qui o altrove) vedi: http://lwn.net/Articles/593918/
+% col 5.1 aggiunta a memfd F_SEAL_FUTURE_WRITE, vedi 
+% https://git.kernel.org/linus/ab3948f58ff8 e https://lwn.net/Articles/782511/
 
 
 \section{L'intercomunicazione fra processi di POSIX}
@@ -3778,9 +3779,9 @@ dei rispettivi limiti di sistema altrimenti la funzione fallirà con un errore
 di \errcode{EINVAL}.  Se \param{attr} è un puntatore nullo gli attributi della
 coda saranno impostati ai valori predefiniti.
 
-I suddetti limiti di sistema sono impostati attraverso altrettanti file in
-\texttt{/proc/sys/fs/mqueue}, in particolare i file che controllano i valori
-dei limiti sono:
+I suddetti limiti di sistema sono impostati attraverso una serie di file
+presenti sotto \texttt{/proc/sys/fs/mqueue}, in particolare i file che
+controllano i valori dei limiti sono:
 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\sysctlfiled{fs/mqueue/msg\_max}] Indica il valore massimo del numero di
   messaggi in una coda e agisce come limite superiore per il valore di
@@ -3833,7 +3834,7 @@ descrittore con la funzione \funcd{mq\_close}, il cui prototipo è:
 La funzione è analoga a \func{close},\footnote{su Linux, dove le code sono
   implementate come file su un filesystem dedicato, è esattamente la stessa
   funzione, per cui non esiste una \textit{system call} autonoma e la funzione
-  viene rimappata su \func{close} dalle \acr{glibc}.}  dopo la sua esecuzione
+  viene rimappata su \func{close} dalla \acr{glibc}.}  dopo la sua esecuzione
 il processo non sarà più in grado di usare il descrittore della coda, ma
 quest'ultima continuerà ad esistere nel sistema e potrà essere acceduta con
 un'altra chiamata a \func{mq\_open}. All'uscita di un processo tutte le code
@@ -3968,8 +3969,8 @@ nell'argomento \param{msg\_ptr}, e la relativa lunghezza in \param{msg\_len}.
 Se quest'ultima eccede la dimensione massima specificata da \var{mq\_msgsize}
 le funzioni ritornano immediatamente con un errore di \errcode{EMSGSIZE}.
 
-L'argomento \param{msg\_prio} indica la priorità dell'argomento, che, essendo
-definito come \ctyp{unsigned int}, è sempre un intero positivo. I messaggi di
+L'argomento \param{msg\_prio} indica la priorità dell'argomento che essendo
+definito come \ctyp{unsigned int} è sempre un intero positivo. I messaggi di
 priorità maggiore vengono inseriti davanti a quelli di priorità inferiore, e
 quindi saranno riletti per primi. A parità del valore della priorità il
 messaggio sarà inserito in coda a tutti quelli che hanno la stessa priorità
@@ -4399,9 +4400,9 @@ sincronizzazione completamente nuovo, basato sui cosiddetti \textit{futex} (la
 sigla sta per \textit{fast user mode mutex}) con il quale è stato possibile
 implementare una versione nativa dei semafori POSIX.  Grazie a questo con i
 kernel della serie 2.6 e le nuove versioni della \acr{glibc} che usano questa
-nuova infrastruttura per quella che viene che viene chiamata \textit{New Posix
-  Thread Library}, sono state implementate anche tutte le funzioni
-dell'interfaccia dei semafori POSIX.
+nuova infrastruttura per quella che viene chiamata \textit{New Posix Thread
+  Library}, sono state implementate anche tutte le funzioni dell'interfaccia
+dei semafori POSIX.
 
 Anche in questo caso è necessario appoggiarsi alla libreria per le estensioni
 \textit{real-time} \texttt{librt}, questo significa che se si vuole utilizzare
@@ -4963,11 +4964,11 @@ quindi bloccato (causando a questo punto una interruzione delle stampe
 eseguite da \file{message\_getter}). Terminato il tempo di attesa si rilascerà
 (\texttt{\small 29-32}) il semaforo per poi uscire.
 
-Per verificare il funzionamento dei programmi occorrerà lanciare per primo
-\file{message\_getter}\footnote{lanciare per primo \file{message\_setter} darà
-  luogo ad un errore, non essendo stati creati il semaforo ed il segmento di
-  memoria condivisa.} che inizierà a stampare una volta al secondo il
-contenuto del messaggio ed i suoi dati, con qualcosa del tipo:
+Per verificare il funzionamento dei programmi occorrerà lanciare prima
+\file{message\_getter} (lanciare per primo \file{message\_setter} darebbe
+luogo ad un errore, non essendo stati creati il semaforo ed il segmento di
+memoria condivisa) che inizierà a stampare una volta al secondo il contenuto
+del messaggio ed i suoi dati, con qualcosa del tipo:
 \begin{Console}
 piccardi@hain:~/gapil/sources$  \textbf{./message_getter messaggio}
 sem=1, Fri Dec 31 14:12:41 2010
@@ -4990,10 +4991,8 @@ Sleeping for 3 seconds
 \end{Console}
 %$
 dove il programma si fermerà per 3 secondi prima di rilasciare il semaforo e
-terminare. 
-
-L'effetto di questo programma si potrà però apprezzare meglio nell'uscita di
-\file{message\_getter}, che verrà interrotta per questo stesso tempo, prima di
+terminare. L'effetto di tutto ciò si potrà vedere nell'\textit{output} di
+\file{message\_getter}, che verrà interrotto per questo stesso tempo, prima di
 ricominciare con il nuovo testo:
 \begin{Console}
 ...