Комментарии 28
Нет, оживлять некого, в зомби находятся только незакрытые, на момент завершения, handle. Ну и соответственно все reference (включая id и псевдо-закрытый handle процесса).
Кстати тот еще гиморой с этим, если это например listening socket, который резервируется за системой (и соединение на другом конце считается открытым), пока система не схлопнет, если ничего не предпринять (например переодически слать NOP пакет через такое соединение).
Такие сокеты называют псевдо-открытые или псевдо-закрытые (half-open (dropped),
half-closed)…
Даже если процесс перезапустится, то "netstat /abn"
покажет 2-а listener на этом порту (один за системой, второй за новым процессом).
Кстати это происходит только если создавать дочерний процесс с флагом bInheritHandle=true (т.е. все дочерние handle наследуются родителем). Подробнее про процесс мучений можно почитать, например, тут Re: Fix windows issue with multiple workers, где я прививал nginx multi-processing под виндовс...
GetExitCodeProcess()
IsWow64Process()
GetExitCodeProcess()
Если оба вызова GetExitCodeProcess() вернули STILL_ACTIVE — то результату IsWow64Process() можно верить.
A pointer to a value that is set to TRUE if the process is running under WOW64. If the process is running under 32-bit Windows, the value is set to FALSE. If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
Огорчился. Начал искать способ определения разрядности ВООБЩЕ. Нашёл Environment.Is64BitOperatingSystem в шарпе. Переписал на нём программку. Ну и пошло-поехало.
Описання в статье проблема не может возникнуть при работе с хендлом своего приложения — мы не можем быть «зомби» если наш код ещё выполняется.
Но простите, вроде логично что сначала стоит проверить есть ли в системе такой процесс и жив ли он.
А уже потом пытаться понять — x64 он или нет.
Неожиданное поведение WinAPI-функции IsWow64Process()