Чтение онлайн

на главную - закладки

Жанры

Программирование для 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
:

close(file_descriptor);

Чтобы получить файловый указатель, соответствующий дескриптору, воспользуйтесь функцией

fdopen
. Ее аргументами является дескриптор и строка, определяющая режим создания файлового потока. Синтаксис строки аналогичен синтаксису второго аргумента функции
fopen
, а задаваемый режим должен быть совместим с режимом открытия файла. Например, файлу, открытому для чтения, соответствует режим
r
, а файлу, открытому для записи, — режим
w
. Как и в случае функции
fileno
, файловый указатель и дескриптор ссылаются на один и тот же файл, поэтому закрытие одного сделает недействительным другой.

Б.5. Другие низкоуровневые операции

Есть ряд других полезных функций для работы с файлами и каталогами.

■ Функция

getcwd
возвращает имя текущего каталога. Она принимает два аргумента — указатель на буфер и длину буфера — и копирует имя каталога в буфер.

■ Функция

chdir
делает текущим заданный каталог.

■ Функция

mkdir
создает новый каталог. Ее первым аргументом является путевое имя каталога. Второй аргумент задает права доступа к каталогу. Интерпретация этого аргумента такая же, как и третьего аргумента функции
open
. На итоговый код доступа влияет значение
umask
процесса.

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

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Отдельный танковый

Берг Александр Анатольевич
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Отдельный танковый

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия