2013-08-29 72 views
7

Tôi quan tâm để biết các giá trị hợp lệ mà tôi có thể mong đợi cho một bộ mô tả tập tin.Giá trị có thể có cho các bộ mô tả tệp là gì?

Vui lòng để tôi giải thích một chút. Tôi biết rằng, ví dụ, khi tôi sử dụng #include <unistd.h> trên hệ thống Linux của tôi sau đó một cuộc gọi để mở một tập tin để đọc:

int fileDescriptor; 
fileDescriptor = open("/some/filename",O_RDONLY); 

một lỗi có thể xảy ra và tôi nhận -1 như một kết quả.
Chắc chắn (-1) số âm phải có phần nào có ý nghĩa đặc biệt. Có phải tất cả các giá trị khác đều là các bộ mô tả tệp hợp lệ không? tức là những người tiêu cực như -2 và -1023?

Giả sử rằng int là 4 byte (sizeof(int)==4), sau đó sẽ

(-1) = 10000000 0000000 00000000 00000001 

sẽ chỉ mô tả tập tin không hợp lệ được phát hiện? Would người khác thích:

  • (0) = 00000000 0000000 00000000 00000000
  • (-2) = 10000000 0000000 00000000 00000010
  • (2) = 00000000 0000000 00000000 00000010

được ok? Vì bộ mô tả tệp có thể lưu trữ 4 byte, do đó, tôi có thể có tối đa (2^(8 * 4) -1) mô tả tệp hợp lệ và do đó đây có thể là số tệp tối đa mà tôi có thể mở, đúng không?

Nói một cách đơn giản nữa:

tôi nên mong đợi gì một (hợp lệ) mô tả tập tin được?

bất kỳ giá trị nào trừ -1?

+0

'bộ mô tả tệp, một số nguyên ** không âm nhỏ ** để sử dụng trong các cuộc gọi hệ thống tiếp theo' xem man 2 open –

+0

Xem [câu hỏi này] (https://stackoverflow.com/questions/17931583/maximum-number- of-files-that-can-be-open-by-c-fopen-in-linux) cho số lượng tệp/tệp mô tả tối đa có thể mở được. – jotik

Trả lời

12

Từ man page:

open() trả về một bộ mô tả tập tin, một nhỏ, không âm nguyên.

và sau đó:

open()creat() trả lại bộ mô tả tập tin mới, hoặc -1 nếu có lỗi xảy ra

+0

Tôi đề nghị làm rõ rằng "nhỏ" có nghĩa là ít hơn RLIMIT_NOFILE (nếu luôn luôn như vậy). – Praxeolitic

1

Đây là những gì một Linux manual page nói:

open()creat() trả lại bộ mô tả tập tin mới, hoặc -1 nếu một lỗi xảy ra (trong trường hợp này, errno được thiết lập một cách thích hợp).

Hệ thống khác có thể trả về các giá trị âm khác trong trường hợp lỗi.

2

Khi open thất bại, nó sẽ trả -1, hoặc 0xffffffff. Nó không có ý nghĩa nhưng open thất bại:

Sau khi hoàn thành thành công, hàm sẽ mở file và trả về một số nguyên không âm đại diện cho không sử dụng bộ mô tả tập tin đánh số thấp nhất. Nếu không, -1 sẽ được trả lại và errno được đặt thành cho biết lỗi. Không có tập tin nào được tạo hoặc sửa đổi nếu hàm trả về -1.

Lý do thất bại được lưu trữ trong errno, bạn có thể đọc giá trị của nó và kiểm tra xem đó là một trong những thất bại có thể lý luận EACCES, EEXIST, EINTR .. vv, hoặc chỉ sử dụng perror để in các thông báo lỗi.

1

Phạm vi giá trị có thể có của các bộ mô tả tệp là từ 0 đến 1023 đối với hệ thống Linux (hệ thống 32 bit hoặc 64 bit).

Bạn không thể tạo bộ mô tả tệp có giá trị cao hơn 1023. Trong trường hợp bộ mô tả tệp có giá trị 1024, nó sẽ trả về lỗi EBADF (bộ mô tả tệp sai, lỗi số 9).

Khi giá trị âm của bộ mô tả tệp được trả về, nó cho biết đã xảy ra lỗi.

+4

Lưu ý rằng 1024 chỉ là giá trị mặc định thông thường cho RLIMIT_NOFILE (ulimit -n). Nếu bạn tăng điều đó, nó sẽ hỗ trợ hơn 1024 tệp cho mỗi quá trình. (Cũng có liên quan là toàn hệ thống, như trái ngược với mỗi quá trình, giới hạn mô tả tập tin - điều này được điều khiển bởi fs.file-max sysctl knob) –