Newsgroup: it.comp.os.linux.development
Titolo: [C] determinare EOF

 
          Salve,
un problemino facile facile
Apro un file (editato con vi, di poche parole) --> filedes =
open(path,...,....)
Leggo 1024byte--> read(filedes,buff,1024);
invio il buffer a un altro processo: B write(socket,buff,strlen(buff));
In B: dopo aver letto dalla socket, volgio determinare se nel buffer "buff"
appena ricevuto c'è l'EOF e quindi stampare un messaggio
ho implementato questa soluzione, ma non funziona:
for(i=0;i<1024;i++)
    if(buff[i] == EOF)
        printf("FINE FILE);
ovvero non stampa niente.
Come posso accorgermi della fine del file??
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 
Nella stringa che leggi con read() e che poi passi a write(B) non c'è
nessun carattere di controllo che ti possa far capire che hai raggiunto
l'eof. 
Io farei così: dopo la chiamata a read() testerei il descrittore con
	if( feof(filedes)) ..
e se è stato raggiunto l'eof invierei a write un valore predefinito per
fare capire a B l'accaduto. Puoi inviare proprio EOF come carattere, però
attento che, siccome hai definito buff come char* (e non come int) è
possibile che nel file sia presente un byte che abbia lo stesso valore
della costante EOF.
Saluti
Matic

 Come posso accorgermi della fine del file??
Non esiste un carattere EOF nell'IPC via socket; infatti il socket
rimane aperto, e puo' inviarti ancora records.  Sta a te scegliere un
opportuno carattere (o sequenza di piu' caratteri) da usare come
sentinella.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 valore della costante EOF.
Per definizione EOF e' differente da qualsiasi carattere possa essere
rappresentato in un char (cfr. K&R pag. 16).



 


 	if( feof(filedes)) ..
Ciao a tutti,
 c´e´ un problema in entrambi i post.
Matic, feof funziona con le stream, non con i file descriptor!
Joiko, perche´usi strlen? Chi ti assicura che dopo i caratteri letti dal 
file ci sia un carattere nullo? Devi usare il codice di ritorno della read 
...
La soluzione, in lineam di massima e´ questa: chi legge il file controlla 
se e´ finito (feof se usi stringhe, codice di ritorno e errno se usi file 
descriptor) e poi notifica al processo B che il file e´ finito, seguendo 
un protocollo che tocca a te definire (perche´non un segnale?).
Spero di esservi stato d´aiuto!
 Ciao
 Federico

 sentinella.
Il carattere non c'e` manco sui file normali, in unix. Se usi fread (e le
funzioni dei file ANSI C) allora puoi usare feof. Ma l'esempio parlava di
una read. 
Su unix ti accorgi che sei arrivato in fondo al file perche' una read ti
restituisce zero come numero di byte letti (che si badi bene *non* e` un
errore). Questo vale per i file, per i socket la cosa e` analoga, ma
leggermente diversa perche' in tal caso la read e` bloccante (per i file
normali non lo e` mai).
Pertanto per i socket non si ottiene uno zero per una read fintanto che
l'altro capo non ha chiuso il suo lato della connessione. Se resta aperto
la read si blocca e basta in attesa di ulteriori dati. 
Pertanto va deciso come e` strutturata l'applicazione, cioe` cosa fa il
processo all'altro capo del socket, se scrive blocchi di dati separati da
dei marcatori, che si vogliono leggere a blocchi o se semplicemente scrive
un blocco di dati e chiude il socket. 
Un esempio di codice, con qualche spiegazione al riguardo lo trovi qui:
http://www.lilik.it/~mirko/gapil/gapilsu238.html
 
Ciao
Simone
-- 
As.| Simone Piccardi - KeyID:2A972F9D - 
JabberID:sim...@jabber.linux.it
So.| 
http://firenze.linux.it/~piccardi
  -  
http://www.softwarelibero.it
Li.| Prima ti ignorano, poi ti deridono, poi ti combattono.  Poi vinci.
                                                           M. K. Ghandi

 
Uh! che goffo. Già già già, ho fatto un po' di confusione. Grazie della
correzione
Ciao
M?!

 rappresentato in un char (cfr. K&R pag. 16).
Vabč. Se quoti e leggi tutta la frase magari vedrai che non c'erano
errori da segnalare
Ciau?
M`

 aperto la read si blocca e basta in attesa di ulteriori dati.
Questo dipende da come hai aperto il socket; nella open puoi specificare 
O_NONBLOCK nelle flags ...
 Ciao
 Federico

 O_NONBLOCK nelle flags ...
Veramente un socket non lo apri con open, ma con socket. Ed ovviamente io
mi riferivo al comportamento di default. Se vuoi un socket non bloccante
devi impostarlo dopo averlo aperto con una fcntl.


 seguendo un protocollo che tocca a te definire (perche´non un segnale?).
Usare un segnale mi pare poco appropriato per una cosa del genere.
Trattandosi di socket non e` detto che i processi debbano girare sulla
stessa macchina.


 bloccante devi impostarlo dopo averlo aperto con una fcntl.
Anche qui ho fatto confusione ... hai perfettamente ragione!
 Ciao
 Federico

 invio il buffer a un altro processo: B write(socket,buff,strlen(buff));
Forse per il tuo problema non serve... comunque se usi un soketpair come
sistema di comunicazione fra processi, oltre a inviare dati da un processo
ad un altro, puoi anche inviare all'altro processo un file descriptor.
Ciao