1. ホーム
  2. c

[解決済み] デフォルトの書き込み動作 - O_TRUNC or O_APPEND?

2022-03-05 02:11:01

質問

を実行したときのデフォルトの動作はどうなっていますか? open アクセスモードを持つファイル O_WRONLY または O_RDWR . ファイルは追記モードで開かれていますか、それとも切り捨てモードですか?からの マンページ :

引数のflagsには、以下のアクセスモードのいずれかを含める必要があります。 O_RDONLY、O_WRONLY、O_RDWR のいずれかであること。
...
おまけ ゼロ またはそれ以上 ファイル作成 フラグと ファイルステータス フラグにはビット単位の OR を指定することができます。

これは次のように聞こえます。 O_APPENDO_TRUNC フラグは任意です。では、次のようにするとどうなるでしょうか。

void main ( void )
{
    int fd = open( "foo.txt", O_WRONLY );

    write( fd, "hello", 5 );

    close( fd );
}

解決方法は?

どちらでもない。

  • デフォルトでは、ファイルはカーソルが先頭に位置する状態で開かれます。書き込みを行うと、ファイルの先頭のバイトが上書きされます。

  • O_TRUNC は、ファイルが存在する場合は切り捨てられる。

  • O_APPEND は、ファイルの先頭で上書きするのではなく、末尾に追加して書き込むようにします。このフラグは永続的である。データを読むためにカーソルを他の場所に移動しても、書き込みの前に常にファイルの末尾に移動されます。

これらのフラグは直交しており、相互に排他的ではありません。もし、最初にファイルを切り捨てて、それ以降の書き込みを常に追記するようにしたい場合は、これらを組み合わせることも可能です。