web-dev-qa-db-ja.com

ファイル記述子の可能な値は何ですか?

ファイル記述子に期待できる有効な値を知りたいです。

少し説明させてください。たとえば、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以外の値はありますか?

10

manページ から:

open()はファイル記述子を返します小さな非負の整数

その後:

open()およびcreat()は、新しいファイル記述子を返しますまたはエラーが発生した場合は-1

15

open が失敗すると、-1または0xffffffffが返されます。意味はありませんが、openが失敗しました:

正常に完了すると、関数はファイルを開き、最小番号の未使用ファイル記述子を表す負でない整数を返します。それ以外の場合は、-1が返され、エラーを示すためにerrnoが設定されます。関数が-1を返した場合、ファイルは作成または変更されません。

失敗の理由は errno に保存され、その値を読み取って、考えられる失敗の理由の1つであるかどうかを確認できますEACCESEEXISTEINTR ..など、または単に perror を使用してエラーメッセージを出力します。

2
user1129665

Linux マニュアルページ の内容は次のとおりです。

open()およびcreat()は、新しいファイル記述子を返すか、-1エラーが発生した場合(この場合、errnoが適切に設定されます)。

他のシステムは、エラーが発生した場合に他の負の値を返す場合があります。

1
meaning-matters

Linuxシステム(32ビットまたは64ビットシステム)の場合、ファイル記述子の可能な値の範囲は0〜1023です。

1023を超える値のファイル記述子を作成することはできません。値が1024のファイル記述子の場合、EBADFのエラー(不正なファイル記述子、エラー番号-9)が返されます。

ファイル記述子の負の値が返される場合は、エラーが発生したことを示します。

1
premal