Программирование для Linux. Профессиональный подход
Шрифт:
■ В поле
st_size
хранится размер файла в байтах. ■ В поле
st_atime
записано время последнего обращения к файлу (для чтения или записи). ■ В поле
st_mtime
записано время последней модификации файла. Следующие макросы проверяют поле
st_mode
, чтобы определить, для файла какого типа была вызвана функция stat
. Макросы возвращают ненулевое значение, если их догадка о типе файла подтвердилась. ■
S_ISBLK(код доступа)
— блочное устройство: ■
S_ISCHR(код
доступа)
— символьное устройство; ■
S_ISDIR(код доступа)
— каталог; ■
S_ISFIFO(код доступа)
— FIFO-файл (именованный канал): ■
S_ISLNK(код доступа)
— символическая ссылка. ■
S_ISREG(код доступа)
— обычный файл; ■
S_ISSOCK(код доступа)
— сокет. В поле
st_dev
содержатся старший и младший номера аппаратного устройства, в котором расположен файл (о номерах устройств рассказывалось в главе 6, "Устройства"). Старший номер находится в старшем байте поля, а младший — в младшем. В поле st_infо
содержится номер индексного дескриптора файла, определяющий местоположение файла в файловой системе. Если вызвать функцию
stat
для символической ссылки, функция проследит, куда указывает ссылка, и вернет информацию о том файле, а не о самой ссылке. Таким образом, в случае функции stat
макрос S_ISLNK
всегда будет возвращать значение 0. Есть другая функция, lstat
, которая не пытается отслеживать символические ссылки. Во всем остальном она эквивалентна функции stat
. Если вызвать функцию stat
для поврежденной ссылки (которая указывает на несуществующий или недоступный файл), возникнет ошибка, тогда как функция lstat
в подобной ситуации выполнится успешно. Если файл уже открыт для чтения или записи, лучше пользоваться функцией
fstat
. В качестве первого аргумента она принимает не путевое имя, а дескриптор. В листинге Б.6 показана функция которая создает буфер достаточного размера и загружает в него содержимое указанного файла. Размер файла определяется с помощью функции
fstat
. Она же позволяет проверить, соответствует ли заданное имя обычному файлу. Листинг Б.6. (read-file.c) Загрузка файла в буфер
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
/* Загрузка содержимого файла FILENAME в память.
Размер буфера записывается в аргумент LENGTH.
Создаваемый буфер должен удаляться в вызывающей функции.
Если аргумент FILENAME не соответствует обычному файлу,
возвращается NULL. */
char* read_file(const char* filename, size_t* length) {
int fd;
struct stat file_info;
char* buffer;
/*
Открытие файла. */
fd = open(filename, O_RDONLY);
/* Получение информации о файле. */
fstat(fd, &file_info);
*length = file_info.st_size;
/* Проверка того, что это обычный файл. */
if (!S_ISREG(file_info.st_mode)) {
/* Этот тип файла не поддерживается. */
close(fd);
return NULL;
}
/* выделение буфера достаточного размера. */
buffer = (char*)malloc(*length);
/* Загрузка файла в буфер. */
read(fd, buffer, *length);
/* Конец работы. */
close(fd);
return buffer;
}
Б.3. Векторные чтение и запись
Аргументами функции
write
являются указатель на буфер и длина буфера. Эта функция записывает в файл непрерывный блок данных, хранящихся в памяти. Но программам часто требуется записывать группы блоков, хранящихся по разным адресам. Если использовать функцию write
, придется либо предварительно объединять блоки в памяти, что неэффективно, либо многократно вызывать функцию. Последнее тоже не всегда приемлемо. Например, при записи в сокет два вызова функции write
приведут к отправке в сеть двух пакетов, тогда как те же самые данные можно перестать в одном пакете. Функция
writev
позволяет записать в файл несколько несвязанных буферов одновременно. Это называется векторной записью. Сложность применения функции writev
заключается в создании структуры, задающей начало и конец каждого буфера. Эта структура представляет собой массив элементов типа struct iovec
. Каждый элемент описывает одну область памяти. В поле iov_base
указывается адрес начала области, а в поле iov_len
— ее длина. Если число буферов известно заранее, можно просто объявить массив типа struct iovec
. В противном случае придется выделять массив динамически. Функции
writev
передается дескриптор записываемого файла, массив структур iovec и размер массива. Функция возвращает общее число записанных байтов. Программа, показанная в листинге Б.7, записывает свои аргументы командной строки в файл с помощью одной-единственной функции
writev
. Первый аргумент — это имя файла, в котором сохраняются все последующие аргументы, каждый в отдельной строке. Число элементов в массиве структур iovec
в два раза превышает число аргументов командной строки, так как после каждого аргумента записывается символ новой строки. Поскольку количество аргументов неизвестно заранее, массив создается с помощью функции malloc
.
Поделиться:
Популярные книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Бывшие. Война в академии магии
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Идеальный мир для Лекаря 7
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга X
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Хозяин Теней
1. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Опасная любовь командора
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Друд, или Человек в черном
Фантастика:
социально-философская фантастика
6.80
рейтинг книги
Волхв
3. Волшебник
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Мастер Разума VII
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен
Документальная литература:
публицистика
5.40
рейтинг книги
Сумеречный Стрелок 5
5. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Морской волк. 1-я Трилогия
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Прогрессор поневоле
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00