Gibt es eine vorgegebene Möglichkeit, um zu sagen, wie viele Bytes zum Lesen bereit sind?
Gibt es eineFILE*
oder einen Dateideskriptor?
Ich kann s=ftell(f),fseek(f,0,SEEK_END),e=ftell(f),fseek(f,s,SEEK_SET),e-s
nicht verwenden, da FILE*
nur einen Dateideskriptor umschließt, den ich von pipe(2)
erhalten habe. , und ich bekomme ESPIPE
, wenn ich das versuche.
Ich dachte daran, select(2)
mit einem Null-Timeout zu verwenden, um zu sagen, dass ich mindestens ein Byte zum Lesen bereit habe und dann ein Byte nach dem anderen lese, bis die select(2)
mir sagt, dass ich aufhören soll. Das scheint irgendwie klobig und langsam.
Gibt es einen besseren Weg, dies zu tun?
read
kann weniger Bytes zurückgeben, als Sie angefordert haben, und muss dies tun, wenn Daten verfügbar sind, aber es müsste blockiert werden, um den Puffer zu füllen.
Also ist es üblich, select
zu verwenden, um lesbar zu erkennen und dann zu lesen, was auch immer Ihre bevorzugte Puffergröße ist. Alternativ setzen Sie O_NONBLOCK mit fcntl und prüfen Sie auf -1 Rückgabewert und errno EAGAIN.
Wenn Sie nur nach etwas effizienterem suchen, das 1 Byte liest, und nicht nach der Größe der verfügbaren Daten im FIFO, dann können Sie:
select
, um zu wissen, wann Daten verfügbar sind read
mit einem großen Puffer auf. Es gibt möglicherweise weniger zurück als angefordert ( überprüfen Sie den Rückgabecode ), oder es gibt -1 mit EAGAIN
oder EWOULDBLOCK
zurück, um anzuzeigen, dass Sie zum Aufruf von select
zurückkehren sollen (keine Daten) verfügbar) Tags und Links c pipe file-descriptor