Spec-Zone.ru › C

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)
1) Создаёт уникальное допустимое имя файла (длиной не более L_tmpnam символов) и сохраняет его в строке символов, на которую указывает filename. Функция способна сгенерировать до TMP_MAX уникальных имён файлов, но некоторые или все из них могут быть заняты в файловой системе и, следовательно, не подходят в качестве возвращаемых значений.
2) Аналогично (1), за исключением того, что может быть сгенерировано до TMP_MAX_S имён, длиной не более L_tmpnam_s символов, и следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений:
  • filename_s является указателем на null
  • maxsize больше RSIZE_MAX
  • maxsize меньше, чем сгенерированная строка имени файла
Как и во всех функциях с проверкой границ, tmpnam_s гарантированно доступна только в том случае, если __STDC_LIB_EXT1__ определена реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целую константу 1 перед включением <stdio.h>.

tmpnam и tmpnam_s изменяют статическое состояние (которое может быть разделено между этими функциями) и не обязаны быть потокобезопасными.

Параметры

filename - указатель на массив символов, способный содержать как минимум L_tmpnam байта, используемый в качестве буфера результатов. Если передан null-указатель, возвращается указатель на внутренний статический буфер.
filename_s - указатель на массив символов, способный содержать как минимум L_tmpnam_s байта, используемый в качестве буфера результатов.
maxsize - максимальное количество символов, которое функция разрешается записать (обычно размер массива filename_s).

Возвращаемое значение

1) filename если filename не был указателем на null. В противном случае возвращается указатель на внутренний статический буфер. Если подходящее имя файла сгенерировать не удаётся, возвращается null-указатель.
2) Возвращает ноль и записывает имя файла в filename_s при успешном выполнении. При ошибке возвращает ненулевое значение и записывает нулевой символ в filename_s[0] (только если filename_s не равен null и maxsize не равен нулю и не больше RSIZE_MAX).

Примечания

Хотя имена, сгенерированные функцией tmpnam, трудно угадать, возможно, что файл с таким именем создаст другой процесс между моментом, когда tmpnam возвращает значение, и моментом, когда эта программа попытается использовать возвращённое имя для создания файла. Стандартная функция tmpfile и функция POSIX mkstemp не имеют этой проблемы (создание уникальной директории с использованием только стандартной библиотеки C всё ещё требует использования tmpnam).

Системы POSIX дополнительно определяют функцию с похожим именем tempnam, которая предлагает выбор директории (по умолчанию определяемой макросом P_tmpdir).

Пример

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
    // Note, the compiler/linker may issue a security warning, e.g. 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 offers mkstemp. The following declaration might be
    // necessary as mkstemp is absent in the standard C <stdlib.h>.
    int mkstemp(char*);
 
    char name3[] = "/tmp/fileXXXXXX"; // at least six 'X' required ^_^
    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:2023):
    • 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

См. также

tmpfiletmpfile_s
(C11)
возвращает указатель на временный файл
(функция)
Документация C++ для tmpnam

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/io/tmpnam

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API