人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Linuxのファイルディスクリプタについて、検索したもののあまり理解できずにいます。
詳しい解説サイトもしくは、わかりやすく説明していただけないでしょうか。

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

●質問者: jumpe
●カテゴリ:コンピュータ インターネット
✍キーワード:Linux LPIC サイト ディスクリプタ ファイル
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● longicorn
●35ポイント

ファイルディスクリプタという概念は基本的に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()時に作成した内部データにアクセスが可能になります。


2 ● hyo-suke
●35ポイント

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ