2

複数のファイルを開いてデータを読み取り、それを処理してから、実験用ハーネスを介してファイルを閉じるコードを実行しています。ハーネスは、1ロットの処理が完了するたびにいくつかのパラメーターを変更し、更新されたパラメーターを使用して同じコードを再度実行します。

少数の実験を実行しても問題はなく、プログラムが終了するとすべてのメモリが解放されます。ただし、多数の実験を実行しようとすると、処理コードを約1000回呼び出した後、コードが常にクラッシュします。開いた各ファイルがシステムの個々の部分でfopen使用して閉じられていることを確認しましたが、Valgrindが出力するため、問題は引き続き発生します。fclose

==11892== Warning: invalid file descriptor 1030 in syscall open()
==11892== Warning: invalid file descriptor 1030 in syscall dup()
Could not access specified file: Too many open files

約1000回の反復の後perror、「開いているファイルが多すぎます」というエラーが発生します。より多くのファイルを開くためにファイル記述子の数をリセットするために私がしなければならないことがありますか?

編集:lsof -p実行時の出力を見ると、開かれているファイルの種類はですDIR。私がアクセスしているファイルは、別のディレクトリ内にあります。現在、でファイルを開いていますfopen("path/to/directory/file.txt", "w")。使用したファイル記述子を解放するために追加で行う必要があることはありますか?

lsof出力の抜粋は次のとおりです。

lt-launch 12101 michal   25r   DIR    8,1     4096 3537225 /directory/reference/20
lt-launch 12101 michal   26r   DIR    8,1     4096 3537238 /directory/reference/21
lt-launch 12101 michal   27r   DIR    8,1     4096 3537251 /directory/reference/22

edit2:問題のあるコードは次のとおりです。

FILE *fp;

printf("Retrieving event data from file %s\n", filename);

if ((fp = fopen(filename, "r")) == NULL){
perror("Could not access specified file");
exit(1);
}

char* line = malloc(MAX_LINE_LENGTH);
char* lref = line;
double_arr* event_times = init_double_arr(DEFAULT_ARR_SIZE);

// Get data from file...

if (i == 0){// we found no events in the given interval
free_double_arr(event_times);
free(lref);
fclose(fp);
return NULL;
}
event_times->data = realloc(event_times->data, i * sizeof(double));
event_times->len = i;
fclose(fp);
free(lref);

return event_times;

edit3:この時点でプログラムがクラッシュしますが、原因は実際にはコードの他の場所で誤ったディレクトリを開くことです。問題が何であったかについては、以下の私の答えを参照してください。

4

2 に答える 2

4

開いているファイルが多すぎると、処理後にファイルを閉じません...

あなたが投稿したコードは、すべてのコード パスでファイルを閉じます (直接exiting する場合を除きますが、それは問題ではありません)。

  • ファイルを閉じない、投稿していないコードに早期復帰があります
  • 他のコードでメモリを破損し、 and を上書きしたfpため、実際には閉じていません。これは、の戻り値を確認することで確認できますfclose
于 2013-03-03T13:34:34.370 に答える
0

ファイルを開こうとするとプログラムがクラッシュしましたが、問題の原因は別のところにありました。開いているファイルは実験ごとに新しいディレクトリにあり、これらのそれぞれは、生成されたポインターに割り当てられたメモリを呼び出して解放するためにopendir()使用される誤ったコードを使用して作成されていました。呼び出しを変更して問題を解決しました。free()DIRfree()dirclose()

于 2013-03-03T13:48:19.870 に答える