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

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

Жанры

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

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

За Горизонтом

Вайс Александр
8. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
За Горизонтом

Бастард Бога (Дилогия)

Матвеев Владимир
Фантастика:
альтернативная история
5.11
рейтинг книги
Бастард Бога (Дилогия)

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Вернувшийся: Посол. Том IV

Vector
4. Вернувшийся
Фантастика:
космическая фантастика
киберпанк
5.00
рейтинг книги
Вернувшийся: Посол. Том IV

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Газлайтер. Том 22

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

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Бастард Императора. Том 14

Орлов Андрей Юрьевич
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 14

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Вперед в прошлое 2

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

Падение Софии (русский роман)

Хаецкая Елена Владимировна
Фантастика:
фэнтези
5.00
рейтинг книги
Падение Софии (русский роман)