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

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

Жанры

Linux программирование в примерах
Шрифт:

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

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

unlink(tfile);

free(tfile);

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

12.4. Совершение самоубийства:

abort

Бывают моменты, когда программа просто не может продолжаться. Обычно лучше всего при этом выдать сообщение об ошибке и вызвать

exit
. Однако, особенно для ошибок, являющихся проблемами программирования, полезно не только завершиться, но и создать дамп ядра, который сохраняет в файле состояние работающей программы для последующего исследования в отладчике. В этом заключается работа функции
abort
:

#include <stdlib.h> /* ISO С */

void abort(void);

Функция

abort
посылает сигнал
SIGABRT
самому процессу. Это случится, даже если
SIGABRT
заблокирован или игнорируется. После этого осуществляется обычное для
SIGABRT
действие, которое заключается в создании дампа ядра.

Примером

abort
в действии является макрос
assert
, описанный в начале данной главы. Когда
assert
обнаруживает, что его выражение ложно, он выводит сообщение об ошибке, а затем вызывает
abort
для создания дампа ядра.

В соответствии со стандартом С, осуществляет

abort
очистку или нет, зависит от реализации. Под GNU/Linux она выполняет очистку: все потоки
<stdio.h> FILE*
перед завершением программы закрываются. Обратите, однако, внимание, что для открытых файлов, использующих системные вызовы на основе дескрипторов файлов, ничего не делается. (Если открыты лишь файлы или каналы, ничего не нужно делать. Хотя мы не обсуждали это, дескрипторы файлов используются также для сетевых соединений, и оставление их открытыми является плохой практикой.)

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

Адвокат Империи 10

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

Сильнейший Столп Империи. Книга 4

Ермоленков Алексей
4. Сильнейший Столп Империи
Фантастика:
фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 4

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

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

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Жертва

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

Эволюционер из трущоб. Том 9

Панарин Антон
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 9

Локки 2. Потомок бога

Решетов Евгений Валерьевич
2. Локки
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Локки 2. Потомок бога

Портрет дьявола: Собрание мистических рассказов

Скотт Вальтер
Проза:
классическая проза
8.09
рейтинг книги
Портрет дьявола: Собрание мистических рассказов

Помещик

Беличенко Константин
1. Помещик
Фантастика:
боевая фантастика
попаданцы
5.56
рейтинг книги
Помещик

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.56
рейтинг книги
Ботаник

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Сон демона

Брюссоло Серж
2. Пегги Сью и призраки
Детские:
детская фантастика
8.61
рейтинг книги
Сон демона

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

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