Поведение записи по умолчанию - O_TRUN C или O_APPEND? - PullRequest
5 голосов
/ 23 января 2020

Каково поведение по умолчанию при open файле с режимом доступа O_WRONLY или O_RDWR. Файл открывается в режиме добавления или усечения? Из справочных страниц :

Флаги аргументов должны включать один из следующих режимов доступа: O_RDONLY, O_WRONLY или O_RDWR.
...
Дополнительно , ноль или более создание файла флаги и состояние файла флаги могут быть поразрядными или иметь флаги.

Это звучит как O_APPEND и O_TRUNC флаги не являются обязательными. Так что же делает следующее?

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

    write( fd, "hello", 5 );

    close( fd );
}

Ответы [ 2 ]

8 голосов
/ 23 января 2020

Ни то, ни другое.

  • По умолчанию файл открывается с курсором, расположенным в начале. Запись перезаписывает байты в начале файла.

  • O_TRUNC вызывает усечение файла, если он существует.

  • O_APPEND заставляет записи добавлять в конец файла вместо перезаписи в начале. Этот флаг является постоянным. Если вы перемещаете курсор в другое место для чтения данных, он всегда перемещается в конец файла перед каждой записью.

Флаги являются ортогональными и не являются взаимоисключающими. Вы даже можете объединить их, если хотите изначально обрезать файл и убедиться, что все последующие записи всегда добавляются.

1 голос
/ 23 января 2020

При использовании самого флага O_WRONLY он открывает файл для записи, сохраняет существующее содержимое файла и помещает указатель файла в начале файла. Любые записи перезаписывают существующий контент.

Если вы используете lseek для изменения положения указателя файла, последующие записи будут происходить с смещенным смещением.

Это поведение отличается от O_TRUNC, который обрезает содержимое файла при открытии, и с O_APPEND, который заставляет все записи происходить в конце файла.

...