許せない心理テスト

C言語のread関数に関するファイルディスクリプタについて質問です。

open関数から得られたファイルディスクリプタを、一般的には変数(例:fd)に代入して、fdをread関数や、write関数の第1引数として用いるんですが、ファイルディスクリプタは数値のはずなので、それを引数として用いてもどうやってそこからパス情報を得ることが出きるのかが分かりません。
例えば以下のような場合です。

******

省略

fd = open("/home/XXX/YYY", O_RDONLY);

read(fd, buf, 10);

省略

******

誰か詳しい方がおりましたら、どうかご教授よろしくお願い致します。

A 回答 (7件)

>open関数からの返り値はアドレス的な意味をもつということでしょうか



配列の添字であり、それ以上でも以下でもありません。
配列の添字は「アドレス的な意味を持つ」とあなたが思うのであればそうです。

>というのも、課題でopen,read関数等を自力で作成せよ、というような課題が出されたので、どうにかして作成したいので・・・

Unix/Linuxでは、openやreadはシステムコール(言語から扱える一番下位レベルの関数)なので、openやreadを呼び出すことなしに同じ機能の関数を作ることは不可能です。

Windowsであれば、Win32APIなどがシステムコールに当たると思いますので、それらを使えばopen/read相当を自作するのは可能でしょう。
システムコールを呼び出すのに必要な情報を全部持ったような構造体の配列を作ればいいわけです。その添字がファイルディスクリプタです。
    • good
    • 0
この回答へのお礼

遅くなってしまい申し訳ありません.
回答して頂きありがとうございました.

お礼日時:2012/02/09 17:13

大雑把に言うと、OS内部でopenしたデバイス(ファイルの形式を取っていても「ファイル」とは似ても似つかない場合もあるのがミソ)とディスクリプタ番号の符合を行っているだけです。

    • good
    • 0
この回答へのお礼

遅くなってしまい申し訳ありません.
回答して頂きありがとうございました.

お礼日時:2012/02/09 17:13

そもそもファイルディスクリプタから「パス情報を得る」というのが何を意味するのかわかりません. 実際にデータを読み書きするときに「パ

ス情報」が必要とは思えないよね?
    • good
    • 0
この回答へのお礼

遅くなってしまい申し訳ありません.
回答して頂きありがとうございました.

お礼日時:2012/02/09 17:13

ひとまずプラットホームはなんでしょうか?



「WindowsのWIN32APIを使ってopen,read,write,close互換ライブラリを作ろう」
とかなら意味わかりますけど、
unixやlinuxだとopen,read,write,closeはシステムコールなので
open,read,write,close互換ライブラリを作ろうとしたところで
結局システムコールのopen,read,write,close使うことになってしまいますが。
    • good
    • 0
この回答へのお礼

遅くなってしまい申し訳ありません.
回答して頂きありがとうございました.

お礼日時:2012/02/09 17:13

open(), read() を「関数」と言ってますが、システムコールですよ?


システムコールを自作したいと言ってる?

この回答への補足

あまり知識がないもので、すいません(^^;)。

これは自作できるようなものではないのでしょうか

補足日時:2012/01/26 21:47
    • good
    • 0
この回答へのお礼

遅くなってしまい申し訳ありません.
回答して頂きありがとうございました.

お礼日時:2012/02/09 17:13

おおざっぱに動作を書けば次のようになります。



openでファイル等と番号を関連付ける。OSでその関係を覚えておく
→ read等で番号を指定する
→OSでその番号に関連付けてあるファイル等にアクセスする


パス情報っていうのがどこから出てきたのか、よくわかりません

この回答への補足

回答ありがとうございます。

パス情報は、絶対パスや相対パスをここでは言っています。(上の例では/home/XXX/YYYです)説明不足ですいません(^^;)。

下の方の補足にも記述したんですが、もしoepn関数やread関数を自力で作成するときは、どのようにしたらいいのでしょうか

補足日時:2012/01/26 21:25
    • good
    • 0
この回答へのお礼

遅くなってしまい申し訳ありません.
回答して頂きありがとうございました.

お礼日時:2012/02/09 17:12

ちょっと不正確ですがわかりやすく説明するなら、


ファイル入出力ライブラリはその内部でファイル入出力に必要な情報を管理する配列を持っています。
open関数はその管理配列の中で使用されていない要素を選び出し、その配列要素の中に必要な情報を格納したあと、その要素番号をファイルディスクリプタとして返します。
read関数では、受け取ったfdをもとにその管理用配列にアクセスすれば、必要な情報を取得できる、という流れになります。

この回答への補足

回答ありがとうございます。

open関数からの返り値はアドレス的な意味をもつということでしょうか

そうすると、もし自作のopen,read関数を作成するときには、どのようにしたらいいのでしょうか

というのも、課題でopen,read関数等を自力で作成せよ、というような課題が出されたので、どうにかして作成したいので・・・

補足日時:2012/01/26 21:25
    • good
    • 0
この回答へのお礼

遅くなってしまい申し訳ありません.
回答して頂きありがとうございました.

お礼日時:2012/02/09 17:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報