3

一度に 2 つの有効なハンドルを持つように、単一のスレッド内で (CreateFile() を使用して) 単一のファイルを 2 回開いた場合、2 つのファイル ハンドルは共有の「ファイル ポインター」(SetFilePointer()) を持ちますか?ハンドルには独立した「ファイルポインタ」がありますか?

代わりに、1 つのプロセスに 2 つの同時スレッドがあり、それぞれが同じファイルへの 1 つのハンドルを保持しているとしたらどうでしょう。これらの 2 つのハンドルは独立したファイル ポインターを持ちますか?

4

3 に答える 3

3

スレッドがファイルを開くたびに、ハンドル固有の属性の新しいセットを使用して新しいファイルオブジェクトが作成されます。たとえば、現在のバイトオフセット属性は、そのハンドルを使用した次の読み取りまたは書き込み操作が発生するファイル内の場所を参照します。基になるファイルが共有されている場合でも、ファイルへの各ハンドルにはプライベートバイトオフセットがあります。プロセスがファイルハンドルを別のプロセスに複製する場合(Windows DuplicateHandle関数を使用)、または子プロセスが親プロセスからファイルハンドルを継承する場合を除いて、ファイルオブジェクトもプロセスに固有です。このような状況では、2つのプロセスには、同じファイルオブジェクトを参照する別々のハンドルがあります。Windows Internals5th

于 2013-01-23T13:22:49.750 に答える
2

個別のファイル ハンドルには個別のファイル ポインターがあるため、これらのシナリオは問題なく機能します (たとえば、2 つのスレッドがそれぞれ独自のファイル ハンドルを排他的に使用する限り、同じファイルの異なるセクションから "同時に" 読み取ることができます)。

于 2013-01-23T12:56:03.030 に答える
1

個別の呼び出しによって作成されたファイル ハンドルは、CreateFile独立したファイル ポインターを持ちます。意図したとおりに、それらを別々のスレッドで使用できます。

DuplicateHandle ファイル ポインタを共有することによって複製されたハンドル: 別のスレッドで使用される「別の」ファイル ハンドルを取得するために使用しないでください。

于 2013-01-23T13:03:25.087 に答える