Я пишу программу C++, которая должна создать временный файл для его внутреннего использования. Я хотел бы позволить параллельные осуществления программы путем выполнения нескольких процессов, таким образом, временное имя файла должно быть рандомизировано, тот способ, которым каждый порожденный процесс генерирует уникальное временное имя файла для своего собственного использования.
Я использую рэнд () для генерации случайных символов для части имени файла, таким образом, я должен инициализировать семя генератора случайных чисел с помощью srand ().
Какие опции там для передачи хорошего аргумента к srand () таким образом, что два процесса не будут инициализированы с тем же значением семени? Мой код должен работать и над Windows и над Linux.
Вопрос на самом деле спрашивает, как создать временный файл с уникальным именем.
Операционная система, вероятно, предоставляет для этого API, что означает, что вам не нужно создавать собственное имя.
В Windows это называется GetTempFileName ()
и GetTempPath ()
.
В Unix используйте tmpfile ()
.
(Windows также поддерживает tmpfile ()
; однако я слышал сообщения от других, что, хотя он хорошо работает в XP, он не работает в Vista, если вы используете диск C: и вы не администратор; лучше всего использовать метод GetTempFileName ()
с настраиваемым безопасным путем)
Если вы просто нуждаетесь в TEMP-файле, вы можете использовать:
FILE* tmpfile(); // Generate an unnamed temporary file.
char* tmpnam(char* s); // Generate a file name in the director specified by TMPDIR
Время использования:
srand(time(NULL));
также обратите внимание, что Rand (), вероятно, не безопасно для потоков.
Так что будьте осторожны, как вы его используете. Два потока, входящие в RAND одновременно, собираются вызвать проблемы.
Я никогда не использовал его сам, но вы сможете использовать TMPNAM ()
, чтобы создать имя вашего временного файла. Быстрый поиск указал на поддержку как Windows и Linux .
вы можете получить время в микросекундах и умножить его на большое число, чтобы получить начальное число. Однако столкновения могут произойти всегда, независимо от того, какое семя.
Я бы предположил, что вы не используете случайное имя файла, но вместо этого создаем уникальное имя файла из идентификатора процесса и текущим временем (если разрешение времени, которое вы можете прочитать, достаточно для вас, который должен быть). Я не знаю достаточно о вашей проблеме, но я подозреваю, что нет никакой выгоды от использования случайного имени, а риск для столкновений может быть очень реальным. Это верно, даже если вы используете операционную систему для создания файлов для вас, которые были предложены в другом ответе.
У разных процессов будут разные идентификаторы процессов. Однако добавлять это прямо к времени было бы немного небрежно, поскольку часто это небольшое число. Однако это не большая проблема: основная проблема заключается в том, что и время, и идентификатор процесса имеют свою энтропию, сконцентрированную в своих младших битах. Просто поменяв местами один бит и выполняя XOR результата, вы получите хорошую энтропию во всех битах.