Книга: Программирование для 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() ставить указатель текущей позиции перед началом файла.

Оглавление книги


Генерация: 1.170. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз