Newsgroup: it.comp.os.linux.development
Titolo: IR2000L pin-out; lettura file

Domanda uno: per caso qualcuno ha il pin-out del connettore IR2000L
Actisys?
Domanda due: un metodo efficiente e poco CPU-intensive per leggere da un
file
             che si allunga (es. /var/log/messages) da un processo in
bg?
(tra un po' scrivo alla actisys e sbudello i sorgenti di tail, sicche'
non e'
che siano domande urgenti o importanti; ma se qualcuno risponde mi fa
piacere
assai).
Leonardo pigro
".signature": bad command or file name


Mai sentito quel connettore: cos'č?
" leggere _da_ un file..  _da_ un processo in bg"
vuoi dire che vuoi scrivere 2 righe che lanciate in bg leggano questo
file?
Se non č grave andare corto con una lettura,
allora non importa che si stia allungando, lo leggi e basta.
Se invece non devi andare corto, allora devi metterti d'accordo con
quello che scrive, se č possibile usare il locking.
tail non fa niente di speciale, resteresti deluso se vedessi il
sorgente, ne sono certo.
Comunque dipende da cosa vuoi fare esattamente. Spiega meglio.
ciao, oops.
ciao, oops.

Comunque dipende da cosa vuoi fare esattamente. Spiega meglio.
Esattamente quello che ho detto. Ho un file, dove un processo scrive,
e voglio leggermelo in tempo reale. Ovviamente ho provato con fgets e
funziona benissimo.
Pero' cosi' la fgets() si blocca -- e quindi non posso fare altro, in
particolare non posso dare una sleep() - e, durante il bloccaggio, il
carico apparente sul sistema e' 100%. Non e' bello.
+++
Cosi' adesso ho deciso di utilizzare stat() in un ciclo e chiudere il
file dopo ogni lettura... ci rimetto una fopen(), una fclose() ed una
fseek() ad ogni giro (senza contare la stat()), ma mediamente mi puo'
andare bene che ad ogni ciclo faccia una sleep() di 5 secondi (a meno
che abbia letto qualcosa, in quel caso la sleep() non c'e'. Cosi' non
mi devo preoccupare che arrivi piu' di una riga ogni N secondi).
Ma mi domandavo se c'era un metodo piu' elegante.
Leonardo


file dopo ogni lettura... ci rimetto una fopen(), una fclose() ed una
Orrore! Lascia il file aperto e usa fstat.
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *
      | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

 Leonardo
Il punto è che (ma stai usando Linux, vero? ;) ) fgets non blocca quando
legge un regular file. A parte quello che dicono i man ecc. ho fatto
anche delle prove leggendo un file che si allunga, e non è successo
niente di strano. Come in teoria, se fgets incontra EOF prima di un \n o
di riempire il buffer, ritorna la lettura corta.
Non si blocca. Stai leggendo una pipe?
Eppoi quella cosa del 100% cpu load. La libc non fa così, mica c'è un
loop in polling...
Neppure un file lock alza il cpu load (e ci mancherebbe che lo facesse:
le trap del blocking I/O non alzano il cpu load, anzi sono pensate per 
ridurlo)
insomma:
f=fopen("growfile", "w");
eppoi
fgets(linebuf, MAXLINE, f);
non si blocca su un regular file (se non ci sono locks). Non alza il
carico di cpu comunque.
Concludo dicendo, giusto per informazione, che tail e le altre text
utilities, AFAIK non usano stdio ma read & write, gestendo "a mano"
buffers e \n.
A 'sto punto direi che sono anche un po' curioso di capire come mai ti
va alle stelle il cpu load. Spero di capirlo dalle prossime replies.
ciao.

va alle stelle il cpu load. Spero di capirlo dalle prossime replies.
Non me lo spiego. Ora estraggo un sorgentino minimale, e lo posto, c'e'
il caso che lo capiate voialtri :-)
Leonardo che ormai ci ha rinunciato


Orrore! Lascia il file aperto e usa fstat.
Gia'. Non ci avevo pensato. Buffo, eh?
Leonardo in ginocchio sui ceci
