ripristino non è comunque garantito in tutte le occasioni.
Come esempio di uso dell'interfaccia dei semafori vediamo come implementare
-con essa dei semplici \textit{mutex} (cioè semafori binari),
+con essa dei semplici \textit{mutex} (cioè semafori binari), tutte le funzioni
+relative sono definite come \ctyp{inline}\footnote{la direttiva \func{inline}
+ viene usata per dire al compilatore di non trattare la funzione cui essa fa
+ riferimento come una funzione, ma di inserire il codice direttamente nel
+ testo del programma. Anche se i compilatori più moderni sono in grado di
+ effettuare da soli queste manipolazioni (impostando le opportune
+ ottimizzazioni) questa è una tecnica usata per migliorare le prestazioni per
+ le funzioni piccole ed usate di frequente, in tal caso infatti le istruzioni
+ per creare un nuovo frame nello stack per chiamare la funzione
+ costituirebbero una parte rilevante del codice, appesantendo inutilmente il
+ programma. Originariamente questa era fatto utilizzando delle macro, ma
+ queste hanno tutta una serie di problemi di sintassi nel passaggio degli
+ argomenti (si veda ad esempio \cite[oullaine]) che in questo modo possono
+ essere evitati.} nel file \file{wrappers.h}. In
+\secref{fig:ipc_mutex_create} si è riportata la definizione delle due funzioni
+che permettono di acquisire il \textit{mutex}; la prima è \func{MutexCreate}
+che crea il semaforo usato per il mutex e lo inizializza, restituendone
+l'identificatore; la seconda è \func{MutexFind}, che data una chiave
+restitituisce l'identificatore del semaforo ad essa associato.
+
+\begin{figure}[!bht]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}{}
+/*
+ * Function MutexCreate:
+ *
+ * Input: an IPC key value (to create an unique semaphore)
+ * Return: the semaphore id#
+ */
+const union semun semunion={1}; /* semaphore union structure */
+inline int MutexCreate(key_t ipc_key)
+{
+ int sem_id;
+ if( (sem_id=semget(ipc_key,1,IPC_CREAT|0666))<0 ){ /* get sem ID */
+ perror("cannot create semaphore"); /* a sem_id <0 is an error */
+ printf("semid=%d",sem_id);
+ exit(1);
+ }
+ if ( (semctl(sem_id,0,SETVAL,semunion)) < 0 ) {
+ perror("cannot init semaphore"); /* <0 is an error */
+ printf("on semid=%d",sem_id);
+ exit(1);
+ }
+ return sem_id;
+}
+/*
+ * Find Mutex
+ * get the semaphore/mutex Id given the IPC key value
+ *
+ * Input: an IPC key value
+ */
+inline int MutexFind(key_t ipc_key)
+{
+ int sem_id;
+ if( (sem_id=semget(ipc_key,1,0))<0 ){ /* find sem .ID */
+ perror("cannot find semaphore");
+ exit(1);
+ }
+ return sem_id;
+}
+ \end{lstlisting}
+ \end{minipage}
+ \normalsize
+ \caption{Il codice delle funzioni che permettono di creare o recuperare
+ l'identificatore di un semaforo da utilizzare come \textit{mutex}.}
+ \label{fig:ipc_mutex_create}
+\end{figure}
+
+
+La prima funzione definita (\texttt{\small 8--22}) è \func{MutexCreate},
+anzitutto (\texttt{\small 11--15}) si chiama \func{semget} con
+\macro{IPC\_CREATE} per creare il semaforo qualora non esista, assegnandogli i
+privilegi di lettura e scrittura per l'utente. In caso di errore si
+scrive un errore e si esce.
+
+
+
+
+
+