Как я могу создать временный файл для записи в C ++ на платформе Linux? - PullRequest
11 голосов
/ 02 октября 2008

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

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

Ответы [ 7 ]

18 голосов
/ 02 октября 2008

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

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

7 голосов
/ 02 октября 2008

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

   #include <stdio.h>

   FILE *tmpfile(void);
2 голосов
/ 21 сентября 2009

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

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

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

0 голосов
/ 02 октября 2008

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

0 голосов
/ 02 октября 2008

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

0 голосов
/ 02 октября 2008

man tmpfile

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

0 голосов
/ 02 октября 2008

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

...