PDA

Visualizza la versione completa : [C] named pipe


rufuss
17-06-2010, 18:53
ciao a tutti ! :)
Non capisco l'output del mio codice:

SERVER.C

main ()
{
// CREO E APRO LE FIFO
int fdf;
mkfifo ("./fifo",0644); // creo la fifo per leggere richieste del client
fdf = open ("./fifo",O_RDONLY); /* apre in sola lettura bloccante */
char richiesta[15];

while (1)
{
read (fdf, richiesta, 15);
printf ("%s\n", richiesta);
}
}



CLIENT.C

main ()
{
int fdf;
fdf = open ("./fifo",O_WRONLY); /* apre in sola scrittura bloccante */
char s[15] = {"ciaoooooooooooo"};
write (fdf, s, 15);
}



faccio partire il server e rimane in attesa sulla open .....
faccio partire il client che scrive sulla pipe....

mi aspetto che il server stampi quello che ha spedito e che poi si rimette in attesa sulla read
invece mi stampa all'infinito "ciaooooo"

perche'? :master:

oregon
17-06-2010, 19:02
read

RETURN VALUES
If successful, these functions return a non-negative integer that indicates the number of bytes read. The number of bytes read may be less than the number of bytes requested in any of the following conditions:

. The number of bytes left in the file is less than the requested length.
. The read() was interrupted by a signal.
. The file is a pipe or FIFO or special device and has fewer bytes than requested immediately available for reading.

On error, these functions return -1

rufuss
17-06-2010, 19:19
nel mio caso la read ritorna con successo .....ma si dovrebbe bloccare fin quando non lancio un'altra vota il client .... giusto?

oregon
17-06-2010, 19:23
Originariamente inviato da rufuss
nel mio caso la read ritorna con successo .....

E come fai a saperlo? Nel tuo codice NON controlli cosa ritorna la read ... quindi ? :confused:

YuYevon
17-06-2010, 19:26
Stampa il valore di ritorno della read() ad ogni iterazione e chiediti *perché* restituisce proprio quel valore, chiaramente dopo aver letto la documentazione relativa alla funzione.

rufuss
17-06-2010, 19:28
ok adesso verifico....ma se stampa quello che il client mi ha mandato deduco che la read ha letto con successo.... :master:

oregon
17-06-2010, 19:39
Originariamente inviato da rufuss
ok adesso verifico....ma se stampa quello che il client mi ha mandato deduco che la read ha letto con successo.... :master:

Non dedurre ma segui la documentazione ... se la funzione ti restituisce un codice d'errore, quello che ottieni non è comunque valido, qualunque cosa sia ...

rufuss
17-06-2010, 20:15
ho cambiato il while:

while (1)
{

if (read (fdf, richiesta, 15) > 0)
printf ("%s\n", richiesta);
else
if (read (fdf, richiesta, 15) == -1)
printf ("\n Errore \n");
}

e cosi' mi funziona...mi stampa "ciaoooo" ogni volta che lancio il client....

ma non capisco perche' prima stampava all'infinito .... se non controllo mi fa i scherzi se controllo si mette paura? :confused:

oregon
17-06-2010, 20:28
Originariamente inviato da rufuss
ma non capisco perche' prima stampava all'infinito .... se non controllo mi fa i scherzi se controllo si mette paura? :confused:

Non hai letto/compreso la documentazione ... né quello che ti ho scritto poco fa ...

E comunque, la read va chiamata una sola volta, non due ...

rufuss
17-06-2010, 20:37
1)non capisco questo punto... The file is a pipe or FIFO or special device and has fewer bytes than requested immediately available for reading. sapresti aiutarmi ..il mio inglese e' un po carente :(

2) prima ritornava sempre 0

:master:

Loading