From: Simone Piccardi Date: Mon, 3 Feb 2003 18:07:38 +0000 (+0000) Subject: Programma per scrivere su una shared memory. X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=08e339a5f489c9401e931a214b37de26be6669a6;hp=750bf2482350e5770a47fbdd76b7eacb88d376ab Programma per scrivere su una shared memory. --- diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..4deb647 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Simone Piccardi diff --git a/README b/README index cdfa3ea..5fa758d 100644 --- a/README +++ b/README @@ -42,12 +42,15 @@ dvips gapil PDF pdflatex gapil -e pigiare invio agli avvertimenti sui colori. -(prima si devono aver generato le figure con make) +(prima si devono generare le figure con make) Attenzione: a partire da fine Ottobre 2002, per un motivo che non sono ancora riuscito a capire, viene generato un errore alla fine del file session.tex. Il codice e` corretto, cio` non ostante latex si ferma ed occorre farlo proseguire premendo invio. +NB per un presunto problema di licenza il pacchetto listings e` stato +rimosso da Debian. L'ultima versione dello stesso era stata +profondamente modificata e non funzionava. Pertanto non e` detto che +sia possibile "compilare" Gapil su una Sid. diff --git a/ipc.tex b/ipc.tex index 9207873..c2d3c21 100644 --- a/ipc.tex +++ b/ipc.tex @@ -3785,13 +3785,9 @@ una interfaccia completamente nuova, che tratteremo in questa sezione. 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 @@ -3799,19 +3795,29 @@ 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} @@ -3821,7 +3827,7 @@ Le code di messaggi non sono ancora supportate nel kernel ufficiale, esiste 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. @@ -3829,7 +3835,6 @@ comunicazione pu - \subsection{Semafori} \label{sec:ipc_posix_sem} @@ -3837,10 +3842,12 @@ Dei semafori POSIX esistono sostanzialmente due implementazioni; una 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. @@ -3874,6 +3881,11 @@ mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs \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" diff --git a/sources/WriteShm.c b/sources/WriteShm.c new file mode 100644 index 0000000..455f5cc --- /dev/null +++ b/sources/WriteShm.c @@ -0,0 +1,127 @@ +/* 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 +#include +#include /* directory */ +#include /* C standard library */ +#include +#include + +#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); +}