Запись данных в файл

В этом разделе рассмотрены функции записи.

Функция Описание
запись Эта функция считывает данные, объем которых задается переменной число-байт, из области памяти, на которую указывает переменная буфер, и добавляет их в файл с дескриптором дескриптор-файла. При этом выполняется примерно та же последовательность действий, что и для операции read. Текущее значение указателя в файле считывается из таблицы открытых файлов.

Если при записи данных в файле отсутствует блок, соответствующий текущему значению указателя, функция write запрашивает новый блок. Информация о нем заносится в описание i-узла, связанного с файлом. При добавлении блока фактически может быть добавлено несколько блоков, если они требуются файловой системе для адресации данных.

I-узел блокируется на время записи. Это означает, что во время записи другие процессы не могут изменять файл. Сразу после завершения записи файл разблокируется. Если другой процесс изменит файл между двумя операциями записи, то результат записи будет различным, однако целостность данных будет сохранена.

Функция write выполняет тот же цикл операций, что и функция read. За один цикл она записывает на диск один блок данных. Иногда требуется записать только часть блока. В этом случае функция write считывает блок с диска, чтобы сохранить данные, которые хранились в нем ранее. Если нужно записать целый блок данных, то старое содержимое блока не сохраняется, а заменяется целиком. Блоки последовательно записываются на диск до тех пор, пока объем записанной информации не станет равен указанному числу-байт.

Отложенная запись

Для включения режима отложенной записи нужно указать флаг O_DEFER. В этом режиме данные записываются на диск как временный файл. Процедура отложенной записи сохраняет данные в кэше, что позволяет быстрее обрабатывать последующие обращения к этим же данным. Механизм отложенной записи сокращает число обращений к диску. Многие программы, в том числе почтовые клиенты и текстовые редакторы, создают временные файлы в каталоге /tmp и удаляют их через непродолжительное время.

Если при открытии файла был указан флаг отложенной записи (O_DEFER), то данные не записываются в постоянную память до тех пор, пока не будет вызвана функция fsync или операция синхронной записи в файл (write) (в случае, если он был открыт с флагом O_SYNC flag). Функция fsync сохраняет на диске все изменения, внесенные в файл. Более подробная информация о флагах O_DEFER и O_SYNC приведена в описании функции open.

Усечение файлов

Функции truncate и ftruncate позволяют изменять длину обычных файлов. Для их выполнения необходимы права на запись в файл. Новый размер файла задается параметром Длина. При этом указанное число байт отсчитывается от начала файла, а не от текущей позиции указателя в файле. Если новая длина меньше текущей длины файла, то усеченные данные удаляются. Если новая длина больше текущей, то дополнительное пространство заполняется нулями. Функция возвращает новое число блоков в файле и обновляет информацию о размере файла.