X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=d3bc3e6307a554f91e88e80c2ba6cce73223eb78;hp=91df500a656fde5184ff36cb256ae8e40a2b6e32;hb=71bd769469078fc921d9646d62b0f9293b6ae47c;hpb=29b7512f9179b716d031c978cd39dc96cd84b8b7 diff --git a/ipc.tex b/ipc.tex index 91df500..d3bc3e6 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1,6 +1,6 @@ %% ipc.tex %% -%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -774,7 +774,7 @@ socket\index{socket} locali in generale) permette di trasmettere attraverso le linea non solo dei dati, ma anche dei file descriptor: si può cioè passare da un processo ad un altro un file descriptor, con una sorta di duplicazione dello stesso non all'interno di uno stesso processo, ma fra processi distinti -(torneremo su questa funzionalità in sez.~\ref{sec:xxx_fd_passing}). +(torneremo su questa funzionalità in sez.~\ref{sec:sock_fd_passing}). \section{Il sistema di comunicazione fra processi di System V} @@ -1639,7 +1639,7 @@ passo (\texttt{\small 17}) prima di uscire messaggio ricevuto. Proviamo allora il nostro nuovo sistema, al solito occorre definire -\code{LD\_LIBRAY\_PATH} per accedere alla libreria \file{libgapil.so}, dopo di +\code{LD\_LIBRARY\_PATH} per accedere alla libreria \file{libgapil.so}, dopo di che, in maniera del tutto analoga a quanto fatto con il programma che usa le fifo, potremo far partire il server con: \begin{verbatim} @@ -2316,7 +2316,7 @@ controllare il valore dei mutex prima di proseguire in una operazione di sblocco non servirebbe comunque, dato che l'operazione non sarebbe atomica. Vedremo in sez.~\ref{sec:ipc_lock_file} come sia possibile ottenere un'interfaccia analoga a quella appena illustrata, senza incorrere in questi -problemi, usando il file locking\index{file!locking}. +problemi, usando il \index{file!locking} \textit{file locking}. \subsection{Memoria condivisa} @@ -2506,20 +2506,20 @@ corrispondente comportamento della funzione, sono i seguenti: \var{shm\_perm.uid} e \var{shm\_perm.gid} occorre essere il proprietario o il creatore del segmento, oppure l'amministratore. Compiuta l'operazione aggiorna anche il valore del campo \var{shm\_ctime}. -\item[\const{SHM\_LOCK}] Abilita il \textit{memory - locking}\itindex{memory~locking}\footnote{impedisce cioè che la memoria - usata per il segmento venga salvata su disco dal meccanismo della memoria - virtuale\index{memoria~virtuale}; si ricordi quanto trattato in +\item[\const{SHM\_LOCK}] Abilita il \itindex{memory~locking} \textit{memory + locking}\footnote{impedisce cioè che la memoria usata per il segmento + venga salvata su disco dal meccanismo della \index{memoria~virtuale} + memoria virtuale; si ricordi quanto trattato in sez.~\ref{sec:proc_mem_lock}.} sul segmento di memoria condivisa. Solo l'amministratore può utilizzare questo comando. -\item[\const{SHM\_UNLOCK}] Disabilita il \textit{memory - locking}\itindex{memory~locking} sul segmento di memoria condivisa. Solo +\item[\const{SHM\_UNLOCK}] Disabilita il \textit{memory locking} + \itindex{memory~locking} sul segmento di memoria condivisa. Solo l'amministratore può utilizzare questo comando. \end{basedescript} i primi tre comandi sono gli stessi già visti anche per le code di messaggi e gli insiemi di semafori, gli ultimi due sono delle estensioni specifiche previste da Linux, che permettono di abilitare e disabilitare il meccanismo -della memoria virtuale\index{memoria~virtuale} per il segmento. +della memoria virtuale \index{memoria~virtuale} per il segmento. L'argomento \param{buf} viene utilizzato solo con i comandi \const{IPC\_STAT} e \const{IPC\_SET} nel qual caso esso dovrà puntare ad una struttura @@ -2707,7 +2707,7 @@ chiave ed il puntatore associati al segmento di memoria condivisa, prima lo sgancia dal processo e poi lo rimuove. Il primo passo (\texttt{\small 37}) è la chiamata a \func{shmdt} per sganciare il segmento, restituendo (\texttt{\small 38--39}) un valore -1 in caso di errore. Il passo successivo -(\texttt{\small 41}) è utilizzare \func{shmget} per ottenre l'identificatore +(\texttt{\small 41}) è utilizzare \func{shmget} per ottenere l'identificatore associato al segmento data la chiave \var{key}. Al solito si restituisce un valore di -1 (\texttt{\small 42--45}) in caso di errore, mentre se tutto va bene si conclude restituendo un valore nullo. @@ -2770,7 +2770,7 @@ Il programma, dopo la sezione, omessa, relativa alla gestione delle opzioni da riga di comando (che si limitano alla eventuale stampa di un messaggio di aiuto a video ed all'impostazione della durata dell'intervallo con cui viene ripetuto il calcolo delle proprietà della directory) controlla (\texttt{\small - 20--23}) che sia stato specificato l'argoemnto necessario contenente il nome + 20--23}) che sia stato specificato l'argomento necessario contenente il nome della directory da tenere sotto controllo, senza il quale esce immediatamente con un messaggio di errore. @@ -3037,13 +3037,13 @@ caratteristica della funzione \func{open} (illustrata in sez.~\ref{sec:file_open}) che prevede\footnote{questo è quanto dettato dallo standard POSIX.1, ciò non toglie che in alcune implementazioni questa tecnica possa non funzionare; in particolare per Linux, nel caso di NFS, si - è comunque soggetti alla possibilità di una \textit{race - condition}\itindex{race~condition}.} che essa ritorni un errore quando -usata con i flag di \const{O\_CREAT} e \const{O\_EXCL}. In tal modo la -creazione di un \textsl{file di lock} può essere eseguita atomicamente, il -processo che crea il file con successo si può considerare come titolare del -lock (e della risorsa ad esso associata) mentre il rilascio si può eseguire -con una chiamata ad \func{unlink}. + è comunque soggetti alla possibilità di una \itindex{race~condition} + \textit{race condition}.} che essa ritorni un errore quando usata con i +flag di \const{O\_CREAT} e \const{O\_EXCL}. In tal modo la creazione di un +\textsl{file di lock} può essere eseguita atomicamente, il processo che crea +il file con successo si può considerare come titolare del lock (e della +risorsa ad esso associata) mentre il rilascio si può eseguire con una chiamata +ad \func{unlink}. Un esempio dell'uso di questa funzione è mostrato dalle funzioni \func{LockFile} ed \func{UnlockFile} riportate in fig.~\ref{fig:ipc_file_lock} @@ -3124,30 +3124,31 @@ leggermente pi \end{minipage} \normalsize \caption{Il codice delle funzioni che permettono per la gestione dei - \textit{mutex} con il file locking\index{file!locking}.} + \textit{mutex} con il \index{file!locking} \textit{file locking}.} \label{fig:ipc_flock_mutex} \end{figure} Il codice delle varie funzioni usate per implementare un mutex utilizzando il -file locking\index{file!locking} è riportato in fig.~\ref{fig:ipc_flock_mutex}; -si è mantenuta volutamente una struttura analoga alle precedenti funzioni che -usano i semafori, anche se le due interfacce non possono essere completamente -equivalenti, specie per quanto riguarda la rimozione del mutex. +\textit{file locking} \index{file!locking} è riportato in +fig.~\ref{fig:ipc_flock_mutex}; si è mantenuta volutamente una struttura +analoga alle precedenti funzioni che usano i semafori, anche se le due +interfacce non possono essere completamente equivalenti, specie per quanto +riguarda la rimozione del mutex. La prima funzione (\texttt{\small 1--5}) è \func{CreateMutex}, e serve a creare il mutex; la funzione è estremamente semplice, e si limita (\texttt{\small 4}) a creare, con una opportuna chiamata ad \func{open}, il -file che sarà usato per il successivo file locking, assicurandosi che non -esista già (nel qual caso segnala un errore); poi restituisce il file +file che sarà usato per il successivo \textit{file locking}, assicurandosi che +non esista già (nel qual caso segnala un errore); poi restituisce il file descriptor che sarà usato dalle altre funzioni per acquisire e rilasciare il mutex. La seconda funzione (\texttt{\small 6--10}) è \func{FindMutex}, che, come la precedente, è stata definita per mantenere una analogia con la corrispondente funzione basata sui semafori. Anch'essa si limita (\texttt{\small 9}) ad -aprire il file da usare per il file locking, solo che in questo caso le -opzioni di \func{open} sono tali che il file in questione deve esistere di -già. +aprire il file da usare per il \index{file!locking} \textit{file locking}, +solo che in questo caso le opzioni di \func{open} sono tali che il file in +questione deve esistere di già. La terza funzione (\texttt{\small 11--22}) è \func{LockMutex} e serve per acquisire il mutex. La funzione definisce (\texttt{\small 14}) e inizializza @@ -3162,9 +3163,10 @@ La quarta funzione (\texttt{\small 24--34}) rilasciare il mutex. La funzione è analoga alla precedente, solo che in questo caso si inizializza (\texttt{\small 28--31}) la struttura \var{lock} per il rilascio del lock, che viene effettuato (\texttt{\small 33}) con la opportuna -chiamata a \func{fcntl}. Avendo usato il file locking in semantica POSIX (si -riveda quanto detto sez.~\ref{sec:file_posix_lock}) solo il processo che ha -precedentemente eseguito il lock può sbloccare il mutex. +chiamata a \func{fcntl}. Avendo usato il \index{file!locking} \textit{file + locking} in semantica POSIX (si riveda quanto detto +sez.~\ref{sec:file_posix_lock}) solo il processo che ha precedentemente +eseguito il lock può sbloccare il mutex. La quinta funzione (\texttt{\small 36--39}) è \func{RemoveMutex} e serve a cancellare il mutex. Anche questa funzione è stata definita per mantenere una @@ -3485,7 +3487,7 @@ Rimuove una coda di messaggi. Anche in questo caso il comportamento della funzione è analogo a quello di \func{unlink} per i file,\footnote{di nuovo l'implementazione di Linux usa - direttamente \func{unlink}.} la funzione rimove la coda \param{name}, così + direttamente \func{unlink}.} la funzione rimuove la coda \param{name}, così che una successiva chiamata a \func{mq\_open} fallisce o crea una coda diversa. @@ -3833,10 +3835,10 @@ La funzione apre un segmento di memoria condivisa identificato dal nome \param{name}. Come già spiegato in sez.~\ref{sec:ipc_posix_generic} questo nome può essere specificato in forma standard solo facendolo iniziare per \file{/} e senza ulteriori \file{/}, Linux supporta comunque nomi generici, che -verranno intepretati prendendo come radice \file{/dev/shm}.\footnote{occorre +verranno interpretati prendendo come radice \file{/dev/shm}.\footnote{occorre pertanto evitare di specificare qualcosa del tipo \file{/dev/shm/nome} all'interno di \param{name}, perché questo comporta, da parte delle funzioni - di libereria, il tentativo di accedere a \file{/dev/shm/dev/shm/nome}.} + di libreria, il tentativo di accedere a \file{/dev/shm/dev/shm/nome}.} La funzione è del tutto analoga ad \func{open} ed analoghi sono i valori che possono essere specificati per \param{oflag}, che deve essere specificato come @@ -3953,7 +3955,7 @@ cancellare un segmento di memoria condivisa. Dato che al contrario di quanto avveniva con i segmenti del SysV IPC gli oggetti allocati nel kernel vengono rilasciati automaticamente quando nessuna li usa più, tutto quello che c'è da fare (\texttt{\small 44}) in questo caso è chiamare \func{shm\_unlink}, -retituendo al chiamante il valore di ritorno. +restituendo al chiamante il valore di ritorno. @@ -3961,3 +3963,53 @@ retituendo al chiamante il valore di ritorno. %%% mode: latex %%% TeX-master: "gapil" %%% End: + +% 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 +% LocalWords: EPIPE shell CGI Gateway Interface HTML JPEG URL mime type gs dup +% LocalWords: barcode PostScript race condition stream BarCodePage WriteMess +% LocalWords: size PS switch wait popen pclose stdio const char command NULL +% LocalWords: EINVAL cap fully buffered Ghostscript l'Encapsulated epstopsf of +% 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 LIBR