PDA

Visualizza la versione completa : [C] comunicazione half/duplex tra processi tramite due fifo


anearion
26-08-2011, 14:57
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:


#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:


#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 )

Loading