0

ファイルを書き込むプロセスが多数あります(任意のファイルを一度書き込むことができます)。ファイルを開いたり、書き込んだり、閉じたりします。また、ファイルを読み取る多くのプロセスがあります。ファイルサイズはさまざまです。そのような必要があります: 一部のプロセスが現時点で書き込み中のファイルを読み取ろうとすると、書き込み後にファイルが閉じられたときに完全なコンテンツを読み取る必要があります。書き込み時にロックし、読み取り時にロックが解除されるのを待つ必要があります。重要: file が file を読み取り、それができない場合、それ自体で file を書き込みます。1. ファイルの読み取りを試みる 2. ファイルが存在しない場合は、ファイルに書き込む

したがって、非同期モードの場合、ファイルを読み取れないためにファイルを書き込みたいプロセスが複数存在する可能性があります。ファイルの書き込みをロックする必要があり、すべてのリーダーはこれを待つ必要があります

4

2 に答える 2

2

ファイルのロックは、オペレーティング システム固有のものです。

Unix ライクなシステム

Unix ライクなシステムは、一般にflock(),fcntl()およびlockf()システム コールをサポートしています。ただし、lockfアドバイザリ ロックは別として、これは Posix 標準の一部ではないため、オペレーティング システム固有のドキュメントを参照する必要があります。

Linux のドキュメントは次のとおりです。

fcntl()ロックするだけでなく、多くのことを行うことに注意してください。

また、ほとんどの場合、UNIX ライクなシステムでのロックは助言、つまり協力的な取り組みであることにも注意してください。両当事者が参加する必要があり、単にロックを無視する可能性があります。強制ロックは可能ですが、一般的なパラダイムでは使用されません。

ウィンドウズ

Windows では、必須のファイル ロック (共有モードでCreateFile) と範囲ロックLockFileExは正常であり、アドバイザリ ロックは使用できませんが、エミュレートすることはできます (通常、0xffffffffまたはで 1 バイトの範囲ロックを使用し0xffffffffffffffffて - ロックされた部分が実際に存在する必要はないため、これは、ファイルがそれほど大きいことを意味するものではありません)。

代替案

説明したシナリオの代替手段は、単に別の名前でファイルを作成し、完了したら名前を変更することです。

たとえば、ファイルの名前を「data-20130719-112258-99823.csv」にする場合は、代わりに「tmpdata-20130719-112258-99823.csv.tmp」という名前のファイルを作成し、完全に書き込んだら名前を変更します。

于 2013-07-19T10:24:45.783 に答える
1

この問題を処理する標準的な方法は、一時ファイル名に書き込み、書き込みが完了したらファイルの名前を変更することです。

ファイルを待機している他のプロセスは、実際のファイルの存在を監視する必要があります (ファイル システム ウォッチャーまたは同様のメカニズムを使用)。ファイルが「現れる」とき、書き込みはすでに完了しています。

于 2013-07-19T10:17:31.867 に答える