Книга: Программирование для Linux. Профессиональный подход
Листинг Б.5. (lseek-huge.c) Создание огромных файлов с помощью функции 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()
ставить указатель текущей позиции перед началом файла.
- Создание функции
- Резервное копирование многофайловых баз данных
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Восстановление из резервных копий многофайловых баз данных
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Создание файлов с блокировкой
- Организация пользователей в группы с помощью ролей
- Создание свободно позиционируемых элементов
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами