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

时间:2009-07-17 18:51:37

标签: c++ c temporary-files

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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