Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список child процессов, Как получить детей просесса? 
V
    Опции темы
Purple_Light
  Дата 8.8.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Всем привет!

Вижу, что тема списка процессов уже поднималась, но у меня есть конкретная проблемма.

Есть процесс в системе, этот процесс может порождать детей. Перед тем как убить родительский процесс, необходимо пройтись по всем детям, которых он создал и завершить их. Вопрос как получить списов детей?

Поискал на форуме и нашел, только недокументированную функцию ZwQuerySystemInformation, но как написано на  MSDN она может меняться от версии к версии, что не есть хорошо  smile 

Может кто-нить поделится другим способом, если он существует.

З.Ы.: Система
Windows XP,
Windows 2000,
Windows 200* Server,
Windows Vista

Это сообщение отредактировал(а) Purple_Light - 8.8.2008, 13:05
PM MAIL   Вверх
Rrader
  Дата 8.8.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 3
Всего: 191



Могу посоветовать посмотреть в сторону WMI. Там есть класс Win32_Process. Его экземпляры - все процессы в системе. Что там есть интересного? Поле ParentProcessId ,в котором хранится ID породившего процесса (подобно th32ParentProcessID в ToolHelp). Т.е. проходимся по всем процессам, и если их ParentProcessId совпадает с требуемым - значит, дочерние. Их и закрываем. smile 

Код

instance of Win32_Process
{
    Caption = "ctfmon.exe";
    CommandLine = "\"C:\\WINDOWS\\system32\\ctfmon.exe\" ";
    CreationClassName = "Win32_Process";
    CreationDate = "20080807140324.671875+600";
    CSCreationClassName = "Win32_ComputerSystem";
    CSName = "RRADER-B1084D79";
    Description = "ctfmon.exe";
    ExecutablePath = "C:\\WINDOWS\\system32\\ctfmon.exe";
    Handle = "2272";
    HandleCount = 142;
    KernelModeTime = "57187500";
    MaximumWorkingSetSize = 1413120;
    MinimumWorkingSetSize = 204800;
    Name = "ctfmon.exe";
    OSCreationClassName = "Win32_OperatingSystem";
    OSName = "Microsoft Windows XP Professional|C:\\WINDOWS|\\Device\\Harddisk0\\Partition1";
    OtherOperationCount = "245";
    OtherTransferCount = "4570";
    PageFaults = 9428;
    PageFileUsage = 1458176;
    // У меня это explorer.exe :)
    ParentProcessId = 1436;
    PeakPageFileUsage = 1462272;
    PeakVirtualSize = "40996864";
    PeakWorkingSetSize = 5148672;
    Priority = 8;
    PrivatePageCount = "1458176";
    ProcessId = 2272;
    QuotaNonPagedPoolUsage = 5440;
    QuotaPagedPoolUsage = 45884;
    QuotaPeakNonPagedPoolUsage = 5760;
    QuotaPeakPagedPoolUsage = 47336;
    ReadOperationCount = "2";
    ReadTransferCount = "136";
    SessionId = 0;
    ThreadCount = 1;
    UserModeTime = "17812500";
    VirtualSize = "40460288";
    WindowsVersion = "5.1.2600";
    WorkingSetSize = "5124096";
    WriteOperationCount = "2";
    WriteTransferCount = "144";
};


Может есть способ и лучше. smile 

Это сообщение отредактировал(а) Rrader - 12.8.2008, 10:33


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Rififi
Дата 8.8.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



PM MAIL   Вверх
Riply
Дата 11.8.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 1
Всего: 32



Цитата(Rrader @  8.8.2008,  17:17 Найти цитируемый пост)
Т.е. проходимся по всем процессам, и если их ParentProcessId совпадает с требуемым - значит, дочерние. Их и закрываем


Возможна ситуация, что ParentProcessId совпадает с требуемым, но на самом деле,
процесс не является дочерним. (и это случается отнюдь не раз в сто лет smile)
(Система может использовать "значения" освободившихся ID)
Для точного установления "родственных отношений", дополнительно к ParentId можно использовать,
например, время создания процесса. 
IMHO, это уже дает полную гарантию, что нашли именно тех, кого искали smile


Это сообщение отредактировал(а) Riply - 11.8.2008, 10:18
PM MAIL   Вверх
Rrader
  Дата 11.8.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 3
Всего: 191



Riply, я не глядел в MSDN. smile  Вы правы smile 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Purple_Light
Дата 1.9.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Спасибо за ответы. 

Rififi в этой статье, как раз приведен пример с недокументированной функцией.

Проблемма оказалась немного сложнее. Например, если рассмотреть случай, когда пользователь (который именно и создает дочернии процессы) запустит приложение запускающее само себя рекурсивно. Получится, к тому времени как программа получит слепок процессов системы, в системе появятся новые процессы (рекурсивно запущенная программа). Соответственно раз ID процессов не попали в слепок (snapshot) приложение их не убъет.

Вообщем алгортм придумать, так и не удалось. Пришлось переписывать приложение, отслеживать запускаемые процессы и объединять их в группы. Ссылка на теорию (MSDN)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.2855 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.