2012-04-03 5 views
0

Mein C/C++ - Programm nimmt eine Datei von der Befehlszeile als Argument. Das Lesen von Daten aus 'regulären Dateien' ist kein Problem/eine allgemeine Programmieraufgabe, aber wenn die Datei von einer 'Geräte-Pipeline' kommt, wie zum Beispiel/dev/fd/63, stürzt mein Programm ab.Der Versuch, den Inhalt einer Gerätepipeline in einen Puffer zu lesen, verursacht Fehler

zu reproduzieren:

von Ihrer freundlichen Nachbarschaft Bash-Shell ein ‚Gerät pipe‘ als Datei an Ihre Anwendung liefern. Ihre App sollte versuchen, den Inhalt der Datei in einem Puffer zu lesen.

./yourapp < (Echo 'Hallo Welt!'); #/dev/fd/xx enthält die Ausgabe des Befehls echo.

Hinweis der obige Befehl wird die Standardeingabe der Anwendung nicht umgeleitet und das ist nicht das beabsichtigte Ergebnis ..

Ich glaube nicht, dass viele Leute wissen, dass dies ihre Anwendung abstürzt. Die Anwendung 'Seed' aus dem Gnome-Projekt verwendet glib, um ihre E/A zu tun, aber sie kann aus diesen Dateien gut lesen. Der Befehl 'cat' kann diese Situation auch elegant behandeln. Warum versuche ich, den Inhalt dieser Named Pipe wie eine normale Datei zu lesen, bekommt meine Anwendung den Absturzfehler?

EDIT: relavent Codeabschnitt

#include <stdio.h> 

int main(int argc, char **argv) { 

    FILE *file; 

    char *buffer; 

    unsigned long fileLen; 

    //Open file 
    file = fopen(argv[1], "rb"); 
    if (!file) return -1; 

    //Get file length 
    fseek(file, 0, SEEK_END); 
    fileLen=ftell(file); 

    fseek(file, 0, SEEK_SET); 

    //Allocate memory 
    buffer=(char *)malloc(fileLen+1); 

    if (!buffer){ 
     fprintf(stderr, "Memory error!"); 
     fclose(file); 
     return -2; 
    } 

    //Read file contents into buffer 
    fread(buffer, fileLen, 1, file); 
    fclose(file); 

    fprintf(stdout, "Size: %i", fileLen); 

    free(buffer); 

} 
+1

Ich denke, etwas ist wahrscheinlich falsch. –

+1

_What_ Fehler oder Absturz erhalten Sie? Haben Sie versucht, das Programm in einem Debugger auszuführen, um festzustellen, wo der Fehler liegt? –

+3

Zeigen Sie uns Ihren Code. – cnicutar

Antwort

0

kann nicht an einem Rohr rufen fseek. Der Code zeigt, dass ich tatsächlich versucht habe, solch eine dumme Sache zu tun.

Verwandte Themen