Процесс-невидимка, странное поведение функции OpenProcess |
Здравствуйте, гость ( Вход | Регистрация )
Процесс-невидимка, странное поведение функции OpenProcess |
Iron Bug |
11.6.2010, 11:53
Сообщение
#1
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Есть у меня в одной проге такой кусочек кода:
Тут id - уникальный идентификатор процесса. Цель кусочка - просто тупо проверить, жив ли "пациент". Ну и, казалось бы, ничего особенного: если нет процесса и открыть его для чтения инфы о нём нельзя, то юзер получит сообщение об ошибке. Ан-нет! Бывают недоразумения: процесс умер (правда, насильственной смертью - был остановлен дебаг или его прибили через диспетчер задач), а программа успешно "находит" его в списке живых (OpenProcess возвращает ненулевой хэндлер) и не выдаёт ошибку, хотя диспетчер задач его при этом не видит в упор, никто его не видит и вообще его как бы быть не должно. Компилю msvc 8.0, всё происходит под вендой XP Pro. Кто-нибудь с такой пакостью сталкивался? Сообщение отредактировал Iron Bug - 11.6.2010, 11:55 |
|
|
Litkevich Yuriy |
11.6.2010, 16:34
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Оригинально, а если попробовать этому процессу какое-нибудь сообщение послать, что будет?
|
|
|
Iron Bug |
11.6.2010, 19:22
Сообщение
#3
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Оригинально, а если попробовать этому процессу какое-нибудь сообщение послать, что будет? ну вот я тоже об этом подумала, но сегодня я просто не успела это поковырять: были другие более важные задачи. дома венды нет, но вот на следующей неделе я попробую стать Франкенштейном и получить "ответ" от такого фантомного процесса причём такая фигня происходит как-то не всегда. иногда происходит, иногда нет. никакой логики в её появлении не заметно. но, в принципе, можно довольно легко повторить ситуацию и проверить, что будет, если попробовать обратиться к такому хэндлеру. кстати, вот кто-то тоже напоролся на такую "фишку" и привёл очень простой тест для такой фигни: http://social.msdn.microsoft.com/Forums/en...0d-1821d22fb32c он там запускал Notepad, записывал PID, убивал приложение и запускал прогу, которая юзала OpenProcess с этим идом и получала в ответ ненулевой хэндлер. это то же самое практически, что у меня происходит, только в очень упрощённом варианте. и тоже система XP. Сообщение отредактировал Iron Bug - 11.6.2010, 20:04 |
|
|
ViGOur |
15.6.2010, 21:52
Сообщение
#4
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Может это просто таким макаром работает "сборщик мусора" виндовый?
Процесс который вроде как умер не своей смертью винда по мере сил "закапывает", потому и получается, что когда "трупик" приложения еще не закопан, он и идентифицируется, но при этом "по бумагам" числится как без временно покинувший нас... |
|
|
inviZ |
17.6.2010, 7:13
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 5.6.2010 Пользователь №: 1781 Спасибо сказали: 4 раз(а) Репутация: 1 |
Ну в *nix-системах же существуют Zombie-процессы. Наверное и в Windows что-то подобное есть. Для того, чтобы была возможность вызвать функцию GetExitCodeProcess().
Соответственно, ее и используй для проверки того, завершен ли процесс. Если процесс не завершен, она вернет STILL_ACTIVE. И все дела. |
|
|
ViGOur |
17.6.2010, 20:08
Сообщение
#6
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
|
|
|
Iron Bug |
18.6.2010, 8:59
Сообщение
#7
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Так оно и оказалось.
В общем так: если на процесс или на какой-либо из его потоков (ресурсов и т.п.) существуют открытые хэндлеры - то при его закрытии он фактически завершается, но информация о нём у системы остаётся. При этом запрос GetExitCodeProcess() возвращает код завершения процесса, отличный от STILL_ACTIVE. Если же все хэндлеры закрыты - то процесс нормально "умирает", OpenProcess возвращает NULL. Вот маленький тест, который я написала ради проверки этой шняги: Раскрывающийся текст
В тесте после вызова CreateProcess проверяется статус порождённого процесса, после этого закрывается хэндл процесса и хэндл потока (ресурсы освобождаются) и снова проверяется статус. Сообщение отредактировал Iron Bug - 18.6.2010, 9:10 |
|
|
Текстовая версия | Сейчас: 3.1.2025, 7:10 |