C / C ++ tmpnam的线程安全性?

我需要在C ++中使用tmpnam函数,但我需要知道它的线程安全性。 也就是说,如果我有几个线程,每个线程都需要为临时文件获取不同的名称,我保证每个线程都会收到一个具有不同名称的文件吗?

tmpnam只保证文件当时不存在 – 但它可能会在您自己创建之前创建。 要安全地使用它,您将始终需要尝试使用open(文件名,O_CREAT | O_EXCL | O_NOFOLLOW)创建文件。 如果由于EEXIST或ELOOP而失败,请返回并尝试新名称。

这对于防止符号链接攻击尤为重要,其中另一个程序会将临时文件名中的符号链接创建到/ etc / passwd或其他一些重要文件。

此外,请确保不将NULL传递给tmpnam,因为所使用的缓冲区对于所有线程都是相同的。

结合这些的另一种方法是使用mkstemp()或mkostemp(),它将为您安全地创建文件。

最后,如果您不需要文件名,则可以使用tmpfile(),它将创建一个临时文件,该文件将在关闭时删除。