\secref{sec:ipc_sysv_access_control}, per quanto riguarda gli altri campi
invece:
\begin{itemize}
-\item i campi \var{msg\_qnum}, \var{msg\_lspid}, \var{msg\_lrpid},
- \var{msg\_stime}, \var{msg\_rtime} sono inizializzati a 0
-\item il campo \var{msg\_ctime} viene settato al tempo corrente
-\item il campo \var{msg\_qbytes} al limite di sistema.
+\item il campo \var{msg\_qnum}, che esprime il numero di messaggi presenti
+ sulla coda, viene inizializzato a 0.
+\item i campi \var{msg\_lspid} e \var{msg\_lrpid}, che esprimono
+ rispettivamente il \acr{pid} dell'ultimo processo che ha inviato o ricevuto
+ un messaggio sulla coda, sono inizializzati a 0.
+\item i campi \var{msg\_stime} e \var{msg\_rtime}, che esprimono
+ rispettivamente il tempo in cui è stato inviato o ricevuto l'ultimo
+ messaggio sulla coda, sono inizializzati a 0.
+\item il campo \var{msg\_ctime} viene inizializzato al tempo corrente.
+\item il campo \var{msg\_qbytes} viene inizializzati al limite di sistema.
+\item i campi \var{msg\_first} e \var{msg\_last} che esprimono l'indirizzo del
+ primo e ultimo messagio sono inizializzati a \macro{NULL} e
+ \var{msg\_cbytes}, che esprime la dimensione in byte dei messaggi presenti è
+ inizializzato a zero. Questi campi sono ad uso interno dell'implementazione
+ e non devono essere utilizzati da programmi in user space).
\end{itemize}
Una volta creata una coda di messaggi le operazioni di controllo vengono
presente che la lunghezza che deve essere indicata in questo argomento è solo
quella del messaggio, non di tutta la struttura, se cioè \var{message} è la
struttura che si passa alla funzione, \param{msgsz} dovrà essere uguale a
-\code{sizeof(message)-sizeof(long)}.
+\code{sizeof(message)-sizeof(long)} (se consideriamo il caso dell'esempio in
+\figref{fig:ipc_msbug} \param{msgsz} dovrà essere pari a \macro{LENGHT}).
\begin{figure}[!htb]
\footnotesize \centering
\begin{minipage}[c]{15cm}
\begin{lstlisting}[labelstep=0]{}
struct msgbuf {
- long mtype; /* message type, must be > 0 */
- char mtext[1]; /* message data */
+ long mtype; /* message type, must be > 0 */
+ char mtext[LENGTH]; /* message data */
};
\end{lstlisting}
\end{minipage}
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à
}
\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}
\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
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}