- ベストアンサー
C言語のread関数についての疑問
- ファイルディスクリプタを使用するC言語のread関数についての疑問です。
- open関数で得られたファイルディスクリプタをread関数に渡す方法が分かりません。
- 具体的なコード例を挙げながら質問しています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>open関数からの返り値はアドレス的な意味をもつということでしょうか 配列の添字であり、それ以上でも以下でもありません。 配列の添字は「アドレス的な意味を持つ」とあなたが思うのであればそうです。 >というのも、課題でopen,read関数等を自力で作成せよ、というような課題が出されたので、どうにかして作成したいので・・・ Unix/Linuxでは、openやreadはシステムコール(言語から扱える一番下位レベルの関数)なので、openやreadを呼び出すことなしに同じ機能の関数を作ることは不可能です。 Windowsであれば、Win32APIなどがシステムコールに当たると思いますので、それらを使えばopen/read相当を自作するのは可能でしょう。 システムコールを呼び出すのに必要な情報を全部持ったような構造体の配列を作ればいいわけです。その添字がファイルディスクリプタです。
その他の回答 (6)
- D-Matsu
- ベストアンサー率45% (1080/2394)
大雑把に言うと、OS内部でopenしたデバイス(ファイルの形式を取っていても「ファイル」とは似ても似つかない場合もあるのがミソ)とディスクリプタ番号の符合を行っているだけです。
お礼
遅くなってしまい申し訳ありません. 回答して頂きありがとうございました.
- Tacosan
- ベストアンサー率23% (3656/15482)
そもそもファイルディスクリプタから「パス情報を得る」というのが何を意味するのかわかりません. 実際にデータを読み書きするときに「パス情報」が必要とは思えないよね?
お礼
遅くなってしまい申し訳ありません. 回答して頂きありがとうございました.
- wormhole
- ベストアンサー率28% (1626/5665)
ひとまずプラットホームはなんでしょうか? 「WindowsのWIN32APIを使ってopen,read,write,close互換ライブラリを作ろう」 とかなら意味わかりますけど、 unixやlinuxだとopen,read,write,closeはシステムコールなので open,read,write,close互換ライブラリを作ろうとしたところで 結局システムコールのopen,read,write,close使うことになってしまいますが。
お礼
遅くなってしまい申し訳ありません. 回答して頂きありがとうございました.
- trapezium
- ベストアンサー率62% (276/442)
open(), read() を「関数」と言ってますが、システムコールですよ? システムコールを自作したいと言ってる?
お礼
遅くなってしまい申し訳ありません. 回答して頂きありがとうございました.
補足
あまり知識がないもので、すいません(^^;)。 これは自作できるようなものではないのでしょうか
- kmee
- ベストアンサー率55% (1857/3366)
おおざっぱに動作を書けば次のようになります。 openでファイル等と番号を関連付ける。OSでその関係を覚えておく → read等で番号を指定する →OSでその番号に関連付けてあるファイル等にアクセスする パス情報っていうのがどこから出てきたのか、よくわかりません
お礼
遅くなってしまい申し訳ありません. 回答して頂きありがとうございました.
補足
回答ありがとうございます。 パス情報は、絶対パスや相対パスをここでは言っています。(上の例では/home/XXX/YYYです)説明不足ですいません(^^;)。 下の方の補足にも記述したんですが、もしoepn関数やread関数を自力で作成するときは、どのようにしたらいいのでしょうか
- mtaka2
- ベストアンサー率73% (867/1179)
ちょっと不正確ですがわかりやすく説明するなら、 ファイル入出力ライブラリはその内部でファイル入出力に必要な情報を管理する配列を持っています。 open関数はその管理配列の中で使用されていない要素を選び出し、その配列要素の中に必要な情報を格納したあと、その要素番号をファイルディスクリプタとして返します。 read関数では、受け取ったfdをもとにその管理用配列にアクセスすれば、必要な情報を取得できる、という流れになります。
お礼
遅くなってしまい申し訳ありません. 回答して頂きありがとうございました.
補足
回答ありがとうございます。 open関数からの返り値はアドレス的な意味をもつということでしょうか そうすると、もし自作のopen,read関数を作成するときには、どのようにしたらいいのでしょうか というのも、課題でopen,read関数等を自力で作成せよ、というような課題が出されたので、どうにかして作成したいので・・・
お礼
遅くなってしまい申し訳ありません. 回答して頂きありがとうございました.