答えに近づいた気がします。お伺いを立てて行います。「ファイルオープンしたいんですけどー」という申請を受けて、そのファイルがシステム的に保護されてないかとか、他のプログラムから「独占的に使いたいから他のプログラムに使わせちゃダメ」とか言われてないかとか調べて、使ってもオーケーならファイルハンドルを渡します。「終わったよー」と申請してクローズします。http://q.hatena.ne.jpなるほど。プログラムが直接HDDにアクセスすることはないと。OSに「ファイルオープン」を依頼してるだけだと。オープンの際のHDDの動作は謎のままですね。08:49:2416ptコンピュータの世界ではレイヤーという考え方が基本にあります。(Windowsなど)アプリケーションこのレイヤーをごっちゃにしてコンピュータを理解することはできません。ディスクの磁気やチップの電荷などは物理レイヤーです。それぞれにドライバやファームなどの制御の仕組みが働いています。それをコントロールするのはBIOSというプログラムです。BIOSは、物理レイヤーと論理レイヤーの橋渡しをします。OSが稼働しています。OSは自分のデバイスドライバというプログラムを使って下層のBIOSと連携し、上層のアプリケーションレイヤーとの橋渡しをします。「ファイルを開く」はOSがデバイスドライバを使って下層のBIOSにデータの読み出しを指示します。BIOSは物理レイヤーからデータを取り出して上層のOSに返します。OSはもらったデータを上層のアプリケーションレイヤーに渡します。OSには、ファイルシステムという仕組みがあります。WindowsではNTFSなどがファイルシステムです。これはファイルの目次情報と、ディスク上のデータのアドレスの番地情報の橋渡しをします。ディスク上では単なる01の磁気ですが、ファイルシステムによってファイルごとの意味のある情報になり、BIOSからOSに渡されてファイルという論理的な情報になります。http://blog.livedoor.jp/papavolvol/URLは私のブログです。今回の回答と直接の関連ではありませんが、ご縁がありましたら一度お越しくださいね。他3件のコメントを見る細かい話ですが、Windowsなど現在のOSではBIOSはOS起動時以外使いません(使えません)。大筋は書かれたとおりであってますが。9x系がどっちだったか...)。13:23:38ありがとうございます。読み替えればよいでしょうか。レイヤになってるのは理解しました。「開く」=「読み出しを指示します」は変じゃないでしょうか。openとreadは別ですよね。私の質問は、「読む」は直感的に理解できるが、「開く」は何か?です。08:15:23たとえば、ファーストフードのお店にいって、いくつかハンバーガーを買おうと思って列に並ぶという行為を想定したとき、ハンバーガを1つ頼むたびにお金を払って、また列に並びなおして、2つ目のハンバーガを買って......とはしないですよね。※この例だと店から買うだけなので、一方向ですがたとえ話ということでご容赦を)最後に決済して注文したものをもらう(close)といったノリになると思います。コンピュータ的にいうと、読み出す前に、読み書きの間に別のユーザやプロセスがそのファイルを使えないようにするロック処理、ユーザから指定されたファイル名と、ファイルシステム上のファイルIDとの対応付けを行ったうえで、一時受け渡し用の領域を整備したり、アクセス権のチェックを行ったりという処理が入ります。これをread/writeの度に行うこともできますが、前作業のオーバーヘッドが大きい、もしくは一連の書き込みを行うまで、他のプロセスから書き込みを入れさせたくないといったことがあるので、一連のread/writeの前に一度openという形で行い、一連のread/writeの完了時点で領域の開放(close)という処理を行うのが一般的ですという話です。ファイルハンドルは、それらの一時的な管理情報を示すタグであると考えればよいでしょう。別のところでも書いたように、現在のソフトウェアは何層にもわたった階層構造になっていますので、アプリケーションがハードディスクにどのようにかかれるかを意識することはできませんし、その必要もありません。12:47:14なるほど。closeのようなものと考えればよいでしょうか。セッション開始とセッション終了のようなものであると。ハンバーガー屋さんの例は大変わかりやすいですね!ありがとうございます。22:15:31セッション開始と終了のようなもの、という理解でよいと思います。どこかのコメントで、わざわざ「fopenでいうopenの場合」みたいな断りを入れましたが、セッションや開始、終了という概念は、いろんなレイヤで使われます。ファイルのオープンからクローズまでの一連の流れもセッションと捉えることもできますし、逆にconnect-closeを、セッションのオープン、セッションのクローズという表現で記載することもできます。10:55:5616ptコンピュータの中でOPEN、CLOSEと言われると確かに現在ではイメージしづらいかも知れません。元々の発想や、旧来のコンピュータを考えると逆にイメージしやすいと考えます。ファイルってご存知ですかね。コンピュータのではありません。キングやコクヨといった事務用品メーカの作っているファイルです。コンピュータの黎明期というか、ノイマン以前の事務機械ってファイルとかバインダといった紙書類の保管システムの更新として期待されていたものですから、その当時の用語が残っています。初期のコンピュータだとメモリやDASDといった外部記憶媒体の容量が小さかったから差替えながら使っていましたからね。用語をそのまま使っていても違和感を感じなかったのでしょう。実際にファイルをOpenするということは、パソコンだとFATなどを参照してハードディスク上のデータを特定してメモリに展開する。closeはメモリのロックを外して開放するといった動作になります。http://support.microsoft.com/kb/100108/ja「パソコンだとFATなどを参照してハードディスク上のデータを特定してメモリに展開する。」何をメモリに展開するのでしょうか?これは、readの説明に見えます。紙ファイルを「開く」ときは、紙ファイルそのものの形状が変わりますよね。13:59:5315pt「概念」として理解したいのであれば、裏側をあまり意識しない方が理解できると思います。裏側にしても、ハードディスクへの読み書きから順番に理解していくのは相当技術力が必要だと思います。土地に倉庫を建てるという例でOSあたりを中心に概念的に説明すると。だだっぴろい土地がある状態→未フォーマットのハードディスク土地を(たとえば)1m四方に区切り、たとえば4行5列目、といったらどこの部分を示すかがわかるようにすること→物理フォーマットOSさんから倉庫(ファイル)をいくつか建てる依頼がくる前提で、個々の倉庫の識別方法や、倉庫の大きさ(たとえば45平米)、IDなどで指示できるように整理し、実際にどこの区画にどういう大きさで立てたかを管理できるように定義すること→論理フォーマット(ファイルシステムの作成)といった前準備がまず発生します。9で)で建ててほしいと倉庫業者(デバイスドライバ)に依頼。3つ目の倉庫なので管理番号は3、倉庫名はお客さんからの指示の名称をつけて管理(倉庫名は変更されることもあるので)、空きスペース36平米といった管理作業を行う。倉庫業者は建設業者(ハード)に依頼して倉庫を建てる。いった作業が発生します。ファイルをオープンする場合はお客さんが倉庫名(ファイル名)を指定して、借用している倉庫にものを置きたい。倉庫名はfile1ですと倉庫管理会社に依頼(fopen発行)倉庫管理会社が、受付担当者をアサインしました。以降今回の倉庫への搬入はこの担当者にお願いしますと返答(fopenの返答としてfpを返却)では4平米の荷物をお願いしますと依頼(write)受付担当者(OS)は、スペースを確認した上で、荷物を倉庫に置くよう、倉庫業者(デバイスドライバ)に依頼。その際、倉庫名から対応表を使って割り出した倉庫識別番号を渡す。倉庫業者は倉庫識別番号と空きスペース情報を元に、倉庫に荷物を持っていく建設業者(ハード)は、倉庫内に、たとえば2x2でおくか、4x1で置くかなどを考え、実際に倉庫に荷物を置く。引き続き、追加で荷物を置いたり、既存の荷物の搬出を行わない場合は、今回のやりとりの完了をお願いする(fclose)といった感じになると思います(少し抜けもれあると思いますが)これらを実際にはプログラムで行うので、プログラムでどう実装されているかはまた別のレベルの理解が必要になります。http://www.google.com/なるほど、わかりやすい説明をありがとうございます。openというのが、「プログラムからOSへの依頼とその返答」であることがよくわかりました。相互作用の話であって、OS⇔物理メディアの相互作用の話ではない、と理解しました。08:22:16openというのがfopenなどのことであれば、その理解でよいと思います。別のところで、階層構造になっているという話もでていると思いますが、これは言い換えると下の階層の動作が(いい意味で)隠蔽されているということも意味します。郵便を出すときに、その郵便物がどうやって相手の手元に届くかは理解していなくても郵便を出す、期日を指定するといったことが可能なのと似ています。わたしの例で言うと、たとえば4平米の荷物を置いてくださいという指示の際に、お客さんは、どこの区画にどうおくかは意識する必要ないし、できないということです。提供する機能の一部であるファイルシステムについて学ぶ必要があります。深く知るならファイルシステムでググるのが良いと思います。ファイルシステムについて勉強すればよいのですね。「私はファイルシステムをわかっていない」ということがわかりました。これは大きな一歩です。ありがとうございました。22:42:4315pt昔は「ファイル」なんて便利なものはなくて、ディスクのトラックやセクタを番号で指定して読み書きしていたんですよ。読み書き、とは補助記憶装置と主記憶との間でバイト列をやりとりすることです。http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%BB%E3%82%AF%E3%82%BFでもそれだとディスクを読み書きするプログラムがどのセクタに何のデータを格納するかきめなくちゃいけないし、いろいろめんどくさいので、「ファイル」という考え方を賢い人が思いついたわけです。ファイルの中身はバイト列にすぎないわけだけど、そのバイト列がディスクのどのトラックのどのセクタに格納されているか、なんてのはファイルを読み書きする側からは知らなくてよい、そういうのはファイルシステムが全部めんどうをみてくれるわけです。そのファイルシステムとアプリケーションプログラムとの間でおこなう取り決めとして、「ファイル名」という名前を使って「開く」ことでファイルを掴む「ハンドル」を得て「読み書きする」、もう使わなくなったら「閉じ」て、掴んでいたハンドルを開放する、というアクセスの手段が「ファイルを開く」ということです。08:26:41ふつう大きなファイルなら二つ以上のセクタに格納されていますからハンドルとセクタがそんな単純に対応づいたりはしないです。このファイルはディスク上のどこからどこまで使っている、などというのをファイルシステムが管理しています。ハンドルを開放しなければならないのは、ファイルアクセスがコンピュータにとって非常に重くて遅い仕事だっていう感じを持てばわかると思います。ディスク上にファイルを大量につくっておくことはできても、ファイルを本当に同時に読み書きできるのはせいぜい数個にすぎません。いまからこのファイルを読み書きしますよ、と言って開いて、もう読み書きしませんと言って閉じるわけです。しないと誰かがファイルを読み書きしていると他の人がファイルを読み書きできなくなります。そのもうアクセスしませんと言うのがファイルを閉じるでありハンドルを開放するということです。16:22:53そうすると、ハンドルを獲得するというのは、読み書きする権利を獲得すること、ハンドルを開放するとうのは、その権利を手放すこと、ということになるんですかね。イメージがわいてきました。05:53:2415pthttp://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0OSはディスクに対して0か1かをビット単位で直接アクセスすることは稀です。