Мкстемп - Mkstemp

В вычисление, mkstemp это POSIX функция для создания временный файлкомпьютерный файл который обычно перестает существовать, когда программа, который открыл файл, закрыл его или завершил работу).[1] Он принимает аргумент который определяет местоположение временного файла и префикс его сгенерированного имени файла.[1] После mkstemp был добавлен в Единая спецификация UNIX, функция темпнам () устарел,[1] поскольку в последнем случае существует риск того, что временный файл с тем же именем может быть создан другим потоком или процессом в течение времени с момента, когда вызывающий объект получает временное имя файла и пытается его создать.[2] mkstemp не страдает этой проблемой.[3]

использование

Включение

C
#включают  // согласно IEEE Std 1003.1, 2004#включают  // для "устаревших" систем
C ++
#включают  // согласно IEEE Std 1003.1, 2004#включают  // для "устаревших" систем

Декларация

int mkstemp (шаблон char *);

Требования

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

Семантика

  • Завершающие крестики в шаблон перезаписываются для создания уникального имя файла для полученного временного файла.
  • Функция сообщает о действительном дескриптор файла к временный файл об успехе; при отказе он сообщает -1.

Пример

Следующий код - это пример использования mkstemp; локальная переменная имя файла изменен mkstemp и будет содержать путь к новому файлу:[4]

#включают <stdlib.h>пустота пример(){    char имя файла[] = "/ tmp / prefXXXXXX";    mkstemp(имя файла);}

Условия ошибки

Не указано, если mkstemp наборы errno, и какие значения errno устанавливаются, в случае отказа.[1]

Механизм

В mkstemp Функция генерирует имя файла в соответствии с предоставленным аргументом для шаблона и пытается его создать. Он повторяет этот процесс до тех пор, пока файл не будет успешно создан.[5] После этого он открывает файл и возвращает дескриптор файла вызывающей стороне,[6] с буфер данных который был передан функции с шаблоном, теперь содержащим новое имя файла.[7] Файл можно удалить сразу после mkstemp вызов возвращается, чтобы предотвратить его открытие другими процессами, но файл все еще можно использовать, потому что вызывающий процесс по-прежнему будет иметь допустимый дескриптор файла.[5] Старые версии mkstemp создал файл с маска из 0666, что приводит к тому, что временные файлы доступны для чтения и записи всем пользователям, и, таким образом, представляет собой уязвимость системы безопасности; это смягчается установкой umask вручную перед вызовом mkstemp.[6] Более новые версии функции создают файл с umask 600, так что только владелец файла может читать и записывать в него.[7]

Смотрите также

Рекомендации

  1. ^ а б c d mkstemp к OpenGroup
  2. ^ "темпнам". Базовые спецификации Open Group (Выпуск 7-е изд.). OpenGroup. 2018.
  3. ^ Стивенс, В. Ричард; Раго, Стивен А. (2013). «Стандартные библиотечные функции». Временные файлы. Расширенное программирование в среде Unix. Эддисон-Уэсли. п. 169. ISBN  9780321638007.
  4. ^ Сикорд, Роберт С. (2014-04-25). «Персонажи и строки (STR)». STR30-C. Не пытайтесь изменять строковые литералы. Стандарт кодирования CERT C (2-е изд.). Эддисон-Уэсли. п. 203. ISBN  9780133805291.
  5. ^ а б Вьега, Джон; Мессье, Мэтт (2003). "Контроль доступа". Временные файлы в Unix. Руководство по безопасному программированию для C и C ++. O'Reilly Media. п. 66. ISBN  9780596003944.
  6. ^ а б Чен, Хао; Дин, Дрю; Вагнер, Дэвид А. (2004). «Модель, проверяющая один миллион строк кода C» (PDF). Симпозиум по безопасности сетей и распределенных систем. Интернет-общество. 4. В архиве (PDF) из оригинала на 2015-10-08. Получено 2019-05-18.
  7. ^ а б Дреппер, Ульрих (2009-04-08). «Защитное программирование для Red Hat Enterprise Linux (и что делать, если что-то пойдет не так)» (PDF). п. 7. В архиве (PDF) из оригинала на 2019-03-05. Получено 2019-05-18.