From 06604d9d9800ff3f095bda01f9c93bc2e82d50eb Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 12 Jan 2003 23:42:43 +0000 Subject: [PATCH] Altre correzioni --- ipc.tex | 98 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 37 deletions(-) diff --git a/ipc.tex b/ipc.tex index 951d424..9d8ebe6 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1692,7 +1692,7 @@ una scansione della struttura mostrata in \figref{fig:ipc_mq_schema}, restituendo il primo messaggio incontrato che corrisponde ai criteri specificati (che quindi, visto come i messaggi vengono sempre inseriti dalla coda, è quello meno recente); in particolare: -\begin{itemize*} +\begin{itemize} \item se \param{msgtyp} è 0 viene estratto il messaggio in cima alla coda, cioè quello fra i presenti che è stato inserito inserito per primo. \item se \param{msgtyp} è positivo viene estratto il primo messaggio il cui @@ -1701,7 +1701,7 @@ coda, \item se \param{msgtyp} è negativo viene estratto il primo fra i messaggi con il valore più basso del tipo, fra tutti quelli il cui tipo ha un valore inferiore al valore assoluto di \param{msgtyp}. -\end{itemize*} +\end{itemize} Il valore di \param{msgflg} permette di controllare il comportamento della funzione, esso può essere nullo o una maschera binaria composta da uno o più @@ -1933,14 +1933,16 @@ passo (\texttt{\small 17}) prima di uscire messaggio ricevuto. Proviamo allora il nostro nuovo sistema, al solito occorre definire -\code{LD\_LIBRAY\_PATH}, dopo di che, in maniera del tutto analoga a quanto -fatto con il programma che usa le fifo, potremo far partire il server con: +\code{LD\_LIBRAY\_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} [piccardi@gont sources]$ ./mqfortuned -n10 \end{verbatim}%$ -come prima, essendo eseguito in background, il comando ritornerà -immediatamente, ma potremo verificare con \cmd{ps} che il programma è -effettivamente in esecuzione, e che ha creato una coda di messaggi: +come nel caso precedente, avendo eseguito il server in background, il comando +ritornerà immediatamente; potremo però verificare con \cmd{ps} che il +programma è effettivamente in esecuzione, e che ha creato una coda di +messaggi: \begin{verbatim} [piccardi@gont sources]$ ipcs @@ -1954,13 +1956,18 @@ key semid owner perms nsems key msqid owner perms used-bytes messages 0x0102dc6a 0 piccardi 666 0 0 \end{verbatim} - - - - - - - +a questo punto potremo usare il client per ottenere le nostre frasi: +\begin{verbatim} +[piccardi@gont sources]$ ./mqfortune +Linux ext2fs has been stable for a long time, now it's time to break it + -- Linuxkongreß '95 in Berlin +[piccardi@gont sources]$ ./mqfortune +Let's call it an accidental feature. + --Larry Wall +\end{verbatim} +con un risultato del tutto equivalente al precedente. Infine potremo chiudere +il server inviando il segnale di terminazione con il comando \code{killall + mqfortuned} verficando che effettivamente la coda di messaggi viene rimossa. Benché funzionante questa architettura risente dello stesso inconveniente visto anche nel caso del precedente server basato sulle fifo; se il client @@ -2789,7 +2796,9 @@ Come per le code di messaggi e gli insiemi di semafori, anche per i segmenti di memoria condivisa esistono una serie di limiti imposti dal sistema. Alcuni di questi limiti sono al solito accessibili e modificabili attraverso \func{sysctl} o scrivendo direttamente nei rispettivi file di -\file{/proc/sys/kernel/}. In \tabref{tab:ipc_shm_limits} si sono riportate le +\file{/proc/sys/kernel/}. + +In \tabref{tab:ipc_shm_limits} si sono riportate le costanti simboliche associate a ciascuno di essi, il loro significato, i valori preimpostati, e, quando presente, il file in \file{/proc/sys/kernel/} che permettono di cambiarne il valore. @@ -2846,49 +2855,64 @@ un segmento di memoria condivisa \begin{errlist} \item[\errcode{EACCES}] Si è richiesto \const{IPC\_STAT} ma i permessi non consentono l'accesso in lettura al segmento. - \item[\errcode{EINVAL}] O \param{shmid} o \param{cmd} hanno valori non - validi. + \item[\errcode{EINVAL}] O \param{shmid} non è un identificatore valido o + \param{cmd} non è un comando valido. \item[\errcode{EIDRM}] L'argomento \param{shmid} fa riferimento ad un segmento che è stato cancellato. \item[\errcode{EPERM}] Si è specificato un comando con \const{IPC\_SET} o \const{IPC\_RMID} senza i permessi necessari. - \item[\errcode{EOVERFLOW}] L'argomento \param{shmid} fa riferimento ad un - segmento che è stato cancellato. + \item[\errcode{EOVERFLOW}] Si è tentato il comando \const{IPC\_STAT} ma il + valore del group-ID o dell'user-ID è troppo grande per essere + memorizzato nella struttura puntata dal \param{buf}. + \item[\errcode{EFAULT}] L'indirizzo specificato con \param{buf} non è + valido. \end{errlist} - ed inoltre \errval{EFAULT}.} +} \end{functions} -Il comportamento della funzione dipende dal valore del comando passato -attraverso l'argomento \param{cmd}, i valori possibili sono i seguenti: +Il comando specificato attraverso l'argomento \param{cmd} determina i diversi +effetti della funzione; i possibili valori che esso può assumere, ed il +corripondente comportamento della funzione, sono i seguenti: + \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} \item[\const{IPC\_STAT}] Legge le informazioni riguardo il segmento di memoria condivisa nella struttura \struct{shmid\_ds} puntata da \param{buf}. Occorre - avere il permesso di lettura sulla coda. + che il processo chiamante abbia il permesso di lettura sulla segmento. \item[\const{IPC\_RMID}] Marca il segmento di memoria condivisa per la rimozione, questo verrà cancellato effettivamente solo quando l'ultimo processo ad esso agganciato si sarà staccato. Questo comando può essere eseguito solo da un processo con user-ID effettivo corrispondente o al - creatore della coda, o al proprietario della coda, o all'amministratore. + creatore del segmento, o al proprietario del segmento, o all'amministratore. \item[\const{IPC\_SET}] Permette di modificare i permessi ed il proprietario del segmento. Per modificare i valori di \var{shm\_perm.mode}, \var{shm\_perm.uid} e \var{shm\_perm.gid} occorre essere il proprietario o - il creatore della coda, oppure l'amministratore. Compiuta l'operazione + 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}\index{memory - locking}\footnote{impedisce cioè che la memoria usata per il segmento - venga salvata su disco dal meccanismo della memoria virtuale; si ricordi - quanto trattato in \secref{sec:proc_mem_lock}.} sul segmento di memoria - condivisa. Solo l'amministratore può utilizzare questo comando. +\item[\const{SHM\_LOCK}] Abilita il + \textit{memory locking}\index{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 + \secref{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} 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 ed i semafori, -gli ultimi due sono delle estensioni previste da Linux. - -Per utilizzare i segmenti di memoria condivisa l'interfaccia prevede due -funzioni, la prima è \funcd{shmat}, che serve ad agganciare un segmento al -processo chiamante, in modo che quest'ultimo possa vederlo nel suo spazio di -indirizzi; il suo prototipo è: +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. + +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 +\struct{shmid\_ds} precedentemente allocata, in cui nel primo caso saranno +scritti i dati del segmento di memoria restituiti dalla funzione e da cui, nel +secondo caso, verranno letti i dati da impostare sul segmento. + +Una volta che lo si è creato, per utilizzare un segmento di memoria condivisa +l'interfaccia prevede due funzioni, \funcd{shmat} e \func{shmdt}. La prima di +queste serve ad agganciare un segmento al processo chiamante, in modo che +quest'ultimo possa inserirlo nel suo spazio di indirizzi per potervi accedere; +il suo prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/shm.h} -- 2.30.2