我需要使用C ++中的tmpnam功能,但我需要知道它的线程安全。也就是说,如果我有多个线程,将每个需要为临时文件获得一个不同的名字,我保证每个线程将收到一个文件有不同的名称?

有帮助吗?

解决方案

使用tmpnam只保证文件不当时存在 - 但它可以被创建之前,你可以这样做你自己。为了安全地使用它,你将永远需要再试图创建与打开文件(文件名,O_CREAT | O_EXCL | O_NOFOLLOW)。如果失败是由于EEXIST或ELOOP,回去尝试一个新的名称。

这是特别重要的,以防止符号链接的攻击,在另一个程序从您的临时文件的名称创建一个符号链接到/ etc / passwd文件或其他一些重要的文件。

此外,还要确保你没有通过NULL来使用tmpnam,如再使用的缓存是所有线程的相同。

其中组合这些的另一种方法是使用mkstemp()或mkostemp(),这将安全地创建该文件为您服务。

最后,如果你不需要的文件名,你可以使用TMPFILE(),这将创建在接近被删除临时文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top