2013-08-29 111 views
7

我有興趣知道我可以預期的文件描述符的有效值。文件描述符的可能值是什麼?

請讓我解釋一下。我知道,比如,當我在我的Linux系統上使用#include <unistd.h>然後調用打開一個文件進行讀操作:可能出現

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

一個錯誤,我收到-1結果。
意外(-1)負一個必須有一些特殊的含義。是否所有其他值都是有效的文件描述符?即也是像-2和-1023那樣的負數?

假設int是4個字節(sizeof(int)==4),然後將

(-1) = 10000000 0000000 00000000 00000001 

將是唯一可檢測的無效文件描述符? 會喜歡其他人:

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

行嗎? 由於文件描述符可以存儲4個字節,因此我可以有最多 (2 ^(8 * 4)-1)有效的文件描述符,因此這將是我可以打開的最大文件數,是否正確?

爲純把它再次:

我應該期待一個(有效的)文件描述符是什麼?

任何值,但-1?

+0

'文件描述符,一個小的**非負整數**用於後續系統調用'看man 2打開 –

+0

請參見[this question](https://stackoverflow.com/questions/17931583/maximum-number- of-files-that-c​​an-be-by-c-fopen-in-linux)可以打開的文件/文件描述符的最大數目。 – jotik

回答

12

man page

open()返回一個文件描述符,小,非負整數

然後:

open()creat()返回新的文件描述符,或-1,如果發生錯誤

+0

我建議澄清「小」的意思是少於RLIMIT_NOFILE(如果情況總是如此)。 – Praxeolitic

1

下面是一個Linux manual page說:

open()creat()返回新的文件描述符,或者-1如果發生錯誤(在這種情況下,errno被適當地設定)。

其他系統在出現錯誤時可能會返回其他負值。

2

open失敗,它返回-1,或0xffffffff。它沒有意義,但open失敗:

成功完成後,該功能將打開該文件,並 返回代表編號最小的未使用的 文件描述符的非負整數。否則,返回-1並將錯誤號設置爲 表示錯誤。如果 函數返回-1,則不會創建或修改任何文件。

失敗原因存儲在errno,你可以閱讀它的價值,並檢查它是否是可能的失敗的重要原因之一EACCESEEXISTEINTR ...等,或者只是使用perror打印錯誤消息。

1

對於Linux系統(32位或64位系統),文件描述符的可能值範圍爲0到1023。

不能創建與價值更多的則1023的值1024文件描述符的情況下,文件描述符,它會返回EBADF的錯誤(錯誤的文件描述符,錯誤沒有-9)。

當文件描述符的負值被返回時,表明發生了錯誤。

+4

請注意,1024是RLIMIT_NOFILE(ulimit -n)的慣用默認值。如果你增加它,它將支持每個進程超過1024個文件。 (與系統範圍相關,與每進程文件描述符限制相反 - 這由fs.file-max sysctl旋鈕控制) –