2010-12-07 6 views
2

Ich muss mit fread() die Sachen vom gelesenen Ende der Rohrleitung lesen.fread() Lesen von einem Deskriptor basierend auf einem Rohrsatzfehler, nicht EOF, wo es keine Daten gibt

Aber während ich erwarte, dass fread() EOF setzt, wenn sich nichts in der Pipe befindet, setzt es stattdessen den Fehlerindikator. Ich habe die Posix- und C-Standards überprüft und keine Ahnung gefunden. Wahrscheinlich tun, ich bin etwas unbeabsichtigte (lesen, albern), rechts :)

Hier ist der Auszug:

#include <stdio.h> 
#include <fcntl.h> 

int main() 
{ 
    char buf[128]; 
    FILE *f; 
    int pipe_fd[2], n; 

    pipe(pipe_fd); 
    fcntl(pipe_fd[0], F_SETFL, O_NONBLOCK); 

    f=fdopen(pipe_fd[0], "r"); 
    n=fread(buf, 1, 1, f); 
    printf("read: %d, Error: %d, EOF: %d\n", n, ferror(f), feof(f)); 

    return 0; 
} 

Antwort

8

Da Sie eine nicht-blockierende Rohr verwenden, ich glaube, Sie würden erhalten:

  • errno==EAGAIN wenn dort einfach nichts zu lesen ist (also nichts jetzt aber vielleicht etwas später - versuche es später nochmal).
  • EOF wenn die Schreibseite der Pipe geschlossen ist (was bedeutet, dass keine Daten mehr kommen).
  • Siehe die Manpage für read() darüber, wie sich read() verhält, wenn O_NONBLOCK-Modus festgelegt ist. fread() Verhalten sollte konsistent sein mit read().

    +1

    Danke, Bert! Schaut so aus. Daher wird das EAGAIN nur bis zur Ebene der Streams weitergegeben und führt zu einer Fehlereinstellung. Also mein Ansatz wird nicht funktionieren. Ich versuche einfach, mit Lex auf eine normale Art und Weise fertig zu werden :) Seht weiter ... –

    +0

    Ja, denke darüber nach, wenn EOF zurückgegeben wird, wenn die Pipe vorübergehend blockiert ist, dann wäre der Empfänger nicht in der Lage, alle Daten zu erkennen ist schon angekommen. Sie könnten keine Programme schreiben, die wirklich funktionieren (mit Pipes), wenn es so funktioniert, es sei denn, Sie hatten einige Protokolle, um die restlichen Daten wiederherzustellen. –