我正在使用File::Temp在Perl中创建唯一的临时文件。如果我运行的脚本在几个不同的进程中创建临时文件,是否可以保证文件名在进程之间是唯一的?
答案 0 :(得分:3)
根据doc,它是安全的:
强调临时文件创建的安全性方面,以便一起返回文件句柄和文件名。这有助于保证在检查文件是否存在及其打开之间由另一个进程创建临时文件的情况下不会发生竞争条件。提供额外的安全级别以检查例如粘性位是否在世界可写目录上设置。有关更多信息,请参阅safe_level。
答案 1 :(得分:3)
否,无法保证临时文件文件名在进程之间是唯一的。
当您要求使用File::Temp::tempfile
创建临时文件时,最多保证文件在创建时不存在。但是没有保证以前从未存在过具有该名称的文件。
例如,如果进程A创建临时文件,然后将其关闭并将其删除,则进程B中File::Temp::tempfile
稍后创建的文件名可能相同。这是不可能的,但可能。在任何情况下,您都不应将tempfile路径视为临时文件生命周期之外的唯一ID。
答案 2 :(得分:2)
File :: Temp尝试通过将O_EXCL
标志设置为sysopen
来确保它不会打开现有文件,如果该文件已经导致sysopen
失败存在。但是:
O_EXCL
可能无法在网络文件系统上运行...
因此,在某些网络文件系统上,一个进程可能会打开另一个进程创建的现有临时文件。
NFS上有other problems和File :: Temp,所以你应该只在本地文件系统上使用它。