Политика назначения PID в Windows / Использование PID для именования временных файлов - PullRequest
2 голосов
/ 15 июня 2009
  1. Какова политика назначения PID в Windows? Повторные запуски процесса, вызывающего _getpid (), указывают на непоследовательное присвоение (3548,3344,3628,2748,4872,2360).

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 15 июня 2009

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

1 голос
/ 15 июня 2009

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

...