Newsgroup: it.comp.lang.c
Titolo: [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:
[CODE]
//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
[/CODE]
La struttra posto l'ho definita cosi
struct posto
{
  unsigned char idPosto[6];
  int flag;
};
la funzione inizializza_cinema
[CODE]
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';
   }
[/CODE]
Non ben chiaro come procedere per risolvere. Se usare una matrice
dinamica (ho il problema che la matrice l'ho dichiarata di tipo posto),
memoria condivisa o tutte e due.
Spero che la discussione troppo lunga nn spaventi e che qualcuno riesca
ad aiutarmi.

 ha scritto nel messaggio
news:1124199867....@z14g2000cwz.googlegroups.com...

Non riesco a trovare nel codice la parte in cui vengono assegnati i flag che
indicano l'avvenuta prenotazione: forse non hai postato la relativa
funzione?
MSL

memoria condivisa + semafori per la zona critica

ad aiutarmi.
HTH
Andrea

boh avevo postato una risposta ma nn è apparsa,spero questa nn risulti
un doppione.
Intanto ringrazio tutti x aver risposto chi in modo conciso ma efficace
chi in modo lungo e esauriente :)
Per rispondere a Msl questa è la funzione x assegnare i posti,
[code]
//assegna il posto alla persona
//
void assegna_posto(struct posto cine[3][3],unsigned char x,unsigned
char y)
{
  send(ds_sock_acc,"\nIl posto è vuoto lo riserviamo a voi!!\n",50,0);
  cine[x-'A'][y-'1'].flag=1;
};
//
[/code]
Dunque vorrei utilzzare memoria condivisa e semafori, pero' ho delle
grosse incertezze su come cambiare il codice.
Io volevo fare in modo che il server accogliesse le richieste di piu'
client(nel codice attuale è presente anche la chiamata listen che
pensavo lasciasse le connessioni pendenti) e poi sequenzialmente ne
processasse le  richieste di prenotazione.
Posso lasciare la struttura dell matrice statica ???
E per quanto riguarda il server lo posso lasciare concorrente ,(dopo
aver letto quanto riportato da Andrea ho dubbi ,ma utilizzando memoria
condivisa ciauscun figlio utilizzerebbe la stessa porzione di memoria
?! )
Comunque effettivamente per ora nn so come muovermi e cambiare il
codice :(
Spero in un ulteriore vostro aiuto!! :)
tipo posso lasciare immutata la struttura della matrice,

usando un semaforo mutex penso di aver ottenuto u ndiscreto successo,
ora tutti i processi si connettono, ma solo il primo nn va in sleep.
(anche se poi gli altri nn seguono l'ordine di connessione strano,
intendo che nn appena il primo processo si disconnette un altro prende
i lsuo posto ma nn è il secondo che si è connesso , ma magati il
terzo o quarto).
Per saggiare l'uso della memoria condivisa  ho realizzato un semplice
proramma(client/server concorrente) x l'invio di stringhe da client  a
server.
Tuttavia mi rimane il problema di come mettere la matrice che ho creato
in maniera statica, nella memoria condivisa, in modo che le modifiche
siano visibili a tutti i processi figli.
Ci sarà un modo x memorizzarla in memoria condivisa ed accedere cmq
agli elementi usando poi gli indici?!