X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=ipc.tex;h=dcc89fde09e9bd905aae282365bc395de817c2cb;hb=2949b52da443a72eba0463bb01f5552adc31e937;hp=2b34ded891023126f13b8cc841b3cb6105af8fd8;hpb=7f880b411dd147595d2309696cf56f3f7bc37d01;p=gapil.git diff --git a/ipc.tex b/ipc.tex index 2b34ded..dcc89fd 100644 --- a/ipc.tex +++ b/ipc.tex @@ -2971,7 +2971,7 @@ funzioni di libreria che ne semplifichino l'uso, automatizzando le operazioni più comuni; il codice, contenuto nel file \file{SharedMem.c}, è riportato in fig.~\ref{fig:ipc_sysv_shm_func}. -La prima funzione (\texttt{\small 3--16}) è \func{ShmCreate} che, data una +La prima funzione (\texttt{\small 1--16}) è \func{ShmCreate} che, data una chiave, crea il segmento di memoria condivisa restituendo il puntatore allo stesso. La funzione comincia (\texttt{\small 6}) con il chiamare \func{shmget}, usando il flag \const{IPC\_CREATE} per creare il segmento @@ -3084,7 +3084,7 @@ Il passo successivo (\texttt{\small 30--39}) è quello di creare gli oggetti di intercomunicazione necessari. Si inizia costruendo (\texttt{\small 30}) la chiave da usare come riferimento con il nome del programma,\footnote{si è usato un riferimento relativo alla home dell'utente, supposto che i sorgenti - di GaPiL siano stati installati direttamente in essa. Qualora si effettui + di GaPiL siano stati installati direttamente in essa; qualora si effettui una installazione diversa si dovrà correggere il programma.} dopo di che si richiede (\texttt{\small 31}) la creazione di un segmento di memoria condivisa con usando la funzione \func{ShmCreate} illustrata in precedenza (una pagina @@ -3097,16 +3097,6 @@ sarà vista nella forma data da \struct{DirProp}. Infine (\texttt{\small di interfaccia già descritte in sez.~\ref{sec:ipc_sysv_sem}, anche un mutex, che utilizzeremo per regolare l'accesso alla memoria condivisa. -\begin{figure}[!htbp] - \footnotesize \centering - \begin{minipage}[c]{\codesamplewidth} - \includecodesample{listati/ComputeValues.c} - \end{minipage} - \normalsize - \caption{Codice delle funzioni ausiliarie usate da \file{DirMonitor.c}.} - \label{fig:ipc_dirmonitor_sub} -\end{figure} - Completata l'inizializzazione e la creazione degli oggetti di intercomunicazione il programma entra nel ciclo principale (\texttt{\small 40--49}) dove vengono eseguite indefinitamente le attività di monitoraggio. @@ -3133,6 +3123,17 @@ descritta in dettaglio) in sez.~\ref{sec:file_dir_read}, che ci permette di effettuare la scansione delle voci della directory, chiamando per ciascuna di esse la funzione \func{ComputeValues}, che esegue tutti i calcoli necessari. +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{\codesamplewidth} + \includecodesample{listati/ComputeValues.c} + \end{minipage} + \normalsize + \caption{Codice delle funzioni ausiliarie usate da \file{DirMonitor.c}.} + \label{fig:ipc_dirmonitor_sub} +\end{figure} + + Il codice di quest'ultima è riportato in fig.~\ref{fig:ipc_dirmonitor_sub}. Come si vede la funzione (\texttt{\small 2--16}) è molto semplice e si limita a chiamare (\texttt{\small 5}) la funzione \func{stat} sul file indicato da @@ -3616,7 +3617,7 @@ non è detto che altrettanto valga per altri kernel. In particolare, come si può facilmente verificare con il comando \cmd{strace}, sia per la memoria condivisa che per le code di messaggi varie \textit{system call} utilizzate da Linux corrispondono in realtà a quelle ordinarie dei file, essendo detti -oggetti realizzati come tali in appositi filesystem. +oggetti realizzati come tali usando degli specifici filesystem. In particolare i permessi associati agli oggetti di IPC POSIX sono identici ai permessi dei file, ed il controllo di accesso segue esattamente la stessa @@ -3935,8 +3936,8 @@ I rispettivi prototipi sono: \fhead{mqueue.h} \fhead{time.h} \fdecl{int mq\_timedsend(mqd\_t mqdes, const char *msg\_ptr, size\_t - msg\_len, unsigned int msg\_prio,\\ -\phantom{int mq\_timedsend(}const struct timespec *abs\_timeout)} + msg\_len, \\ +\phantom{int mq\_timedsend(}unsigned int msg\_prio, const struct timespec *abs\_timeout)} \fdesc{Esegue l'inserimento di un messaggio su una coda entro un tempo specificato} } @@ -3981,13 +3982,12 @@ descriptor della coda, nel qual caso entrambe ritornano con un codice di errore di \errcode{EAGAIN}. La sola differenza fra le due funzioni è che \func{mq\_timedsend}, passato il -tempo massimo impostato con l'argomento \param{abs\_timeout}, ritorna comunque -con un errore di \errcode{ETIMEDOUT}, se invece il tempo è già scaduto al -momento della chiamata e la coda è piena la funzione ritorna -immediatamente. Il valore di \param{abs\_timeout} deve essere specificato come -tempo assoluto tramite una struttura \struct{timespec} (vedi -fig.~\ref{fig:sys_timespec_struct}) indicato in numero di secondi e -nanosecondi a partire dal 1 gennaio 1970. +tempo massimo impostato con l'argomento \param{abs\_timeout}, ritorna con un +errore di \errcode{ETIMEDOUT}, se invece il tempo è già scaduto al momento +della chiamata e la coda è piena la funzione ritorna immediatamente. Il valore +di \param{abs\_timeout} deve essere specificato come tempo assoluto tramite +una struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct}) +indicato in numero di secondi e nanosecondi a partire dal 1 gennaio 1970. Come per l'inserimento, anche per l'estrazione dei messaggi da una coda sono previste due funzioni di sistema, \funcd{mq\_receive} e @@ -4272,11 +4272,11 @@ lunghezza nulla. Il nuovo segmento verrà creato con i permessi indicati da \param{mode} (di cui vengono usati solo i 9 bit meno significativi, non si applicano pertanto i permessi speciali di sez.~\ref{sec:file_special_perm}) filtrati dal valore dell'\textit{umask} del processo. Come gruppo ed utente -propritario del segmento saranno presi quelli facenti parte del gruppo +proprietario del segmento saranno presi quelli facenti parte del gruppo \textit{effective} del processo chiamante. Dato che un segmento di lunghezza nulla è di scarsa utilità, una vola che lo -si è creato per impostarne la dimensione si devrà poi usare \func{ftruncate} +si è creato per impostarne la dimensione si dovrà poi usare \func{ftruncate} (vedi sez.~\ref{sec:file_file_size}) prima di mapparlo in memoria con \func{mmap}. Si tenga presente che una volta chiamata \func{mmap} si può chiudere il file descriptor ad esso associato (semplicemente con @@ -4325,7 +4325,7 @@ Come esempio dell'uso delle funzioni attinenti ai segmenti di memoria condivisa POSIX, vediamo come è possibile riscrivere una interfaccia semplificata analoga a quella vista in fig.~\ref{fig:ipc_sysv_shm_func} per la memoria condivisa in stile SysV. Il codice completo, di cui si sono riportate -le parti esseziali in fig.~\ref{fig:ipc_posix_shmmem}, è contenuto nel file +le parti essenziali in fig.~\ref{fig:ipc_posix_shmmem}, è contenuto nel file \file{SharedMem.c} dei sorgenti allegati. \begin{figure}[!htb] @@ -4447,15 +4447,15 @@ utilizzare, ed è quello che permette a processi diversi di accedere allo stesso semaforo. Questo deve essere specificato nella stessa forma utilizzata per i segmenti di memoria condivisa, con un nome che inizia con ``\texttt{/}'' e senza ulteriori ``\texttt{/}'', vale a dire nella forma -\texttt{/nomesemaforo}. +\texttt{/nome-semaforo}. Con Linux i file associati ai semafori sono mantenuti nel filesystem virtuale \texttt{/dev/shm}, e gli viene assegnato automaticamente un nome nella forma -\texttt{sem.nomesemaforo}, si ha cioè una corrispondenza per cui -\texttt{/nomesemaforo} viene rimappato, nella creazione tramite -\func{sem\_open}, su \texttt{/dev/shm/sem.nomesemaforo}. Per questo motivo la +\texttt{sem.nome-semaforo}, si ha cioè una corrispondenza per cui +\texttt{/nome-semaforo} viene rimappato, nella creazione tramite +\func{sem\_open}, su \texttt{/dev/shm/sem.nome-semaforo}. Per questo motivo la dimensione massima per il nome di un semaforo, a differenza di quanto avviene -per i segmenti di memoria confivisa, è pari a \const{NAME\_MAX}$ - 4$. +per i segmenti di memoria condivisa, è pari a \const{NAME\_MAX}$ - 4$. L'argomento \param{oflag} è quello che controlla le modalità con cui opera la funzione, ed è passato come maschera binaria; i bit corrispondono a quelli @@ -4528,7 +4528,7 @@ decrementarlo con successo e proseguire. Si tenga presente che la funzione può sempre essere interrotta da un segnale, nel qual caso si avrà un errore di \const{EINTR}; inoltre questo avverrà -comunque, anche qualora si fosse richiesta la gesione con la semantica BSD, +comunque, anche qualora si fosse richiesta la gestione con la semantica BSD, installando il gestore del suddetto segnale con l'opzione \const{SA\_RESTART} (vedi sez.~\ref{sec:sig_sigaction}) per riavviare le \textit{system call} interrotte. @@ -4592,7 +4592,7 @@ Anche in questo caso il comportamento della funzione è identico a quello di \func{sem\_wait}, ma è possibile impostare un tempo limite per l'attesa tramite la struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct}) puntata -dall'argomento \param{abs\_timeout}, indicato in secondi e nonosecondi a +dall'argomento \param{abs\_timeout}, indicato in secondi e nanosecondi a partire dalla cosiddetta \textit{Epoch} (00:00:00, 1 January 1970 UTC). Scaduto il limite la funzione ritorna anche se non è possibile acquisire il semaforo fallendo con un errore di \errval{ETIMEDOUT}. @@ -5080,11 +5080,12 @@ testo alla terminazione di quest'ultimo. % LocalWords: Larry Wall Escape the Hell William ipctestid Identifier segment % LocalWords: violation dell'I SIGINT setter Fri Dec Sleeping seconds ECHILD % LocalWords: SysV capability short RESOURCE INFO UNDEFINED EFBIG semtimedop -% LocalWords: scan HUGETLB huge page NORESERVE copy RLIMIT MEMLOCK REMAP -% LocalWords: readmon Hierarchy defaults queues MSGQUEUE +% LocalWords: scan HUGETLB huge page NORESERVE copy RLIMIT MEMLOCK REMAP UTC +% LocalWords: readmon Hierarchy defaults queues MSGQUEUE effective fstat %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: fchown fchmod Epoch January