2013-05-18 14 views
5

Tôi đang viết một máy chủ mà cần phải xử lý nhiều ổ cắm mở, vì vậy tôi sử dụng setrlimit() để thiết lập số lượng tối đa của file descriptor mở (như root, trước khi đặc quyền thả) như sau:Có hợp lý để mong đợi rằng trong Linux, fd <số lượng tối đa các bộ mô tả tệp mở?

#include <sys/resource.h> 
#define MAX_FD_C 9001 

if (setrlimit(
     RLIMIT_NOFILE, &(struct rlimit){.rlim_cur = MAX_FD_C, .rlim_max = MAX_FD_C} 
    ) == -1) { 
    perror("Failed to set the maximum number of open file descriptors"); 
    return EXIT_FAILURE; 
} 

Bây giờ, tôi nhận ra rằng có lẽ sẽ không có bất kỳ sự bảo đảm nào và rằng tôi đang ở lòng thương xót của bất cứ phương pháp nào mà hạt nhân Linux sử dụng để triển khai các bảng mô tả tập tin; nhưng trong thực tế, có hợp lý để giả định rằng bất kỳ fd chương trình này nhận được từ hạt nhân Linux sẽ có một giá trị nhỏ hơn MAX_FD_C tôi đặt ở trên?

Tôi muốn giữ cho mỗi dữ liệu ổ cắm càng nhỏ càng tốt có nghĩa là chỉ sử dụng một mảng như static struct client clients[MAX_FD_C] = {{0}}; và sử dụng fd làm chỉ mục cho cấu trúc ứng dụng khách (về cơ bản là phiên bản FDT của riêng tôi).

+1

Có, các bộ mô tả tệp sẽ nằm trong khoảng 0 <= fd

+0

Đừng thừa nhận bất cứ điều gì trong khi lập trình. Nó làm cho bạn sống lâu hơn. Nghiêm túc. –

+0

@RandyHoward: Tôi nghĩ rằng các giả định là cần thiết để giữ cho chúng tôi lành mạnh và hiệu quả. –

Trả lời

3

Có các chức năng trong tiêu chuẩn POSIX. Hãy xem FD_SETSIZE, select(), FD_SET.

+0

Cảm ơn, đó là yên tâm. Có lẽ bạn có thể trích dẫn (các) phần của tài liệu liên quan làm cho điều rõ ràng nhất/rõ ràng nhất? Tôi đang tìm nó bây giờ, nhưng tôi không hoàn toàn chắc chắn ... – Will

+0

Tôi đoán nó là từ trang 'select' người đàn ông:' Một fd_set là một bộ đệm kích thước cố định. Thực thi FD_CLR() hoặc FD_SET() với giá trị fd âm hoặc bằng hoặc lớn hơn FD_SETSIZE sẽ dẫn đến hành vi không xác định. Hơn nữa, POSIX yêu cầu fd là một bộ mô tả tệp hợp lệ.'? – Will

+0

@Will: Lưu ý rằng điều này không đảm bảo rằng bạn không bao giờ có thể mô tả tệp ở trên 'FD_SETSIZE', nhưng' mở' đảm bảo bộ mô tả tệp kết quả là "một số nguyên nhỏ" và các thứ khác bị ngắt khi chúng xuất hiện ' t nhỏ. Nếu bạn thích, bạn cũng có thể sử dụng 'dup2' để di chuyển các dải ô ngoài phạm vi vào phạm vi (chọn một mục nhập không sử dụng, rõ ràng). –

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