2012-04-03 9 views
0

C/C++プログラムは、コマンドラインからファイルを引数として取ります。 '普通のファイル'からのデータの読み込みは問題ない/一般的なプログラミング作業ですが、ファイルが/ dev/fd/63のような 'デバイスパイプ'から来ると、プログラムがクラッシュします。デバイスパイプの内容をバッファに読み込もうとすると、エラーが発生します。

再現するには、次の

をあなたの優しい近所のbashシェルからアプリケーションにファイルとして「デバイスパイプ」を提供します。あなたのアプリは、ファイルの内容をバッファに読み込もうとする必要があります。

./yourapp <(echo 'Hello World!'); #/ dev/fd/xx echoコマンドの出力を含んでいます。

上記のコマンドは、アプリケーションの標準入力をリダイレクトされておらず、それが意図した結果ではない..です

私は多くの人々は、これが彼らのアプリケーションがクラッシュします知っているとは思いません。 Gnomeプロジェクトのアプリケーション 'seed'はglibを使ってI/Oを行いますが、これらのファイルからうまく読み込めます。コマンド 'cat'は、この状況を正常に処理することもできます。なぜ私はアプリケーションがクラッシュバグを取得する通常のファイルのような名前付きパイプの内容を読み取ろうとしているのですか?

EDIT:のrelaventコードセクション

#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

私は何かが間違っていると思います。 –

+1

_何らかのエラーやクラッシュがありますか?デバッガでプログラムを実行して、エラーがどこにあるか確認しましたか? –

+3

あなたのコードを教えてください。 – cnicutar

答えて

0

はパイプにfseek関数を呼び出すことはできません。コードは、私が実際にそのような愚かなことをしようとしていたことを示しています。

関連する問題