Scroll to navigation

TEMPNAM(3) Руководство программиста Linux TEMPNAM(3)

ИМЯ

tempnam - создание имени для временного файла

ОБЗОР

#include <stdio.h>

char *tempnam(const char *dir, const char *pfx);


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

tempnam(): _BSD_SOURCE || _SVID_SOURCE

ОПИСАНИЕ

Функция tempnam() возвращает указатель на строку, которая является допустимым именем файла и при этом файл с подобным именем на момент проверки tempnam() не существовал. Суффикс сгенерированного имени файла будет начинаться с pfx (при условии, что pfx — не NULL-строка и содержит не менее пяти байт). Также необходимо, чтобы префикс, состоящий из имён каталогов полного имени файла, был «подходящим» (чаще всего это требование доступности на запись).

Попытка найти подходящий каталог делится на следующие шаги:

1.
Если существует переменная окружения TMPDIR, которая содержит подходящий каталог, то используется она.
2.
Иначе, если аргумент dir не является NULL и подходящий, то используется он.
3.
Иначе используется P_tmpdir (описана в <stdio.h>), если она подходит.
4.
И, наконец, может быть использован каталог, определённый реализацией функции.

Память под строку, возвращаемую tempnam(), выделяется с помощью malloc(3) и в последствии должна быть освобождена с помощью free(3).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция tempnam() возвращает указатель на уникальное имя временного файла, либо NULL, если его невозможно сгенерировать.

ОШИБКИ

Не удалось выделить память для строки.

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, 4.3BSD, POSIX.1-2001. В POSIX.1-2008 функция tempnam() отмечена как устаревшая.

ЗАМЕЧАНИЯ

Хотя tempnam() генерирует имена, которые трудно подобрать, тем не менее, есть вероятность, что за промежуток времени, когда tempnam() вернёт имя файла и программа откроет его, другая программа успеет создать такое же имя с помощью open(2) или создать символическую ссылку, что может привести к проблемам безопасности. Чтобы исключить подобную вероятность, для открытия имени файла используйте open(2) с флагом O_EXCL. А ещё лучше — воспользуйтесь mkstemp(3) или tmpfile(3).

В SUSv2 не упоминается использование TMPDIR; в glibc она будет использоваться только в том случае, если у программы не установлен бит set-user-ID. В SVr4, используемый каталог для случая 4./tmp (как и для glibc).

Так как tempnam() динамически выделяет память под возвращаемое имя файла, то она является реентерабельной и, следовательно, безопасной при использовании нитей (в отличие от tmpnam(3)).

Функция tempnam() генерирует уникальное имя каждый раз, пока не достигнет предела TMP_MAX (определённого в <stdio.h>). Если она будет вызвана более чем TMP_MAX раз, то дальнейшее поведение определяется конкретной реализацией.

tempnam() использует по крайней мере первые пять байт из pfx.

Реализация tempnam() из glibc завершится с ошибкой EEXIST, если не сможет найти уникальное имя.

ДЕФЕКТЫ

Точного определения что значение «подходимости» — нет. Не определено, каким образом должна определяться доступность каталога.

Никогда не используйте эту функцию. Вместо неё используйте mkstemp(3) или tmpfile(3).

СМОТРИТЕ ТАКЖЕ

mkstemp(3), mktemp(3), tmpfile(3), tmpnam(3)

2008-08-06