Ciao ragazzi.
Io ho un problema col mio Server-Client.
Quello che sto cercando di fare è un client che genera un certo numero di interi, li passa al server con una pipe, il server ne fa il quadrato e li ripassa nuovamente al client. A questo punto il client li stampa
Quello che non riesco a fare, è far terminare correttamente il server. Io mi aspetterei che quando il clien ha finito, la sua read inizi a dare errore, ma non mi viene mai stampato il messaggio di errore che ho associato a questa eventualità.
Lasciate stare il fatto che uno una named pipe e contemporaneamente i threads, sto solo decomponendo un altro problema più complesso, per non correre troppo!
Qui c'è il codice:


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
#include<fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#define N 4

int main(void){
int n=10;
int pfd,pfd1,pid,l,w,w1,l1;
int * buf=malloc(sizeof(int));
int *buf1=malloc(sizeof(int));
int *ris1=malloc(sizeof(int));

if ((mkfifo("serverreq",0664) == -1)
&& errno!=EEXIST) {printf("E' fallita la creazione pipe server\n");}
if (chmod("serverreq",0664) == -1) {printf("E' fallita l'impostazione dei diritti pipe server");}
/* apertura in lettura e scrittura */

if ((mkfifo("clientreq",0664) == -1)
&& errno!=EEXIST) {printf("E' fallita la creazione pipe client\n");}
if (chmod("clientreq",0664) == -1) {printf("E' fallita l'impostazione dei diritti pipe client");}

if ( (pid=fork())== -1 ) {/* errore */}
if ( pid ) { /* siamo nel padre */



printf("Padre");
if ((pfd=open("serverreq",O_RDONLY)) == -1)
{printf("E' fallita l'apertura pipe server");
return(-1);}

/* uso pipe: la read è bloccante anche senza
client*/

if ((pfd1=open("clientreq",O_WRONLY)) == -1)
{printf("E' fallita l'apertura pipe client");
return(-1);}

while (1) {printf("Padre");
if ( (l=read(pfd,buf,N)) == -1)
printf("Non c'è niente da leggere\n");
else{
printf("Server: ricevuto il valore %d\n",*buf);
printf("Server: Moltiplicazione\n");
*buf=(*buf)*(*buf);
printf("Server: Si sta per scrivere il valore %d\n",*buf);
while ((w=write(pfd1,buf,N))==-1) {}
printf("Server: Scritto il valore %d\n",*buf);

}
}


if (pfd=close(pfd) == -1)
{ printf("Chiusura non avvenuta correttamente\n");}
printf("Server: chiusura avvenuta correttamente\n");

if ( ( waitpid(pid,NULL,0) ) == -1) printf("Non termina\n");

}
else{printf("Figlio\n");

if ((pfd=open("serverreq",O_WRONLY)) == -1)
{printf("E' fallita l'apertura pipe server");
return(-1);}

if ((pfd1=open("clientreq",O_RDONLY)) == -1)
{printf("E' fallita l'apertura pipe client");
return(-1);}



while(n>0){printf("Size of int è %d \n",sizeof(int));

*buf1=rand()%100;
/* printf("Valore creato %d\n",*buf1);*/

if ((w1=write(pfd,buf1,N))==-1) {}

else {
printf("Client: Valore creato %d\n",*buf1);
printf("Client: Write client riuscita\n");
n--;
while((l1=read(pfd1,ris1,N))==-1) {}
printf("Client: Il valore del quadrato è: %d\n\n",*ris1);
}
}
close(pfd);
close(pfd1);
printf("Figlio: n adesso vale %d\n",n);
pthread_exit((void *) 17);
}

return(0);
}