3

openファイルへの変更が、同じファイル名で/を繰り返しclose呼び出すことで確実に表示されるという Posix 標準の保証があるかどうかを知りたいです。説明のために、次の Bash スクリプトを検討してください。

#!/bin/bash

FILE=$(mktemp)

echo "Some data" >> $FILE
cat $FILE

echo終了するまでに、ファイル内のすべてのデータが利用可能であることが保証されていますか?

Posix 関数に関しては、例は次のようになります。

const char fn[] = "/tmp/somefile";
const char data[] = "hello world";

// Stage 1
{
   int fd = open(fn, O_CREAT);
   write(fd, data, sizeof data); // #1
   close(fd);
}

// Stage 2
{
   int fd = open(fn);
   read(fd, ...);                // #2
   close(fd);
}

行番号 1 の書き込みが読み取り番号 2 に表示されることが保証されていますか?それとも、OS が書き込みをキャッシュして、時間内に伝播しないようにすることはできますか? 他のプロセスがファイル名を認識していないか、ファイル検索を妨害していないと想定できます。

4

1 に答える 1

2

はい。たとえば、 write() 仕様 ( http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html ) から:

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

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

    その後、ファイル内の同じバイト位置への write() が成功すると、そのファイル データが上書きされます。

「Any」read() と表示されていることに注意してください。つまり、新しい fd を open() し、それを介して read() を行うことができ、それらと同じ保証が提供されます。

ちなみに、この種の強い整合性により、セマンティクスを簡単に推論できますが、POSIX 準拠の分散 FS に適切なパフォーマンスを提供することは、不可能ではないにしても、非常に困難になります。

于 2012-04-03T10:24:21.817 に答える