From 0e9d5d9643607c94e7faced765248ac4d223548f Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 25 Aug 2002 23:13:55 +0000 Subject: [PATCH] Iniziato coi semafori --- img/mqstruct.dia | Bin 3652 -> 3689 bytes ipc.tex | 131 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 109 insertions(+), 22 deletions(-) diff --git a/img/mqstruct.dia b/img/mqstruct.dia index e9e2e7e7cbac32b69a697c40f969a66928d32840..1cad62a12e4bb1edaa08c2f4314ff539184bec18 100644 GIT binary patch literal 3689 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 H&qV@=yTEpz4JFn% z-gWF$R+>p4_P3X$6g#%8*b#Y|D!x-p8hd0?lBq?||H1s7migV8`NU#nUtNuEtLpxTi;Ks{M>2m} z<<+tz^VtJg6&L@{=kxr+Ty!z|`swWKWdW1C%I$m2yLnZWv+IYdI9ud*#ntFKzxm&^ zTs|x&qx!1mx|`*ES)Tot&#y+Gzqvo7i>8>1t#V!|`#!%f%H3k`?w6~Xxukl!Z(Y(+ zj{W)Kn&zsNxo9!{`uQ*E=lYhKH#TMMyV1@{s=K_L&KB)@$|9fF4}uZR7<+yWZ?EDS zzKS_~6(xKXv(@;1Syp8}tJ>9EFPHNoU(_{KpQ3HzNVw3+vc*1Lk-`(?${R8Z|!tcu8Mj7RFqBeKX1CI zv*sB$z<==+me>C+ZmOnv|E}`IBrhjtU(SABejjamT+`pqCRd|>Cfko^w?U>bLqM(P zbH7}FkAkps@iG>>zRRxSudjDYFU|eui|M?0u7PIf_Q$0rDK)=o+OM`^UfhjumgS<| z(S~Y}tHPnT-Kb~ea<9T~i`n$H>MlJYvR~=f%W_hbhi*P0Nzc1q-7X);dj?sDJG1?W zzt{wO@93w#(Vvj?T#^(p`V+!4Qw7g1Ig#{SkpwjQy&8nk|0j+9f6Nxep73YB;cr6n zoDl&S{+tLcOdb5va5A;OseZNHEEkJ$v6#5Ke^Z~Q{g_^;8 zaYXR)p3qxN#(7yTA9o8cOkA?aRo=j}22I)?-5k zJ~r&#AnY9nH8xCxL_c)wbCNZ&Z{iX@_A&BLAo4|s$mb+N?DKW(C*ZNqaaME^(Jw

Ceox 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 0 */ - char mtext[1]; /* message data */ + long mtype; /* message type, must be > 0 */ + char mtext[LENGTH]; /* message data */ }; \end{lstlisting} \end{minipage} @@ -1463,12 +1475,12 @@ interrotta da un segnale (nel qual caso si ha un errore di \macro{EINTR}). Una volta completato con successo l'invio del messaggio sulla coda, la funzione aggiorna i dati mantenuti in \var{msqid\_ds}, in particolare vengono modificati: -\begin{itemize*} -\item Il valore di \var{msg\_lspid}, che viene importato al \acr{pid} del +\begin{itemize} +\item Il valore di \var{msg\_lspid}, che viene impostato al \acr{pid} del processo chiamante. \item Il valore di \var{msg\_qnum}, che viene incrementato di uno. \item Il valore \var{msg\_stime}, che viene impostato al tempo corrente. -\end{itemize*} +\end{itemize} La funzione che permette di estrarre da una coda un messaggio (che sarà @@ -1500,27 +1512,68 @@ rimosso dalla stessa) } \end{functions} -La funzione è analoga alla precedente \func{msgsnd} ed gli argomenti sono -analoghi, con l'eccezione di \param{type}, questo permette di restringere la -ricerca ad alcuni messaggi; in particolare: +La funzione permette di estrarre un messaggio dalla coda e di scriverlo nel +buffer indicato da \param{msgp}, che deve puntare ad una struttura della forma +mostrata in \figref{fig:ipc_msbug}. L'argomento \param{msgsz} indica la +lunghezza massima del testo del messaggio (equivalente al valore del parametro +\macro{LENGHT} nell'esempio di \figref{fig:ipc_msbug}). + +Se il testo del messaggio ha lunghezza inferiore a \param{msgsz} esso viene +rimosso dalla coda, in caso contrario se \param{msgflg} è impostato a +\macro{MSG\_NOERROR} il messaggio viene troncato e la parte in eccesso viene +perduta, altrimenti il messaggio non viene estratto e la funzione ritorna con +un errore di \macro{E2BIG}. + +L'argomento \param{msgtyp} permette di restringere la ricerca ad un +sottoinsieme dei messaggi presenti sulla coda; in particolare: +\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 + tipo (il valore del campo \var{mtype}) corrisponde a quanto specificato. +\item se \param{msgtyp} è negativo viene estratto il primo messaggio nella coda + con il tipo più basso, fra quelli di tipo inferiore al valore assoluto di + quanto specificato. +\end{itemize} + +Il valore di \param{msgflg} permette di controllare il comportamento della +funzione, esso può assumere valore nullo o essere specificato come maschera +binaria di uno o più dei valori. Oltre al precedente \macro{MSG\_NOERROR}, si +può impostare il valore \macro{MSG\_EXCEPT}, che quando \param{msgtyp} è +positivo permette di leggere il primo messaggio nella coda con tipo diverso da +\param{msgtyp}, ed il valore \macro{IPC\_NOWAIT} che causa il ritorno +immediato della funzione quando non ci sono messaggi sulla coda. + +Il comportamento usuale della funzione infatti, quando non ci sono messaggi +disponibili per la lettura, è di bloccare il processo in stato di +\textit{sleep}; nel caso però si sia specificato \macro{IPC\_NOWAIT} la +funzione ritorna immediatamente con un errore \macro{ENOMSG}. Altrimenti la +funzione ritorna normalmente non appena viene inserito un messaggio del tipo +desiderato, oppure ritorna con errore qualora la cosa sia rimossa (con un +\macro{EIDRM}) o se il processo viene interrotto da un segnale (con un +\macro{EINTR}). + +Una volta completata con successo l'estrazione del messaggio dalla coda, la +funzione aggiorna i dati mantenuti in \var{msqid\_ds}, in particolare vengono +modificati: \begin{itemize} -\item se \param{type} è 0 viene estratto il messaggio in cima alla coda (cioè - quello fra i presenti che è stato inserito inserito per primo). -\item se \param{type} è positivo viene estratto il primo messaggio il cui tipo - (il valore del campo \var{mtype}) corrisponde a quanto specificato. -\item se \param{type} è negativo viene estratto il primo messaggio il valore - di tipo più basso inferiore al valore assoluto di quanto specificato. +\item Il valore di \var{msg\_lrpid}, che viene impostato al \acr{pid} del + processo chiamante. +\item Il valore di \var{msg\_qnum}, che viene decrementato di uno. +\item Il valore \var{msg\_rtime}, che viene impostato al tempo corrente. \end{itemize} + \subsection{Semafori} \label{sec:ipc_sysv_sem} Il secondo oggetto introdotto dal \textit{System V IPC} è quello dei semafori. Un semaforo è uno speciale contatore che permette di controllare l'accesso a -risorse condivise. La funzione che permette di ottenere un insieme di semafori -è \func{semget} ed il suo prototipo è: +risorse condivise. La funzione che permette di creare o ottenere +l'identificatore di un insieme di semafori è \func{semget}, ed il suo prototipo +è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/ipc.h} @@ -1528,7 +1581,7 @@ risorse condivise. La funzione che permette di ottenere un insieme di semafori \funcdecl{int semget(key\_t key, int nsems, int flag)} - Restituisce l'identificatore di un semaforo. + Restituisce l'identificatore di un insieme di semafori. \bodydesc{La funzione restituisce l'identificatore (un intero positivo) o -1 in caso di errore, nel qual caso \var{errno} viene settato agli stessi @@ -1542,6 +1595,40 @@ specificare quanti semafori deve contenere l'insieme qualora se ne richieda la creazione, e deve essere nullo quando si effettua una richiesta dell'identificatore di un insieme già esistente. +A ciascun insieme di semafori è associata una struttura \var{semid\_ds}, +riportata in \figref{fig:ipc_semid_sd}, come nel caso delle code di messaggi +quando si crea un nuovo insieme di semafori con \func{semget} questa struttura +viene inizializzata, in particolare il campo \var{sem\_perm} viene +inizializzato come illustrato in \secref{sec:ipc_sysv_access_control}, per +quanto riguarda gli altri campi invece: +\begin{itemize*} +\item il campo \var{sem\_nsems}, che esprime il numero di semafori + nell'insieme, viene inizializzato al valore di \param{nsems}. +\item il campo \var{sem\_ctime}, che esprime il tempo di creazione + dell'insieme, viene inizializzato al tempo corrente +\item il campo \var{sem\_otime}, che esprime il tempo dell'ultima operazione + effettuata, viene inizializzato a zero. +\end{itemize*} + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \begin{lstlisting}[labelstep=0]{} +struct semid_ds +{ + struct ipc_perm sem_perm; /* operation permission struct */ + time_t sem_otime; /* last semop() time */ + time_t sem_ctime; /* last time changed by semctl() */ + unsigned long int sem_nsems; /* number of semaphores in set */ +}; + + \end{lstlisting} + \end{minipage} + \normalsize + \caption{La struttura \var{semid\_ds}, associata a ciascun insieme di + semafori.} + \label{fig:ipc_semid_sd} +\end{figure} \subsection{Memoria condivisa} -- 2.30.2