Я читаю около 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 я получаю ошибку " Too many open files ", когдаоткрытие 2826-го файла.До этого момента в операции закрытия не возникало ошибок.
Так как она всегда зависает в 2826-й итерации, я не верю, что должен ждать, пока файл действительно закроется после вызова close();
У меня была такая же проблема, используяfopen, fread и fclose.
Не думаю, что это связано с контекстом этого фрагмента, но если вы это сделаете, я предоставлю его.
Спасибо за ваше время!
РЕДАКТИРОВАТЬ:
Я перевел программу в режим сна и проверил / proc // fd / (спасибо nos).Как вы и подозревали, было ровно 1024 файловых дескриптора, которые я нашел обычным ограничением.
+ я дал вам всю функцию, которая считывает документы из каталога и всех подкаталогов
+ программа работает на Linux!Извините, что забыли об этом!