打开和关闭大量文件时打开的文件太多

时间:2013-03-03 13:05:58

标签: c

我正在运行一些代码,这些代码打开多个文件来读取数据,处理它然后通过实验工具关闭文件。每次完成一批处理后,线束会更改一些参数,然后使用更新的参数再次运行相同的代码。

当我运行少量实验时没有问题,当程序退出时,所有内存都被释放。但是,如果我尝试运行大量实验,代码总是在大约1000次调用处理代码后崩溃。我已经检查过我用fopen打开的每个文件是否在系统的每个部分都使用fclose关闭,但问题仍然存在,Valgrind输出

==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:虽然这一点是程序崩溃的地方,但原因实际上是代码中其他地方的错误目录打开。请参阅下面的答案,了解问题所在。

2 个答案:

答案 0 :(得分:4)

如果打开的文件太多,则处理后不会关闭文件...

您发布的代码在所有代码路径上关闭文件(直接exit时除外,但这没关系),所以..我看到两种可能的情况:

  • 您尚未发布的代码中有一个早期返回,但未关闭文件
  • 您使用其他一些代码破坏了内存,覆盖了fp,因此您没有真正关闭它 - 您可以通过检查fclose的返回值来验证这一点。

答案 1 :(得分:0)

程序在尝试打开文件时崩溃,但问题的根源在其他地方。正在打开的文件位于每个实验的新目录中,并且每个实验都使用一些名为opendir()的错误代码创建,然后使用free()释放分配给DIR的内存指针产生。将free()调用更改为dirclose()可解决问题。