salve! ho un problema che mi stà facendo impazzire!!! allora... stò realizzando una comunicazione tra un client e un server in C. ho impostato in questo modo :

SERVER crea la fifo e la apre in lettura, aspettando una connessione in scrittra da parte del client.
CLIENT crea la fifo e apre in scrittura la fifo del server
CLIENT invia un messaggio per convalidare la connessione
CLIENT lo apro in lettura e aspetto la risposta del server
SERVER legge, apre la fifo del client in scrittura (grazie al pid che gli mando tramite messaggio) e manda la risposta al client
CLIENT legge la risposta

poi da quì invio e mando i vari mess. nel codice seguente ho schematizzato tutte le mie funzioni (per esempio la connect l'ho tolta per semplificare! risponde semplicemente con quello che gli scivo).

client.c :

// Creo la fifo del client
if(mkfifo(pid,O_CREAT|perm)<0){
printf("\tErrore nella creazione del canale di comunicazione:\n");
perror("\t\tERRORE"); // La fifo ritorna 0 in caso di corretta inizzializzazione, -1 in caso contrario
exit(1); // Se -1 stampo l'errore e esco dal programma.
}

// Apro la fifo del server in scrittura
if((sscrittura = open(argv[1],O_WRONLY|O_NONBLOCK))<0){
printf("\tErrore nell'apertura del canale di comunicazione in scrittura\n");
perror("\t\tERRORE"); // La fifo ritorna 0 se corretta, -1 in caso contrario.
exit(1); // Se -1 stampo l'errore e esco dal programma.
}

// invio messaggio di connessione
strcpy(messaggio,"");
strcat(messaggio, pid);
strcat(messaggio, "+");
strcat(messaggio, "connect");
write(sscrittura, messaggio, sizeof(messaggio));

// Apro la fifo del client in lettura
if((clettura = open(pid,O_RDONLY))<0){
printf("\tErrore nell'apertura del canale di comunicazione in lettura\n");
perror("\t\tERRORE"); // La fifo ritorna 0 se corretta, -1 in caso contrario.
exit(1); // Se -1 stampo l'errore e esco dal programma.
}

// aspetto la risposta
nread=read(clettura,risposta,sizeof(risposta));

if(nread>-1){
printf("\nConnessione avvenuta con successo...\n");
printf("%s", risposta);
}

while(1) {
printf("--> ");
scanf("%s", search);
if (strcmp(search, "0")!=0) {
strcpy(messaggio, "");
strcat(messaggio, pid);
strcat(messaggio, "+");
strcat(messaggio, search);
write(sscrittura, messaggio, sizeof(messaggio));

nread=read(clettura,risposta,sizeof(risposta));
printf("RISPOSTA : %s\n\n", risposta);
}

// esco dal client
else {
// elimino la fifo
unlink(pid);

//close(sscrittura);
//close(clettura);
return 0;
}
}

return 0;
}

************************************************** *****

server.c :

// Creo la fifo da utilizzare come canale di comunicazione con i vari client.
if(mkfifo(argv[1],O_CREAT|perm)<0){
printf("\tErrore nella creazione del canale di comunicazione:\n");
perror("\t\tERRORE"); // La fifo ritorna 0 in caso di corretta inizzializzazione, -1 in caso contrario
exit(1); // Se -1 stampo l'errore e esco dal programma.
}

// Duplico il processo con una fork
pid = fork();

// Questo è il processo figlio della prima fork e svoglie l'azione del server
if(pid == 0){
int nread;

if((slettura = open(argv[1],O_RDONLY))<0){
printf("\tErrore nell'apertura del canale di comunicazione in lettura.\n");
perror("\t\tERRORE"); // La fifo ritorna 0 se corretta, -1 in caso contrario.
exit(1); // Se -1 stampo l'errore e esco dal programma.
}

// Inizio un ciclio while che resta in attesa di un messaggio scritto sulla fifo
while(1){
printf("attendo\n\n");
// Attendo che il messaggio venga scritto sulla fifo
nread=read(slettura,messaggio,sizeof(messaggio));
// Se viene scritto qualche cosa sulla fifo la processo
if (nread>-1) {
// decripto il messaggio
decriptamessaggio(messaggio,comandoclient);

attiva=1;
// creo un altro processo thread che permette al server di continuare a leggere sulla fifo mentre questo processo elabora la richiesta arrivata dal client
thread = fork();

// Processo figlio della seconda fork
if(thread == 0){
//se sono nel figlio faccio questo
// faccio una terza fork in modo che il processo padre ritorni subito senza tempi di
// attesa lasciando orfano il processo figlio che verra adottato da init svolgerà
// l'azione richiesta dal client e poi uscirà, evitando così che si creino processi
//zombie
app=fork();
// processo padre terza fork esce subito
if(app>0){
exit(0);
}
// Processo figlio della terza fork compie l'azione richiesta dal client
else {
// Apro la fifo del client in scrittura
if((cscrittura = open(comandoclient[0],O_WRONLY))<0){
printf("\tErrore nell'apertura del canale di comunicazione in scrittura\n");
perror("\t\tERRORE"); // La fifo ritorna 0 se corretta, -1 in caso contrario.
exit(1); // Se -1 stampo l'errore e esco dal programma.
}

if(attiva==1) {
// creo un headle per il database
//che la passerò ad ogni richiesta/azione sulle varie funzioni
printf("sono dentro\n");
strcpy(risposta, "");
strcat(risposta, comandoclient[1]);
write(cscrittura, risposta, sizeof(risposta));
exit(0);
} else{
strcpy(risposta,"");
strcat(risposta, "server inattivo");
write(cscrittura, risposta, sizeof(risposta));
exit(0);
}
}
}
// Processo padre della seconda fork ritorna subito perchè aspetta la fine del processo
// padre della terza fork che esce subito
else{//altrimenti se sono il padre faccio questo
wait(0); // Attende che il figlio esca
}
}
}
}

ora lasciando perdere le varie fork() (che faccio per uccidere il padre che genera il figlio che esegue il thread, in modo da farlo ereditare da init e non avere zombie)... l'output è più o meno il seguente :

CLIENT invio ciao RISPOSTA ciao
SERVER ricevo MES32164+ciao sono dentro
attendo

ora fin quì posso andare avanti finchè voglio (collegarmi con altri client, ecc ecc). non appena però chiudo l'ultima connessione rimasta...il server crash...non sò perchè! è come se il client dopo l'ultimo unlink inviasse qualcosa al server, che non riesce a interpretare, e che continua a leggere, stampandomi all'infinito "Errore nell'apertura del canale di comunicazione in scrittura .ERRORE: No such file or directory". perchè succede questo? vorrei propio capirlo...mi stà tormentando questo problema!

vi prego, help me \o