Ответ 1
Используйте одну из стандартных функций библиотеки mktemp: mktemp/mkstemp/mkstemps/mkdtemp.
Изменить: простой mktemp может быть небезопасным - mkstemp является предпочтительным.
В С++, в Linux, как я могу написать функцию для возврата временного имени файла, которое я могу открыть для записи?
Имя файла должно быть как можно более уникальным, так что другой процесс с использованием той же функции не получит одно и то же имя.
Используйте одну из стандартных функций библиотеки mktemp: mktemp/mkstemp/mkstemps/mkdtemp.
Изменить: простой mktemp может быть небезопасным - mkstemp является предпочтительным.
tmpnam(), или все, что дает вам имя, будет уязвимым для условий гонки. Используйте что-то, предназначенное для этой цели, которое возвращает дескриптор, например tmpfile():
#include <stdio.h>
FILE *tmpfile(void);
В руководстве GNU libc обсуждаются различные доступные варианты и их оговорки:
http://www.gnu.org/s/libc/manual/html_node/Temporary-Files.html
Короче говоря, только mkstemp() или tmpfile() должны использоваться, как упомянули другие.
man tmpfile
Функция tmpfile() открывает уникальный временный файл в двоичном формате режим чтения/записи (w + b). Файл будет автоматически удален, если он закрывается или программа terminates.ote
mktemp должен работать или получить одно из множества доступных библиотек для создания UUID.
Функция tmpnam() в стандартной библиотеке C предназначена для решения именно этой проблемы. Там также tmpfile(), который возвращает дескриптор открытого файла (и автоматически удаляет его при его закрытии).
Вы должны просто проверить, существует ли файл, который вы пытаетесь записать, уже существует. Это проблема блокировки. У файлов также есть владельцы, поэтому, если вы делаете это правильно, неправильный процесс не сможет его написать.