Программирование для Linux. Профессиональный подход
Шрифт:
■ Если третий аргумент равен
SEEK_END
, функция lseek
интерпретирует второй аргумент как смещение (в байтах) от конца файла. Функция
lseek
возвращает смещение новой позиции от начала файла. Тип этого значения — off_t
. В случае ошибки возвращается -1. Функция неприменима к файлам некоторых типов, например к сокетам. Если требуется узнать текущую позицию файла, задайте смещение 0:
off_t position = lseek(free_descriptor, 0, SEEK_CUR);
ОС 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% /
Как
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, "Пользователи и группы".
Поделиться:
Популярные книги
Антракт. Поминки. Жизнеописание. Шатало
5.00
рейтинг книги
На краю империи: Камчатский излом
Фантастика:
альтернативная история
7.12
рейтинг книги
Когда отступать некуда, дерутся насмерть
Детективы:
прочие детективы
8.20
рейтинг книги
"Дальние горизонты. Дух". Компиляция. Книги 1-25
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Неудержимый. Книга XII
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Справочник по лечению зависимостей
Справочная литература:
путеводители
5.00
рейтинг книги
Неучтенный элемент. Том 8
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Я спас СССР! том 2
2. Я спас СССР
Фантастика:
альтернативная история
5.62
рейтинг книги
Философия и культура
Научно-образовательная:
философия
5.00
рейтинг книги
Смерть не имеет лица (Преданность смерти)
10. Следствие ведет Ева Даллас
Любовные романы:
остросюжетные любовные романы
9.08
рейтинг книги
Кризис - это возможность. 10 стратегий, которые позволят вам процветать в эпоху перемен
Религия и эзотерика:
самосовершенствование
5.00
рейтинг книги
Ночи Истории
Проза:
историческая проза
5.00
рейтинг книги
Открывая организации будущего
Деловая литература:
о бизнесе популярно
деловая литература
корпоративная культура
5.00