最新のmtimeを読むことができますが、読み取った内容はまだ更新されていませんか?

最新のmtimeを読むことができますが、読み取った内容はまだ更新されていませんか?

touchなどが関連付けられておらず、標準、、、、システムopenコールのみが含まれているとします。writecloselink

あるプロセスはファイルを更新し、もう一方は定期的にファイルがstat変更されたことを確認し、内容を再ロードします。最初のプロセスが書き込みを完了する前に2番目のプロセスが再ロードされた場合、ファイルは間違ったビューで終わる可能性がありますか?

主にLinux ext4ファイルシステムに焦点を当てていますが、この情報は他のファイルシステムと異なる場合に役立ちます。

答え1

POSIXでは、次のように常に正しいデータを返すために書き込み後の読み取り()が必要です。http://pubs.opengroup.org/onlinepubs/007908799/xsh/write.html:

一般ファイルの write() が正常に返された後:

  • この書き込みで変更されたファイルの各バイト位置に対して成功した read() は、そのバイト位置が再び修正されるまで、その位置で write() で指定されたデータを返します。

Linuxでは、書き込みが完了するまでmtimeファイルは更新されません。してはいけない結果データを表示せずに更新されたmtimeを表示できます。それ時間に合わせて更新されます。

nbyteが0より大きい正常に完了すると、ファイルのst_ctimeフィールドとst_mtimeフィールドを更新するようにwrite()が表示されます。

Ext4はPOSIX規格に準拠しようとするので、この場合は安全でなければなりません。ただし、すべてのファイルシステムがPOSIX仕様に完全に準拠しているわけではないため、YMMVです。

答え2

必要な粒度によって異なります。単一write()の呼び出しはアトミック(*)でなければなりません。ただし、アプリケーションが単一の論理操作の一部として複数の書き込み呼び出しを実行している場合は、他のプロセスが途中で起動し、その一部のみを読み取ることができます。

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

次の順序を考えてください。

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

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

関連情報