\func{flock}, la seconda è quella recepita dallo standard POSIX.1 (che è
derivata dall'interfaccia usata in System V), che è basata sulla funzione
\func{fcntl}. I \textit{file lock} sono implementati in maniera completamente
-indipendente nelle due interfacce,\footnote{in realtà con Linux questo avviene
- solo dalla serie 2.0 dei kernel.} che pertanto possono coesistere senza
+indipendente nelle due interfacce (in realtà con Linux questo avviene solo
+dalla serie 2.0 dei kernel) che pertanto possono coesistere senza
interferenze.
Entrambe le interfacce prevedono la stessa procedura di funzionamento: si
permette di eseguire un blocco solo su un intero file; la funzione usata per
richiedere e rimuovere un \textit{file lock} è \funcd{flock}, ed il suo
prototipo è:
-\begin{prototype}{sys/file.h}{int flock(int fd, int operation)}
-
- Applica o rimuove un \textit{file lock} sul file \param{fd}.
-
- \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
- errore, nel qual caso \var{errno} assumerà uno dei valori:
- \begin{errlist}
+
+\begin{funcproto}{
+\fhead{sys/file.h}
+\fdecl{int flock(int fd, int operation)}
+\fdesc{Applica o rimuove un \textit{file lock}.}
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+ caso \var{errno} assumerà uno dei valori:
+ \begin{errlist}
\item[\errcode{EWOULDBLOCK}] il file ha già un blocco attivo, e si è
specificato \const{LOCK\_NB}.
- \end{errlist}
- }
-\end{prototype}
+ \end{errlist}
+}
+\end{funcproto}
La funzione può essere usata per acquisire o rilasciare un \textit{file lock}
a seconda di quanto specificato tramite il valore dell'argomento
\const{LOCK\_NB} la funzione non si bloccherà qualora il \textit{file lock}
non possa essere acquisito, ma ritornerà subito con un errore di
\errcode{EWOULDBLOCK}. Per rilasciare un \textit{file lock} si dovrà invece
-usare direttamente const{LOCK\_UN}.
+usare direttamente \const{LOCK\_UN}.
Si tenga presente che non esiste una modalità per eseguire atomicamente un
cambiamento del tipo di blocco (da \textit{shared lock} a \textit{esclusive
\begin{figure}[!htb]
\centering
- \includegraphics[width=15.5cm]{img/file_flock}
+ \includegraphics[width=14cm]{img/file_flock}
\caption{Schema dell'architettura del \textit{file locking}, nel caso
particolare del suo utilizzo da parte dalla funzione \func{flock}.}
\label{fig:file_flock_struct}
{frame=lines,framerule=0.5mm,framesep=2mm,xleftmargin=1cm,xrightmargin=1cm,fontsize=\footnotesize}
\DefineVerbatimEnvironment{Terminal}{Verbatim}
-{xleftmargin=\parindent,xrightmargin=\parindent,fontfamily=courier,fontsize=\footnotesize}
+{xleftmargin=\parindent,xrightmargin=\parindent,fontsize=\footnotesize}
\DefineVerbatimEnvironment{Command}{Verbatim}
{xleftmargin=\parindent,xrightmargin=\parindent,fontseries=b,
-fontfamily=courier,fontsize=\footnotesize}
+fontsize=\footnotesize}
\DefineVerbatimEnvironment{Console}{Verbatim}
-{commandchars=\\\{\},xleftmargin=\parindent,xrightmargin=\parindent,fontfamily=courier,fontsize=\footnotesize}
+{commandchars=\\\{\},xleftmargin=\parindent,xrightmargin=\parindent,fontsize=\footnotesize}
\usepackage[bookmarks=true,plainpages=false,pdfpagelabels,
\usepackage{listings}
\lstloadlanguages{C++}
\usepackage{color}
+
+\providecommand{\defaultdesc}{%
+\desclabelstyle{\pushlabel}%
+\renewcommand{\makelabel}[1]{##1}%
+\setlength{\labelwidth}{0pt}%
+}
\usepackage{mdwlist}
+
\usepackage{boxedminipage}
\usepackage{multirow}
\usepackage{longtable}
più comuni; il codice, contenuto nel file \file{SharedMem.c}, è riportato in
fig.~\ref{fig:ipc_sysv_shm_func}.
-La prima funzione (\texttt{\small 3--16}) è \func{ShmCreate} che, data una
+La prima funzione (\texttt{\small 1--16}) è \func{ShmCreate} che, data una
chiave, crea il segmento di memoria condivisa restituendo il puntatore allo
stesso. La funzione comincia (\texttt{\small 6}) con il chiamare
\func{shmget}, usando il flag \const{IPC\_CREATE} per creare il segmento
intercomunicazione necessari. Si inizia costruendo (\texttt{\small 30}) la
chiave da usare come riferimento con il nome del programma,\footnote{si è
usato un riferimento relativo alla home dell'utente, supposto che i sorgenti
- di GaPiL siano stati installati direttamente in essa. Qualora si effettui
+ di GaPiL siano stati installati direttamente in essa; qualora si effettui
una installazione diversa si dovrà correggere il programma.} dopo di che si
richiede (\texttt{\small 31}) la creazione di un segmento di memoria condivisa
con usando la funzione \func{ShmCreate} illustrata in precedenza (una pagina
errore di \errcode{EAGAIN}.
La sola differenza fra le due funzioni è che \func{mq\_timedsend}, passato il
-tempo massimo impostato con l'argomento \param{abs\_timeout}, ritorna comunque
-con un errore di \errcode{ETIMEDOUT}, se invece il tempo è già scaduto al
-momento della chiamata e la coda è piena la funzione ritorna
-immediatamente. Il valore di \param{abs\_timeout} deve essere specificato come
-tempo assoluto tramite una struttura \struct{timespec} (vedi
-fig.~\ref{fig:sys_timespec_struct}) indicato in numero di secondi e
-nanosecondi a partire dal 1 gennaio 1970.
+tempo massimo impostato con l'argomento \param{abs\_timeout}, ritorna con un
+errore di \errcode{ETIMEDOUT}, se invece il tempo è già scaduto al momento
+della chiamata e la coda è piena la funzione ritorna immediatamente. Il valore
+di \param{abs\_timeout} deve essere specificato come tempo assoluto tramite
+una struttura \struct{timespec} (vedi fig.~\ref{fig:sys_timespec_struct})
+indicato in numero di secondi e nanosecondi a partire dal 1 gennaio 1970.
Come per l'inserimento, anche per l'estrazione dei messaggi da una coda sono
previste due funzioni di sistema, \funcd{mq\_receive} e
versione 2.1 della \acr{glibc}.} in particolare sono stati superati tre
limiti fondamentali dei segnali classici:
\begin{basedescript}{\desclabelwidth{1cm}\desclabelstyle{\nextlinelabel}}
-\item[I segnali non sono accumulati]
+\item[\textbf{I segnali non sono accumulati}]
se più segnali vengono generati prima dell'esecuzione di un gestore
questo sarà eseguito una sola volta, ed il processo non sarà in grado di
accorgersi di quante volte l'evento che ha generato il segnale è accaduto.
-\item[I segnali non trasportano informazione]
+\item[\textbf{I segnali non trasportano informazione}]
i segnali classici non prevedono altra informazione sull'evento
che li ha generati se non il fatto che sono stati emessi (tutta
l'informazione che il kernel associa ad un segnale è il suo numero).
-\item[I segnali non hanno un ordine di consegna]
+\item[\textbf{I segnali non hanno un ordine di consegna}]
l'ordine in cui diversi segnali vengono consegnati è casuale e non
prevedibile. Non è possibile stabilire una priorità per cui la reazione a
certi segnali ha la precedenza rispetto ad altri.