In Linux non tutti gli oggetti del POSIX IPC sono pienamente supportati nel
kernel ufficiale; solo la memoria condivisa è presente con l'interfaccia
completa, ma solo a partire dal kernel 2.4.x, i semafori sono forniti dalle
-\acr{glibc} nella sezione che implementa i thread POSIX, e sono utilizzabili
-solo all'interno dei thread generati dallo stesso processo,\footnote{sono cioè
- oggetti che non possono, al contrario dei semafori del SysV IPC, essere
- utilizzati per sincronizzare processi diversi.} le code di messaggi non
-hanno alcun tipo di supporto ufficiale. Esistono tuttavia dei patch e delle
-librerie aggiuntive che supportano alcune di queste interfacce, anche se
-sperimentali e di uso limitato.
+\acr{glibc} nella sezione che implementa i thread POSIX, le code di messaggi
+non hanno alcun tipo di supporto ufficiale. Per queste ultime esistono
+tuttavia dei patch e una libreria aggiuntiva.
La caratteristica fondamentale dell'interfaccia POSIX è l'abbandono dell'uso
degli identificatori e delle chiavi visti nel SysV IPC, per passare ai
equivalenti ai nomi dei file. Tutte le funzioni che creano un oggetto di IPC
Posix prendono come primo argomento una stringa che indica uno di questi nomi;
lo standard è molto generico riguardo l'implementazione, ed i nomi stessi
-possono avere o meno una corrispondenza sul filesystem.
-
-
- le caratteristiche di questi nomi,
-per i quali richiede che:
+possono avere o meno una corrispondenza sul filesystem; tutto quello che è
+richiesto è che:
\begin{itemize}
-\item debbano essere conformi alle regole che caratterizzano i
+\item i nomi devono essere conformi alle regole che caratterizzano i
\textit{pathname}, in particolare non essere più lunghi di \const{PATH\_MAX}
byte e terminati da un carattere nullo.
-\item se il nome inizia per una \texttt{/}
+\item se il nome inizia per una \texttt{/} chiamate differenti allo stesso
+ nome fanno riferimento allo stesso oggetto, altrimenti l'interpretazione del
+ nome dipende dall'implementazione.
+\item l'interpretazione di ulteriori \texttt{/} presenti nel nome dipende
+ dall'implementazione.
\end{itemize}
-
+Il comportamento delle funzioni è pertanto subordinato in maniera quasi
+completa alla relativa implementazione.\footnote{tanto che Stevens in
+ \cite{UNP2} cita questo caso come un esempio della maniera standard per
+ consentire soluzioni non standard.} Nel caso di Linux per quanto riguarda la
+memoria condivisa, tutto viene creato nella directory \file{/dev/shm}, ed i
+nomi sono presi come pathname assoluto (comprendente eventuali sottodirectory)
+rispetto a questa radice (per maggiori dettagli si veda quanto illustrato in
+\secref{sec:ipc_posix_shm}). Lo stesso accade per l'implementazione
+sperimentale delle code di messaggi, che però fa riferimento alla directory
+\file{/dev/mqueue}.
\subsection{Code di messaggi}
però una implementazione sperimentale di Michal Wronski e Krzysztof
Benedyczak,\footnote{i patch al kernel e la relativa libreria possono essere
trovati \href{http://www.mat.uni.torun.pl/~wrona/posix_ipc}
- {http://www.mat.uni.torun.pl/\~wrona/posix_ipc}.}. In generale, come le
+ {http://www.mat.uni.torun.pl/\~{}wrona/posix\_ipc}.}. In generale, come le
corrispettive del SysV IPC, sono poco usate, dato che i socket\index{socket},
nei casi in cui sono sufficienti, sono più comodi, e negli altri casi la
comunicazione può essere gestita direttamente con mutex e memoria condivisa.
-
\subsection{Semafori}
\label{sec:ipc_posix_sem}
livello di libreria ed è fornita dalla libreria dei thread; questa però li
implementa solo a livello di thread e non di processi.\footnote{questo
significa che i semafori sono visibili solo all'interno dei thread creati da
- un sngolo processo.} Esiste un'altra versione, realizzata da Konstantin
-Knizhnik, che reimplementa l'interfaccia POSIX usando i semafori di SysV IPC,
-e che non vale comunque la pena di usare visto che i problemi sottolineati in
-\secref{sec:ipc_sysv_sem} restano invariati.
+ un singolo processo, e non possono essere usati come meccanismo di
+ sincronizzazione fra processi diversi.} Esiste però anche una libreria
+realizzata da Konstantin Knizhnik, che reimplementa l'interfaccia POSIX usando
+i semafori di SysV IPC, e che non vale comunque la pena di usare visto che i
+problemi sottolineati in \secref{sec:ipc_sysv_sem} rimangono, anche se
+mascherati.
\end{verbatim}
+ la memoria
+condivisa è trattata come un filesystem separato, con tutte le caratteristiche
+di un qualunque filesystem,
+
+
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
--- /dev/null
+/* WriteShm.c
+ *
+ * Copyright (C) 2002 Simone Piccardi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*****************************************************************************
+ *
+ * File WriteShm.c:
+ *
+ * An example of POSIX shared memory use: wwrite some content to a
+ * shared memory segment
+ *
+ * Author: S. Piccardi Jan. 2003
+ *
+ * $Id: WriteShm.c,v 1.1 2003/02/03 18:07:38 piccardi Exp $
+ *
+ *****************************************************************************/
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h> /* directory */
+#include <stdlib.h> /* C standard library */
+#include <unistd.h>
+#include <stdio.h>
+
+#include "Gapil.h"
+#include "macros.h"
+
+/* Help printing routine */
+void usage(void);
+
+int main(int argc, char *argv[])
+{
+ int i;
+ int size = 4096;
+ char * file_name = NULL;
+ int fd = 0;
+ int mutex;
+ char * mutex_file;
+ void * shm_ptr;
+ /*
+ * Input section: decode command line parameters
+ * Use getopt function
+ */
+ opterr = 0; /* don't want writing to stderr */
+ while ( (i = getopt(argc, argv, "hs:f:")) != -1) {
+ switch (i) {
+ /*
+ * Handling options
+ */
+ case 's': /* set pause (in sec.) */
+ size = strtol(optarg, NULL, 10);
+ break;
+ case 'f': /* set pause (in sec.) */
+ file_name = optarg;
+ break;
+ case 'h': /* help option */
+ printf("Wrong -h option use\n");
+ usage();
+ return -1;
+ break;
+ case '?': /* unrecognized options */
+ printf("Unrecognized options -%c\n",optopt);
+ usage();
+ default: /* should not reached */
+ usage();
+ }
+ }
+ /* ***********************************************************
+ *
+ * Options processing completed
+ *
+ * Main code beginning
+ *
+ * ***********************************************************/
+ if ((argc - optind) != 1) { /* There must be remaing parameters */
+ printf("Wrong number of arguments %d\n", argc - optind);
+ usage();
+ }
+ mutex_file = tempnam("/tmp","mutex");
+ if ((mutex = CreateMutex(mutex_file)) == -1) { /* get a Mutex */
+ perror("Cannot create mutex");
+ goto errmutex;
+ }
+ /* main loop */
+ shm_ptr = CreateShm(argv[1], size, 0644, 0);
+ if (shm_ptr == NULL) {
+ perror("Error creating shared memory");
+ goto errshared;
+ }
+ if (file_name) {
+ fd = open(file_name, O_RDONLY);
+ }
+ FullRead(fd, shm_ptr, size);
+// RemoveShm(argv[1]);
+ RemoveMutex(mutex_file);
+ exit(0);
+ errshared:
+ RemoveShm(argv[1]);
+ RemoveMutex(mutex_file);
+ errmutex:
+ exit(1);
+}
+/*
+ * routine to print usage info and exit
+ */
+void usage(void) {
+ printf("Program myls: list file in a directory \n");
+ printf("Usage:\n");
+ printf(" WriteShm [-h] [-s size] [-f file] name \n");
+ printf(" -h print this help\n");
+ printf(" -s size size of segment \n");
+ printf(" -f file filename to read contents \n");
+ exit(1);
+}