Поскольку вы отметили вопрос gnu
и linux
, вы можете использовать функцию mkstemp()
:
ОПИСАНИЕ
Функция mkstemp()
генерирует уникальное временное имя файла из template
, создает и открывает файл и возвращает дескриптор открытого файла для файла.
Последние шесть символов шаблона должны быть "XXXXXX"
и они заменяются строкой, которая делает имя файла уникальным. Поскольку он будет изменен, шаблон не должен быть строковой константой, а должен быть объявлен как массив символов.
Например:
char newFileName[] = "/path/to/new/file/someName.XXXXXX";
int newFileDescriptor = mkstemp( newFileName );
Существует несколько других вариантов функция mkstemp()
на странице руководства, которая может лучше соответствовать вашим реальным потребностям.
В зависимости от того, насколько безопасным должен быть процесс создания вашего файла, создавая уникальное имя для нового файла, а затем убедившись, что файл, который вы открываете, на самом деле является новым файлом, который вы намеревались создать, а не какой-то другой файл, замененный вредоносным кодом, сделать нелегко безопасно - было довольно много эксплойтов, использующих внутреннее условие гонки между кодом, генерирующим имя, и затем пытаясь создать новый файл для взлома системы или иным образом скомпрометировать его.
И помните, что такие конструкции, как UUID, на самом деле не гарантированно являются уникальными. Если это просто случайные числа, они не могут быть гарантированно уникальными (хотя вероятность столкновения может быть чрезвычайно мала). Если они не являются действительно случайными числами, у них есть шаблон, который может быть предсказан и использован вредоносным кодом.
Если требуется защита, вам лучше всего использовать возможности операционной системы для создания нового , уникальный файл и предоставление вашему коду дескриптора открытого файла или дескриптора этого нового файла.