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);
}
私は何かが間違っていると思います。 –
_何らかのエラーやクラッシュがありますか?デバッガでプログラムを実行して、エラーがどこにあるか確認しましたか? –
あなたのコードを教えてください。 – cnicutar