4
我需要在C++中使用tmpnam
函數,但我需要知道它的線程安全性。也就是說,如果我有幾個線程,每個線程都需要爲一個臨時文件獲取不同的名稱,我保證每個線程都會收到一個名稱不同的文件?C/C++ tmpnam的線程安全性?
我需要在C++中使用tmpnam
函數,但我需要知道它的線程安全性。也就是說,如果我有幾個線程,每個線程都需要爲一個臨時文件獲取不同的名稱,我保證每個線程都會收到一個名稱不同的文件?C/C++ tmpnam的線程安全性?
tmpnam只保證該文件在當時不存在 - 但它可能會在您自己創建之前創建。要安全地使用它,你總是需要嘗試用open(文件名,O_CREAT | O_EXCL | O_NOFOLLOW)創建文件。如果由於EEXIST或ELOOP而失敗,請返回並嘗試一個新名稱。
這對防止符號鏈接攻擊尤爲重要,其中另一個程序從臨時文件名創建符號鏈接到/ etc/passwd或其他重要文件。
此外,請確保您不會將NULL傳遞給tmpnam,因爲所使用的緩衝區對於所有線程都是相同的。
將這些結合起來的另一種方法是使用mkstemp()或mkostemp(),它將爲您安全地創建文件。
最後,如果你不需要文件名,你可以使用tmpfile(),它會創建一個臨時文件,並在關閉時刪除。
但mkstemp是僅用於UNIX ... :( – rlbond 2009-07-17 19:06:21