2011-11-09 53 views
5

Tôi đang viết một chương trình bằng cách sử dụng epoll_wait để đợi các bộ mô tả tệp trên Linux 64 bit và tôi cố gắng đặt một số thông tin cùng với bộ mô tả tệp trong dữ liệu người dùng epoll_event.Phạm vi mô tả tập tin trên Linux 64-bit là gì?

Tôi biết trong thực tế không chắc rằng bộ mô tả tệp sẽ vượt quá 32 bit. Chỉ cần biết là hạt nhân đảm bảo rằng các bộ mô tả tập tin có một phạm vi cụ thể, hoặc nó chỉ đếm từ nhỏ và khó có thể nhận được rất lớn?

+0

Tôi tưởng tượng số FD được tái chế - ví dụ không bao giờ vượt quá số lượng cao nhất các mô tả mở đồng thời cho quá trình - nhưng .... tôi không có đầu mối. –

+0

fd được định nghĩa là một "nhỏ" không âm int, bất cứ điều gì "nhỏ" có nghĩa là tại thời gian chạy. Ngoài ra, hạt nhân không đảm bảo giá trị của nó. –

Trả lời

9

Giao diện epoll_ctl(2) để thêm người gửi mới có tham số int fd, vì vậy bạn đã bị giới hạn ở phạm vi 32 bit (ít nhất là trên nền tảng Linux mà tôi quen thuộc).

Bạn bị hạn chế thêm bởi /proc/sys/fs/file-max giới hạn trên toàn hệ thống về số lượng tệp mở cho tất cả các quy trình; /proc/sys/fs/file-max hiện tại là 595956 trên hệ thống của tôi.

Mỗi quá trình được giới hạn hơn thông qua giới hạn cho mỗi lần xử lý về số lượng tệp mở cho setrlimit(2)RLIMIT_NOFILE. 1024 là giới hạn RLIMIT_NOFILE phổ biến. (Rất dễ dàng để thay đổi giới hạn này qua /etc/security/limits.conf.)

Đây là ứng dụng hiếm hoi cần nhiều hơn 1024. 32 bit đầy đủ dường như không ổn, vì mỗi tệp mở sẽ mất bộ nhớ hạt nhân để đại diện - bốn tỷ ~ 280 byte struct inode cấu trúc (ở mức tối thiểu) là bộ nhớ được ghim.

+0

Cảm ơn, có vẻ như tôi có thể an toàn sử dụng một chút để sử dụng sau đó. –

2

Bạn có kế hoạch mở 2 tỷ bộ mô tả tệp và bạn có muốn hệ điều hành xử lý việc này không?

Trong hầu hết các nix, hàm trả về FD trả về là int, với < 0 là một bộ mô tả không hợp lệ. Những hàm này trả về FD trong một số int, do đó phạm vi của loại đó là phạm vi cho FD. (Trừ những âm bản (không có ý định chơi chữ)) Tôi sẽ làm theo: sử dụng cùng một loại, do đó, int.

1

Tôi tìm thấy nhận xét trong hạt nhân cho biết giới hạn trên cứng là 1024 * 1024.

-1

phạm vi mô tả tệp trên 64-bit (cũng áp dụng cho hệ thống 32 bit) Linux là 0 đến 1023, bạn không thể tạo thêm sau đó mở 1023 bộ mô tả tệp. bạn cố mở thêm 1023 tập tin mô tả sau đó hệ thống sẽ trả về lỗi EBADF (Bộ mô tả tập tin sai), lỗi số -

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