Questo e' il loop principale del server..

codice:
while (TRUE)
    {

      /* leggo dalla pipe con id fifo aperta in precedenza*/
      while((letto = read(fifo,msg,MAXDIM)) > 0)
        {

          printf("RICEZIONE --> %s\n",msg);
          if(strstr(msg,"CONNECT")!= NULL)
            {
              if((sscanf(msg,"%d CONNECT %s",&p,&nome_u))== 2)
                {

                  if(chdir("..")== -1)
                    {
                      perror("Nella chdir");
                      exit(errno);
                    }

                  /* apro la pipe serverclientPID per spedire la risposta positiva al client */
                  sprintf(serverclient,"serverclient%d%c",p,SZ);
                  fifo_client = apri_pipe(serverclient,O_RDWR);


                  /* mi risposto dentro nmat_data */
                  if(chdir("./nmat_data")== -1)
                    {
                      perror("Nella chdir");
                      exit(errno);
                    }


                  /* controlla che l'utente che ha fatto richiesta di connessione non sia gia' connesso */
                  if((autorizzazione(&nome_u,users_list)== 0)||(controllo_accessi(&nome_u) == 0))
                    {
                      /* connessione non accettata */
                      fprintf(stderr,"Impossibile connettersi.\n** Utente non riconosciuto oppure gia' connesso **\n");
                      sprintf(ok,"%d KO%c",getpid(),SZ);
                      write(fifo_client,&ok,30);
                      /* se non ci sono gia' mi sposto nella directory principale */
                      if(chdir("..")== -1)
                        {
                          perror("Nella chdir");
                          exit(errno);
                        }

                      fclose(users_list);
                      close(fifo);
                      close(fifo_client);
                      unlink("clientserver");


                      exit(-1);
                    }
                }

            }


          /* connessione accettata */



          /* mi sposto nella directory principale */
          if(chdir("..")== -1)
            {
              perror("Nella chdir");
              exit(errno);
            }

          /* mando la risposta di ok al client per avvertire dell'avvenuta connessione */
          sprintf(ok,"%d OK%c",getpid(),SZ);
          write(fifo_client,&ok,30);
          printf("OK:: %s\n",ok);

          if((pid = fork()) == -1)
            {
              perror("Nella fork()\n");
              exit(errno);
            }

          else if (pid == 0)
            {

              /* creazione della pipe clientserverpid */
              sprintf(clientserver,"clientserver%d%c",p,SZ);
              crea_pipe(clientserver);

              /* apertura della pipe clientserverpid */
              fifo_fi = apri_pipe(clientserver,O_RDONLY);


              /* leggo dalla pipe il messaggio in arrivo */
              while((letto = read(fifo_fi,&cosafare,MAXDIM)) > 0)
                {
                  cosafare[letto] = SZ;

            /* codice identifica un'operazione. A seconda del numero eseguo diversi comandi. 
               Ometto il tutto, ho gia' testato che non ha niente a che vedere col problema... */


                  codice = estrai_codice(cosafare);

                  if(codice == 1)
                    {

                    }

                  if (codice == 2)
                    {

                    }

                  if (codice == 3)
                    {

                    }

                  if (codice == 4)
                    {

                    }

                  if (codice == 6)
                    {

                    }
                }

            }
          else
            {
              waitpid(pid,&status,0);
              if (WIFEXITED(status))
                printf("Utente %s terminato:: %d\n",&nome_u,WEXITSTATUS(status));
            }
        }

      /* break;*/

      /* FINE WHILE */
    }