Политика назначения PID в Windows / Использование PID для именования временных файлов

StackOverflow https://stackoverflow.com/questions/996649

  •  13-09-2019
  •  | 
  •  

Вопрос

  1. Какова политика назначения PID в Windows?Повторные запуски процесса, вызывающего _getpid(), указывают на непоследовательное присвоение (3548,3344,3628,2748,4872,2360).

  2. Учитывая наблюдаемое непоследовательное назначение PID, возможно ли, чтобы два разных процесса с одним и тем же pid выполнялись близко друг к другу по времени?Очевидно, что процессы не будут выполняться одновременно.

  3. Действительно ли неразумно использовать PID для именования временных файлов?

Я пишу программу, которая взаимодействует с другим исполняемым файлом, генерируя необходимые входные файлы, вызывая исполняемый файл и считывая сгенерированные выходные файлы из указанного исполняемого файла.При завершении CLEAN промежуточные файлы удаляются.

Меня беспокоит то, что если временные файлы не очищены и если PID используются повторно, может возникнуть неоднозначность между старыми временными файлами, которые не были очищены, и новыми файлами.Если исполняемый файл не создает новый выходной файл из-за ошибки, старый файл может выглядеть так же, как вновь созданный файл, поэтому ошибка может быть не обнаружена.

Существуют и другие способы повысить надежность, например использование GUID для временных файлов, использование только чистых каталогов для временных файлов или проверка отсутствия файлов с тем же именем, что и у целевого выходного файла.Некоторые из этих методов следует использовать, поскольку PID обязательно будут повторяться при перезагрузке машины или если машина будет работать в течение достаточного времени.

Вопрос возникает главным образом из моего любопытства относительно того, почему Windows распределяет PID иначе, чем *nix.

Это было полезно?

Решение

Использование PID таким образом проблематично.Я видел программы, которые используют PID в сочетании с текущим временем UTC при именовании файлов, поэтому в итоге вы получаете файлы с именем foo_55145_4a3667d3.log.Другой вариант — использовать FILE_ATTRIBUTE_TEMPORARY и FILE_FLAG_DELETE_ON_CLOSE варианты в dwFlagsAndAttributes параметр для CreateFile().

Другие советы

Идентификаторы процессов и идентификаторы потоков берутся из одного и того же пула в Windows.Система немедленно повторно использует идентификаторы потоков и процессов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top