У меня есть сценарий, который порождает несколько процессов, а затем отслеживает их через их идентификатор процесса, я бы не хотел, чтобы один из них закрывался, а затем другой процесс мог бы получить этот pid в то время, когда я проверяю. Есть ли гарантия? До сих пор я обнаружил, что никто не знает, когда они будут повторно использованы, случайно это или нет.
1 ответ
Идентификатор процесса - это значение, связанное с объектом процесса, и до тех пор, пока объект процесса все еще присутствует, его идентификатор процесса также будет присутствовать. Объект процесса остается до тех пор, пока процесс все еще выполняется (процесс неявно сохраняет ссылку на себя) или до тех пор, пока у кого-то еще есть дескриптор объекта процесса.
Если вы думаете об этом, это имеет смысл, потому что, пока есть еще дескриптор процесса, кто-то может вызвать WaitForSingleObject, чтобы дождаться завершения процесса, или он может вызвать GetExitCodeProcess, чтобы получить код выхода и этот код выхода. должен быть сохранен где-то для последующего поиска.
Когда все дескрипторы закрыты, ядро знает, что никто не спросит, работает ли процесс или каков его код выхода (потому что вам нужен дескриптор, чтобы задать эти вопросы). В этот момент объект процесса может быть уничтожен, что, в свою очередь, уничтожает идентификатор процесса.
Что произойдет, если кто-то вызовет OpenProcess в процессе зомби? То же самое происходит, если они вызывают его в запущенном процессе: они получают управление процессом. Почему вы хотите получить контроль над процессом зомби? Ну, вы, возможно, еще не знаете, что это зомби; вы получаете дескриптор, чтобы вы могли вызвать WaitForSingleObject, чтобы узнать, завершился ли он еще. Или вы можете получить дескриптор, зная, что это зомби, потому что вы хотите вызвать GetExitCodeProcess, чтобы увидеть, какой был код выхода.