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

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

Жанры

Программирование для Linux. Профессиональный подход

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

Шрифт:

■ Если третий аргумент равен

SEEK_END
, функция
lseek
интерпретирует второй аргумент как смещение (в байтах) от конца файла.

Функция

lseek
возвращает смещение новой позиции от начала файла. Тип этого значения —
off_t
. В случае ошибки возвращается -1. Функция неприменима к файлам некоторых типов, например к сокетам.

Если требуется узнать текущую позицию файла, задайте смещение 0:

off_t position = lseek(free_descriptor, 0, SEEK_CUR);

ОС Linux

позволяет перемещать указатель текущей позиции за пределы файла. Обычно, если текущая позиция находится за концом файла и выполняется операция записи, операционная система автоматически увеличивает файл, чтобы вместить в него новые данные. "Промежуток" между старым признаком конца файла и указателем текущей позиции не записывается на диск. Linux лишь помечает его длину. Если впоследствии попытаться прочесть файл, окажется, что данный промежуток заполнен нулевыми байтами.

Благодаря данной особенности функции

lseek
можно создавать файлы огромного размера, практически не занимающие места на диске. Это продемонстрировано в листинге Б.5. В качестве аргументов командной строки программа принимает имя файла и требуемый размер в мегабайтах. Программа создает файл, перемещается с помощью функции
lseek
на нужное расстояние и записывает нулевой байт, после чего закрывает файл.

Листинг Б.5. (lseek-huge.c) Создание огромных файлов с помощью функции
lseek

#include <fcntl.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

int main (int argc, char* argv[]) {

 int zero = 0;

 const int megabyte = 1024 * 1024;

 char* filename = argv[1];

 size_t length = (size_t)atoi(argv[2]) * megabyte;

 /* Создание нового файла. */

 int fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);

 /* Перемещение в точку, где должен быть записан последний байт

файла. */

 lseek(fd, length - 1, SEEK_SET);

 /* Запись нулевого байта. */

 write(fd, &zero, 1);

 /* Конец работы. */

 close(fd);

 return 0;

}

Давайте теперь создадим файл размером 1 Гбайт. Обратите внимание на объем свободного места на диске до и после выполнения программы.

% df -h .

Filesystem Size Used Avail Use% Mounted on

/dev/hda5 2.9G 2.1G 655M 76% /

% ./lseek-huge bigfile 1024 % ls -l bigfile

– rw-r----- 1 samuel samuel 1073741824 Feb 5 16:29 bigfile

% df -h .

Filesystem Size Used Avail Use% Mounted on

/dev/hda5 2.9G 2.1G 655M 76% /

Как

видите, файл практически не занимает место на диске, несмотря на свой огромный размер. Но если открыть его и попытаться прочитать данные, окажется, что в нем находится 1 Гбайт нулей. Давайте, к примеру, проверим это с помощью программы
hexdump
:

% ./hexdump bigfile / head -10

0x000000 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000050 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

...

Чтобы не наблюдать, как по экрану проносятся 230 нулей, нажмите <Ctrl+C>.

"Волшебные промежутки" в файлах являются особенностью файловых систем типа

ext2
, обычно создаваемых на жестких дисках Linux. Если попытаться с помощью программы
lseek-huge
создать файл в файловой системе типа
fat
или
vfat
, то он займет весь указанный объем диска.

ОС Linux не позволяет функции

lseek
ставить указатель текущей позиции перед началом файла.

Б.2. Функция stat

Функция

read
позволяет прочесть только содержимое файла. Но как насчет остальной информации? Например, команда
ls -l
сообщает такие сведения о файлах в текущем каталоге, как размер, время последнего обновления, права доступа, владелец и пр. Аналогичную информацию об отдельном файле можно получить с помощью функции
stat
. Ей необходимо передать путевое имя файла и указатель на структуру типа
stat
. В случае успешного завершения функция возвращает 0 и заполняет поля структуры данными о файле, иначе возвращается -1.

Перечислим наиболее полезные поля структуры

stat
.

■ В поле

st_mode
содержится код доступа к файлу. О правах доступа к файлам рассказывалось в разделе 10.3. "Права доступа к файлам". В старшем бите поля закодирован тип файла. Об этом пойдет речь ниже.

■ В полях

st_uid
и
st_gid
содержатся идентификаторы соответственно пользователя и группы, которым принадлежит файл. Назначение идентификатора описывалось в разделе 10.1, "Пользователи и группы".

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

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Бывшие. Война в академии магии

Берг Александра
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Бывшие. Война в академии магии

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Возвышение Меркурия. Книга 3

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

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Хозяин Теней

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

Опасная любовь командора

Муратова Ульяна
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Опасная любовь командора

Друд, или Человек в черном

Симмонс Дэн
Фантастика:
социально-философская фантастика
6.80
рейтинг книги
Друд, или Человек в черном

Волхв

Земляной Андрей Борисович
3. Волшебник
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волхв

Мастер Разума VII

Кронос Александр
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума VII

Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен

Агеева Елена А.
Документальная литература:
публицистика
5.40
рейтинг книги
Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен

Сумеречный Стрелок 5

Карелин Сергей Витальевич
5. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 5

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Прогрессор поневоле

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