作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要在 C++ 中使用 tmpnam
函数,但我需要了解它的线程安全性。也就是说,如果我有多个线程,每个线程都需要为一个临时文件获取不同的名称,我能保证每个线程都会收到一个不同名称的文件吗?
最佳答案
tmpnam 仅保证该文件当时不存在 - 但它可能在您自己创建之前创建。为了安全地使用它,您将始终需要尝试创建打开的文件(文件名,O_CREAT | O_EXCL | O_NOFOLLOW)。如果由于 EEXIST 或 ELOOP 而失败,请返回并尝试一个新名称。
这对于防止符号链接(symbolic link)攻击特别重要,在这种攻击中,另一个程序会创建一个从您的临时文件名到/etc/passwd 或其他重要文件的符号链接(symbolic link)。
此外,请确保您没有将 NULL 传递给 tmpnam,因为所有线程使用的缓冲区都是相同的。
另一种结合这些方法的方法是使用 mkstemp() 或 mkostemp(),它们将为您安全地创建文件。
最后,如果您不需要文件名,可以使用 tmpfile(),它将创建一个临时文件,该文件将在关闭时删除。
关于c++ - tmpnam 的 C/C++ 线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1145048/
我是一名优秀的程序员,十分优秀!