- ベストアンサー
デバイスファイルに書き込むこと
カテゴリに迷いましたが、 Linuxにおいて/dev以下のディレクトリにデバイスファイルがありますが、最近勉強しはじめたのですが、open()やwrite(),read()を使ってデバイスファイルに対して読み書きしているプログラムをよく見かけるのですが、 質問は デバイスファイルを 「1.開く」 「2.読み書きする」 ということは内部でどのような処理を行っているのでしょうか? この辺はなんとなくでしかわかっていないので質問させていただきました。よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
デバイスドライバというカーネルに組み込まれるソフトウェアをご存知でしょうか? open()をコールすると、デバイスドライバのopenエントリに制御が渡されます。デイバスドライバは、 ・あぁ、だれかさんからオープンされたね、とだけ覚えてリターンすることもありますし、 ・次のコールされるであろうreadやwriteあるいはioctlに備えて、自身が制御するデバイスを制御して準備をしたあと、リターンすることもあります。 read()/write()でも同様に、デバイスドライバの該当するエントリに制御が渡されます。 この場合は間違いなくデバイスを制御します。 デバイスを制御するということは... 興味がおありでしたら、別スレッドででも聞いてください。 参考まで。
その他の回答 (6)
- MovingWalk
- ベストアンサー率43% (2233/5098)
こちらの方が良かったでしょうか? 細部については確認していませんが。 http://japan.linux.com/kernel/internal22/node166.shtml
お礼
どうもありがとうござます。 まさにこういう説明を求めてました。
- MovingWalk
- ベストアンサー率43% (2233/5098)
>open(devname,...)とした場合コンピューター内部で物理的にどういう >状況になったのかが知りたいです 指定のデバイスを探し、見つかれば、そのデバイスをオープンするだけです。 (デバイスをオープンすることはデバイスマネージャにデバイスオープンの リクエストをすることです) >普通のファイルであればメモリにファイルがロードされると... オープンだけでファイルがロードされることはありませんよ。
お礼
何回もありがとうございます。
- MovingWalk
- ベストアンサー率43% (2233/5098)
>>何を聞きたいのでしょうか? >どうもありがとうございます。 これでは、私の質問の答えになっていませんよ。 #2さんのソケットのオープンはopen()でできますか? また、ファイルシステムのファイルのopen()は普通のファイルのオープンです。 もっと質問の意図を明確にしてくださいといっているのですが... デバイス、例えば/dev/fd0 をオープンするということは FDデバイスを1つのファイルのようにオープンすることです。 これに先頭から書き込みをすると、FDの先頭セクタから書込みされます。
お礼
どうもありがとうございます。 >質問の意図を明確にしてくださいといっているのですが... 読み書きについてはわかりましたが、open(devname,...) とした場合コンピューター内部で物理的にどういう状況になったのかが知りたいです。 (普通のファイルであればメモリにファイルがロードされると読んだことがありますがデバイスファイルの場合はどうなんでしょうか?)
- xjd
- ベストアンサー率63% (1021/1612)
Linuxには仮想ファイルシステム(VFS)という仕組みがある。 ユーザアプリから見た場合、通常ファイル・デバイスファイルの 違いを意識せず、open/read/write/closeなど同じ関数が使える。 これは、VFSが違いを隠蔽してくれている為である。 VFSは、デバイスファイルへのシステムコール(open/read/write/close)を ファイルシステムに対応する関数ではなく、そのデバイスファイルに対応 するデバイス用の関数の呼び出しへと置き換えてくれる。 ハードウェアへのI/O操作・データ入出力は、当然ハードウェア毎に異なるが、 VFS+デバイスファイル(デバイスドライバ)が違いを吸収してくれるので、 ユーザアプリ(およびカーネル)からは、open/read/write/close で通常ファイルと同様にハードウェアを扱えるわけ。
お礼
どうもありがとうございます。 ファイルシステムについて詳しく調べてみたいと思います。
- gatyan
- ベストアンサー率41% (160/385)
たとえば、LANボードの場合、 ソケットなどを使うと、ポートという仮想的な接続点を相手にすることで通信ができる。LAN上を流れるデータから指定されたポートに向けられたデータを取り出し、プログラムに渡すまたは、データが来るまで待機するということもしてくれる。 デバイスファイルを使うと、LAN上を流れるすべてのデータを読み取ることができるが、データを解析し何のデータなのかを判断したり、扱いやすい形にするのはプログラムの仕事になる。また、相手のシステムが理解できるようにデータを作成するのはすべてプログラム側の仕事になる。つまり、デバイスファイルではデータをLANボードに渡すくらいしかしてくれない。 という感じでは?
お礼
どうもありがとうございます。 なんとなくわかりました。 お暇であればもう少しお願いしたいのですが、 例えばopen()すると、データを送受信できる状態になりますが、これは物理的にどういう状態なんでしょうか? またwrite()で"ABC"というデータをあるデバイスファイルに書き込んだ場合、そのデバイスのポートに"ABC"が書き込まれると解釈して良いのでしょうか? お暇でしたらお願いします。
- MovingWalk
- ベストアンサー率43% (2233/5098)
>デバイスファイルを >「1.開く」 >「2.読み書きする」 >ということは内部でどのような処理を行っているのでしょうか? 開く: デバイスのデータを読み書きできるようにします。 読み書きする: デバイスからデータを読み書きします。 あれ、当たり前の答えになっちゃいましたが... でも、何を聞きたいのでしょうか?
お礼
どうもありがとうございます。
お礼
どうもありがとうございます。 雰囲気はわかりました。 後はopen()やread()のソースコードを解読するのがてっとり早そうなのでそちらでがんばってみます。 機会があればまた質問したいと思います。