我需要tmpnam
在 C++ 中使用该函数,但我需要了解它的线程安全性。也就是说,如果我有几个线程,每个线程都需要为临时文件获取不同的名称,我是否保证每个线程都会收到一个不同名称的文件?
问问题
1376 次
1 回答
5
tmpnam 仅保证该文件当时不存在 - 但它可以在您自己创建之前创建。为了安全地使用它,您将始终需要尝试使用 open (filename, O_CREAT | O_EXCL | O_NOFOLLOW) 创建文件。如果由于 EEXIST 或 ELOOP 而失败,请返回并尝试一个新名称。
这对于防止符号链接攻击尤其重要,在这种攻击中,另一个程序会创建一个从您的临时文件名到 /etc/passwd 或其他重要文件的符号链接。
此外,请确保不要将 NULL 传递给 tmpnam,因为那时使用的缓冲区对于所有线程都是相同的。
结合这些的另一种方法是使用 mkstemp() 或 mkostemp(),它将为您安全地创建文件。
最后,如果您不需要文件名,您可以使用 tmpfile(),它会创建一个临时文件,该文件将在关闭时删除。
于 2009-07-17T18:54:10.077 回答