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

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

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

/* ch12-mkstemp.с --- демонстрирует mkstemp.

Проверка ошибок для краткости опущена */

#include <stdio.h>

#include <fcntl.h> /* для флагов открытия */

#include <limits.h> /* для PATH_МАХ */

int main(void) {

 static char template[] = "/tmp/myfileXXXXXX";

 char fname[PATH_MAX];

 static char mesg[] =

"Here's lookin' at you, kid!\n"; /* заменяет "hello, world" */

 int fd;

 char buf[BUFSIZ];

 int n;

 strcpy(fname, template); /*
Копировать шаблон */

 fd = mkstemp(fname); /* Создать и открыть временный файл */

 printf("Filename is %s\n", fname); /* Вывести его для сведений */

 write(fd, mesg, strlen(mesg)); /* Что-нибудь записать в файл */

 lseek(fd, 0L, SEEK_SET); /* Перейти в начало */

 n = read(fd, buf, sizeof(buf));

/* Снова прочесть данные; НЕ завышается '\0'! */

 printf("Got back: %.*s", n, buf); /* Вывести его для проверки */

 close(fd); /* Закрыть файл */

 unlink(fname); /* Удалить его */

 return 0;

}

При запуске получаем ожидавшиеся результаты:

$ ch12-mkstemp

Filename is /tmp/myfileuXFWIN

Got back: Here's lookin' at you, kid!

12.3.3. Использование переменной окружения

TMPDIR

Многие стандартные утилиты обращают внимание на переменную окружения

TMPDIR
, используя обозначенный в ней каталог в качестве места для помещения временных файлов. Если
TMPDIR
не установлена, каталогом по умолчанию для временных файлов обычно является
/tmp
, хотя на многих современных системах есть также и каталог
/var/tmp
.
/tmp
обычно очищается от всех файлов и каталогов административными сценариями оболочки при запуске.

Многие системы GNU/Linux предоставляют каталог

/dev/shm
, использующий файловую систему типа
tmpfs:

$ df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hda2 6198436 5136020 747544 88% /

/dev/hda5 61431520 27720248 30590648 48% /d

none 256616 0 256616 0% /dev/shm

Тип файловой системы

tmpfs
предоставляет электронный (RAM) диск: часть памяти, которая используется, как если бы она была диском. Более того, файловая система
tmpfs
использует механизмы виртуальной памяти ядра Linux для его увеличения сверх фиксированного размера. Если на вашей системе уйма оперативной памяти, этот подход может обеспечить заметное ускорение. Чтобы протестировать производительность, мы начали с файла
/usr/share/dict/linux.words
, который является отсортированным списком правильно написанных слов, по одному в строке. Затем мы перемешали этот файл, так что он больше не был сортированным, и создали больший файл, содержащий 500 копий спутанной версии файла:

$ ls -l /tmp/randwords.big /* Показать размер */

– rw-r--r-- 1 arnold devel 204652500 Sep 18 16:02 /tmp/randwords.big

$ wc -l /tmp/randwords.big /* Сколько слов? */

22713500 /tmp/randwords.big /* Свыше 22 миллионов! */

Затем мы отсортировали файл, используя сначала каталог

/tmp
, а затем с
TMPDIR
,
установленным в
/dev/shm
[125] :

125

Такое использование

/dev/shm
на самом деле является злоупотреблением,, он предназначен для использования в реализации разделяемой памяти, а не в качестве электронного диска. Тем не менее, это полезно для иллюстрации нашей мысли — Примеч. автора.

$ time sort /tmp/randwords.big > /dev/null

 /* Использование реальных файлов */

real 1m32.566s

user 1m23.137s

sys 0m1.740s

$ time TMPDIR=/dev/shm sort /tmp/randwords.big > /dev/null

 /* Использование электронного диска */

real 1m28.257s

user 1m18.469s

sys 0m1.602s

Интересно, использование электронного диска было лишь незначительно быстрее, чем использование обычных файлов. (В некоторых дальнейших тестах оно было даже в действительности медленнее!) Мы предполагаем, что в игру вступил буферный кэш ядра (см. раздел 4.6.2 «Создание файлов с помощью

creat
»), весьма эффективно ускоряя файловый ввод/вывод [126] .

У электронного диска есть важный недостаток: он ограничен сконфигурированным для вашей системы размером пространства для подкачки. [127] Когда мы попытались отсортировать файл, содержащий 1000 копий файла с перемешанными словами, место на электронном диске закончилось, тогда как обычный sort завершился благополучно.

126

На нашей системе 512 мегабайтов оперативной памяти, что для старых чудаков вроде автора кажется порядочным. Однако цены на память упали, и вполне обычны системы с одним или более гигабайтами оперативной памяти, по крайней мере, для разработчиков программного обеспечения — Примеч. автора.

127

Пространство для подкачки состоит из одного или более выделенных участков диска, используемых для хранения частей исполняющегося процесса, который не находится в настоящее время в памяти — Примеч. автора.

Использовать TMPDIR для своих программ просто. Мы предлагаем следующую схему.

const char template[] = "myprog.XXXXXX";

char *tmpdir, *tfile;

size_t count;

int fd;

if ((tmpdir = getenv("TMPDIR")) == NULL)

 /* Использовать значение TMPDIR, если имеется */

 tmpdir = "/tmp"; /* В противном случае, /tmp по умолчанию */

count = strlen(tmpdir) + strlen(template) + 2;

 /* Вычислить размер имени файла */

tfile = (char *)malloc(count); /* Выделить для него память */

if (tfile == NULL) /* Проверка ошибок */

 /* восстановить */

sprintf(tfile, "%s/%s", tmpdir, template);

 /* Создать завершающий шаблон */

fd = mkstemp(tfile); /* Создать и открыть файл */

/* ...использование tempfile через fd... */

close(fd); /* Очистка */

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

Первый среди равных. Книга VII

Бор Жорж
7. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга VII

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Третий. Том 4

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

Жертва

Привалов Сергей
2. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Жертва

Кодекс Охотника XXXI

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

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Серпентарий

Мадир Ирена
Young Adult. Темный мир Шарана. Вселенная Ирены Мадир
Фантастика:
фэнтези
готический роман
5.00
рейтинг книги
Серпентарий

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Московское золото и нежная попа комсомолки. Часть Пятая

Хренов Алексей
5. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Пятая

Охотник на демонов

Шелег Дмитрий Витальевич
2. Живой лёд
Фантастика:
боевая фантастика
5.83
рейтинг книги
Охотник на демонов

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия

Лекарь Империи 6

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