C/C++;tmpnam的线程安全性? 我需要在C++中使用 TMPNAM//COD>函数,但我需要知道它的线程安全性。也就是说,如果我有几个线程,每个线程都需要为一个临时文件获取不同的名称,那么我是否保证每个线程都会收到一个具有不同名称的文件?
tmpnam仅保证该文件当时不存在,但它可能是在您自己创建之前创建的。为了安全地使用它,您将始终需要尝试创建打开的文件(filename,O|u create | O|u EXCL | O|u NOFOLLOW)。如果由于EEXIST或ELOOP而失败,请返回并尝试一个新名称 这对于防止符号链接攻击尤其重要,因为其他程序会创建一个从临时文件名到/etc/passwd或其他一些重要文件的符号链接 另外,请确保不要将NULL传递给tmpnam,因为此时使用的缓冲区对于所有线程都是相同的 另一种结合这些特性的方法是使用mkstemp()或mkostemp(),这将为您安全地创建文件C/C++;tmpnam的线程安全性? 我需要在C++中使用 TMPNAM//COD>函数,但我需要知道它的线程安全性。也就是说,如果我有几个线程,每个线程都需要为一个临时文件获取不同的名称,那么我是否保证每个线程都会收到一个具有不同名称的文件?,c++,c,temporary-files,C++,C,Temporary Files,tmpnam仅保证该文件当时不存在,但它可能是在您自己创建之前创建的。为了安全地使用它,您将始终需要尝试创建打开的文件(filename,O|u create | O|u EXCL | O|u NOFOLLOW)。如果由于EEXIST或ELOOP而失败,请返回并尝试一个新名称 这对于防止符号链接攻击尤其重要,因为其他程序会创建一个从临时文件名到/etc/passwd或其他一些重要文件的符号链接 另外,请确保不要将NULL传递给tmpnam,因为此时使用的缓冲区对于所有线程都是相同的 另一种结合这
最后,如果您不需要文件名,可以使用tmpfile(),它将创建一个临时文件,该文件将在关闭时删除。以可移植的方式避免符号链接遍历是不可能的。。。您可能只需要为windows编写一个版本,为*nix编写一个版本。或者使用一个安全的随机数生成器生成一个长文件名,并且冲突的概率非常小。