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
La struttra posto l'ho definita cosi

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';
   }
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.