Подтвердить что ты не робот

Как создать временный файл для записи на С++ на платформе Linux?

В С++, в Linux, как я могу написать функцию для возврата временного имени файла, которое я могу открыть для записи?

Имя файла должно быть как можно более уникальным, так что другой процесс с использованием той же функции не получит одно и то же имя.

4b9b3361

Ответ 1

Используйте одну из стандартных функций библиотеки mktemp: mktemp/mkstemp/mkstemps/mkdtemp.

Изменить: простой mktemp может быть небезопасным - mkstemp является предпочтительным.

Ответ 2

tmpnam(), или все, что дает вам имя, будет уязвимым для условий гонки. Используйте что-то, предназначенное для этой цели, которое возвращает дескриптор, например tmpfile():

   #include <stdio.h>

   FILE *tmpfile(void);

Ответ 3

В руководстве GNU libc обсуждаются различные доступные варианты и их оговорки:

http://www.gnu.org/s/libc/manual/html_node/Temporary-Files.html

Короче говоря, только mkstemp() или tmpfile() должны использоваться, как упомянули другие.

Ответ 4

man tmpfile

Функция tmpfile() открывает уникальный временный файл в двоичном формате        режим чтения/записи (w + b). Файл будет автоматически удален, если он        закрывается или программа terminates.ote

Ответ 5

mktemp должен работать или получить одно из множества доступных библиотек для создания UUID.

Ответ 6

Функция tmpnam() в стандартной библиотеке C предназначена для решения именно этой проблемы. Там также tmpfile(), который возвращает дескриптор открытого файла (и автоматически удаляет его при его закрытии).

Ответ 7

Вы должны просто проверить, существует ли файл, который вы пытаетесь записать, уже существует. Это проблема блокировки. У файлов также есть владельцы, поэтому, если вы делаете это правильно, неправильный процесс не сможет его написать.