tmpnam, tmpnam_s
|
Определено в заголовочном файле
<stdio.h>
|
||
|
char
*
tmpnam
(
char
*
filename
)
;
|
(1) | |
|
errno_t tmpnam_s
(
char
*
filename_s, rsize_t maxsize
)
;
|
(2) | (начиная с C11) |
|
#define TMP_MAX /*unspecified*/
|
||
|
#define TMP_MAX_S /*unspecified*/
|
(начиная с C11) | |
|
#define L_tmpnam /*unspecified*/
|
||
|
#define L_tmpnam_s /*unspecified*/
|
(начиная с C11) | |
-
- filename_s является нулевым указателем
- maxsize больше RSIZE_MAX
- maxsize меньше сгенерированной строки имени файла
-
Как и все функции с проверкой границ,
tmpnam_sгарантированно доступна только если реализация определяет __STDC_LIB_EXT1__ и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h> .
tmpnam и tmpnam_s изменяют статическое состояние (которое может быть общим для этих функций) и не обязаны быть потокобезопасными.
Содержание |
Параметры
| filename | - | указатель на массив символов, способный содержать как минимум L_tmpnam байт, используемый в качестве результирующего буфера. Если передается нулевой указатель, возвращается указатель на внутренний статический буфер. |
| filename_s | - | указатель на массив символов, способный содержать как минимум L_tmpnam_s байт, используемый в качестве результирующего буфера. |
| maxsize | - |
максимальное количество символов, которое функция может записать (обычно размер массива
filename_s
).
|
Возвращаемое значение
Примечания
Хотя имена, генерируемые функцией
tmpnam
, сложно предугадать, существует вероятность, что файл с таким именем будет создан другим процессом в промежутке между моментом,
когда
tmpnam
возвращает результат, и моментом, когда программа попытается использовать возвращённое имя для создания файла. Стандартная функция
tmpfile
и POSIX-функция
mkstemp
не имеют этой проблемы (создание уникального каталога с использованием только стандартной библиотеки C по-прежнему требует применения
tmpnam
).
Системы POSIX дополнительно определяют функцию с похожим названием
tempnam
, которая предоставляет выбор директории (по умолчанию используется опционально определённый макрос
P_tmpdir
).
Пример
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { // Примечание: компилятор/линковщик может выдать предупреждение безопасности, например в GCC: // "warning: the use of `tmpnam' is dangerous, better use `mkstemp'" char* name1 = tmpnam(NULL); printf("temporary file name: %s\n", name1); char name2[L_tmpnam]; if (tmpnam(name2)) printf("temporary file name: %s\n", name2); // POSIX предлагает mkstemp. Следующее объявление может быть // необходимо, так как mkstemp отсутствует в стандартном C <stdlib.h>. int mkstemp(char*); char name3[] = "/tmp/fileXXXXXX"; // требуется как минимум шесть 'X' ^_^ int file_descriptor = mkstemp(name3); if (file_descriptor != -1) printf("temporary file name: %s\n", name3); else perror("mkstemp"); }
Возможный вывод:
temporary file name: /tmp/file90dLlR temporary file name: /tmp/fileY9LWAg temporary file name: /tmp/filexgv8PF
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.21.4.4 Функция tmpnam (стр.: TBD)
-
- K.3.5.1.2 Функция tmpnam_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.21.4.4 Функция tmpnam (стр. 222)
-
- K.3.5.1.2 Функция tmpnam_s (стр. 427-428)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.21.4.4 Функция tmpnam (стр. 303-304)
-
- K.3.5.1.2 Функция tmpnam_s (стр. 587-588)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.19.4.4 Функция tmpnam (стр. 269-270)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.9.4.4 Функция tmpnam
Смотрите также
|
(C11)
|
возвращает указатель на временный файл
(функция) |
|
C++ documentation
для
tmpnam
|
|