2009-07-17 78 views
4

我需要在C++中使用tmpnam函數,但我需要知道它的線程安全性。也就是說,如果我有幾個線程,每個線程都需要爲一個臨時文件獲取不同的名稱,我保證每個線程都會收到一個名稱不同的文件?C/C++ tmpnam的線程安全性?

回答

5

tmpnam只保證該文件在當時不存在 - 但它可能會在您自己創建之前創建。要安全地使用它,你總是需要嘗試用open(文件名,O_CREAT | O_EXCL | O_NOFOLLOW)創建文件。如果由於EEXIST或ELOOP而失敗,請返回並嘗試一個新名稱。

這對防止符號鏈接攻擊尤爲重要,其中另一個程序從臨時文件名創建符號鏈接到/ etc/passwd或其他重要文件。

此外,請確保您不會將NULL傳遞給tmpnam,因爲所使用的緩衝區對於所有線程都是相同的。

將這些結合起來的另一種方法是使用mkstemp()或mkostemp(),它將爲您安全地創建文件。

最後,如果你不需要文件名,你可以使用tmpfile(),它會創建一個臨時文件,並在關閉時刪除。

+0

但mkstemp是僅用於UNIX ... :( – rlbond 2009-07-17 19:06:21