2
static char filename[128] = "trace.txt";

g_file = fopen(filename, "w");
if(NULL == g_file)
{
       printf("Cannot open file %s.error %s\n",filename,strerror(errno));
       exit(1);
}

trace.txtという名前の空のテキストファイルを書き込みモードで(作業ディレクトリに)開こうとしています。プログラムは私のディレクトリに空のファイルtrace.txtを作成していますが、チェック(NULL == g_file)はtrueを返し、エラーコード24(開いているファイルが多すぎます)が返されます。これがなぜであるかはわかりません。これは、プログラムで開いている最初のファイルです。

驚いたことに、コードは指定された名前で作業ディレクトリに空のファイルを作成していますが、何らかの理由でnullファイルポインタのチェックが成功しています。:(

4

4 に答える 4

11

おそらくファイル記述子のリークがあります。
コードがファイルを開き続け、決して閉じない場合は、遅かれ早かれ制限に達し、fopen失敗します。

これを確認するには、ファイルを開くたびに取得するファイル記述子番号を出力します。彼らが成長し続けるならば、あなたは漏れを持っています。

于 2012-06-10T06:58:20.433 に答える
4

システムが開いているファイル ハンドルの最大許容数に達したことが原因である可能性が最も高いです。

これは、次を実行することで簡単にテストできます。

$ dd if=/dev/urandom of=test.dat bs=16 count=1

ファイル ハンドルが不足している場合は、同じまたは類似のエラーが発生するはずです。

次のコマンドのいくつかを使用して、これをトラブルシューティングできます。

開いているファイルの最大許容数を確認するには:

$ cat /proc/sys/fs/file-max

現在開いているファイルを確認するには (これにはデバイス ファイル、ソケットなどが含まれることを思い出してください):

$ lsof

lsof開いているファイルの数を取得するために使用することもできます。

$ lsof | wc -l
于 2012-06-10T04:53:36.030 に答える
1

これはあなたが抱えている問題と同様の問題のように見えますが、問題の解決に役立つかどうかは完全にはわかりません. 一見の価値があるかもしれません:

C でのファイルへの書き込みに関する問題

于 2012-06-10T04:42:58.643 に答える