11

C++ での I/O 操作について調べていますが、質問があります。次のようなファイルを開くとき:

#include <fcntl.h>
int main() {
    unsigned char buffer[16];     
    int fd = open (argv[1], O_RDONLY);
    read(fd, buffer, sizeof(buffer));
    return 0;
}

fdメソッドに渡すときに、変数はファイルを整数としてどのように表すことができますopenか? 現在のフォルダー内のファイルを表していますか? 「fd」変数を出力すると、3 が出力されます。これはどういう意味ですか?

Ps。stdio.h、fstreamなど、ファイルを処理する方法が他にもいくつかあることは知っていますが、それはこの質問の範囲外です。Ds。

4

5 に答える 5

16

ファイルをopenメソッドに渡すときに、変数fdはどのようにファイルを整数として表すことができますか?

開いているファイルを識別するハンドルです。一般にファイル記述子と呼ばれるため、名前が付けられfdました。

ファイルを開くと、オペレーティング システムは、ファイルへのアクセスに必要なリソースをいくつか作成します。これらは、整数をキーとして使用するある種のデータ構造 (おそらく単純な配列) に格納されます。への呼び出しopenはその整数を返すため、それを渡すとread、オペレーティング システムはそれを使用して必要なリソースを見つけることができます。

現在のフォルダー内のファイルを表していますか?

開いたファイルを表しています。そのファイル名はargv[1]、起動時にプログラムに渡された最初の引数でした。そのファイルが存在しない場合、またはopen何らかの理由で失敗した場合、値は -1 になり、ファイルを表していません。何かをしようとする前に、それを確認する必要があります。

変数をfd出力すると、3 が出力されます。これはどういう意味ですか?

特に意味はありません。しかし、それは、によって使用される入力 (0)、出力 (1)、およびエラー (2) ストリームの後、開かれた 4 番目のファイル (またはファイルのようなもの) であったため、その値を持ち、C++ で使用されcinます。coutcerr

于 2012-08-31T12:07:16.383 に答える
6

これは、現在のプロセス用に保存されているリソースのテーブルのインデックスであるためです。

read/write/etc各プロセスには独自のリソース テーブルがあるため、インデックスを関数に渡すだけです。

一般に、ファイル記述子は、開いているすべてのファイルの詳細を含むカーネル常駐データ構造内のエントリのインデックスです。POSIX では、このデータ構造はファイル記述子テーブルと呼ばれ、各プロセスには独自のファイル記述子テーブルがあります。ユーザー アプリケーションはシステム コールを介してカーネルに抽象キーを渡し、カーネルはアプリケーションに代わってキーに基づいてファイルにアクセスします。アプリケーション自体は、ファイル記述子テーブルを直接読み書きすることはできません。

から: http://en.wikipedia.org/wiki/File_descriptor

于 2012-08-31T11:58:08.180 に答える
2

open() は、C 型の int であるファイルのファイル記述子を返します。ファイル記述子の詳細については、http://en.wikipedia.org/wiki/File_descriptorを参照してください。

于 2012-08-31T12:03:18.127 に答える
0

「fd」はファイル記述子を表します。ファイルを識別する値です。多くの場合、(グローバル テーブル内の) インデックス、オフセット、またはポインターです。異なる API は異なるタイプを使用します。たとえば、WinAPI はさまざまなタイプのハンドル (HANDLE、HGDI など) を使用しますが、これらは基本的に int/void*/long などの typedef です。

通常、「int」のような生の型を使用するのは良い考えではありませんが、実装でそうするように指示されている場合 (この場合は POSIX のように)、そのままにしておく必要があります。

于 2012-08-31T12:04:22.590 に答える
0

簡単な答えはfd、ファイル記述子の配列へのインデックスにすぎないということです。

ほとんどのプロセスが開始されると、最初にstdin(0)、stdout(1)、およびstderr(2) の 3 つのオープン ファイル記述子が与えられます。したがって、最初のファイルを開くと、次に使用可能な配列エントリは 3 になります。

于 2012-08-31T12:04:45.200 に答える