Risistemazione delle cose da scrivere.
[gapil.git] / ipc.tex
diff --git a/ipc.tex b/ipc.tex
index 12cd3c0e07d99308eec8612c0d2e00f02892f045..f21ffe797dfe6cb79f5c5b40287f2128c2ed4618 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -3234,6 +3234,7 @@ pi
 sez.~\ref{sec:ipc_sysv_shm} che possa restituisca i risultati via rete.
 \itindend{memory~mapping}
 
 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}
 
 \section{Il sistema di comunicazione fra processi di POSIX}
 \label{sec:ipc_posix}
@@ -3768,16 +3769,16 @@ 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
   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.
 
 
   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};
 \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}
 \begin{verbatim}
 tmpfs   /dev/shm        tmpfs   defaults        0      0
 \end{verbatim}
@@ -3845,7 +3846,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
 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.
 
 \func{mmap} sul file descriptor restituito da \func{shm\_open} ed i processi
 vedranno lo stesso segmento di memoria condivisa.
 
@@ -3963,8 +3964,6 @@ Anche in questo caso 
 questa interfaccia, oltre ad utilizzare gli opportuni file di definizione,
 occorrerà compilare i programmi con l'opzione \texttt{-lrt}. 
 
 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.
-
 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
 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
@@ -4297,14 +4296,14 @@ 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
 
 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.  In
-tal caso occorrerà che tutti i processi abbiano un genitore comune che ha
-allocato, con uno dei metodi possibili visti con \func{shm\_open}
-(sez.~\ref{sec:ipc_posix_shm}), \func{mmap} (sez.~\ref{sec:file_memory_map}) o
-\func{shmget} (sez.~\ref{sec:ipc_sysv_shm}) la memoria condivisa su cui si va
-a creare il semaforo,\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.
+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
 
 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
@@ -4312,6 +4311,36 @@ utilizzare nello stesso modo dei semafori normali con \func{sem\_wait} e
 semaforo può dar luogo ad un comportamento indefinito. 
 
 
 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:  like fifo System POSIX RPC Calls Common Object Request Brocker