From: Simone Piccardi Date: Fri, 1 Nov 2002 14:10:02 +0000 (+0000) Subject: Aggiunte info su shmctl, smat, shmst X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=3b25af0c70f61bf5bb4327f32c0abcc51e7f7332;p=gapil.git Aggiunte info su shmctl, smat, shmst --- diff --git a/ipc.tex b/ipc.tex index 2bd1a9c..488e330 100644 --- a/ipc.tex +++ b/ipc.tex @@ -2554,46 +2554,100 @@ un segmento di memoria condivisa \begin{errlist} \item[\macro{EACCES}] Si è richiesto \macro{IPC\_STAT} ma i permessi non consentono l'accesso in lettura al segmento. - \item[\macro{EINVAL}] . - \item[\macro{ENOMEM}] . - \end{errlist}.} + \item[\macro{EINVAL}] O \param{shmid} o \param{cmd} hanno valori non + validi. + \item[\macro{EIDRM}] L'argomento \param{shmid} fa riferimento ad un + segmento che è stato cancellato. + \item[\macro{EPERM}] Si è specificato un comando con \macro{IPC\_SET} o + \macro{IPC\_RMID} senza i permessi necessari. + \item[\macro{EOVERFLOW}] L'argomento \param{shmid} fa riferimento ad un + segmento che è stato cancellato. + \end{errlist} + ed inoltre \macro{EFAULT}.} \end{functions} -Per utilizzare i segmenti di memoria condivisa si usano due funzioni, -\func{shmat} e \func{shmdt}, che consentono di agganciarli e sganciarli da un -processo, così che questo possa vederli nel suo spazio di indirizzi; i loro -prototipi sono: +Il comportamento della funzione dipende dal valore del comando passato +attraverso l'argomento \param{cmd}, i valori possibili sono i seguenti: +\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} +\item[\macro{IPC\_STAT}] Legge le informazioni riguardo il segmento di memoria + condivisa nella struttura \var{shmid\_ds} puntata da \param{buf}. Occorre + avere il permesso di lettura sulla coda. +\item[\macro{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 userid effettivo, corrispondente al + creatore o al proprietario della coda, o all'amministratore. +\item[\macro{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 + aggiorna anche il valore del campo \var{shm\_ctime}. +\item[\macro{SHM\_LOCK}] Abilita il \textit{memory locking}\index{memory + locking} (vedi \secref{sec:proc_mem_lock}) sul segmento di memoria + condivisa. Solo l'amministratore può utilizzare questo comando. +\item[\macro{SHM\_UNLOCK}] Disabilita il \textit{memory locking}. 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 solo in Linux. + +Per utilizzare i segmenti di memoria condivisa si usano due funzioni, la prima +di queste è \func{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 è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/shm.h} \funcdecl{void *shmat(int shmid, const void *shmaddr, int shmflg)} Aggancia al processo un segmento di memoria condivisa. - - \funcdecl{int shmdt(const void *shmaddr)} - Sgancia dal processo un segmento di memoria condivisa. - \bodydesc{Le funzioni restituiscono rispettivamente l'indirizzo del segmento - e 0 in caso di successo, mentre entrambe restituiscono -1 in caso di - errore, nel qual caso \var{errno} assumerà i valori: + \bodydesc{La funzione restituisce l'indirizzo del segmento in caso di + successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà i + valori: \begin{errlist} - \item[\macro{EACCES}] Il processo non ha i provilegi di accesso. + \item[\macro{EACCES}] Il processo non ha i privilegi per accedere al + segmento nella modalità richiesta. \item[\macro{EINVAL}] Si è specificato un identificatore invalido per - \param{shmid}, o un indirizzo non valido per \param{shmaddr}. - \item[\macro{EPERM}] Si è richiesto \macro{IPC\_SET} o \macro{IPC\_RMID} - senza avere i permessi del creatore o del proprietario del segmento (o - quelli dell'amministratore). - \item[\macro{EOVERFLOW}] Si è richiesto \macro{IPC\_STAT} ma alcuni valori - sono troppo grandi per essere memorizzati nella struttura puntata da - \param{buf}. + \param{shmid}, o un indirizzo non allineato sul confine di una pagina + per \param{shmaddr}. + \item[\macro{EIDRM}] Si è richiesto un segmento marcato per la + cancellazione. \end{errlist} - ed inoltre \macro{EFAULT} e \macro{EIDRM}.} + ed inoltre \macro{ENOMEM}.} \end{functions} -La prima funzione, \func{shmat}, aggancia un segmento di memoria condivisa -allo spazio di indirizzi del processo, così che questo possa accedervi. -L'argomento \param{shmaddr} specifica a quale indirizzo deve essere associato -il segmento. +La funzione inserisce un segmento di memoria condivisa all'interno dello +spazio di indirizzi del processo, come mostrato in così che questo possa +accedervi, L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{Lo + standard SVID prevede che l'argomento \param{shmaddr} sia di tipo \ctyp{char + *}, così come il valore di ritorno della funzione. In Linux è stato così + con le \acr{libc4} e le \acr{libc5}, con il passaggio alle \acr{glibc} il + tipo di \param{shmaddr} è divenuto un \ctyp{const void *} e quello del + valore di ritorno un \ctyp{void *}.} deve essere associato il segmento, che +verrà restituito dalla funzione. + + +La seconda funzione è \func{shmdt}, che consente di sganciare un segmento di +memoria condivisa dal processo chiamante, , quando questo non è più +necessario, il suo prototipo è: +\begin{functions} + \headdecl{sys/types.h} + \headdecl{sys/shm.h} + + \funcdecl{int shmdt(const void *shmaddr)} + Sgancia dal processo un segmento di memoria condivisa. + + \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di + errore, la funzione fallisce solo quando non c'è un segmento agganciato + all'indirizzo \func{shmaddr}, con \var{errno} che assume il valore + \macro{EINVAL}.} +\end{functions} + + + + +