Linuxで書き込み中にファイルを読み取る


9

私が理解しているように、ファイルが書き込まれているとき、ファイルへの書き込みプロセスは排他ロックを取得します。したがって、他のプロセスはこのファイルにアクセスして読み取ることができません。

上記の知識があるため、ブラウザがまだビデオをダウンロードしているときに、メディアプレーヤーでビデオを再生する方法を理解できません。


1
反対投票の理由を指定してください。ありがとう。
ソーター2015年

2
これはプラットフォームに依存するため、対象のOSを指定してください。Linuxは暗黙のロックを提供しないことを知っていますが、Windowsは異なる場合があります。
amon 2015年

私はLinuxを使用しています
ソーター2015年

回答:


13

あなたの理解は間違っています。複数のLinuxプロセスが同じファイルに一度に書き込むことができます(プロセスがそのファイルの異なるセグメントを上書きする場合を除いて、その後の動作は不特定になる場合があります)。また、他の一部のLinuxプロセス(ブラウザなど)は、に書き込まれたファイルを読み取ることができます

あなたはそれを避けるために慣習採用することができます。たとえば、アドバイザリファイルロック(関連するすべてのプログラムが行う規則を採用)を使用できます。たとえば、flock(2)lockf(3)などを使用します。その規則にアクセスして、そのファイルにアクセス(または書き込み)します。許可機構を使用する場合があります(たとえば、システムユーザーをsetuidプログラム専用にするなど)。

StackOverflowでこれその回答も参照してください(非推奨の強制ロック Linux固有のメカニズムについて言及されているものもあります)。ACIDプロパティについて読み、いくつかのデータベース(sqlitePostGreSQLMongoDBなど)またはいくつかのインデックス付きファイル(gdbm)の使用を検討してください。

私はWindowsを知りませんが、同じファイルへの同時アクセスまたは書き込みを許可しないという噂を聞きました。


4

ファイルは通常ロックされていません-UNIXファイルロック。また、ファイルのリーダーは複数あるがライターは1つだけである場合もよくあります。複数のライターがある場合にのみ問題が発生します。

また、ほとんどのビデオファイル形式(特にWeb上)はストリーミング可能です。つまり、ビデオ全体を再生する必要はありません。


大きなファイルをメモリに読み込まないようにする場合など、ファイルの内容を読み取り間で変更しないようにすると、問題が発生する可能性があります。
yyny

2

Unix OSは強制ロックを使用しません(Gnu / LinuxはUnix、他の例はUNIX、BSD、Mac OSXです)。可能な限り回避されるようなロック。

他のいくつかのOSは常に強制ロックを使用しています(特にMicrosoftのWindows OS)。これにより、完全にダウンロードされるまで再生が停止します。また、開いている(アプリケーションが存在する)ファイルまたはディレクトリの名前を変更することも停止します。しかし、Unixでは問題ありません。アプリケーションでロックが必要な場合は、それを使用できます。しかし、通常はそうではありません。


Windowsでもファイルをロックしないように選択できます。ダウンロードした動画の半分をいつも再生しています。ロックは、ロードされた実行可能ファイルにのみ必要です。
CodesInChaos

@CodesInChaos真実ですが、ほとんどのアプリはロックします。ロックせずにディレクトリに移動できるかどうか知っていますか?また、私はただ考えています.Linuxの実行可能ファイルはロックなしでどのように機能しますか(両方のシステムはジャストインロードで使用されるため、ビットはプログラム開始後長時間ロードできます)、それはその超能力を使用している可能性があります。
ctrl-alt-delor 2015年

1
LinuxとWindowsの大きな違いは、Linuxはファイルをファイルシステムエントリとは別に扱うということです。そのため、ファイル名を開いている間にリンクを解除できます。一方、Windowsは、閉じるまで削除を遅らせます。Linuxは実行中の実行可能ファイルの変更を許可しますか?それとも、異なるコンテンツでの削除+再作成を許可するだけですか?
CodesInChaos

@CodesInChaosどちらも推測できることですが、削除+作成ではなく、変更するとどうなるのかと考えていました。私の推測では、アプリが読み込まれると、OSはCOWモード(コピーオンライト)でファイルを開き、一部のプロセスがコンテンツを変更した場合に限り、OSは(変更されたブロックの)コピーを作成します。1つのコピーはプロセスにリンクされ、もう1つのコピーはファイルにリンクされます。オリジナルを使用しているすべてのプロセスが閉じられると、オリジナルのコピーが削除されます(ファイルシステムエントリがないため)。これはあくまでも推測であり、OSでできることはわかっています。
ctrl-alt-delor 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.