Книга: Программирование для Linux. Профессиональный подход
Листинг Б.7. (write-args.c) Запись списка аргументов в файл с помощью функции writev()
Листинг Б.7. (write-args.c) Запись списка аргументов в файл с помощью функции writev()
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
int fd;
struct iovec* vec;
struct iovec* vec_next;
int i;
/* Символ новой строки хранится в обычной переменной
типа char. */
char newline = 'n';
/* Первый аргумент командной строки -- это имя выходного
файла. */
char* filename = argv[1];
/* Пропускаем первые два элемента списка аргументов.
Элемент номер 0 -- это имя самой программы,
а элемент номер 1 -- это имя выходного файла */
argc -= 2;
argv += 2;
/* Выделяем массив элементов типа iovec каждому аргументу
командной строки соответствует два элемента массива:
один -- для самого аргумента,
а другой -- для символа новой строки. */
vec =
(struct iovec*)malloc(2 * argc * sizeof(struct iovec));
/* Просмотр списка аргументов и создание массива. */
vec_next = vec;
for (i = 0; i < argc; ++i) {
/* первый элемент -- это текст аргумента */
vec_next->iov_base = argv[i];
vec_next->iov_len = strlen(argv[i]);
++vec_next;
/* Второй элемент -- это символ новой строки, допускается,
чтобы несколько элементов массива указывали на одну и
ту же область памяти. */
vec_next->iov_base = &newline;
vec_next->iov_len = 1;
++vec_next;
}
/* Запись аргументов в файл. */
fd = open(filename, O_WRONLY | O_CREAT);
writev(fd, vec, 2 * argc);
close(fd);
free(vec);
return 0;
}
Вот пример работы программы:
% ./write-args outputfile "first arg" "second arg" "third arg"
% cat outputfile
first arg
second arg
third arg
В Linux имеется также функция readv()
, которая загружает содержимое файла в несколько несвязанных областей памяти. Как и в функции writev()
, массив структур типа iovec определяет начало и размер каждой области.
- Резервное копирование многофайловых баз данных
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Восстановление из резервных копий многофайловых баз данных
- Forced writes - палка о двух концах
- Повышение производительности приложений с помощью хранимых процедур
- Ответный файл, используемый по умолчанию (csc.rsp)
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Forced Writes
- Создание файлов с блокировкой
- Организация пользователей в группы с помощью ролей
- Файлы базы данных InterBase
- Файлы *.GDB изнутри