Tôi đọc khoảng 6000 text-file vào bộ nhớ với đoạn mã sau trong một vòng lặp:C: Quá nhiều file mở bằng opendir và mở
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);
}
}
}
Trong lặp 2826 tôi nhận được một "Quá nhiều file mở "lỗi khi mở tệp 2826. Không có lỗi xảy ra trong hoạt động đóng cho đến thời điểm này.
Vì nó luôn bị treo trong phiên bản 2826, tôi không tin rằng tôi nên đợi cho đến khi một tập tin thực sự bị đóng sau khi gọi close();
Tôi có cùng vấn đề với fopen, fread và fclose.
Tôi không nghĩ rằng nó phải làm với bối cảnh của đoạn mã này, nhưng nếu bạn làm tôi sẽ cung cấp nó.
Cảm ơn bạn đã dành thời gian!
EDIT:
Tôi đặt chương trình để ngủ và kiểm tra/proc // fd/(nhờ vào nos). Giống như bạn nghi ngờ có chính xác 1024 tập tin mô tả mà tôi tìm thấy là một giới hạn thông thường.
+ tôi đã cung cấp cho bạn toàn bộ chức năng đọc tài liệu từ một thư mục và tất cả các thư mục con
+ chương trình chạy trên Linux! Xin lỗi vì đã quên điều đó!
Một nơi nào đó, bạn không thể đóng() tệp đó, có thể trên đường dẫn lỗi. Nếu điều này là trên linux, hãy xem/proc//fd /, bạn sẽ ít khi thấy những trình mô tả mà bạn đã không đóng() –
nos
Chắc chắn, hãy hiển thị thêm mã :-) – cnicutar
như thể hệ thống đã thực sự đóng các tệp sau khi gọi để đóng(). Theo hệ thống nào bạn đang chạy chương trình này? – Shlublu