Qualche altra aggiunta minimale.
[gapil.git] / ipc.tex
diff --git a/ipc.tex b/ipc.tex
index 74b51365d4f7311193f2d8e734121abfe2fcd02f..e18dbbc157fcf487eddda20ff8a1613c69280e02 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -3250,12 +3250,11 @@ una interfaccia completamente nuova, che tratteremo in questa sezione.
 \subsection{Considerazioni generali}
 \label{sec:ipc_posix_generic}
 
 \subsection{Considerazioni generali}
 \label{sec:ipc_posix_generic}
 
-In Linux non tutti gli oggetti del POSIX IPC sono pienamente supportati nel
-kernel ufficiale; solo la memoria condivisa è presente con l'interfaccia
-completa, ma solo a partire dal kernel 2.4.x, i semafori sono forniti dalle
-\acr{glibc} nella sezione che implementa i thread POSIX, le code di messaggi
-non hanno alcun tipo di supporto ufficiale.  Per queste ultime esistono
-tuttavia dei patch e una libreria aggiuntiva.
+Oggi Linux supporta tutti gli oggetti definito nello standard POSIX per l'IPC,
+ma a lungo non è stato così; la memoria condivisa è presente a partire dal
+kernel 2.4.x, i semafori sono forniti dalle \acr{glibc} nella sezione che
+implementa i thread POSIX di nuova generazione che richiedono il kernel 2.6,
+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
 
 La caratteristica fondamentale dell'interfaccia POSIX è l'abbandono dell'uso
 degli identificatori e delle chiavi visti nel SysV IPC, per passare ai
@@ -3315,14 +3314,14 @@ processo che esegue la creazione.
 \label{sec:ipc_posix_mq}
 
 Le code di messaggi POSIX sono supportate da Linux a partire dalla versione
 \label{sec:ipc_posix_mq}
 
 Le code di messaggi POSIX sono supportate da Linux a partire dalla versione
-2.6.6-rc1 del kerne;, \footnote{l'implementazione è dovuta a Michal Wronski e
+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
 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
   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
 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 e memoria condivisa con tutta la flessibilità che occorre.
+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
 
 Per poter utilizzare le code di messaggi, oltre ad utilizzare un kernel
 superiore al 2.6.6 (o precedente, purché cui siano stati opportunamente
@@ -3585,11 +3584,16 @@ valore della priorit
 \const{MQ\_PRIO\_MAX}, che nel caso è pari a 32768.
 
 Qualora la coda sia piena, entrambe le funzioni si bloccano, a meno che non
 \const{MQ\_PRIO\_MAX}, che nel caso è pari a 32768.
 
 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, 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}, ritorna comunque con un errore di \errcode{ETIMEDOUT}.
-
+sia stata selezionata in fase di apertura la modalità non
+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
+  specificato un tempo assoluto tramite una struttura \struct{timespec} (vedi
+  fig.~\ref{fig:sys_timeval_struct}) indicato in numero di secondi e
+  nanosecondi a partire dal 1 gennaio 1970.} ritorna comunque con un errore di
+\errcode{ETIMEDOUT}, se invece il tempo è già scaduto al momento della
+chiamata e la coda è vuota la funzione ritorna immediatamente.
 
 Come per l'inserimento, anche per l'estrazione dei messaggi da una coda sono
 previste due funzioni, \funcd{mq\_receive} e \funcd{mq\_timedreceive}, i cui
 
 Come per l'inserimento, anche per l'estrazione dei messaggi da una coda sono
 previste due funzioni, \funcd{mq\_receive} e \funcd{mq\_timedreceive}, i cui
@@ -3626,7 +3630,11 @@ 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
 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.
+ritorno.\footnote{si tenga presente che 0 è una dimensione valida 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 dimensione nulla infatti, pur non essendo citata, non
+  viene proibita.}
 
 Se la dimensione specificata da \param{msg\_len} non è sufficiente a contenere
 il messaggio, entrambe le funzioni, al contrario di quanto avveniva nelle code
 
 Se la dimensione specificata da \param{msg\_len} non è sufficiente a contenere
 il messaggio, entrambe le funzioni, al contrario di quanto avveniva nelle code
@@ -3645,10 +3653,8 @@ Qualora non interessi usare la priorit
 Si noti che con le code di messaggi POSIX non si ha la possibilità di
 selezionare quale messaggio estrarre con delle condizioni sulla priorità, a
 differenza di quanto avveniva con le code di messaggi di SysV che permettono
 Si noti che con le code di messaggi POSIX non si ha la possibilità di
 selezionare quale messaggio estrarre con delle condizioni sulla priorità, a
 differenza di quanto avveniva con le code di messaggi di SysV che permettono
-invece la selezione in base al valore del campo \var{mtype}. Qualora non
-interessi usare la priorità dei messaggi si
+invece la selezione in base al valore del campo \var{mtype}. 
 
 
-% TODO vericare questa interruzione di paragrafo 
 % TODO inserire i dati di /proc/sys/fs/mqueue 
 
 Qualora la coda sia vuota entrambe le funzioni si bloccano, a meno che non si
 % TODO inserire i dati di /proc/sys/fs/mqueue 
 
 Qualora la coda sia vuota entrambe le funzioni si bloccano, a meno che non si
@@ -3748,7 +3754,7 @@ all'userid effettivo, \var{si\_code} a \const{SI\_MESGQ}, e \var{si\_errno} a
 0. Questo ci dice che, se si effettua la ricezione dei messaggi usando
 esclusivamente il meccanismo di notifica, è possibile ottenere le informazioni
 sul processo che ha inserito un messaggio usando un gestore per il segnale in
 0. Questo ci dice che, se si effettua la ricezione dei messaggi usando
 esclusivamente il meccanismo di notifica, è possibile ottenere le informazioni
 sul processo che ha inserito un messaggio usando un gestore per il segnale in
-forma estesa\footnote{di nuovo si faccia riferimento a quanto detto al
+forma estesa.\footnote{di nuovo si faccia riferimento a quanto detto al
   proposito in sez.~\ref{sec:sig_sigaction} e sez.~\ref{sec:sig_real_time}.}
 
 
   proposito in sez.~\ref{sec:sig_sigaction} e sez.~\ref{sec:sig_real_time}.}
 
 
@@ -3756,37 +3762,58 @@ forma estesa\footnote{di nuovo si faccia riferimento a quanto detto al
 \subsection{Semafori}
 \label{sec:ipc_posix_sem}
 
 \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
+Fino alla serie 2.4.x del kernel esistevano due implementazioni dei semafori
+POSIX; una parziale 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.} presente
+nella sezione delle estensioni \textit{real-time} delle
+\acr{glibc},\footnote{quelle che si accedono collegandosi alla libreria
+  \texttt{librt}.} ed una che realizzava 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
 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}. 
+\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}.
 
 % TODO trattare l'argomento a partire da man sem_overview.
 
 
 
 
 % TODO trattare l'argomento a partire da man sem_overview.
 
 
 
+
+\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{Le funzioni restituiscono il numero di byte del messaggio 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
+      coda è vuota.
+    \end{errlist}    
+    ed inoltre \errval{EBADF}, \errval{EINTR}, \errval{ENOMEM}, o
+    \errval{EINVAL}.}
+\end{functions}
+
+
 \subsection{Memoria condivisa}
 \label{sec:ipc_posix_shm}
 
 \subsection{Memoria condivisa}
 \label{sec:ipc_posix_shm}
 
@@ -3974,7 +4001,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:  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
 % 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
@@ -3987,7 +4014,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:  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
 % 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
@@ -4012,7 +4039,7 @@ 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:  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
 
 
 %%% Local Variables: 
 
 
 %%% Local Variables: