Aggiunte info su shmctl, smat, shmst
authorSimone Piccardi <piccardi@gnulinux.it>
Fri, 1 Nov 2002 14:10:02 +0000 (14:10 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Fri, 1 Nov 2002 14:10:02 +0000 (14:10 +0000)
ipc.tex

diff --git a/ipc.tex b/ipc.tex
index 2bd1a9ccdcbbf00ec46c4df004ca434496e63f6d..488e330b50620ec3b0e1386f0960cf118610a09b 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -2554,46 +2554,100 @@ un segmento di memoria condivisa 
     \begin{errlist}
     \item[\macro{EACCES}] Si è richiesto \macro{IPC\_STAT} ma i permessi non
       consentono l'accesso in lettura al segmento.
-    \item[\macro{EINVAL}] .
-    \item[\macro{ENOMEM}] .
-    \end{errlist}.}
+    \item[\macro{EINVAL}] O \param{shmid} o \param{cmd} hanno valori non
+      validi.
+    \item[\macro{EIDRM}] L'argomento \param{shmid} fa riferimento ad un
+      segmento che è stato cancellato.
+    \item[\macro{EPERM}] Si è specificato un comando con \macro{IPC\_SET} o
+      \macro{IPC\_RMID} senza i permessi necessari.
+    \item[\macro{EOVERFLOW}] L'argomento \param{shmid} fa riferimento ad un
+      segmento che è stato cancellato.
+    \end{errlist}
+  ed inoltre \macro{EFAULT}.}
 \end{functions}
 
-Per utilizzare i segmenti di memoria condivisa si usano due funzioni,
-\func{shmat} e \func{shmdt}, che consentono di agganciarli e sganciarli da un
-processo, così che questo possa vederli nel suo spazio di indirizzi; i loro
-prototipi sono:
+Il comportamento della funzione dipende dal valore del comando passato
+attraverso l'argomento \param{cmd}, i valori possibili sono i seguenti:
+\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
+\item[\macro{IPC\_STAT}] Legge le informazioni riguardo il segmento di memoria
+  condivisa nella struttura \var{shmid\_ds} puntata da \param{buf}. Occorre
+  avere il permesso di lettura sulla coda.
+\item[\macro{IPC\_RMID}] Marca il segmento di memoria condivisa per la
+  rimozione, questo verrà cancellato effettivamente solo quando l'ultimo
+  processo ad esso agganciato si sarà staccato. Questo comando può essere
+  eseguito solo da un processo con userid effettivo, corrispondente al
+  creatore o al proprietario della coda, o all'amministratore.
+\item[\macro{IPC\_SET}] Permette di modificare i permessi ed il proprietario
+  del segmento.  Per modificare i valori di \var{shm\_perm.mode},
+  \var{shm\_perm.uid} e \var{shm\_perm.gid} occorre essere il proprietario o
+  il creatore della coda, oppure l'amministratore. Compiuta l'operazione
+  aggiorna anche il valore del campo \var{shm\_ctime}.
+\item[\macro{SHM\_LOCK}] Abilita il \textit{memory locking}\index{memory
+    locking} (vedi \secref{sec:proc_mem_lock}) sul segmento di memoria
+  condivisa. Solo l'amministratore può utilizzare questo comando.
+\item[\macro{SHM\_UNLOCK}] Disabilita il \textit{memory locking}. Solo
+  l'amministratore può utilizzare questo comando.
+\end{basedescript}
+i primi tre comandi sono gli stessi già visti anche per le code ed i semafori,
+gli ultimi due sono delle estensioni previste solo in Linux. 
+
+Per utilizzare i segmenti di memoria condivisa si usano due funzioni, la prima
+di queste è \func{shmat}, che serve ad agganciare un segmento al processo
+chiamante, in modo che quest'ultimo possa vederlo nel suo spazio di indirizzi;
+il suo prototipo è:
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/shm.h}
   
   \funcdecl{void *shmat(int shmid, const void *shmaddr, int shmflg)}
   Aggancia al processo un segmento di memoria condivisa.
-
-  \funcdecl{int shmdt(const void *shmaddr)}
-  Sgancia dal processo un segmento di memoria condivisa.
   
-  \bodydesc{Le funzioni restituiscono rispettivamente l'indirizzo del segmento
-    e 0 in caso di successo, mentre entrambe restituiscono -1 in caso di
-    errore, nel qual caso \var{errno} assumerà i valori:
+  \bodydesc{La funzione restituisce l'indirizzo del segmento in caso di
+    successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà i
+    valori:
     \begin{errlist}
-    \item[\macro{EACCES}] Il processo non ha i provilegi di accesso.
+    \item[\macro{EACCES}] Il processo non ha i privilegi per accedere al
+      segmento nella modalità richiesta.
     \item[\macro{EINVAL}] Si è specificato un identificatore invalido per
-      \param{shmid}, o un indirizzo non valido per \param{shmaddr}.
-    \item[\macro{EPERM}] Si è richiesto \macro{IPC\_SET} o \macro{IPC\_RMID}
-      senza avere i permessi del creatore o del proprietario del segmento (o
-      quelli dell'amministratore).
-    \item[\macro{EOVERFLOW}] Si è richiesto \macro{IPC\_STAT} ma alcuni valori
-      sono troppo grandi per essere memorizzati nella struttura puntata da
-      \param{buf}.
+      \param{shmid}, o un indirizzo non allineato sul confine di una pagina
+      per \param{shmaddr}.
+    \item[\macro{EIDRM}] Si è richiesto un segmento marcato per la
+      cancellazione.
     \end{errlist}
-    ed inoltre \macro{EFAULT} e \macro{EIDRM}.}
+    ed inoltre \macro{ENOMEM}.}
 \end{functions}
 
-La prima funzione, \func{shmat}, aggancia un segmento di memoria condivisa
-allo spazio di indirizzi del processo, così che questo possa accedervi.
-L'argomento \param{shmaddr} specifica a quale indirizzo deve essere associato
-il segmento.
+La funzione inserisce un segmento di memoria condivisa all'interno dello
+spazio di indirizzi del processo, come mostrato in così che questo possa
+accedervi, 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 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, che
+verrà restituito dalla funzione.
+
+
+La seconda funzione è \func{shmdt}, che consente di sganciare un segmento di
+memoria condivisa dal processo chiamante, , quando questo non è più
+necessario, il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/types.h} 
+  \headdecl{sys/shm.h}
+
+  \funcdecl{int shmdt(const void *shmaddr)}
+  Sgancia dal processo un segmento di memoria condivisa.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
+    errore, la funzione fallisce solo quando non c'è un segmento agganciato
+    all'indirizzo \func{shmaddr}, con \var{errno} che assume il valore
+    \macro{EINVAL}.}
+\end{functions}
+
+
+
+
+