Ciao a tutti, devo creare un programma per la gestione di diversi client. Questo server deve prendere dei comandi e restituire delle risposte e deve supportare la connessione di diversi client contemporaneamente.

Ora, ho capito abbastanza bene come funzionano le wk-fifo singole, nel senso che i client scrivono al server e il server legge ciò che viene scritto sulle fifo, ma a me serve che i client scrivano, il serve legga, risponda su una seconda fifo e i client leggano da quest'ultima il risultato.

Vorrei passarvi del codice ma il discorso è talmente ampio che rischio solo di confondervi le idee con degli esempi particolari, magari con errori che non c'entrano niente.

Provo giusto a farvi vedere cosa ho capito fin'ora,
questo è il server:

codice:
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>

void disconnetti_pipe() {
   printf("Server fermato. Rimozione FIFO dal sistema....");
   unlink("comandi");
   exit(0);
}
int main(int argc, char *argv[]){
  int pid, fd, lettura, scrittura;
  char r[20];

  signal(SIGTERM, disconnetti_pipe);
  signal(SIGHUP, disconnetti_pipe);
  signal(SIGINT, disconnetti_pipe);
  lettura = mkfifo("comandi", 0777);
  //scrittura = mkfifo("risposte", 0777);
  if ( lettura == -1 ) {
     printf("Errore nella creazione della FIFO lato server\n");
     exit(1);
  }

  
  fd = open("comandi",O_RDONLY);
  //fd[1] = open("risposte", O_RDWR);
  while(1) {
     if ((lettura = read(fd, &r, sizeof(r))) != 0) {
       pid = fork();
       if (pid==0) {
         printf("Richiesta di esecuzione di: %s\n", r);
         sleep(1);
         execlp(r, r, (char *)0);
       }
     }
  }
}
mentre questo è il client:

codice:
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>

void esci() {
   printf("Il server non è in ascolto, uscita dal sistema...");
   exit(0);
}
int main(int argc, char *argv[]) {
  int fd, esito, risposta; char r[20];
  signal(SIGPIPE, esci);

   printf("Inserisci il comando da eseguire: ");
  scanf("%s", r);
  fd = open("comandi", O_WRONLY);
  //fd[1] = open("risposte", O_RDWR);
  if ( fd == -1 ) {
     printf("\n Servizio non disponibile \n");
     exit(1);
  }
esito = write(fd, &r, sizeof(r));
  esito = close(fd);
  exit(0);
}

Ora le parti commentate sono quelle relative all'uso di una seconda fifo per la comunicazione server->client, ovviamente manca la parte relativa alla fwrite/fread perchè mi produce proprio errori in compilazione, mentre cosi il codice funziona bene.

Grazie mille in anticipo =)


(Andbin spero che non stai in vacanza :P )