Linuxのファイルディスクリプタについて、検索したもののあまり理解できずにいます。

詳しい解説サイトもしくは、わかりやすく説明していただけないでしょうか。

私の知識はLPIC Lv1程度ですので平易な表現だと助かります。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2009/02/09 22:34:05
  • 終了:2009/02/16 22:35:03

回答(2件)

id:longicorn No.1

longicorn回答回数56ベストアンサー獲得回数62009/02/10 00:01:26

ポイント35pt

ファイルディスクリプタという概念は基本的にUnix+C言語での概念です。


まずはC言語のプログラムから。

(テスト用プログラムなのでclose(2)していないけど気にしないでください。)

$ cat foo.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
        int fd1,fd2;

        fd1 = open("a", O_RDONLY);
        fd2 = open("b", O_RDONLY);
        printf("fd1 = %d fd2 =%d\n", fd1, fd2);

        //ここ以降でread(2)とかを行う。
        //たとえば
        //read(fd1, buf, 1024);
        //とか

        return 0;
}

これを実行するとこんな感じになります。

$ ./foo
fd1 = 3 fd2 =4

この場合ファイルディスクリプタはopen(2)の返り値であるfd1、fd2です。

このファイルディスクリプタをwrite(2)、read(2)関数などに渡してファイルへアクセス出来ます。


プログラムをみると分かりますがこれは単なるint型の値です。

この値はカーネル側がプロセス毎に管理している値です。わかりやすく言えばこの値はカーネル内部で作成したファイル固有データへのインデックスです。

まあ大体は構造体だとは思います。


なぜファイルディスクリプタが必要かですが、

もし、open(2)からファイルディスクリプタが帰らない場合は、open(2)した後にread(2)を呼んだ場合にカーネル側は"a"に対してか"b"に対してのどちらの操作か分かりません。

よって、カーネル側からopen()の戻り値としてファイルディスクリプタをプログラム側に返しておきます。

そしてプログラム側からカーネル側に、read(2)などの操作を行う関数の使用時にファイルディスクリプタを教えます。

これによりカーネル側はopen()時に作成した内部データにアクセスが可能になります。

id:hyo-suke No.2

hyo-suke回答回数43ベストアンサー獲得回数52009/02/10 00:12:02

ポイント35pt

UNIXでは、通常のファイルやディレクトリだけではなく、ネットワーク(socket)やパイプなど、入出力可能なさまざまなリソースを「ファイル」として扱います。ファイルディスクリプタとは、これらのファイルを指す識別子です。

なぜこのようなものがあるかというと、抽象化のためです。

上記に挙げたようなさまざまなリソースがコンピュータにはありますが、そのリソースを扱うためには、本来はそのリソースに応じた処理を行う必要があります。しかし、それらをすべて「ファイル」として扱うことで、共通の操作(読み込んだり、書き込んだり)でアクセスすることができるようになります。またそれにより、入出力先を簡単に切り替えたりできます。(例えばprintf()は本来、stdout(標準出力)に指定した文字を出力(例えばディスプレイに表示)しますが、>(リダイレクト)することで、この出力先を通常のファイルなどに変えることができます。これは抽象化によって実現できていることです。)

  • id:kn1967
    LPICですか・・・受けたら落ちるだろうなぁ・・・。
    普段使わない知識は概要だけ覚えていて詳細は忘れるから・・・。
    詳細まで覚えていたって時間がたてば微妙に違ってくるものだし・・・。
    単に脳みそが老化してきているとも言うか?

    それはさておき、ファイルディスクリプタ・・・
    単語の意味だけが知りたい訳じゃないですよね?
    どうして調べる必要性が出てきたのかを書いたほうが
    それに即した説明が来ると思いますよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません