Alcune correzioni ai font dei link, e una trattazione esplicita
[gapil.git] / ipc.tex
diff --git a/ipc.tex b/ipc.tex
index f16502633f4c448ed5de56226580326ed465442f..e17fe6decb0dac0bffd05c22f8e2effcbb1dbda4 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -66,8 +66,9 @@ La funzione restituisce la coppia di file descriptor nel vettore
 accennato concetto di funzionamento di una pipe è semplice: quello che si
 scrive nel file descriptor aperto in scrittura viene ripresentato tale e quale
 nel file descriptor aperto in lettura. I file descriptor infatti non sono
-connessi a nessun file reale, ma ad un buffer nel kernel, la cui dimensione è
-specificata dal parametro di sistema \const{PIPE\_BUF}, (vedi
+connessi a nessun file reale, ma, come accennato in
+sez.~\ref{sec:file_sendfile_splice}, ad un buffer nel kernel, la cui
+dimensione è specificata dal parametro di sistema \const{PIPE\_BUF}, (vedi
 sez.~\ref{sec:sys_file_limits}). Lo schema di funzionamento di una pipe è
 illustrato in fig.~\ref{fig:ipc_pipe_singular}, in cui sono illustrati i due
 capi della pipe, associati a ciascun file descriptor, con le frecce che
@@ -133,7 +134,7 @@ Per capire meglio il funzionamento delle pipe faremo un esempio di quello che
 è il loro uso più comune, analogo a quello effettuato della shell, e che
 consiste nell'inviare l'output di un processo (lo standard output) sull'input
 di un altro. Realizzeremo il programma di esempio nella forma di un
-\textit{CGI}\footnote{Un CGI (\textit{Common Gateway Interface}) è un
+\textit{CGI}\footnote{un CGI (\textit{Common Gateway Interface}) è un
   programma che permette la creazione dinamica di un oggetto da inserire
   all'interno di una pagina HTML.}  per Apache, che genera una immagine JPEG
 di un codice a barre, specificato come argomento in ingresso.
@@ -568,7 +569,7 @@ ricevuta la risposta, uscir
 A questo punto il server resta (se non ci sono altri client che stanno
 effettuando richieste) con la fifo chiusa sul lato in lettura, ed in questo
 stato la funzione \func{read} non si bloccherà in attesa di input, ma
-ritornerà in continuazione, restituendo un end-of-file.\footnote{Si è usata
+ritornerà in continuazione, restituendo un end-of-file.\footnote{si è usata
   questa tecnica per compatibilità, Linux infatti supporta l'apertura delle
   fifo in lettura/scrittura, per cui si sarebbe potuto effettuare una singola
   apertura con \const{O\_RDWR}, la doppia apertura comunque ha il vantaggio
@@ -749,9 +750,9 @@ entrambe le direzioni. Il prototipo della funzione 
   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{EAFNOSUPPORT}] I socket locali non sono supportati.
-  \item[\errcode{EPROTONOSUPPORT}] Il protocollo specificato non è supportato.
-  \item[\errcode{EOPNOTSUPP}] Il protocollo specificato non supporta la
+  \item[\errcode{EAFNOSUPPORT}] i socket locali non sono supportati.
+  \item[\errcode{EPROTONOSUPPORT}] il protocollo specificato non è supportato.
+  \item[\errcode{EOPNOTSUPP}] il protocollo specificato non supporta la
   creazione di coppie di socket.
   \end{errlist}
   ed inoltre \errval{EMFILE},  \errval{EFAULT}.
@@ -1017,8 +1018,9 @@ Il sistema dispone sempre di un numero fisso di oggetti di IPC,\footnote{fino
   altri limiti relativi al \textit{SysV IPC}) solo con una ricompilazione del
   kernel, andando a modificarne la definizione nei relativi header file.  A
   partire dal kernel 2.4.x è possibile cambiare questi valori a sistema attivo
-  scrivendo sui file \file{shmmni}, \file{msgmni} e \file{sem} di
-  \file{/proc/sys/kernel} o con l'uso di \func{sysctl}.} e per ciascuno di
+  scrivendo sui file \procrelfile{/proc/sys/kernel}{shmmni},
+  \procrelfile{/proc/sys/kernel}{msgmni} e \procrelfile{/proc/sys/kernel}{sem}
+  di \file{/proc/sys/kernel} o con l'uso di \func{sysctl}.} e per ciascuno di
 essi viene mantenuto in \var{seq} un numero di sequenza progressivo che viene
 incrementato di uno ogni volta che l'oggetto viene cancellato. Quando
 l'oggetto viene creato usando uno spazio che era già stato utilizzato in
@@ -1101,15 +1103,15 @@ di messaggi esistente (o di crearne una se questa non esiste) 
   \bodydesc{La funzione restituisce l'identificatore (un intero positivo) o -1
     in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{EACCES}] Il processo chiamante non ha i privilegi per accedere
+  \item[\errcode{EACCES}] il processo chiamante non ha i privilegi per accedere
   alla coda richiesta.  
-  \item[\errcode{EEXIST}] Si è richiesta la creazione di una coda che già
+  \item[\errcode{EEXIST}] si è richiesta la creazione di una coda che già
   esiste, ma erano specificati sia \const{IPC\_CREAT} che \const{IPC\_EXCL}. 
-  \item[\errcode{EIDRM}] La coda richiesta è marcata per essere cancellata.
-  \item[\errcode{ENOENT}] Si è cercato di ottenere l'identificatore di una coda
+  \item[\errcode{EIDRM}] la coda richiesta è marcata per essere cancellata.
+  \item[\errcode{ENOENT}] si è cercato di ottenere l'identificatore di una coda
     di messaggi specificando una chiave che non esiste e \const{IPC\_CREAT}
     non era specificato.
-  \item[\errcode{ENOSPC}] Si è cercato di creare una coda di messaggi quando è
+  \item[\errcode{ENOSPC}] si è cercato di creare una coda di messaggi quando è
     stato superato il limite massimo di code (\const{MSGMNI}).
   \end{errlist}
   ed inoltre \errval{ENOMEM}.
@@ -1160,7 +1162,7 @@ coda.
     \hline
     \hline
     \const{MSGMNI}&   16& \file{msgmni} & Numero massimo di code di
-                                          messaggi. \\
+                                          messaggi.\\
     \const{MSGMAX}& 8192& \file{msgmax} & Dimensione massima di un singolo
                                           messaggio.\\
     \const{MSGMNB}&16384& \file{msgmnb} & Dimensione massima del contenuto di 
@@ -1175,7 +1177,9 @@ Le code di messaggi sono caratterizzate da tre limiti fondamentali, definiti
 negli header e corrispondenti alle prime tre costanti riportate in
 tab.~\ref{tab:ipc_msg_limits}, come accennato però in Linux è possibile
 modificare questi limiti attraverso l'uso di \func{sysctl} o scrivendo nei
-file \file{msgmax}, \file{msgmnb} e \file{msgmni} di \file{/proc/sys/kernel/}.
+file \procrelfile{/proc/sys/kernel}{msgmax},
+\procrelfile{/proc/sys/kernel}{msgmnb} e
+\procrelfile{/proc/sys/kernel}{msgmni} di \file{/proc/sys/kernel/}.
 
 
 \begin{figure}[htb]
@@ -1269,10 +1273,10 @@ prototipo 
   \bodydesc{La funzione restituisce 0 in caso di successo o -1 in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{EACCES}] Si è richiesto \const{IPC\_STAT} ma processo
+  \item[\errcode{EACCES}] si è richiesto \const{IPC\_STAT} ma processo
     chiamante non ha i privilegi di lettura sulla coda.
-  \item[\errcode{EIDRM}] La coda richiesta è stata cancellata.
-  \item[\errcode{EPERM}] Si è richiesto \const{IPC\_SET} o \const{IPC\_RMID} ma
+  \item[\errcode{EIDRM}] la coda richiesta è stata cancellata.
+  \item[\errcode{EPERM}] si è richiesto \const{IPC\_SET} o \const{IPC\_RMID} ma
     il processo non ha i privilegi, o si è richiesto di aumentare il valore di
     \var{msg\_qbytes} oltre il limite \const{MSGMNB} senza essere
     amministratore.
@@ -1324,13 +1328,13 @@ messaggio su una coda si utilizza la funzione \funcd{msgsnd}; il suo prototipo
   \bodydesc{La funzione restituisce 0, e -1 in caso di errore, nel qual caso
     \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{EACCES}] Non si hanno i privilegi di accesso sulla coda.
-  \item[\errcode{EIDRM}] La coda è stata cancellata.
-  \item[\errcode{EAGAIN}] Il messaggio non può essere inviato perché si è
+  \item[\errcode{EACCES}] non si hanno i privilegi di accesso sulla coda.
+  \item[\errcode{EIDRM}] la coda è stata cancellata.
+  \item[\errcode{EAGAIN}] il messaggio non può essere inviato perché si è
   superato il limite \var{msg\_qbytes} sul numero massimo di byte presenti
   sulla coda, e si è richiesto \const{IPC\_NOWAIT} in \param{flag}.
-  \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
-  \item[\errcode{EINVAL}] Si è specificato un \param{msgid} invalido, o un
+  \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+  \item[\errcode{EINVAL}] si è specificato un \param{msgid} invalido, o un
     valore non positivo per \param{mtype}, o un valore di \param{msgsz}
     maggiore di \const{MSGMAX}.
   \end{errlist}
@@ -1432,13 +1436,13 @@ La funzione che viene utilizzata per estrarre un messaggio da una coda 
     successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà uno
     dei valori:
   \begin{errlist}
-  \item[\errcode{EACCES}] Non si hanno i privilegi di accesso sulla coda.
-  \item[\errcode{EIDRM}] La coda è stata cancellata.
-  \item[\errcode{E2BIG}] Il testo del messaggio è più lungo di \param{msgsz} e
+  \item[\errcode{EACCES}] non si hanno i privilegi di accesso sulla coda.
+  \item[\errcode{EIDRM}] la coda è stata cancellata.
+  \item[\errcode{E2BIG}] il testo del messaggio è più lungo di \param{msgsz} e
     non si è specificato \const{MSG\_NOERROR} in \param{msgflg}.
-  \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale mentre
+  \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale mentre
     era in attesa di ricevere un messaggio.
-  \item[\errcode{EINVAL}] Si è specificato un \param{msgid} invalido o un
+  \item[\errcode{EINVAL}] si è specificato un \param{msgid} invalido o un
     valore di \param{msgsz} negativo.
   \end{errlist}
   ed inoltre \errval{EFAULT}.
@@ -1724,7 +1728,7 @@ pertanto una realizzazione di un oggetto di questo tipo 
 demandata al kernel. La forma più semplice di semaforo è quella del
 \textsl{semaforo binario}, o \textit{mutex}, in cui un valore diverso da zero
 (normalmente 1) indica la libertà di accesso, e un valore nullo l'occupazione
-della risorsa; in generale però si possono usare semafori con valori interi,
+della risorsa. In generale però si possono usare semafori con valori interi,
 utilizzando il valore del contatore come indicatore del ``numero di risorse''
 ancora disponibili.
 
@@ -1745,15 +1749,15 @@ permette di creare o ottenere l'identificatore di un insieme di semafori 
   \bodydesc{La funzione restituisce l'identificatore (un intero positivo) o -1
     in caso di errore, nel qual caso \var{errno} assumerà i valori:
     \begin{errlist}
-    \item[\errcode{ENOSPC}] Si è cercato di creare una insieme di semafori
+    \item[\errcode{ENOSPC}] si è cercato di creare una insieme di semafori
       quando è stato superato o il limite per il numero totale di semafori
       (\const{SEMMNS}) o quello per il numero totale degli insiemi
       (\const{SEMMNI}) nel sistema.
-    \item[\errcode{EINVAL}] L'argomento \param{nsems} è minore di zero o
+    \item[\errcode{EINVAL}] l'argomento \param{nsems} è minore di zero o
       maggiore del limite sul numero di semafori per ciascun insieme
       (\const{SEMMSL}), o se l'insieme già esiste, maggiore del numero di
       semafori che contiene.
-    \item[\errcode{ENOMEM}] Il sistema non ha abbastanza memoria per poter
+    \item[\errcode{ENOMEM}] il sistema non ha abbastanza memoria per poter
       contenere le strutture per un nuovo insieme di semafori.
     \end{errlist}
     ed inoltre \errval{EACCES}, \errval{ENOENT}, \errval{EEXIST},
@@ -1788,7 +1792,6 @@ del sistema. Come vedremo esistono delle modalit
 diventa necessario indicare esplicitamente che si vuole il ripristino del
 semaforo all'uscita del processo.
 
-
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
@@ -1819,7 +1822,6 @@ quanto riguarda gli altri campi invece:
   effettuata, viene inizializzato a zero.
 \end{itemize*}
 
-
 Ciascun semaforo dell'insieme è realizzato come una struttura di tipo
 \struct{sem} che ne contiene i dati essenziali, la sua definizione\footnote{si
   è riportata la definizione originaria del kernel 1.0, che contiene la prima
@@ -1862,16 +1864,16 @@ indicano rispettivamente:
     \textbf{Costante} & \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    \const{SEMMNI}&          128 & Numero massimo di insiemi di semafori. \\
+    \const{SEMMNI}&          128 & Numero massimo di insiemi di semafori.\\
     \const{SEMMSL}&          250 & Numero massimo di semafori per insieme.\\
     \const{SEMMNS}&\const{SEMMNI}*\const{SEMMSL}& Numero massimo di semafori
-                                   nel sistema .\\
+                                   nel sistema.\\
     \const{SEMVMX}&        32767 & Massimo valore per un semaforo.\\
     \const{SEMOPM}&           32 & Massimo numero di operazioni per chiamata a
                                    \func{semop}. \\
     \const{SEMMNU}&\const{SEMMNS}& Massimo numero di strutture di ripristino.\\
     \const{SEMUME}&\const{SEMOPM}& Massimo numero di voci di ripristino.\\
-    \const{SEMAEM}&\const{SEMVMX}& valore massimo per l'aggiustamento
+    \const{SEMAEM}&\const{SEMVMX}& Valore massimo per l'aggiustamento
                                    all'uscita. \\
     \hline
   \end{tabular}
@@ -1884,7 +1886,7 @@ Come per le code di messaggi anche per gli insiemi di semafori esistono una
 serie di limiti, i cui valori sono associati ad altrettante costanti, che si
 sono riportate in tab.~\ref{tab:ipc_sem_limits}. Alcuni di questi limiti sono
 al solito accessibili e modificabili attraverso \func{sysctl} o scrivendo
-direttamente nel file \file{/proc/sys/kernel/sem}.
+direttamente nel file \procfile{/proc/sys/kernel/sem}.
 
 La funzione che permette di effettuare le varie operazioni di controllo sui
 semafori (fra le quali, come accennato, è impropriamente compresa anche la
@@ -1904,12 +1906,12 @@ loro inizializzazione) 
     quattro. In caso di errore restituisce -1, ed \var{errno} assumerà uno dei
     valori:
     \begin{errlist}
-    \item[\errcode{EACCES}] Il processo non ha i privilegi per eseguire
+    \item[\errcode{EACCES}] il processo non ha i privilegi per eseguire
       l'operazione richiesta.
-    \item[\errcode{EIDRM}] L'insieme di semafori è stato cancellato.
-    \item[\errcode{EPERM}] Si è richiesto \const{IPC\_SET} o \const{IPC\_RMID}
+    \item[\errcode{EIDRM}] l'insieme di semafori è stato cancellato.
+    \item[\errcode{EPERM}] si è richiesto \const{IPC\_SET} o \const{IPC\_RMID}
       ma il processo non ha privilegi sufficienti ad eseguire l'operazione.
-    \item[\errcode{ERANGE}] Si è richiesto \const{SETALL} \const{SETVAL} ma il
+    \item[\errcode{ERANGE}] si è richiesto \const{SETALL} \const{SETVAL} ma il
       valore a cui si vuole impostare il semaforo è minore di zero o maggiore
       di \const{SEMVMX}.
   \end{errlist}
@@ -2010,10 +2012,10 @@ tutti i semafori il cui valore viene modificato.
     \textbf{Operazione}  & \textbf{Valore restituito} \\
     \hline
     \hline
-    \const{GETNCNT}& valore di \var{semncnt}.\\
-    \const{GETPID} & valore di \var{sempid}.\\
-    \const{GETVAL} & valore di \var{semval}.\\
-    \const{GETZCNT}& valore di \var{semzcnt}.\\
+    \const{GETNCNT}& Valore di \var{semncnt}.\\
+    \const{GETPID} & Valore di \var{sempid}.\\
+    \const{GETVAL} & Valore di \var{semval}.\\
+    \const{GETZCNT}& Valore di \var{semzcnt}.\\
     \hline
   \end{tabular}
   \caption{Valori di ritorno della funzione \func{semctl}.} 
@@ -2042,18 +2044,18 @@ vengono effettuate con la funzione \funcd{semop}, il cui prototipo 
   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
     \begin{errlist}
-    \item[\errcode{EACCES}] Il processo non ha i privilegi per eseguire
+    \item[\errcode{EACCES}] il processo non ha i privilegi per eseguire
       l'operazione richiesta.
-    \item[\errcode{EIDRM}] L'insieme di semafori è stato cancellato.
-    \item[\errcode{ENOMEM}] Si è richiesto un \const{SEM\_UNDO} ma il sistema
+    \item[\errcode{EIDRM}] l'insieme di semafori è stato cancellato.
+    \item[\errcode{ENOMEM}] si è richiesto un \const{SEM\_UNDO} ma il sistema
       non ha le risorse per allocare la struttura di ripristino.
-    \item[\errcode{EAGAIN}] Un'operazione comporterebbe il blocco del processo,
+    \item[\errcode{EAGAIN}] un'operazione comporterebbe il blocco del processo,
       ma si è specificato \const{IPC\_NOWAIT} in \var{sem\_flg}.
-    \item[\errcode{EINTR}] La funzione, bloccata in attesa dell'esecuzione
+    \item[\errcode{EINTR}] la funzione, bloccata in attesa dell'esecuzione
       dell'operazione, viene interrotta da un segnale.
-    \item[\errcode{E2BIG}] L'argomento \param{nsops} è maggiore del numero
+    \item[\errcode{E2BIG}] l'argomento \param{nsops} è maggiore del numero
       massimo di operazioni \const{SEMOPM}.
-    \item[\errcode{ERANGE}] Per alcune operazioni il valore risultante del
+    \item[\errcode{ERANGE}] per alcune operazioni il valore risultante del
       semaforo viene a superare il limite massimo \const{SEMVMX}.
   \end{errlist}
   ed inoltre \errval{EFAULT} ed \errval{EINVAL}.
@@ -2336,14 +2338,14 @@ ed il suo prototipo 
   \bodydesc{La funzione restituisce l'identificatore (un intero positivo) o -1
     in caso di errore, nel qual caso \var{errno} assumerà i valori:
     \begin{errlist}
-    \item[\errcode{ENOSPC}] Si è superato il limite (\const{SHMMNI}) sul numero
+    \item[\errcode{ENOSPC}] si è superato il limite (\const{SHMMNI}) sul numero
       di segmenti di memoria nel sistema, o cercato di allocare un segmento le
       cui dimensioni fanno superare il limite di sistema (\const{SHMALL}) per
       la memoria ad essi riservata.
-    \item[\errcode{EINVAL}] Si è richiesta una dimensione per un nuovo segmento
+    \item[\errcode{EINVAL}] si è richiesta una dimensione per un nuovo segmento
       maggiore di \const{SHMMAX} o minore di \const{SHMMIN}, o se il segmento
       già esiste \param{size} è maggiore delle sue dimensioni.
-    \item[\errcode{ENOMEM}] Il sistema non ha abbastanza memoria per poter
+    \item[\errcode{ENOMEM}] il sistema non ha abbastanza memoria per poter
       contenere le strutture per un nuovo segmento di memoria condivisa.
     \end{errlist}
     ed inoltre \errval{EACCES}, \errval{ENOENT}, \errval{EEXIST},
@@ -2430,23 +2432,25 @@ che permettono di cambiarne il valore.
     & \textbf{Significato} \\
     \hline
     \hline
-    \const{SHMALL}& 0x200000&\file{shmall}& Numero massimo di pagine che 
-                                       possono essere usate per i segmenti di
-                                       memoria condivisa. \\
-    \const{SHMMAX}&0x2000000&\file{shmmax}& Dimensione massima di un segmento 
-                                            di memoria condivisa.\\
-    \const{SHMMNI}&     4096&\file{msgmni}& Numero massimo di segmenti di 
-                                            memoria condivisa presenti nel
-                                            kernel.\\ 
+    \const{SHMALL}& 0x200000&\procrelfile{/proc/sys/kernel}{shmall}
+                            & Numero massimo di pagine che 
+                              possono essere usate per i segmenti di
+                              memoria condivisa.\\
+    \const{SHMMAX}&0x2000000&\procrelfile{/proc/sys/kernel}{shmmax} 
+                            & Dimensione massima di un segmento di memoria
+                              condivisa.\\ 
+    \const{SHMMNI}&     4096&\procrelfile{/proc/sys/kernel}{msgmni}
+                            & Numero massimo di segmenti di memoria condivisa
+                              presenti nel kernel.\\ 
     \const{SHMMIN}&        1& ---         & Dimensione minima di un segmento di
-                                            memoria condivisa. \\
+                                            memoria condivisa.\\
     \const{SHMLBA}&\const{PAGE\_SIZE}&--- & Limite inferiore per le dimensioni
                                             minime di un segmento (deve essere
                                             allineato alle dimensioni di una
-                                            pagina di memoria). \\
+                                            pagina di memoria).\\
     \const{SHMSEG}&   ---   &     ---     & Numero massimo di segmenti di
-                                            memoria condivisa 
-                                            per ciascun processo.\\
+                                            memoria condivisa per ciascun
+                                            processo.\\
 
 
     \hline
@@ -2470,18 +2474,18 @@ un segmento di memoria condivisa 
   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
     errore, nel qual caso \var{errno} assumerà i valori:
     \begin{errlist}
-    \item[\errcode{EACCES}] Si è richiesto \const{IPC\_STAT} ma i permessi non
+    \item[\errcode{EACCES}] si è richiesto \const{IPC\_STAT} ma i permessi non
       consentono l'accesso in lettura al segmento.
-    \item[\errcode{EINVAL}] O \param{shmid} non è un identificatore valido o
+    \item[\errcode{EINVAL}] o \param{shmid} non è un identificatore valido o
       \param{cmd} non è un comando valido.
-    \item[\errcode{EIDRM}] L'argomento \param{shmid} fa riferimento ad un
+    \item[\errcode{EIDRM}] l'argomento \param{shmid} fa riferimento ad un
       segmento che è stato cancellato.
-    \item[\errcode{EPERM}] Si è specificato un comando con \const{IPC\_SET} o
+    \item[\errcode{EPERM}] si è specificato un comando con \const{IPC\_SET} o
       \const{IPC\_RMID} senza i permessi necessari.
-    \item[\errcode{EOVERFLOW}] Si è tentato il comando \const{IPC\_STAT} ma il
+    \item[\errcode{EOVERFLOW}] si è tentato il comando \const{IPC\_STAT} ma il
       valore del group-ID o dell'user-ID è troppo grande per essere
       memorizzato nella struttura puntata da \param{buf}.
-    \item[\errcode{EFAULT}] L'indirizzo specificato con \param{buf} non è
+    \item[\errcode{EFAULT}] l'indirizzo specificato con \param{buf} non è
       valido.
     \end{errlist}
 }
@@ -2542,9 +2546,9 @@ il suo prototipo 
     successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà i
     valori:
     \begin{errlist}
-    \item[\errcode{EACCES}] Il processo non ha i privilegi per accedere al
+    \item[\errcode{EACCES}] il processo non ha i privilegi per accedere al
       segmento nella modalità richiesta.
-    \item[\errcode{EINVAL}] Si è specificato un identificatore invalido per
+    \item[\errcode{EINVAL}] si è specificato un identificatore invalido per
       \param{shmid}, o un indirizzo non allineato sul confine di una pagina
       per \param{shmaddr}.
     \end{errlist}
@@ -2569,9 +2573,9 @@ stato marcato per la cancellazione.
   \label{fig:ipc_shmem_layout}
 \end{figure}
 
-L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{Lo standard
+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
+  come il valore di ritorno della funzione; in Linux è stato così con le
   \acr{libc4} e le \acr{libc5}, con il passaggio alle \acr{glibc} il tipo di
   \param{shmaddr} è divenuto un \ctyp{const void *} e quello del valore di
   ritorno un \ctyp{void *}.} deve essere associato il segmento, se il valore
@@ -3236,6 +3240,7 @@ pi
 sez.~\ref{sec:ipc_sysv_shm} che possa restituisca i risultati via rete.
 \itindend{memory~mapping}
 
+% TODO fare esempio di mmap anonima
 
 \section{Il sistema di comunicazione fra processi di POSIX}
 \label{sec:ipc_posix}
@@ -3258,7 +3263,7 @@ le code di messaggi sono supportate a partire dal kernel 2.6.6.
 
 La caratteristica fondamentale dell'interfaccia POSIX è l'abbandono dell'uso
 degli identificatori e delle chiavi visti nel SysV IPC, per passare ai
-\textit{POSIX IPC names}\itindex{POSIX~IPC~names}, che sono sostanzialmente
+\itindex{POSIX~IPC~names} \textit{POSIX IPC names}, che sono sostanzialmente
 equivalenti ai nomi dei file. Tutte le funzioni che creano un oggetto di IPC
 POSIX prendono come primo argomento una stringa che indica uno di questi nomi;
 lo standard è molto generico riguardo l'implementazione, ed i nomi stessi
@@ -3266,7 +3271,7 @@ possono avere o meno una corrispondenza sul filesystem; tutto quello che 
 richiesto è che:
 \begin{itemize}
 \item i nomi devono essere conformi alle regole che caratterizzano i
-  \itindex{pathname}\textit{pathname}, in particolare non essere più lunghi di
+  \itindex{pathname} \textit{pathname}, in particolare non essere più lunghi di
   \const{PATH\_MAX} byte e terminati da un carattere nullo.
 \item se il nome inizia per una \texttt{/} chiamate differenti allo stesso
   nome fanno riferimento allo stesso oggetto, altrimenti l'interpretazione del
@@ -3286,28 +3291,28 @@ directory (rispettivamente \file{/dev/shm} e \file{/dev/mqueue}, per i
 dettagli si faccia riferimento a sez.~\ref{sec:ipc_posix_shm},
 sez.~\ref{sec:ipc_posix_sem} e sez.~\ref{sec:ipc_posix_mq}) ed i nomi
 specificati nelle relative funzioni sono considerati come un
-\itindsub{pathname}{assoluto}\textit{pathname} assoluto (comprendente
+\itindsub{pathname}{assoluto} \textit{pathname} assoluto (comprendente
 eventuali sottodirectory) rispetto a queste radici.
 
 Il vantaggio degli oggetti di IPC POSIX è comunque che essi vengono inseriti
 nell'albero dei file, e possono essere maneggiati con le usuali funzioni e
 comandi di accesso ai file,\footnote{questo è vero nel caso di Linux, che usa
   una implementazione che lo consente, non è detto che altrettanto valga per
-  altri kernel; in particolare sia la memoria condivisa che per le code di
-  messaggi, come si può facilmente evincere con uno \cmd{strace}, le system
-  call utilizzate sono le stesse, in quanto detti oggetti sono realizzati con
-  dei file in speciali filesystem.}  che funzionano come su dei file normali.
+  altri kernel; in particolare, come si può facilmente verificare con uno
+  \cmd{strace}, sia per la memoria condivisa che per le code di messaggi le
+  system call utilizzate da Linux sono le stesse di quelle dei file, essendo
+  detti oggetti realizzati come tali in appositi filesystem.}  che funzionano
+come su dei file normali.
 
 In particolare i permessi associati agli oggetti di IPC POSIX sono identici ai
-permessi dei file, e il controllo di accesso segue esattamente la stessa
-semantica (quella illustrata in sez.~\ref{sec:file_access_control}), invece di
+permessi dei file, ed il controllo di accesso segue esattamente la stessa
+semantica (quella illustrata in sez.~\ref{sec:file_access_control}), e non
 quella particolare (si ricordi quanto visto in
-sez.~\ref{sec:ipc_sysv_access_control}) usata per gli oggetti del SysV IPC.
-Per quanto riguarda l'attribuzione dell'utente e del gruppo proprietari
-dell'oggetto alla creazione di quest'ultimo essa viene effettuata secondo la
-semantica SysV; essi corrispondono cioè a userid e groupid effettivi del
-processo che esegue la creazione.
-
+sez.~\ref{sec:ipc_sysv_access_control}) che viene usata per gli oggetti del
+SysV IPC.  Per quanto riguarda l'attribuzione dell'utente e del gruppo
+proprietari dell'oggetto alla creazione di quest'ultimo essa viene effettuata
+secondo la semantica SysV: corrispondono cioè a user-ID e group-ID effettivi
+del processo che esegue la creazione.
 
 
 \subsection{Code di messaggi}
@@ -3317,28 +3322,27 @@ Le code di messaggi POSIX sono supportate da Linux a partire dalla versione
 2.6.6-rc1 del kernel,\footnote{l'implementazione è dovuta a Michal Wronski e
   Krzysztof Benedyczak, e le relative informazioni si possono trovare su
   \href{http://www.geocities.com/wronski12/posix_ipc/index.html}
-  {\texttt{http://www.geocities.com/wronski12/posix\_ipc/index.html}}.} In
+  {\textsf{http://www.geocities.com/wronski12/posix\_ipc/index.html}}.} In
 generale, come le corrispettive del SysV IPC, le code di messaggi sono poco
 usate, dato che i socket, nei casi in cui sono sufficienti, sono più comodi, e
 che in casi più complessi la comunicazione può essere gestita direttamente con
 mutex (o semafori) e memoria condivisa con tutta la flessibilità che occorre.
 
 Per poter utilizzare le code di messaggi, oltre ad utilizzare un kernel
-superiore al 2.6.6 (o precedente, purché cui siano stati opportunamente
-applicati i relativi patch) occorre utilizzare la libreria
-\file{libmqueue}\footnote{i programmi che usano le code di messaggi cioè
-  devono essere compilati aggiungendo l'opzione \code{-lmqueue} al comando
-  \cmd{gcc}, dato che le funzioni non fanno parte della libreria standard, in
-  corrispondenza all'inclusione del supporto nel kernel ufficiale, anche le
-  relative funzioni sono state inserite nelle \acr{glibc}, e presenti a
-  partire dalla versione 2.3.4 delle medesime.}  che contiene le funzioni
-dell'interfaccia POSIX.\footnote{in realtà l'implementazione è realizzata
-  tramite delle speciali chiamate ad \func{ioctl} sui file del filesystem
-  speciale su cui vengono mantenuti questi oggetti di IPC.}
+superiore al 2.6.6 (o precedente, se sono stati opportunamente applicati i
+relativi patch) occorre utilizzare la libreria \file{libmqueue}\footnote{i
+  programmi che usano le code di messaggi cioè devono essere compilati
+  aggiungendo l'opzione \code{-lmqueue} al comando \cmd{gcc}; in
+  corrispondenza all'inclusione del supporto nel kernel ufficiale anche
+  \file{libmqueue} è stata inserita nelle \acr{glibc}, a partire dalla
+  versione 2.3.4 delle medesime.} che contiene le funzioni dell'interfaccia
+POSIX.\footnote{in realtà l'implementazione è realizzata tramite delle
+  opportune chiamate ad \func{ioctl} sui file del filesystem speciale su cui
+  vengono mantenuti questi oggetti di IPC.}
 
 La libreria inoltre richiede la presenza dell'apposito filesystem di tipo
 \texttt{mqueue} montato su \file{/dev/mqueue}; questo può essere fatto
-aggiungendo ad \file{/etc/fstab} una riga come:
+aggiungendo ad \conffile{/etc/fstab} una riga come:
 \begin{verbatim}
 mqueue   /dev/mqueue       mqueue    defaults        0      0
 \end{verbatim}
@@ -3365,15 +3369,15 @@ di messaggi POSIX 
     di successo e -1 in caso di errore; nel quel caso \var{errno} assumerà i
     valori:
     \begin{errlist}
-    \item[\errcode{EACCES}] Il processo non ha i privilegi per accedere al
+    \item[\errcode{EACCES}] il processo non ha i privilegi per accedere al
       alla memoria secondo quanto specificato da \param{oflag}.
-    \item[\errcode{EEXIST}] Si è specificato \const{O\_CREAT} e
+    \item[\errcode{EEXIST}] si è specificato \const{O\_CREAT} e
       \const{O\_EXCL} ma la coda già esiste.
-    \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
-    \item[\errcode{EINVAL}] Il file non supporta la funzione, o si è
+    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+    \item[\errcode{EINVAL}] il file non supporta la funzione, o si è
       specificato \const{O\_CREAT} con una valore non nullo di \param{attr} e
       valori non validi di \var{mq\_maxmsg} e \var{mq\_msgsize}.
-    \item[\errcode{ENOENT}] Non si è specificato \const{O\_CREAT} ma la coda
+    \item[\errcode{ENOENT}] non si è specificato \const{O\_CREAT} ma la coda
       non esiste.
     \end{errlist}
     ed inoltre \errval{ENOMEM}, \errval{ENOSPC}, \errval{EFAULT},
@@ -3439,7 +3443,7 @@ fig.~\ref{fig:ipc_mq_attr}.
   \label{fig:ipc_mq_attr}
 \end{figure}
 
-Per ls creazione della coda i campi della struttura che devono essere
+Per la creazione della coda i campi della struttura che devono essere
 specificati sono \var{mq\_msgsize} e \var{mq\_maxmsg}, che indicano
 rispettivamente la dimensione massima di un messaggio ed il numero massimo di
 messaggi che essa può contenere. Il valore dovrà essere positivo e minore dei
@@ -3556,16 +3560,16 @@ Per inserire messaggi su di una coda sono previste due funzioni,
   \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di
     errore; nel quel caso \var{errno} assumerà i valori:
     \begin{errlist}
-    \item[\errcode{EAGAIN}] Si è aperta la coda con \const{O\_NONBLOCK}, e la
+    \item[\errcode{EAGAIN}] si è aperta la coda con \const{O\_NONBLOCK}, e la
       coda è piena.
-    \item[\errcode{EMSGSIZE}] La lunghezza del messaggio \param{msg\_len}
+    \item[\errcode{EMSGSIZE}] la lunghezza del messaggio \param{msg\_len}
       eccede il limite impostato per la coda.
-    \item[\errcode{ENOMEM}] Il kernel non ha memoria sufficiente. Questo
+    \item[\errcode{ENOMEM}] il kernel non ha memoria sufficiente. Questo
       errore può avvenire quando l'inserimento del messaggio
-    \item[\errcode{EINVAL}] Si è specificato un valore nullo per
+    \item[\errcode{EINVAL}] si è specificato un valore nullo per
       \param{msg\_len}, o un valore di \param{msg\_prio} fuori dai limiti, o
       un valore non valido per \param{abs\_timeout}.
-    \item[\errcode{ETIMEDOUT}] L'inserimento del messaggio non è stato
+    \item[\errcode{ETIMEDOUT}] l'inserimento del messaggio non è stato
       effettuato entro il tempo stabilito.
     \end{errlist}    
     ed inoltre \errval{EBADF} ed \errval{EINTR}.}
@@ -3585,7 +3589,7 @@ valore della priorit
 
 Qualora la coda sia piena, entrambe le funzioni si bloccano, a meno che non
 sia stata selezionata in fase di apertura la modalità non
-bloccante,\footnote{o si sia impostato il flag \const{O\_NONBLOCK} sul fie
+bloccante,\footnote{o si sia impostato il flag \const{O\_NONBLOCK} sul file
   descriptor della coda.} nel qual caso entrambe ritornano \errcode{EAGAIN}.
 La sola differenza fra le due funzioni è che la seconda, passato il tempo
 massimo impostato con l'argomento \param{abs\_timeout},\footnote{deve essere
@@ -3614,13 +3618,13 @@ prototipi sono:
     di successo e -1 in caso di errore; nel quel caso \var{errno} assumerà i
     valori:
     \begin{errlist}
-    \item[\errcode{EAGAIN}] Si è aperta la coda con \const{O\_NONBLOCK}, e la
+    \item[\errcode{EAGAIN}] si è aperta la coda con \const{O\_NONBLOCK}, e la
       coda è vuota.
-    \item[\errcode{EMSGSIZE}] La lunghezza del messaggio sulla coda eccede il
+    \item[\errcode{EMSGSIZE}] la lunghezza del messaggio sulla coda eccede il
       valore \param{msg\_len} specificato per la ricezione.
-    \item[\errcode{EINVAL}] Si è specificato un valore nullo per
+    \item[\errcode{EINVAL}] si è specificato un valore nullo per
       \param{msg\_ptr}, o un valore non valido per \param{abs\_timeout}.
-    \item[\errcode{ETIMEDOUT}] La ricezione del messaggio non è stata
+    \item[\errcode{ETIMEDOUT}] la ricezione del messaggio non è stata
       effettuata entro il tempo stabilito.
     \end{errlist}    
     ed inoltre \errval{EBADF}, \errval{EINTR}, \errval{ENOMEM}, o
@@ -3630,10 +3634,10 @@ prototipi sono:
 La funzione estrae dalla coda il messaggio a priorità più alta, o il più
 vecchio fra quelli della stessa priorità. Una volta ricevuto il messaggio
 viene tolto dalla coda e la sua dimensione viene restituita come valore di
-ritorno.\footnote{si tenga presente che 0 è una dimensione valida la
+ritorno.\footnote{si tenga presente che 0 è una dimensione valida e che la
   condizione di errore è restituita dal valore -1; Stevens in \cite{UNP2} fa
   notare che questo è uno dei casi in cui vale ciò che lo standard
-  \textsl{non} dice, una dimenzione nulla infatti, pur non essendo citata, non
+  \textsl{non} dice, una dimensione nulla infatti, pur non essendo citata, non
   viene proibita.}
 
 Se la dimensione specificata da \param{msg\_len} non è sufficiente a contenere
@@ -3684,8 +3688,8 @@ Attiva il meccanismo di notifica per la coda \param{mqdes}.
 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
   errore; nel quel caso \var{errno} assumerà i valori: 
     \begin{errlist}
-    \item[\errcode{EBUSY}] C'è già un processo registrato per la notifica.
-    \item[\errcode{EBADF}] Il descrittore non fa riferimento ad una coda di
+    \item[\errcode{EBUSY}] c'è già un processo registrato per la notifica.
+    \item[\errcode{EBADF}] il descrittore non fa riferimento ad una coda di
       messaggi.
     \end{errlist}}
 \end{prototype}
@@ -3759,40 +3763,6 @@ forma estesa.\footnote{di nuovo si faccia riferimento a quanto detto al
 
 
 
-\subsection{Semafori}
-\label{sec:ipc_posix_sem}
-
-Dei semafori POSIX esistono sostanzialmente due implementazioni; una è fatta a
-livello di libreria ed è fornita dalla libreria dei thread; questa però li
-implementa solo a livello di thread e non di processi.\footnote{questo
-  significa che i semafori sono visibili solo all'interno dei thread creati da
-  un singolo processo, e non possono essere usati come meccanismo di
-  sincronizzazione fra processi diversi.} Esiste però anche una libreria
-realizzata da Konstantin Knizhnik, che reimplementa l'interfaccia POSIX usando
-i semafori di SysV IPC, e che non vale comunque la pena di usare visto che i
-problemi sottolineati in sez.~\ref{sec:ipc_sysv_sem} rimangono, anche se
-mascherati.
-
-In realtà a partire dal kernel 2.5.7 è stato introdotto un meccanismo di
-sincronizzazione completamente nuovo, basato sui cosiddetti
-\textit{futex}\footnote{la sigla sta per \textit{fast user mode mutex}.}, con
-il quale è stato possibile implementare una versione nativa dei semafori; esso
-è già stato usato con successo per reimplementare in maniera più efficiente
-tutte le direttive di sincronizzazione previste per i thread POSIX; e con il
-kernel della serie 2.6 e le nuove versioni delle \acr{glibc} che usano quella
-che viene chiamata la \textit{New Posix Thread Library} sono state
-implementate tutte le funzioni occorrenti. 
-
-Anche in questo caso (come per le code di messaggi) è necessario appoggiarsi
-alla libreria per le estensioni \textit{real-time} \texttt{librt}, questo
-significa che se si vuole utilizzare questa interfaccia, oltre ad utilizzare
-gli opportuni file di definizione, occorrerà compilare i programmi con
-l'opzione \texttt{-lrt}. 
-
-% TODO trattare l'argomento a partire da man sem_overview.
-
-
-
 \subsection{Memoria condivisa}
 \label{sec:ipc_posix_shm}
 
@@ -3805,20 +3775,20 @@ suoi contenuti in memoria,\footnote{il filesystem \texttt{tmpfs} 
   per la memoria condivisa; esso infatti non ha dimensione fissa, ed usa
   direttamente la cache interna del kernel (che viene usata anche per la
   shared memory in stile SysV). In più i suoi contenuti, essendo trattati
-  direttamente dalla memoria virtuale\index{memoria~virtuale} possono essere
+  direttamente dalla memoria virtuale \index{memoria~virtuale} possono essere
   salvati sullo swap automaticamente.} che viene attivato abilitando l'opzione
 \texttt{CONFIG\_TMPFS} in fase di compilazione del kernel.
 
 
-Per potere utilizzare l'interfaccia POSIX per le code di messaggi le
+Per potere utilizzare l'interfaccia POSIX per la memoria condivisa le
 \acr{glibc}\footnote{le funzioni sono state introdotte con le glibc-2.2.}
 richiedono di compilare i programmi con l'opzione \code{-lrt}; inoltre è
 necessario che in \file{/dev/shm} sia montato un filesystem \texttt{tmpfs};
-questo di norma viene eseguita aggiungendo una riga tipo:
+questo di norma viene fatto aggiungendo una riga del tipo di:
 \begin{verbatim}
 tmpfs   /dev/shm        tmpfs   defaults        0      0
 \end{verbatim}
-ad \file{/etc/fstab}. In realtà si può montare un filesystem \texttt{tmpfs}
+ad \conffile{/etc/fstab}. In realtà si può montare un filesystem \texttt{tmpfs}
 dove si vuole, per usarlo come RAM disk, con un comando del tipo:
 \begin{verbatim}
 mount -t tmpfs -o size=128M,nr_inodes=10k,mode=700 tmpfs /mytmpfs
@@ -3882,7 +3852,7 @@ segmento di memoria condiviso con le stesse modalit
 il flag \const{FD\_CLOEXEC}.  Chiamate effettuate da diversi processi usando
 lo stesso nome, restituiranno file descriptor associati allo stesso segmento
 (così come, nel caso di file di dati, essi sono associati allo stesso
-\index{inode}inode).  In questo modo è possibile effettuare una chiamata ad
+\index{inode} inode).  In questo modo è possibile effettuare una chiamata ad
 \func{mmap} sul file descriptor restituito da \func{shm\_open} ed i processi
 vedranno lo stesso segmento di memoria condivisa.
 
@@ -3970,6 +3940,415 @@ fare (\texttt{\small 44}) in questo caso 
 restituendo al chiamante il valore di ritorno.
 
 
+
+
+\subsection{Semafori}
+\label{sec:ipc_posix_sem}
+
+Fino alla serie 2.4.x del kernel esisteva solo una implementazione parziale
+dei semafori POSIX che li realizzava solo a livello di thread e non di
+processi,\footnote{questo significava che i semafori erano visibili solo
+  all'interno dei thread creati da un singolo processo, e non potevano essere
+  usati come meccanismo di sincronizzazione fra processi diversi.} fornita
+attraverso la sezione delle estensioni \textit{real-time} delle
+\acr{glibc}.\footnote{quelle che si accedono collegandosi alla libreria
+  \texttt{librt}.} Esisteva inoltre una libreria che realizzava (parzialmente)
+l'interfaccia POSIX usando le funzioni dei semafori di SysV IPC (mantenendo
+così tutti i problemi sottolineati in sez.~\ref{sec:ipc_sysv_sem}).
+
+A partire dal kernel 2.5.7 è stato introdotto un meccanismo di
+sincronizzazione completamente nuovo, basato sui cosiddetti
+\textit{futex},\footnote{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 delle
+\acr{glibc} che usano questa nuova infrastruttura per quella che viene 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
+questa interfaccia, oltre ad utilizzare gli opportuni file di definizione,
+occorrerà compilare i programmi con l'opzione \texttt{-lrt}. 
+
+La funzione che permette di creare un nuovo semaforo POSIX, creando il
+relativo file, o di accedere ad uno esistente, è \funcd{sem\_open}, questa
+prevede due forme diverse a seconda che sia utilizzata per aprire un semaforo
+esistente o per crearne uno nuovi, i relativi prototipi sono:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{sem\_t *sem\_open(const char *name, int oflag)}
+  
+  \funcdecl{sem\_t *sem\_open(const char *name, int oflag, mode\_t mode,
+    unsigned int value)} 
+
+  Crea un semaforo o ne apre uno esistente.
+  
+  \bodydesc{La funzione restituisce l'indirizzo del semaforo in caso di
+    successo e \const{SEM\_FAILED} in caso di errore; nel quel caso
+    \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EACCESS}] il semaforo esiste ma non si hanno permessi
+      sufficienti per accedervi.
+    \item[\errcode{EEXIST}] si sono specificati \const{O\_CREAT} e
+      \const{O\_EXCL} ma il semaforo esiste.
+    \item[\errcode{EINVAL}] il valore di \param{value} eccede
+      \const{SEM\_VALUE\_MAX}.
+    \item[\errcode{ENAMETOOLONG}] si è utilizzato un nome troppo lungo.
+    \item[\errcode{ENOENT}] non si è usato \const{O\_CREAT} ed il nome
+      specificato non esiste.
+    \end{errlist}    
+    ed inoltre \errval{ENFILE} ed \errval{ENOMEM}.}
+\end{functions}
+
+L'argomento \param{name} definisce il nome del semaforo che si vuole
+utilizzare, ed è quello che permette a processi diversi di accedere allo
+stesso semaforo. Questo deve essere specificato con un pathname nella forma
+\texttt{/qualchenome}, che non ha una corrispondenza diretta con un pathname
+reale; con Linux infatti i file associati ai semafori sono mantenuti nel
+filesystem virtuale \texttt{/dev/shm}, e gli viene assegnato automaticamente
+un nome nella forma \texttt{sem.qualchenome}.\footnote{si ha cioè una
+  corrispondenza per cui \texttt{/qualchenome} viene rimappato, nella
+  creazione tramite \func{sem\_open}, su \texttt{/dev/shm/sem.qualchenome}.}
+
+L'argomento \param{oflag} è quello che controlla le modalità con cui opera la
+funzione, ed è passato come maschera binaria; i bit corrispondono a quelli
+utilizzati per l'analogo argomento di \func{open}, anche se dei possibili
+valori visti in sez.~\ref{sec:file_open} sono utilizzati soltanto
+\const{O\_CREAT} e \const{O\_EXCL}.
+
+Se si usa \const{O\_CREAT} si richiede la creazione del semaforo qualora
+questo non esista, ed in tal caso occorre utilizzare la seconda forma della
+funzione, in cui si devono specificare sia un valore iniziale con l'argomento
+\param{value},\footnote{e si noti come così diventa possibile, differenza di
+  quanto avviene per i semafori del \textit{SysV IPC}, effettuare in maniera
+  atomica creazione ed inizializzazione di un semaforo usando una unica
+  funzione.} che una maschera dei permessi con l'argomento
+\param{mode};\footnote{anche questo argomento prende gli stessi valori
+  utilizzati per l'analogo di \func{open}, che si sono illustrati in dettaglio
+  sez.~\ref{sec:file_perm_overview}.} questi verranno assegnati al semaforo
+appena creato. Se il semaforo esiste già i suddetti valori saranno invece
+ignorati. Usando il flag \const{O\_EXCL} si richiede invece la verifica che il
+semaforo non esiste, usandolo insieme ad \const{O\_CREAT} la funzione fallisce
+qualora un semaforo con lo stesso nome sia già presente.
+
+La funzione restituisce in caso di successo un puntatore all'indirizzo del
+semaforo con un valore di tipo \ctyp{sem\_t *}, è questo valore che dovrà
+essere passato alle altre funzioni per operare sul semaforo stesso. Si tenga
+presente che, come accennato in sez.~\ref{sec:ipc_posix_generic}, i semafori
+usano la semantica standard dei file per quanto riguarda i controlli di
+accesso. 
+
+Questo significa che un nuovo semaforo viene sempre creato con l'user-ID ed il
+group-ID effettivo del processo chiamante, e che i permessi indicati con
+\param{mode} vengono filtrati dal valore della \textit{umask} del processo.
+Inoltre per poter aprire un semaforo è necessario avere su di esso sia il
+permesso di lettura che quello di scrittura.
+
+Una volta che si sia ottenuto l'indirizzo di un semaforo, sarà possibile
+utilizzarlo; se si ricorda quanto detto all'inizio di
+sez.~\ref{sec:ipc_sysv_sem}, dove si sono introdotti i concetti generali
+relativi ai semafori, le operazioni principali sono due, quella che richiede
+l'uso di una risorsa bloccando il semaforo e quella che rilascia la risorsa
+liberando il semaforo. La prima operazione è effettuata dalla funzione
+\funcd{sem\_wait}, il cui prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_wait(sem\_t *sem)}
+  
+  Blocca il semaforo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+    \item[\errcode{EINVAL}] il semaforo \param{sem} non esiste.
+    \end{errlist}    
+}
+\end{functions}
+
+La funzione cerca di decrementare il valore del semaforo indicato dal
+puntatore \param{sem}, se questo ha un valore positivo, cosa che significa che
+la risorsa è disponibile, la funzione ha successo, il valore del semaforo
+viene diminuito di 1 ed essa ritorna immediatamente; se il valore è nullo la
+funzione si blocca fintanto che il valore del semaforo non torni
+positivo\footnote{ovviamente per opera di altro processo che lo rilascia
+  chiamando \func{sem\_post}.} così che poi essa possa decrementarlo con
+successo e proseguire. 
+
+Si tenga presente che la funzione può sempre essere interrotta da un segnale
+(nel qual caso si avrà un errore di \const{EINTR}) e che questo avverrà
+comunque, anche se si è richiesta la semantica BSD installando il relativo
+gestore con \const{SA\_RESTART} (vedi sez.~\ref{sec:sig_sigaction}) per
+riavviare le system call interrotte.
+
+Della funzione \func{sem\_wait} esistono due varianti che consentono di
+gestire diversamente le modalità di attesa in caso di risorsa occupata, la
+prima di queste è \funcd{sem\_trywait}, che serve ad effettuare un tentativo
+di acquisizione senza bloccarsi; il suo prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_trywait(sem\_t *sem)}
+  
+  Tenta di bloccare il semaforo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà gli stessi valori:
+    \begin{errlist}
+    \item[\errcode{EAGAIN}] il semaforo non può essere acquisito senza
+      bloccarsi. 
+    \item[\errcode{EINVAL}] il semaforo \param{sem} non esiste.
+    \end{errlist}    
+}
+\end{functions}
+
+La funzione è identica a \func{sem\_wait} ed se la risorsa è libera ha lo
+stesso effetto, vale a dire che in caso di semaforo diverso da zero la
+funzione lo decrementa e ritorna immediatamente; la differenza è che nel caso
+in cui il semaforo è occupato essa non si blocca e di nuovo ritorna
+immediatamente, restituendo però un errore di \errval{EAGAIN}, così che il
+programma possa proseguire.
+
+La seconda variante di \func{sem\_wait} è una estensione specifica che può
+essere utilizzata soltanto se viene definita la macro \macro{\_XOPEN\_SOURCE}
+ad un valore di 600 prima di includere \texttt{semaphore.h}, la funzione è
+\func{sem\_timedwait}, ed il suo prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+
+  \funcdecl{int sem\_timedwait(sem\_t *sem, const struct timespec
+    *abs\_timeout)}
+  
+  Blocca il semaforo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà gli stessi valori:
+    \begin{errlist}
+    \item[\errcode{ETIMEDOUT}] è scaduto il tempo massimo di attesa. 
+    \item[\errcode{EINVAL}] il semaforo \param{sem} non esiste.
+    \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
+    \end{errlist}    
+}
+\end{functions}
+
+Anche in questo caso il comportamento della funzione è identico a quello di
+\func{sem\_wait}, la sola differenza consiste nel fatto che con questa
+funzione è possibile impostare tramite l'argomento \param{abs\_timeout} un
+tempo limite per l'attesa, scaduto il quale la funzione ritorna comunque,
+anche se non è possibile acquisire il semaforo. In tal caso la funzione
+fallirà, riportando un errore di \errval{ETIMEDOUT}.
+
+La seconda funzione principale utilizzata per l'uso dei semafori è
+\funcd{sem\_post}, che viene usata per rilasciare un semaforo occupato o, in
+generale, per aumentare di una unità il valore dello stesso anche qualora non
+fosse occupato;\footnote{si ricordi che in generale un semaforo viene usato
+  come indicatore di un numero di risorse disponibili.} il suo prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_post(sem\_t *sem)}
+  
+  Rilascia il semaforo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EINVAL}] il semaforo \param{sem} non esiste.
+    \end{errlist}    
+}
+\end{functions}
+
+La funzione incrementa di uno il valore corrente del semaforo indicato
+dall'argomento \param{sem}, se questo era nullo la relativa risorsa risulterà
+sbloccata, cosicché un altro processo (o thread) eventualmente bloccato in una
+\func{sem\_wait} sul semaforo potrà essere svegliato e rimesso in esecuzione.
+Si tenga presente che la funzione è sicura \index{funzioni~sicure} per l'uso
+all'interno di un gestore di segnali (si ricordi quanto detto in
+sez.~\ref{sec:sig_signal_handler}).
+
+Se invece di operare su un semaforo se ne vuole solamente leggere il valore,
+si può usare la funzione \funcd{sem\_getvalue}, il cui prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_getvalue(sem\_t *sem, int *sval)}
+  
+  Richiede il valore del semaforo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EINVAL}] il semaforo \param{sem} non esiste.
+    \end{errlist}    
+}
+\end{functions}
+
+La funzione legge il valore del semaforo indicato dall'argomento \param{sem} e
+lo restituisce nella variabile intera puntata dall'argomento
+\param{sval}. Qualora ci siano uno o più processi bloccati in attesa sul
+semaforo lo standard prevede che la funzione possa restituire un valore nullo
+oppure il numero di processi bloccati in una \func{sem\_wait} sul suddetto
+semaforo; nel caso di Linux vale la prima opzione.
+
+Questa funzione può essere utilizzata per avere un suggerimento sullo stato di
+un semaforo, ovviamente non si può prendere il risultato riportato in
+\param{sval} che come indicazione, il valore del semaforo infatti potrebbe
+essere già stato modificato al ritorno della funzione.
+
+% TODO verificare comportamento sem_getvalue
+
+Una volta che non ci sia più la necessità di operare su un semaforo se ne può
+terminare l'uso con la funzione \funcd{sem\_close}, il cui prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_close(sem\_t *sem)}
+  
+  Chiude il semaforo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EINVAL}] il semaforo \param{sem} non esiste.
+    \end{errlist}    
+}
+\end{functions}
+
+La funzione chiude il semaforo indicato dall'argomento \param{sem}; questo
+comporta che tutte le risorse che il sistema può avere assegnato al processo
+nell'uso dello stesso vengono rilasciate. Questo significa che un altro
+processo bloccato sul semaforo a causa della acquisizione da parte del
+processo che chiama \func{sem\_close} potrà essere riavviato.
+
+Si tenga presente poi che come per i file all'uscita di un processo tutti i
+semafori che questo aveva aperto vengono automaticamente chiusi; questo
+comportamento risolve il problema che si aveva con i semafori del \textit{SysV
+  IPC} (di cui si è parlato in sez.~\ref{sec:ipc_sysv_sem}) per i quali le
+risorse possono restare bloccate. Si tenga poi presente che, a differenza di
+quanto avviene per i file, in caso di una chiamata ad \func{execve} tutti i
+semafori vengono chiusi automaticamente.
+
+Come per i semafori del \textit{SysV IPC} anche quelli POSIX hanno una
+persistenza di sistema; questo significa che una volta che si è creato un
+semaforo con \func{sem\_open} questo continuerà ad esistere fintanto che il
+kernel resta attivo (vale a dire fino ad un successivo riavvio) a meno che non
+lo si cancelli esplicitamente. Per far questo si può utilizzare la funzione
+\funcd{sem\_unlink}, il cui prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_unlink(const char *name)}
+  
+  Rimuove il semaforo \param{name}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EACCESS}] non si hanno i permessi necessari a cancellare il
+      semaforo.
+    \item[\errcode{ENAMETOOLONG}] il nome indicato è troppo lungo.
+    \item[\errcode{ENOENT}] il semaforo \param{name} non esiste.
+    \end{errlist}    
+}
+\end{functions}
+
+La funzione rimuove il semaforo indicato dall'argomento \param{name}, che
+prende un valore identico a quello usato per creare il semaforo stesso con
+\func{sem\_open}. Il semaforo viene rimosso dal filesystem immediatamente; ma
+il semaforo viene effettivamente cancellato dal sistema soltanto quando tutti
+i processi che lo avevano aperto lo chiudono. Si segue cioè la stessa
+semantica usata con \func{unlink} per i file, trattata in dettaglio in
+sez.~\ref{sec:file_link}.
+
+Una delle caratteristiche peculiari dei semafori POSIX è che questi possono
+anche essere utilizzati anche in forma anonima, senza necessità di fare
+ricorso ad un nome sul filesystem o ad altri indicativi.  In questo caso si
+dovrà porre la variabile che contiene l'indirizzo del semaforo in un tratto di
+memoria che sia accessibile a tutti i processi in gioco.  La funzione che
+consente di inizializzare un semaforo anonimo è \funcd{sem\_init}, il cui
+prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_init(sem\_t *sem, int pshared, unsigned int value)}
+
+  Inizializza il semaforo anonimo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EINVAL}] il valore di \param{value} eccede
+      \const{SEM\_VALUE\_MAX}.
+    \item[\errcode{ENOSYS}] il valore di \param{pshared} non è nullo ed il
+      sistema non supporta i semafori per i processi.
+    \end{errlist}
+}
+\end{functions}
+
+La funzione inizializza un semaforo all'indirizzo puntato dall'argomento
+\param{sem}, e come per \func{sem\_open} consente di impostare un valore
+iniziale con \param{value}. L'argomento \param{pshared} serve ad indicare se
+il semaforo deve essere utilizzato dai \itindex{thread} thread di uno stesso
+processo (con un valore nullo) o condiviso fra processi diversi (con un valore
+non nullo).
+
+Qualora il semaforo debba essere condiviso dai \itindex{thread} thread di uno
+stesso processo (nel qual caso si parla di \textit{thread-shared semaphore}),
+occorrerà che \param{sem} sia l'indirizzo di una variabile visibile da tutti i
+\itindex{thread} thread, si dovrà usare cioè una variabile globale o una
+variabile allocata dinamicamente nello \itindex{heap} heap.
+
+Qualora il semaforo debba essere condiviso fra più processi (nel qual caso si
+parla di \textit{process-shared semaphore}) la sola scelta possibile per
+renderlo visibile a tutti è di porlo in un tratto di memoria condivisa. Questo
+potrà essere ottenuto direttamente sia con \func{shmget} (vedi
+sez.~\ref{sec:ipc_sysv_shm}) che con \func{shm\_open} (vedi
+sez.~\ref{sec:ipc_posix_shm}), oppure, nel caso che tutti i processi in gioco
+abbiano un genitore comune, con una mappatura anonima con \func{mmap} (vedi
+sez.~\ref{sec:file_memory_map}),\footnote{si ricordi che i tratti di memoria
+  condivisa vengono mantenuti nei processi figli attraverso la funzione
+  \func{fork}.} a cui essi poi potranno accedere.
+
+Una volta inizializzato il semaforo anonimo con \func{sem\_init} lo si potrà
+utilizzare nello stesso modo dei semafori normali con \func{sem\_wait} e
+\func{sem\_post}. Si tenga presente però che inizializzare due volte lo stesso
+semaforo può dar luogo ad un comportamento indefinito. 
+
+
+Una volta che non si indenda più utilizzare un semaforo anonimo questo può
+essere eliminato da sistema; per far questo di deve utilizzare una apposita
+funzione, \funcd{sem\_destroy}, il cui prototipo è:
+\begin{functions}
+  \headdecl{semaphore.h} 
+  
+  \funcdecl{int sem\_destroy(sem\_t *sem)}
+
+  Elimina il semaforo anonimo \param{sem}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore; nel quel caso \var{errno} assumerà i valori:
+    \begin{errlist}
+    \item[\errcode{EINVAL}] il valore di \param{value} eccede
+      \const{SEM\_VALUE\_MAX}.
+    \end{errlist}
+}
+\end{functions}
+
+La funzione prende come unico argomento l'indirizzo di un semaforo che deve
+essere stato inizializzato con \func{sem\_init}; non deve quindi essere
+applicata a semafori creati con \func{sem\_open}. Inoltre si deve essere
+sicuri che il semaforo sia effettivamente inutilizzato, la distruzione di un
+semaforo su cui sono presenti processi (o thread) in attesa (cioè bloccati in
+una \func{sem\_wait}) provoca un comportamento indefinito. 
+
+Si tenga presente infine che utilizzare un semaforo che è stato distrutto con
+\func{sem\_destroy} di nuovo può dare esito a comportamenti indefiniti.  Nel
+caso ci si trovi in una tale evenienza occorre reinizializzare il semaforo una
+seconda volta con \func{sem\_init}.
+
+
 % LocalWords:  like fifo System POSIX RPC Calls Common Object Request Brocker
 % LocalWords:  Architecture descriptor kernel unistd int filedes errno EMFILE
 % LocalWords:  ENFILE EFAULT BUF sez fig fork Stevens siblings EOF read SIGPIPE
@@ -3980,7 +4359,7 @@ restituendo al chiamante il valore di ritorno.
 % LocalWords:  PDF EPS lseek ESPIPE PPM Portable PixMap format pnmcrop PNG pnm
 % LocalWords:  pnmmargin png BarCode inode filesystem l'inode mknod mkfifo RDWR
 % LocalWords:  ENXIO deadlock client reinviate fortunes fortunefilename daemon
-% LocalWords:  FortuneServer FortuneParse FortuneClient pid libgapil  LD
+% LocalWords:  FortuneServer FortuneParse FortuneClient pid libgapil  LD librt
 % LocalWords:  PATH linker pathname ps tmp killall fortuned crash socket domain
 % LocalWords:  socketpair BSD sys protocol sv EAFNOSUPPORT EPROTONOSUPPORT AF
 % LocalWords:  EOPNOTSUPP SOCK SysV IPC Process Comunication ipc perm key exec
@@ -3993,7 +4372,7 @@ restituendo al chiamante il valore di ritorno.
 % LocalWords:  cmd struct buf EPERM RMID msgsnd msgbuf msgp msgsz msgflg EAGAIN
 % LocalWords:  NOWAIT EINTR mtype mtext long message sizeof LENGTH ts sleep BIG
 % LocalWords:  msgrcv ssize msgtyp NOERROR EXCEPT ENOMSG multiplexing select ls
-% LocalWords:  poll polling queue MQFortuneServer write init HandSIGTERM 
+% LocalWords:  poll polling queue MQFortuneServer write init HandSIGTERM  l'IPC
 % LocalWords:  MQFortuneClient mqfortuned mutex risorse' inter semaphore semget
 % LocalWords:  nsems SEMMNS SEMMSL semid otime semval sempid semncnt semzcnt nr
 % LocalWords:  SEMVMX SEMOPM semop SEMMNU SEMUME SEMAEM semnum union semun arg
@@ -4018,7 +4397,9 @@ restituendo al chiamante il valore di ritorno.
 % LocalWords:  EBUSY sigev SIGNAL signo value sigval siginfo all'userid MESGQ
 % LocalWords:  Konstantin Knizhnik futex tmpfs ramfs cache shared swap CONFIG
 % LocalWords:  lrt blocks PAGECACHE TRUNC CLOEXEC mmap ftruncate munmap FindShm
-% LocalWords:  CreateShm RemoveShm LIBRARY
+% LocalWords:  CreateShm RemoveShm LIBRARY Library libmqueue FAILED EACCESS
+% LocalWords:  ENAMETOOLONG qualchenome RESTART trywait XOPEN SOURCE timedwait
+% LocalWords:  process getvalue sval execve pshared ENOSYS heap
 
 
 %%% Local Variables: