Я использую File::Temp для создания уникальных временных файлов в Perl. Если я запускаю скрипт, создающий временные файлы в нескольких разных процессах, гарантируется ли уникальность имен файлов между процессами?Являются ли файлы :: Temp именами файлов уникальными для всех процессов?
ответ
File :: Temp пытается убедиться, что он не открывает существующий файл, установив O_EXCL
флаг в sysopen
, что вызывает sysopen
сбой, если файл уже существует. Однако:
O_EXCL
не может работать на сетевых файловых системах ...
Так что на некоторых сетевых файловых систем, вполне возможно, что один процесс может открыть существующий временный файл, созданный другим процессом.
Есть other problems с файлом :: Temp на NFS, поэтому вы должны использовать его только в локальной файловой системе.
Согласно doc, это безопасно:
аспект безопасности создания временного файла Подчеркивается, например, что указатель_на_файл и имя файла возвращаются вместе. Это помогает гарантировать, что условие гонки не может произойти, когда временный файл создается другим процессом между проверкой наличия файла и его открытием. Дополнительные уровни безопасности предоставляются для проверки, например, того, что липкий бит установлен в мировых каталогах, доступных для записи. Для получения дополнительной информации см. Safe_level.
Нет, нет никакой гарантии, что временные файлы имена файлов будут уникальными между процессами.
Когда вы запрашиваете создание временного файла с File::Temp::tempfile
, существует самая большая гарантия того, что файл не существовал во время создания. Но нет гарантии, что файл с таким именем никогда раньше не существовал.
Например, если процесс A создает временный файл, а затем закрывает его и удаляет, имя файла, созданное позже File::Temp::tempfile
, в процессе B может быть одинаковым. Это очень маловероятно, но возможно. В любом случае вы не должны рассматривать путь tempfile как уникальный id за время существования временного файла.
Я проделал большую работу с файлом «Файл :: Temp» в сочетании с асинхронными процессами выделения, и это просто делает правильную вещь. – stevieb
Работая с этим, я понял, что иногда он создает имя файла с подчеркиванием, которое не подходит для меня, могу ли я исключить подчеркивание из поколения? – Snow
@Snow: вы можете использовать опцию 'template', см. Документ. – Toto