Программирование для 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
рейтинг книги
Барон диктует правила
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Попытка возврата. Тетралогия
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Долгий путь домой
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Гардемарин Ее Величества. Инкарнация
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Завод-3: назад в СССР
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Камень. Книга пятая
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Отдельный танковый
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Метатель. Книга 3
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Боярышня Евдокия
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00