gpt4 book ai didi

C: 使用 opendir 和 open 打开的文件太多

转载 作者:太空狗 更新时间:2023-10-29 17:00:29 28 4
gpt4 key购买 nike

我正在使用以下循环代码将大约 6000 个文本文件读入内存:

void readDocs(const char *dir, char **array){
DIR *dp = opendir(dir);;
struct dirent *ep;
struct stat st;
static uint count = 0;
if (dp != NULL){
while (ep = readdir(dp)){ // crawl through directory
char name[strlen(dir) + strlen(ep->d_name) + 2];
sprintf(name, "%s/%s", dir, ep->d_name);

if(ep->d_type == DT_REG){ // regular file
stat(name, &st);
array[count] = (char*) malloc(st.st_size);
int f;
if((f = open(name, O_RDONLY)) < 0) perror("open: ");
read(f, array[count], st.st_size));
if(close(f) < 0) perror("close: ");
++count;
}

else if(ep->d_type == DT_DIR && strcmp(ep->d_name, "..") && strcmp(ep->d_name, "."))
// go recursive through sub directories
readDocs(name, array);
}
}
}

在第 2826 次迭代中,我在打开第 2826 个文件时遇到“打开的文件太多”错误。至此关闭操作没有出现错误。
因为它总是在第 2826 次迭代时挂起,所以我认为我不应该等到文件在调用 close();
后真正关闭我在使用 fopen、fread 和 fclose 时遇到了同样的问题。
我认为这与此片段的上下文无关,但如果您这样做,我会提供。
感谢您的宝贵时间!

编辑:
我让程序进入休眠状态并检查了/proc//fd/(感谢 nos)。就像你怀疑的那样,正好有 1024 个文件描述符,我发现这是一个通常的限制。
+ 我给了你从目录和所有子目录中读取文档的整个功能
+ 该程序在 Linux 上运行!抱歉忘记了!

最佳答案

您需要在循环后调用 closedir()。打开一个目录也会消耗一个文件描述符。

关于C: 使用 opendir 和 open 打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7175739/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com