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

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

Жанры

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); /* Очистка */

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

Среда обитания (сборник)

Высоцкий Сергей Александрович
Советский детектив
Детективы:
криминальные детективы
5.00
рейтинг книги
Среда обитания (сборник)

Родословная. Том 1

Ткачев Андрей Юрьевич
1. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Родословная. Том 1

Лев Толстой

Шкловский Виктор Борисович
363. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Лев Толстой

Травник

Назимов Константин Геннадьевич
1. Травник
Фантастика:
фэнтези
5.00
рейтинг книги
Травник

На границе империй. Том 7. Часть 3

INDIGO
9. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.40
рейтинг книги
На границе империй. Том 7. Часть 3

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Газлайтер. Том 12

Володин Григорий Григорьевич
12. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 12

Перекресток судеб

Щепетнов Евгений Владимирович
6. Нед
Фантастика:
фэнтези
8.84
рейтинг книги
Перекресток судеб

Геном хищника. Книга девятая

Гарцевич Евгений Александрович
9. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.50
рейтинг книги
Геном хищника. Книга девятая

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Начало шторма

Мазуров Дмитрий
9. Громовая поступь
Фантастика:
фэнтези
рпг
5.75
рейтинг книги
Начало шторма

Черный ратник 2

Гато Макс
2. Черный ратник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный ратник 2

Тринадцатый

Северский Андрей
Фантастика:
фэнтези
рпг
7.12
рейтинг книги
Тринадцатый

Ваше Сиятельство 4т

Моури Эрли
4. Ваше Сиятельство
Любовные романы:
эро литература
5.00
рейтинг книги
Ваше Сиятельство 4т