tempnam - создаёт
имя для
временного
файла
Standard C library (
libc,
-lc)
#include <stdio.h>
char *tempnam(const char *dir, const char *pfx);
tempnam():
начиная с glibc 2.19:
_DEFAULT_SOURCE
в glibc 2.19 и старее:
_BSD_SOURCE || _SVID_SOURCE
Никогда не
используйте
эту
функцию.
Вместо неё
используйте
mkstemp(3) или
tmpfile(3).
Функция
tempnam()
возвращает
указатель
на строку,
которая
является
допустимым
именем
файла и при
этом файл с
подобным
именем на
момент
проверки
tempnam() не
существует.
Суффикс
сгенерированного
имени
файла
будет
начинаться
с
pfx (при
условии,
что
pfx — не
NULL-строка и
содержит
не менее
пяти байт).
Также
необходимо,
чтобы
префикс,
состоящий
из имён
каталогов
полного
имени
файла, был
«целесообразным»
(чаще всего
это
подразумевает,
как
минимум,
доступность
на запись).
Попытка
найти
подходящий
каталог
делится на
следующие
шаги:
- а)
- Если
существует
переменная
окружения
TMPDIR, которая
содержит
подходящий
каталог, то
используется
она.
- б)
- Иначе,
если
аргумент
dir не
является NULL
и
подходящий,
то
используется
он.
- 3.
- Иначе
используется
P_tmpdir (описана
в <stdio.h>), если
она
подходит.
- 4.
- И,
наконец,
может быть
использован
каталог,
определённый
реализацией
функции.
Память под
строку,
возвращаемую
tempnam(),
выделяется
с помощью
malloc(3) и в
последствии
должна
быть
освобождена
с помощью
free(3).
On success, the
tempnam() function returns a pointer to a unique
temporary filename. It returns NULL if a unique name cannot be generated, with
errno set to indicate the error.
- ENOMEM
- Не
удалось
выделить
память для
строки.
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
tempnam() |
Безвредность
в нитях |
MT-Safe env |
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),
mktemp(3),
tmpfile(3),
tmpnam(3)
Русский
перевод
этой
страницы
руководства
был сделан
Azamat Hackimov <
[email protected]>, Dmitry Bolkhovskikh
<
[email protected]>, Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]