Книга: Программирование для 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 определяет начало и размер каждой области.

Оглавление книги


Генерация: 1.641. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз