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

rlb*_*ond 4 c c++ temporary-files

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

bdo*_*lan 5

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

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

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

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

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