X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=dcc89fde09e9bd905aae282365bc395de817c2cb;hp=7e5645de914e3c40a15e64e5a33ff522903e912b;hb=79073aa5e38b418fc4844ba3bd8dbb55e75dc4ff;hpb=8fad76a42d4fdf71d9a90d425a70af66827fbf9e diff --git a/ipc.tex b/ipc.tex index 7e5645d..dcc89fd 100644 --- a/ipc.tex +++ b/ipc.tex @@ -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} } @@ -4271,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 @@ -4324,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] @@ -4446,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 @@ -4527,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. @@ -4591,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}. @@ -5079,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