|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 15
|
[C]matrice statica,dinamica,memoria condivisa
Sistema Suse 9.2, linguaggio C , compilatore gcc.
Ho realizzato un sistema di prenotazione posti per una sala cinematografica, con un processo su una macchina server che gestisce la mappa dei posti. Ogni posto è caratterizzato da numero di fila, numero di poltrona e da un flag che indica se il posto è prenotato o meno. Il server accetta e processa sequenzialmente le richieste prenotazioni di posti da uno o piu' client che possono essere sulla stessa macchina o in remoto(quindi macchine diverse). Come struttura ho utilizzato una matrice statica [3][3] Con un unico client funziona tutto perfettamente , ma quando si connette un secondo client ,questo visualizza una matrice che nn tiene conto delle prenotazioni effettuate dal primo client, e la stessa cosa vale per il primo client. Quindi i vari client nn fanno riferimento alla stessa matrice ![]() All'inizio pensavo che dipendesse dalla posizione dell chiamata alla funzione inizializza(cinema) , ma quando il secondo client si connette questa nn dovrebe essere chiamata. Ecco il codice del main del server: Codice:
//main server int main(int argc,char *argv[]) { char scelta[1]; char out[MAX_DIM]; char buff[MAX_DIM]; int ds_sock,/*ds_sock_acc,*/ret,lenght; struct sockaddr_in server; struct sockaddr client; struct posto cinema[3][3]; // inizializza_cinema(cinema); // system("clear" ); //qui ho omesso il codice del socket x snellire la lettura del testo printf("in attesa di connessione da parte del client!!\n\n" ); // // while(1) { while((ds_sock_acc=accept(ds_sock,&client,&lenght)) ==-1); printf("client connesso!!\n\n" ); if (fork()==0) { close(ds_sock); do { strcpy(out," "); read(ds_sock_acc,buff,MAX_DIM); // scelta=buff; if ((strcmp(buff,"A")==0)||(strcmp(buff,"a") ==0)) { posti_vuoti(cinema); //printf("%s\n",buff); } else if ((strcmp(buff,"B")==0)||(strcmp(buff,"b") ==0)) { controllo_posto(cinema); } else if ((strcmp(buff,"C") ==0)||(strcmp(buff,"c") ==0)) { annulla_posto(cinema); } else if((strcmp(buff,"D") ==0)||(strcmp(buff,"d") ==0)) { strcpy(out,"fatto"); } }//relativa al do while (strcmp(out,"fatto") !=0); // write(ds_sock_acc,"\n\nArrivederci!!",20); close(ds_sock_acc); printf("Client disconnesso!!\n\n"); printf("\nIn attesa di connessione da nuovo client!!\n\n"); exit(0); }//della fork else close(ds_sock_acc); //è del fork==0 }//del while(1) }//del main struct posto { unsigned char idPosto[6]; int flag; }; la funzione inizializza_cinema Codice:
void inizializza_cinema(struct posto cine[3][3]) { unsigned char i,j,k; k='1'; for(i='A';i<='C';i++) { //printf("\n"); for(j='1';j<='3';j++) { cine[i-'A'][j-'1'].flag=0; cine[i-'A'][j-'1'].idPosto[0]=' '; cine[i-'A'][j-'1'].idPosto[1]=i; cine[i-'A'][j-'1'].idPosto[2]=j; cine[i-'A'][j-'1'].idPosto[3]=' '; cine[i-'A'][j-'1'].idPosto[4]='\t'; cine[i-'A'][j-'1'].idPosto[5]='\0'; } cine[i-'A'][2].idPosto[4]='\n'; } Spero che la discussione troppo lunga nn spaventi e che qualcuno riesca ad aiutarmi. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: $HOME
Messaggi: 1213
|
hai provato ad utilizzare un mutex per l'accesso al cinema?
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 15
|
il fatto è che la matirce è statica, x usare un mutex dovrei memorizzare la matrice statica su memoria condivisa, mumble...
![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Prescindendo dal codice che hai riportato (che non ho letto, so' troppo stanco...
![]() 1) usare la memoria condivisa tra processi concorrenti, e quindi prevedere dei meccanismi di sincronizzazione tra i vari processi (semafori); 1-bis) usare la memoria condivisa e rinunciare alla concorrenza dei processi (gestendo un client per volta per evitare l'onere della sincronizzazione); 2) fare uso di altri sistemi di IPC (ad es. scambio di messaggi), cosa che pero' introdurrebbe il problema della gestione della coerenza dei dati.
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto ![]() |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 15
|
[quote=Gica78R]Prescindendo dal codice che hai riportato (che non ho letto, so' troppo stanco...
![]() 1) usare la memoria condivisa tra processi concorrenti, e quindi prevedere dei meccanismi di sincronizzazione tra i vari processi (semafori); Ecco appunto usare la memoria condivisa con un semaforo mutex. Il server con il codice attuale accetta connessioni da piu' client contemporaneamnete (server concorrente) , e dovrebbe processare pero' le richieste di prenotazione sequenzialmente. Il fatto è che nn so bene come modificare il codice x memorizzare la matrice in memoria condivisa. LA posso lasciare statica?? Penso che nel codice main del server debba creare la porzione di memoria condivisa e il semaforo(e settarlo), poi associarla nel codice che genera il figlio e sempre qui mettere le chiamate che blocchino e sblocchino il semaforo. Dunque il problema rimane come spiattellare la matrice in memoria condivisa e poi passarla con la send o write ai client. Con il codice attuale la matrice ripeto è statica e una volta nizializzata le varie prenotazioni sono memorizzate in un vettore idposto[6] in modo da passarle con la send. la matrice l'ho definita cosi struct posto { unsigned char idPosto[6]; int flag; // indica con 0 posto libero, con 1 prenotato } struct posto cinema[3][3]; ad ogni elemento della matrice è assegnato un vettore idPosto e un flag Nel vettore quindi è memorizzato ad esempio (spazio vuoto) 'A' 1' (spazio vuoto) (il tabulatore'\') '\0' vale x i posti liberi '[' 'A' '1' ']' '\' '0' vale x posto prenotato chiuso tra parentesi Ultima modifica di viridovix1 : 18-08-2005 alle 10:58. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Per i semafori guarda qui: http://www.lilik.it/~mirko/gapil/gap...8-24500012.2.5
mentre per la memoria condivisa, qui: http://www.lilik.it/~mirko/gapil/gap...6-24600012.2.6 Sono link alla versione on-line di GaPiL, puoi scaricare anche la versione pdf; e' molto ben fatta ![]() Ciao
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto ![]() |
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 15
|
TI ringrazio
![]() ![]() |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
![]() Dipende per caso dalla zona di memoria in cui e' allocata? Cioe' nello heap e non nello stack? Sinceramente non ho idea di dove venga allocato lo spazio per la memoria condivisa...
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto ![]() |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Dec 1999
Città: Roma
Messaggi: 143
|
Quote:
Per curiosità, non è che a settembre dovrai affrontare un certo professor Quaglia? ![]() BYeZzzZ
__________________
"Il piacere non è peccato se goduto con moderazione" Lorenzo Valla - "Masturbarsi fa male alla memoria e a tante altre cose che ora non ricordo" |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
![]() ![]()
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto ![]() |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Dec 1999
Città: Roma
Messaggi: 143
|
Quote:
Migrando migrando ![]() Comunque è un bravo ragazzo. Un po flashato, ma gli ammmmmmolla ![]() BBella ingegnè! Byezzz ![]()
__________________
"Il piacere non è peccato se goduto con moderazione" Lorenzo Valla - "Masturbarsi fa male alla memoria e a tante altre cose che ora non ricordo" |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
![]() ![]()
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto ![]() |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Per matrice statica, e in generale per dati statici, nel gergo s'intende non allocata dinamicamente: la struttura è "allocata" tutta in una volta in fase di caricamento dell'eseguibile.
Comunque la soluzione al problema secondo me è di definire una macchina che faccia da server, e che quindi memorizzi i dati in qualche modo, in modo che tutte le richieste di accesso ai dati vengano "centralizzate" (tramite delle API opportunamente definite). Un'altra soluzione potrebbe essere quella di mettere su un server database condiviso da tutti i client. Quindi non esistono server, e tutte le applicazioni sono dei client. Il problema, in questo caso, è garantire la coerenza per quanto riguarda l'assegnazione dei posti, in modo da garantire che lo stesso posto venga prenotato da più persone. La soluzione al problema è quella di usare un database che consenta di effettuare delle transazioni. Una transazione è una sequenza di operazioni (su un database in genere) che, una volta "chiusa", garantisce l'esecuzione di TUTTE le operazioni o di NESSUNA. Mio consiglio personale è quello di usare un database come FireBird (open source / aggratis ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:05.