writeblock()

Записать блоки данных в файл

Прототип:

#include <unistd.h>
int writeblock( int fd,
size_t blksize,
unsigned block,
int numblks,
const void *buff );

Аргументы:

fd
Дескриптор файла, в который должна быть произведена запись.
blksize
Количество байт в каждом блоке данных.
block
Номер блока, с которого начинать запись. Нумерация блоков считается с 0.
numblks
Количество блоков данных для записи.
buff
Указатель на область памяти, которая содержит блоки с данными для записи.

Библиотека:

libc

Описание:

Функция writeblock() записывает numblks данных в файл, дескриптор которого передан в fd, из области памяти, указатель на которую передан в buf, начиная с блока с номером block.

Функция полезна для прямого доступа к необработанным блокам на специальном блочном устройстве (например, к необработанным дисковым блокам), но также может использоваться, например, для высокоскоростного доступа к файлам базы данных. Прирост скорости достигается засчет комбинированного поиска/чтения, неявного в этом вызове.

Если numblks равно нулю, writeblock() возвращает ноль.

При успешном завершении writeblock() возвращает количество блоков, фактически записанных на диск чере дескриптор fd. Это число никогда не превышает numblks, но может быть меньше numblks, если происходит одно из следующих событий:

Если ошибка записи появилась в первом блоке и один из флагов синхронизации был выставлен, writeblock() возвращает -1 и устанавливает переменной errno значение EIO.

Если один из флагов синхронизации установлен, writeblock() не завершается до момента, пока все блоки не будут фактически перенесены на устройство. Если ни один из флагов не установлен, writeblock() помещает блоки в кэш и помечает их к немеделенной записи, но завершает выполнение до того, как сама запись произошла.


Note: В последнем примере, для приложения невозможно узнать, была ли запись завершена успешно или нет (в случае проблем системы, или поврежденных секторов диска). Использование флагов синхронизации значительно влияет на скорость работы writeblock(), но гарантирует, что данные могут быть восстановлены.

Возвращаемое значение:

Количество фактически записанных блоков. Если происходит ошибка, возвращается -1, устанавливается errno для обозначения ошибки, а содержимое указателя буфера, на который указывает buff остается неизменным.

Коды ошибок:

EBADF
Аргумент fd не является допустимым файловым дескриптором, который позволяет производить запись на блочно-ориентированном устройстве.
EIO
Возникла ошибка при записи первого блока на физическом уровне, либо установлен флаг O_DSYNC или O_SYNC.
EINVAL
Начальная позиция недействительна (0 или меньше нуля) или находится за пределами конца файла.

Классификация:

ЗОСРВ «Нейтрино»

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

open(), readblock(), write()




Предыдущий раздел: Описание API системной библиотеки