MKSTEMP(3)

ИМЯ
mkstemp, mkostemp, mkstemps, mkostemps - создаёт временный файл с уникальным именем

ОБЗОР
#include <stdlib.h>

int mkstemp(char *template);

int mkostemp(char *template, int flags);

int mkstemps(char *template, int suffixlen);

int mkostemps(char *template, int suffixlen, int flags);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

mkstemp():
    _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
    || /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200112L

mkostemp(): _GNU_SOURCE
mkstemps(): _BSD_SOURCE || _SVID_SOURCE
mkostemps(): _GNU_SOURCE

ОПИСАНИЕ
Функция mktemp() генерирует на основе шаблона template уникальное имя для временного файла, создаёт и открывает файл, после чего возвращает дескриптор открытого файла. Последние шесть символов template должны быть равны "XXXXXX", они будут заменены на строку, которая сделает имя файла уникальным. Так как template будет меняться, он должна быть объявлен не строковой константой, а массивом символов. Файл создается с правами 0600, то есть читать и записывать в него может только владелец (в версиях glibc 2.06 и ниже файл создавался с правами 0666, то есть читать и записывать в него могли все пользователи). Возвращаемый дескриптор файла предоставляет доступ к файлу как на чтение, так и на запись. Файл открывается с помощью open(2) с флагом O_EXCL, что гарантирует, что вызывающий является процессом, создавшим файл. Функция mkostemp() похожа на mkstemp() с той лишь разницей, что флаги для вызова open(2) могут быть указаны в flags (например, O_APPEND, O_SYNC). Функция mkstemps() похожа на mkstemp(), за исключением строки в template, которая содержит символы суффикса suffixlen. Таким образом, template будет приобретать вид prefixXXXXXXsuffix, а строка XXXXXX будет меняться так же, как и для mkstemp(). Функция mkostemps() является аналогом mkstemps(), подобно как mkostemp() является аналогом mkstemp().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении данные функции возвращают дескриптор временного файла. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EEXIST
    Невозможно создать уникальное имя временного файла. Содержимое template теперь не определено.

EINVAL
    Для mkstemp() и mkostemp(): последние шесть символов template не равны XXXXXX. template не изменён.

    Для mkstemps() и mkostemps(): количество символов template меньше, чем (6 + suffixlen) или последние 6 символов до суффикса в template не равны XXXXXX.

Данные функции также могут завершиться ошибками, описанными в open(2).

ВЕРСИИ
mkostemp() впервые появилась в glibc 2.7. mkstemps() и mkostemps() доступны в glibc с версии 2.11.

СООТВЕТСТВИЕ СТАНДАРТАМ
mkstemp(): 4.3BSD, POSIX.1-2001. mkstemps() не стандартизована, однако может присутствовать на некоторых системах. mkostemp() и mkstemp(): являются расширениями glibc.

ЗАМЕЧАНИЯ
Старое поведение, при котором файл создавался с правами 0666, может являться угрозой безопасности, особенно когда в остальных системах UNIX используется режим 0600, на что некоторые могут не обратить внимания при переносе программ. В более общем смысле, в спецификации POSIX для mkstemp() ничего не сказано о правах на файл, поэтому программа должна сама проверить до вызова mkstemp() (и mkostemp()), что маска создания файла (смотрите umask(2)) уставлена в правильное значение. Прототип mktemp() для libc4, libc5, glibc1 находится в <unistd.h>; glibc2 следует POSIX.1, поэтому прототип для неё находится в <stdlib.h>.

СМОТРИТЕ ТАКЖЕ
mkdtemp(3), mktemp(3), tempnam(3), tmpfile(3), tmpnam(3)