複数のファイルを開いてデータを読み取り、それを処理してから、実験用ハーネスを介してファイルを閉じるコードを実行しています。ハーネスは、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:この時点でプログラムがクラッシュしますが、原因は実際にはコードの他の場所で誤ったディレクトリを開くことです。問題が何であったかについては、以下の私の答えを参照してください。