2011-08-24 40 views
8

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 đó!

+6

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

+3

Chắc chắn, hãy hiển thị thêm mã :-) – cnicutar

+0

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

Trả lời

12

Bạn cần gọi đến hàm closedir() sau khi đã lặp. Mở một thư mục cũng tiêu thụ một bộ mô tả tập tin.

+0

Đây là nó. Điều này sẽ làm cho đệ quy một chút phức tạp nhưng cảm ơn tất cả! – Callahan

+2

Làm cách nào? Chỉ cần thêm closedir (dp) sau khi vòng lặp while đã kết thúc. Hay bạn có 1000 cấp thư mục? Bạn cũng có thể tạo danh sách tất cả các tệp đệ quy và sau đó mở từng tệp một bên ngoài đệ quy. –

2

Bạn có thể đạt đến giới hạn hệ điều hành cho # tệp mở được cho phép. Không biết bạn đang sử dụng hệ điều hành nào, bạn nên google OS + "quá nhiều tệp đang mở" để tìm hiểu cách khắc phục sự cố này. Đây là một kết quả cho linux, http://lj4newbies.blogspot.com/2007/04/too-many-open-files.html

+1

Tăng giới hạn các tập tin được mở trên hệ điều hành là sai đường. Anh ta nên kiểm tra lý do tại sao anh ta không đóng tập tin của mình. – RedX

+0

Kiểm tra giới hạn tập tin là chính xác, đây là giới hạn cứng – ajreal

1

tôi giải quyết vấn đề bằng cách thêm vào /etc/security/limits.conf

* soft nofile 40960

* hard nofile 102400

Vấn đề là khi đăng nhập để Debian nó cho thấy ulimit -n 40960, nhưng khi người dùng su, đó là một lần nữa 1024. Cần bỏ ghi chú một hàng trên /etc/pam.d/su

session required pam_limits.so

Sau đó luôn cần giới hạn

0

Bạn nên gọi closedir() vì nó cũng opendir trả về mô tả như trong tối đa hệ thống linux số nhiều này thời gian/proc/Bạn có thể mở tệp sys/fs/file-max mặc dù bạn có thể tăng/giảm số này

Các vấn đề liên quan