\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
\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
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
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 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
\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
-\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.
+
+\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}
% 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: 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: 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: