O_APPEND フラグで開かれたファイルに書き込まれるデータが、`lseek` を使用しても常に最後に書き込まれるのはなぜですか? 質問する

O_APPEND フラグで開かれたファイルに書き込まれるデータが、`lseek` を使用しても常に最後に書き込まれるのはなぜですか? 質問する

プログラミングの課題を与えられました:

O_APPEND フラグを使用して既存のファイルを書き込み用に開き、データを書き込む前にファイルの先頭を検索するプログラムを作成します。データはファイルのどこに表示されますか? 理由は何ですか?

私が思いついたのは次のことです:

main() {
    int fd = open("test.txt", O_WRONLY | O_APPEND);
    lseek(fd, 0, SEEK_SET);
    write(fd, "abc", 3);
    close(fd);
}

上記を試してみたところ、データが常にファイルの末尾に書き込まれることがわかりました。なぜでしょうか? 指定したからでしょうかO_APPEND?

ベストアンサー1

でファイルを開くと、最新の呼び出しや最新の読み取り/書き込み操作O_APPENDからの現在のファイルポインタに関係なく、すべてのデータが末尾に書き込まれます。lseek(2)open(2)ドキュメンテーション:

O_APPEND
ファイルは追加モードで開かれます。各 の前にwrite(2)、ファイル オフセットは の場合と同様にファイルの末尾に配置されますlseek(2)

ファイルの最後にデータを書き込み、その後にファイルの先頭に書き込みたい場合は、 を使わずにファイルを開きO_APPENDfstat(2)ファイル サイズ (st_sizeメンバー内struct stat) を取得し、そのオフセットまでシークして末尾を書き込みます。

おすすめ記事