我正在编写一个C ++程序,需要为其内部用法创建一个临时文件。我想通过运行多个进程来允许并发执行程序,因此临时文件名需要随机化,这样每个衍生进程都会生成一个唯一的临时文件名供自己使用。
我使用rand()为部分文件名生成随机字符,所以我需要使用srand()初始化随机数生成器的种子。
有什么选择可以将一个好的参数传递给srand(),这样就不会使用相同的种子值初始化两个进程? 我的代码需要在Windows和Linux上运行。
答案 0 :(得分:24)
问题是 实际上 询问如何创建一个唯一命名的临时文件。
操作系统可能为此提供了一个API,这意味着您不必生成自己的名称。
在Windows上,它名为GetTempFileName()
and GetTempPath()
。
在Unix上,使用tmpfile()
。
(Windows也支持tmpfile()
;但是,我听到其他人的报告,虽然它在XP上工作得很好,但如果你使用的是C:驱动器并且你不是管理员;最好使用GetTempFileName()
方法和自定义的安全路径
答案 1 :(得分:2)
如果您只是需要临时文件,可以使用:
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()可能不是线程安全的 所以要小心你如何使用它。同时进入兰特的两个线程会引起问题。
答案 2 :(得分:1)
答案 3 :(得分:0)
你可以用微秒获得时间,并将它乘以一个大数来得到种子。但是,无论种子是什么,碰撞总会发生。
答案 4 :(得分:0)
在unix系统上,读取/dev/random
答案 5 :(得分:0)
不同的进程将具有不同的进程ID。然而,直接添加到时间会有点粗心,因为它通常是一个小数字。这不是一个大问题:潜在的问题是时间和进程ID都将其熵集中在最低位。通过简单地进行位反转并对结果进行异或,您可以获得所有位的良好熵。
答案 6 :(得分:0)
我建议您不要使用随机文件名,而是根据进程ID和当前时间创建一个唯一的文件名(如果您可以阅读的时间分辨率足以满足您的需要)。我对你的问题知之甚少,但我怀疑使用随机名称没有任何好处,并且碰撞的风险可能非常真实。即使您使用操作系统为另一个答案中建议的文件创建文件,也是如此。