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
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]:$ 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()
У электронного диска есть важный недостаток: он ограничен сконфигурированным для вашей системы размером
Использовать 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) /* Проверка ошибок */
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT