Книга: Программирование для Linux. Профессиональный подход
Б.3. Векторные чтение и запись
Б.3. Векторные чтение и запись
Аргументами функции write()
являются указатель на буфер и длина буфера. Эта функция записывает в файл непрерывный блок данных, хранящихся в памяти. Но программам часто требуется записывать группы блоков, хранящихся по разным адресам. Если использовать функцию write()
, придется либо предварительно объединять блоки в памяти, что неэффективно, либо многократно вызывать функцию. Последнее тоже не всегда приемлемо. Например, при записи в сокет два вызова функции write()
приведут к отправке в сеть двух пакетов, тогда как те же самые данные можно перестать в одном пакете.
Функция writev()
позволяет записать в файл несколько несвязанных буферов одновременно. Это называется векторной записью. Сложность применения функции writev()
заключается в создании структуры, задающей начало и конец каждого буфера. Эта структура представляет собой массив элементов типа struct iovec
. Каждый элемент описывает одну область памяти. В поле iov_base
указывается адрес начала области, а в поле iov_len
— ее длина. Если число буферов известно заранее, можно просто объявить массив типа struct iovec
. В противном случае придется выделять массив динамически.
Функции writev()
передается дескриптор записываемого файла, массив структур iovec и размер массива. Функция возвращает общее число записанных байтов.
Программа, показанная в листинге Б.7, записывает свои аргументы командной строки в файл с помощью одной-единственной функции writev()
. Первый аргумент — это имя файла, в котором сохраняются все последующие аргументы, каждый в отдельной строке. Число элементов в массиве структур iovec
в два раза превышает число аргументов командной строки, так как после каждого аргумента записывается символ новой строки. Поскольку количество аргументов неизвестно заранее, массив создается с помощью функции malloc()
.
- 4.4.3. Чтение и запись
- 1.18. Запись телефонных звонков
- Как сделать перезапись файлов в Проводнике более удобной?
- Не могу войти в систему под учетной записью администратора, поскольку среди имен пользователей, отображаемых на экране п...
- При попытке войти в систему Пользователю1 выдается предупреждение, что загрузился временный профиль и все сделанные изме...
- У файла и каталога есть атрибуты (например: Скрытый, Только чтение). Как ими управлять из командной строки?
- 12.5. Чтение «битых» компакт-дисков
- 19.2.4. Чтение и запись значений элементов HTML-форм
- 19.2.5. Чтение и запись содержимого элемента
- 1.2. Запись образа операционной системы на флэшку
- Запись звукового компакт-диска
- 19.2.1. Чтение и запись значений HTML-атрибутов