web-dev-qa-db-ja.com

更新されたmtimeを読むことはできますが、コンテンツを読むときはまだ更新されていませんか?

touchなどが含まれていないと仮定すると、標準のopenwritecloselinkシステムコールのみが含まれます。

1つのプロセスはファイルを更新し、別のプロセスは定期的にstatingして、ファイルが変更されたかどうかを確認し、コンテンツを再読み込みします。 2番目のプロセスがファイルの誤ったビューで終わる可能性がある場合、最初のプロセスが書き込みを完了する前にリロードした場合はどうなりますか?

主にLinuxext4ファイルシステムを調べますが、他のファイルシステムが異なる場合は、他の情報が役立つ可能性があります。

3
OrangeDog

http://pubs.opengroup.org/onlinepubs/007908799/xsh/write.html :によると、POSIXではread-after-write()が常に正しいデータを返す必要があります。

通常のファイルへのwrite()が正常に戻った後:

  • その書き込みによって変更されたファイル内の各バイト位置からのread()が成功すると、そのようなバイト位置が再び変更されるまで、その位置のwrite()によって指定されたデータが返されます。

Linuxでの書き込みが終了するまでファイルmtimeは更新されないため、データを表示せずに更新されたmtimeを表示することはできませんthatmtime更新を引き起こしました。

正常に完了すると、nbyteが0より大きい場合、write()はファイルのst_ctimeフィールドとst_mtimeフィールドを更新するようにマークします。

Ext4はPOSIX準拠を保証しようとするため、この場合は安全である必要がありますが、すべてのファイルシステムが完全にPOSIX準拠であるとは限らないため、YMMVです。

3
LustreOne

必要な粒度によって異なります。単一のwrite()呼び出しはアトミック(*)である必要があります。ただし、アプリケーションが単一の論理操作の一部として複数の書き込み呼び出しを行う場合、他のプロセスが途中でウェイクアップして、その一部のみを読み取る可能性があります。

*)システムコールは、データの一部のみを書き込んだ後に戻ることができます。これは戻り値に示されます。しかし、それがLinuxのローカルファイルで発生する可能性があるかどうかはわかりません。

このシーケンスを検討してください。

--task 1--                  --task 2--
write()                     ..  
..                          stat()
..                          read()
write()                        

左側の2つの書き込みが単一の論理変更の一部である場合、タスク2はその変更の一部のみを読み取ります。

1
ilkkachu