From: Simone Piccardi Date: Sun, 5 Jan 2003 20:30:24 +0000 (+0000) Subject: Aggiunto codice del client. X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=305928c5c349fa8fd0131dcf5a095e98c610e6bb Aggiunto codice del client. --- diff --git a/ipc.tex b/ipc.tex index 3151c40..61eb8a0 100644 --- a/ipc.tex +++ b/ipc.tex @@ -3055,8 +3055,9 @@ segmento di memoria condivisa \var{shmid} (uscendo in caso di errore), che si aggancia (\texttt{\small 39--41}) al processo all'indirizzo \var{shmptr}; sarà attraverso questo puntatore che potremo accedere alla memoria condivisa, che sarà vista nella forma data da \struct{DirProp}. Infine con la stessa chiave -si crea (\texttt{\small 42--45}) anche un mutex, che utilizzaremo per regolare -l'accesso alla memoria condivisa. +si crea (\texttt{\small 42--45}) anche un mutex (utilizzando le funzioni di +intrfaccia già descritte in \secref{sec:ipc_sysv_sem}) che utilizzaremo per +regolare l'accesso alla memoria condivisa. Una volta completata l'inizializzazione e la creazione degli oggetti di intercomunicazione il programma eseguirà indefinitamente (\texttt{\small @@ -3068,7 +3069,6 @@ automaticamente se qualche client sta leggendo), poi si cancellano (\texttt{\small 51}), e si attende (\texttt{\small 52}) per il periodo di tempo specificato a riga di comando con l'opzione \code{-p}. - \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} @@ -3136,14 +3136,90 @@ dei file ed il loro numero, poi utilizzando le macro di \tabref{tab:file_type_macro}, si contano (\texttt{\small 11--17}) quanti ce ne sono per ciascun tipo. -In \figref{fig:ipc_dirmonitor_sub} è riportato inoltre (\texttt{\small - 23--35}) il codice del gestore di segnali usato per terminare il programma, -che si incarica di cancellare tutti gli oggetti non più necessari. +In \figref{fig:ipc_dirmonitor_sub} è riportato anche (\texttt{\small 23--35}) +il codice del gestore di segnali di terminazione usato per chiudere il +programma, che oltre a provocare l'uscita del programma si incarica anche di +cancellare tutti gli oggetti di intercomunicazione non più necessari. Nel +caso anzitutto (\texttt{\small 24}) si acquisisce il mutex per evitare di +operare mentre un client sta ancora leggendo i dati, dopo di che prima si +distacca (\texttt{\small 25--28}) il segmento e poi lo si cancella +(\texttt{\small 29--32}). Infine (\texttt{\small 33}) si rimuove il mutex e si +esce. + +Il codice del client che permette di leggere le informazioni mantenute nella +memoria condivisa è riportato in \figref{fig:ipc_dirmonitor_client}, al solito +si è omessa la sezione di gestione delle opzioni e la funzione che stampa a +video le istruzioni; il codice completo è nei sorgenti allegati, nel file +\file{ReadMonitor.c}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \begin{lstlisting}{} +#include +#include +#include /* directory */ +#include /* C standard library */ +#include + +#include "Gapil.h" +#include "macros.h" + +int main(int argc, char *argv[]) +{ + int i; + key_t key; + .. + /* find needed IPC objects */ + key = ftok("./DirMonitor.c", 1); /* define a key */ + shmid = shmget(key, 4096, 0); /* get the shared memory ID */ + if (shmid < 0) { + perror("Cannot find shared memory"); + exit(1); + } + if ( (shmptr = shmat(shmid, NULL, 0)) == NULL ) { /* attach to process */ + perror("Cannot attach segment"); + exit(1); + } + if ((mutex = MutexFind(key)) == -1) { /* get the Mutex */ + perror("Cannot find mutex"); + exit(1); + } + /* main loop */ + MutexLock(mutex); /* lock shared memory */ + printf("File presenti %d file, per un totale di %d byte\n", + shmptr->tot_files, shmptr->tot_size); + printf("Ci sono %d file dati\n", shmptr->tot_regular); + printf("Ci sono %d directory\n", shmptr->tot_dir); + printf("Ci sono %d link\n", shmptr->tot_link); + printf("Ci sono %d fifo\n", shmptr->tot_fifo); + printf("Ci sono %d socket\n", shmptr->tot_sock); + printf("Ci sono %d device a carrateri\n", shmptr->tot_char); + printf("Ci sono %d device a blocchi\n", shmptr->tot_block); + MutexUnlock(mutex); /* unlock shared memory */ +} + \end{lstlisting} + \end{minipage} + \normalsize + \caption{Codice del programma client \file{ReadMonitor.c}.} + \label{fig:ipc_dirmonitor_client} +\end{figure} -Anzitutto (\texttt{\small 24}) si acquisisce il mutex per evitare di operare -mentre un client sta ancora leggendo i dati, dopo di che si distacca -(\texttt{\small 25--28}) il segmento e lo si cancella (\texttt{\small - 29--32}). Infine (\texttt{\small 33}) si rimuove il mutex e si esce. +Una volta completata la gestione delle opzioni a riga di comando il programma +rigenera (\texttt{\small 16}) la chiave usata per identificare memoria +condivisa e mutex, richiede (\texttt{\small 17}) l'identificatore della +memoria condivisa (che in questo caso deve già esistere), uscendo in caso di +errore (\texttt{\small 18--21}). Una volta ottenuto l'identificatore si può +(\texttt{\small 22--25}) agganciare il segmento al processo (anche in questo +caso uscendo se qualcosa non funziona). Infine (\texttt{\small 26--29}) si +richede pure l'identificatore del mutex. + +Una volta completata l'inizializzazione ed ottenuti i riferimenti agli oggetti +di intercomunicazione necessari viene eseguito il corpo principale del +programma (\texttt{\small 30--41}); si acquisisce (\texttt{\small 31}) il +mutex (qui avviene il blocco se la memoria condivisa non è disponibile), e poi +(\texttt{\small 32--40}) si stampano i vari valori in essa contenuti. Infine +(\texttt{\small 41}) si rilascia il mutex. %% Per capire meglio il funzionamento delle funzioni facciamo ancora una volta