我正在运行一些代码,它打开多个文件以读取数据,对其进行处理,然后通过实验工具关闭文件。每次完成大量处理时,工具都会更改一些参数,然后使用更新的参数再次运行相同的代码。
当我运行少量实验时没有问题,当程序退出时,所有内存都被释放。但是,如果我尝试运行大量实验,代码总是在调用处理代码大约 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;
编辑3:虽然这点是程序崩溃的地方,但原因实际上是在代码的其他地方打开了错误的目录。请参阅下面的答案以了解问题所在。