Создание и открывание временных файлов (хорошо) — КиберПедия 

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Создание и открывание временных файлов (хорошо)

2021-01-29 64
Создание и открывание временных файлов (хорошо) 0.00 из 5.00 0 оценок
Заказать работу

 

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

 

Другая функция для использования с системными вызовами на основе дескрипторов файлов:

 

 возвращает значение, представляющее уникальный открытый временный файл. Файл открывается в режиме "". означает «открыть для чтения и записи, сначала урезав файл», a b означает двоичный, а не текстовый режим. (На системах GNU/Linux или Unix нет разницы, но на других системах есть.) Файл автоматически удаляется, когда закрывается указатель файла; нет способа получить имя файла, чтобы сохранить его содержимое. Программа в демонстрирует:

 

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

ch12‑tmpfile

 

Ранее мы видели, что авторы GLIBC рекомендуют использование функции:

cc ch12‑mktemp.с ‑о ch12‑mktemp

 

 

Эта функция похожа на в том, что она принимает имя файла, оканчивающееся на '', и заменяет эти символы уникальным суффиксом для создания уникального имени файла. Однако, она идет на один шаг дальше. Она создает и открывает файл. Файл создается с доступом 0600 (т.е.). Таким образом, доступ к файлу может получить только пользователь, запустивший программу.

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

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

 

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

ch12‑mkstemp

 

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

 

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

Многие системы GNU/Linux предоставляют каталог, использующий файловую систему типа

df

 

 

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

ls ‑l /tmp/randwords.big

 

wc ‑l /tmp/randwords.big

 

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

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

 

 

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

 

 

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

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

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

 

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

 

 

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

 

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

 

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

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

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

 

Нелокальные переходы

 

«Идите прямо в тюрьму. Не проходите GO. Не забирайте 200$».

‑ Монополия ‑

 

Вы, без сомнения, знаете, чем является: передачей потока управления на метку где‑то в текущей функции. Операторы при скупом употреблении могут послужить удобочитаемости и правильности функции (Например, когда все проверки ошибок используют для перехода на метку в конце функции, такую, как, код с этой меткой проводит очистку [закрывая файлы и т.п.] и возвращается.) При плохом использовании операторы могут привести к так называемой «лапше» в коде, логику которого становится невозможно отследить.

Оператор в языке С ограничен переходом на метку в текущей функции. Многие языки в семействе Алгола, такие, как Паскаль, допускают использование для выхода из вложенной функции в предшествующую вызывающую функцию. Однако в С нет способа, в пределах синтаксиса самого языка, перейти в определенную точку другой функции, пусть даже и вызывающей. Такой переход называется нелокальным переходом.

Почему полезен нелокальный переход? Рассмотрите интерактивную программу, которая считывает и выполняет программы. Предположим, пользователь запускает длительное задание, разочаровывается или меняет мнение о данном задании и нажимает CTRL‑С для генерирования сигнала. Когда запускается обработчик сигнала, он может перейти обратно в начало главного цикла чтения и обработки команд. Строковый редактор ed представляет простой пример этого:

ed ‑p '> ' sayings

 

a

 

 

^C

 

1,$p

 

 

w

 

q

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

 


Поделиться с друзьями:

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.013 с.