Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

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

Б.4. Взаимосвязь с библиотечными функциями ввода-вывода

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

Если файл был открыт с помощью функции

fopen
, то узнать его дескриптор позволяет функция
fileno
. Она принимает аргумент типа
FILE*
и возвращает соответствующий ему дескриптор. Например, можно открыть файл с помощью библиотечной функции
fopen
, но осуществить в него запись посредством функции
writev
:

FILE* stream = fopen(filename, "w");

int file_descriptor = fileno(stream);

writev(file_descriptor, vector, vector_length);

Учтите, что переменные

stream
и
file_descriptor
соответствуют одному и тому же открытому файлу. Если выполнить следующую функцию, дескриптор
file_descriptor
станет недействительным:

fclose(stream);

Аналогичным образом следующая функция делает недействительным файловый указатель

stream
:

  • Читать дальше
  • 1
  • ...
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: