アプリ版:「スタンプのみでお礼する」機能のリリースについて

カテゴリに迷いましたが、
Linuxにおいて/dev以下のディレクトリにデバイスファイルがありますが、最近勉強しはじめたのですが、open()やwrite(),read()を使ってデバイスファイルに対して読み書きしているプログラムをよく見かけるのですが、

質問は
デバイスファイルを
「1.開く」
「2.読み書きする」
ということは内部でどのような処理を行っているのでしょうか?

この辺はなんとなくでしかわかっていないので質問させていただきました。よろしくお願いします。

A 回答 (7件)

>デバイスファイルを


>「1.開く」
>「2.読み書きする」
>ということは内部でどのような処理を行っているのでしょうか?

開く:
 デバイスのデータを読み書きできるようにします。
読み書きする:
 デバイスからデータを読み書きします。

あれ、当たり前の答えになっちゃいましたが...
でも、何を聞きたいのでしょうか?
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

お礼日時:2003/09/20 18:43

たとえば、LANボードの場合、



ソケットなどを使うと、ポートという仮想的な接続点を相手にすることで通信ができる。LAN上を流れるデータから指定されたポートに向けられたデータを取り出し、プログラムに渡すまたは、データが来るまで待機するということもしてくれる。

デバイスファイルを使うと、LAN上を流れるすべてのデータを読み取ることができるが、データを解析し何のデータなのかを判断したり、扱いやすい形にするのはプログラムの仕事になる。また、相手のシステムが理解できるようにデータを作成するのはすべてプログラム側の仕事になる。つまり、デバイスファイルではデータをLANボードに渡すくらいしかしてくれない。

という感じでは?
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
なんとなくわかりました。

お暇であればもう少しお願いしたいのですが、

例えばopen()すると、データを送受信できる状態になりますが、これは物理的にどういう状態なんでしょうか?

またwrite()で"ABC"というデータをあるデバイスファイルに書き込んだ場合、そのデバイスのポートに"ABC"が書き込まれると解釈して良いのでしょうか?

お暇でしたらお願いします。

お礼日時:2003/09/20 18:49

Linuxには仮想ファイルシステム(VFS)という仕組みがある。



ユーザアプリから見た場合、通常ファイル・デバイスファイルの
違いを意識せず、open/read/write/closeなど同じ関数が使える。

これは、VFSが違いを隠蔽してくれている為である。

VFSは、デバイスファイルへのシステムコール(open/read/write/close)を
ファイルシステムに対応する関数ではなく、そのデバイスファイルに対応
するデバイス用の関数の呼び出しへと置き換えてくれる。

ハードウェアへのI/O操作・データ入出力は、当然ハードウェア毎に異なるが、
VFS+デバイスファイル(デバイスドライバ)が違いを吸収してくれるので、
ユーザアプリ(およびカーネル)からは、open/read/write/close
で通常ファイルと同様にハードウェアを扱えるわけ。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
ファイルシステムについて詳しく調べてみたいと思います。

お礼日時:2003/09/20 18:51

>>何を聞きたいのでしょうか?


>どうもありがとうございます。
これでは、私の質問の答えになっていませんよ。

#2さんのソケットのオープンはopen()でできますか?
また、ファイルシステムのファイルのopen()は普通のファイルのオープンです。
もっと質問の意図を明確にしてくださいといっているのですが...

デバイス、例えば/dev/fd0 をオープンするということは
FDデバイスを1つのファイルのようにオープンすることです。
これに先頭から書き込みをすると、FDの先頭セクタから書込みされます。
    • good
    • 1
この回答へのお礼

どうもありがとうございます。

>質問の意図を明確にしてくださいといっているのですが...

読み書きについてはわかりましたが、open(devname,...)
とした場合コンピューター内部で物理的にどういう状況になったのかが知りたいです。
(普通のファイルであればメモリにファイルがロードされると読んだことがありますがデバイスファイルの場合はどうなんでしょうか?)

お礼日時:2003/09/20 23:16

>open(devname,...)とした場合コンピューター内部で物理的にどういう


>状況になったのかが知りたいです
指定のデバイスを探し、見つかれば、そのデバイスをオープンするだけです。
(デバイスをオープンすることはデバイスマネージャにデバイスオープンの
リクエストをすることです)

>普通のファイルであればメモリにファイルがロードされると...
オープンだけでファイルがロードされることはありませんよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/09/24 21:34

こちらの方が良かったでしょうか?


細部については確認していませんが。
http://japan.linux.com/kernel/internal22/node166 …

参考URL:http://japan.linux.com/kernel/internal22/node166 …
    • good
    • 0
この回答へのお礼

どうもありがとうござます。
まさにこういう説明を求めてました。

お礼日時:2003/09/24 21:36

デバイスドライバというカーネルに組み込まれるソフトウェアをご存知でしょうか?



open()をコールすると、デバイスドライバのopenエントリに制御が渡されます。デイバスドライバは、
・あぁ、だれかさんからオープンされたね、とだけ覚えてリターンすることもありますし、
・次のコールされるであろうreadやwriteあるいはioctlに備えて、自身が制御するデバイスを制御して準備をしたあと、リターンすることもあります。

read()/write()でも同様に、デバイスドライバの該当するエントリに制御が渡されます。
この場合は間違いなくデバイスを制御します。

デバイスを制御するということは...
興味がおありでしたら、別スレッドででも聞いてください。

参考まで。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
雰囲気はわかりました。
後はopen()やread()のソースコードを解読するのがてっとり早そうなのでそちらでがんばってみます。
機会があればまた質問したいと思います。

お礼日時:2003/09/24 21:38

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