мкстемп
В вычислениях , mkstemp
— это функция POSIX для создания временного файла ( компьютерного файла , который обычно перестает существовать, когда программа , открывшая файл, закрывает его или завершает работу). [ 1 ] Он принимает аргумент , определяющий расположение временного файла и префикс его сгенерированного имени файла. [ 1 ] После mkstemp
в Единую спецификацию UNIX была добавлена функция tmpnam()
был признан устаревшим, [ 1 ] поскольку последнее несло риск того, что временный файл с тем же именем может быть создан другим потоком или процессом в течение времени с момента, когда вызывающая сторона получит имя временного файла и попытается его создать. [ 2 ] mkstemp
не страдает от этой проблемы. [ 3 ]
Использование
[ редактировать ]Включение
[ редактировать ]- С
#include <stdlib.h> // per IEEE Std 1003.1, 2004
#include <unistd.h> // for "legacy" systems
- С++
#include <cstdlib> // per IEEE Std 1003.1, 2004
#include <unistd.h> // for "legacy" systems
Декларация
[ редактировать ]int mkstemp(char* template);
Требования
[ редактировать ]- Параметр
template
должен быть модифицируемым массивом символов с нулевым завершением. - Содержание
template
должен быть в формате допустимого пути к файлу с шестью символами в конце. - Параметр
template
не должен использоваться при предыдущем вызовеmkstemp
.
Семантика
[ редактировать ]- Завершающий «X»
template
перезаписываются для создания уникального имени результирующего временного файла. - В случае успеха функция сообщает действительный файловый дескриптор файлу временному ; в случае неудачи сообщает
-1
.
Пример
[ редактировать ]Следующий код является примером использования mkstemp
; локальная переменная filename
модифицируется mkstemp
и будет содержать путь к новому файлу: [ 4 ]
#include <stdlib.h>
void example()
{
char filename[] = "/tmp/prefXXXXXX";
mkstemp(filename);
}
Условия ошибки
[ редактировать ]Не указано, если mkstemp
устанавливает errno и какие значения errno устанавливаются в случае сбоя. [ 1 ]
Механизм
[ редактировать ]The mkstemp
Функция генерирует имя файла в соответствии с предоставленным аргументом шаблона и пытается его создать. Этот процесс повторяется до тех пор, пока файл не будет успешно создан. [ 5 ] После этого он открывает файл и возвращает дескриптор файла вызывающей стороне. [ 6 ] с буфером данных , который был передан в функцию, с шаблоном, который теперь содержит новое имя файла. [ 7 ] Файл можно удалить сразу после mkstemp
вызов возвращается, чтобы предотвратить его открытие другими процессами, но файл все равно можно использовать, поскольку вызывающий процесс все еще будет иметь действительный дескриптор файла. [ 5 ] Старые версии mkstemp
создал файл с маской 0666, в результате чего временные файлы стали доступны для чтения и записи всем пользователям, что представляет собой уязвимость безопасности; это можно исправить, установив umask вручную перед вызовом mkstemp
. [ 6 ] Более новые версии функции создают файл с маской 600, так что только владелец файла может читать и писать в него. [ 7 ]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с д mkstemp от OpenGroup
- ^ «темнам» . Спецификации базы открытой группы (выпуск 7 изд.). Открытая группа . 2018.
- ^ Стивенс, В. Ричард ; Раго, Стивен А. (2013). «Стандартные библиотечные функции». Временные файлы . Аддисон-Уэсли . п. 169. ИСБН 9780321638007 .
{{cite book}}
:|work=
игнорируется ( помогите ) - ^ Сикорд, Роберт К. (25 апреля 2014 г.). «Символы и строки (STR)». СТР30-С. Не пытайтесь изменять строковые литералы (2-е изд.). Аддисон-Уэсли. п. 203. ИСБН 9780133805291 .
{{cite book}}
:|work=
игнорируется ( помогите ) - ^ Jump up to: а б Виега, Джон ; Мессье, Мэтт (2003). «Контроль доступа». Временные файлы в Unix . О'Рейли Медиа . п. 66. ИСБН 9780596003944 .
{{cite book}}
:|work=
игнорируется ( помогите ) - ^ Jump up to: а б Чен, Хао; Дин, Дрю; Вагнер, Дэвид А. (2004). «Проверка модели на один миллион строк кода C» (PDF) . Симпозиум по безопасности сетей и распределенных систем . 4 . Интернет-сообщество . Архивировано (PDF) из оригинала 08 октября 2015 г. Проверено 18 мая 2019 г.
- ^ Jump up to: а б Дреппер, Ульрих (8 апреля 2009 г.). «Защитное программирование для Red Hat Enterprise Linux (и что делать, если что-то пойдет не так)» (PDF) . п. 7. S2CID 239879 . Архивировано из оригинала (PDF) 5 марта 2019 г. Проверено 18 мая 2019 г.