From: Simone Piccardi Date: Wed, 20 Nov 2002 00:43:56 +0000 (+0000) Subject: Funzione di creazione e ricerca del mutex X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=4ddd2ee63965e5eb0f723da634d157447f3e4ceb Funzione di creazione e ricerca del mutex --- diff --git a/ipc.tex b/ipc.tex index 9b04f51..1060b49 100644 --- a/ipc.tex +++ b/ipc.tex @@ -2440,7 +2440,87 @@ ignorare silenziosamente le altre; questo per 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. + + + + + +