From: Simone Piccardi Date: Sun, 25 Aug 2002 23:13:55 +0000 (+0000) Subject: Iniziato coi semafori X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=0e9d5d9643607c94e7faced765248ac4d223548f Iniziato coi semafori --- diff --git a/img/mqstruct.dia b/img/mqstruct.dia index e9e2e7e..1cad62a 100644 Binary files a/img/mqstruct.dia and b/img/mqstruct.dia differ diff --git a/ipc.tex b/ipc.tex index a607aa1..0637d47 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1306,10 +1306,21 @@ riguardo lo stato corrente della coda. Quando si crea una nuova coda con \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 @@ -1416,15 +1427,16 @@ dimensione deve essere specificata sempre attraverso \param{msgsz}. Si tenga 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} @@ -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}