代码之家  ›  专栏  ›  技术社区  ›  rlbond

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

  •  4
  • rlbond  · 技术社区  · 15 年前

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

    1 回复  |  直到 15 年前
        1
  •  5
  •   bdonlan    15 年前

    tmpnam只保证文件当时不存在-但在您自己创建之前,它可能会被创建。为了安全地使用它,您总是需要尝试创建打开的文件(文件名,o_creat_o_excl_o_nofollow)。如果由于eExist或eLop而失败,请返回并尝试新名称。

    这对于防止symlink攻击特别重要,在这种攻击中,另一个程序从临时文件名创建symlink到/etc/passwd或其他一些重要文件。

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

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

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