Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
30 / 23 / 13
Регистрация: 26.10.2013
Сообщений: 125

Завершение процесса и его дочерних процессов

08.06.2014, 08:58. Показов 3963. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!

Подскажите, пожалуйста, как можно реализовать завершение процесса (зная его имя или PID) и всех его дочерних процессов так же, как это сделано в утилите taskkill?

Заранее спасибо!

Добавлено через 13 часов 39 минут
Ура! Вот, что получилось:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
DWORD PID = GetProcessByExeName("cmd.exe");
// Получить PID процесса по его имени;
 
PROCESSENTRY32 pe;
 
memset(&pe, 0, sizeof(PROCESSENTRY32));
pe.dwSize = sizeof(PROCESSENTRY32);
 
HANDLE hSnap = :: CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
if (::Process32First(hSnap, &pe))
{
 BOOL bContinue = TRUE;
 
 // Завершение дочерних процессов;
 while (bContinue)
    {
 // Завершить только дочерние процессы;
        if (pe.th32ParentProcessID == PID)
        {
            HANDLE hChildProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
 
            if (hChildProc)
            {
                ::TerminateProcess(hChildProc, 1);
                ::CloseHandle(hChildProc);
            }
 }
 
        bContinue = ::Process32Next(hSnap, &pe);
    }
 
 // Завершить родительский процесс;
 HANDLE hProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
 
    if (hProc)
    {
        ::TerminateProcess(hProc, 1);
        ::CloseHandle(hProc);
 }
}
Этот код позволяет определить PID нужного родительского процесса по имени, а затем завершить работу дочерних процессов и его самого по отдельности. Может, кому-нибудь пригодится)
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.06.2014, 08:58
Ответы с готовыми решениями:

"Привязка" окон дочерних процессов к окну главного процесса
Всем доброго дня. Вопрос знатокам. Есть VCL приложение (С++ Builder XE). В этом приложении можно открыть несколько дочерних форм...

Завершение процесса по его Id
Такая задачка помогите, вот прогу пишу, нужно чтобы выводила процессы и завершала. Сделал чтобы выводила процессы и также выводит ID...

Поиск процесса и его дочерних процессов
Всем привет! Сначала опишу ситуацию на примере "CodeBlocks", чтобы стало понятно чего я хочу: У меня открыт проект в...

2
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,140
Записей в блоге: 3
08.06.2014, 13:16
Хотел бы отметить что данный код не панацея....использовал данный код, против Бот процессов одной онлайн игры, и столкнулся с двумя случаями:
1)У процессов "паразитов" уровень полномочий в системе был выше чем у моей программы и они не удалялись (так и не понял, как поднять приоритет программе)
2)Система не могла автоматически определить PID "паразитов"....то есть просто возвращалось нулевое значение.
0
30 / 23 / 13
Регистрация: 26.10.2013
Сообщений: 125
08.06.2014, 23:17  [ТС]
Dinkin, если я Вас так понял, полномочия можно поднять до уровня администратора с помощью манифеста, а до уровня системы - с помощью утилиты psexec.exe. А вот со вторым пунктом не очень понятно... У меня тоже бывали случаи, когда не работал тот же самый taskkill: не то, чтобы PID определить, он даже по имени не мог найти процесс - но это уже неполадки в системе, которые решились простой переустановкой) А Вы как решали данные проблемы?

Добавлено через 5 часов 19 минут
Вот улучшенный вариант, реализованный через функцию и её рекурсивное выполнение, чтобы завершить все дочерние процессы, в том числе и созданные этими дочерними процессами:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
bool __fastcall KillProcessTree(DWORD myprocID, DWORD dwTimeout)
{
  bool bRet = true;
  HANDLE hWnd;
  PROCESSENTRY32 pe;
 
  memset(&pe, 0, sizeof(PROCESSENTRY32));
  pe.dwSize = sizeof(PROCESSENTRY32);
 
  HANDLE hSnap = :: CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
  if (::Process32First(hSnap, &pe))
  {
    BOOL bContinue = TRUE;
 
    // Завершение дочерних процессов;
    while (bContinue)
    {
      if (pe.th32ParentProcessID == myprocID)
   {
 
        // Рекурсия;
 KillProcessTree(pe.th32ProcessID, dwTimeout);
 
        HANDLE hChildProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
 
        if (hChildProc)
 {
 
          if (WaitForSingleObject(hChildProc, dwTimeout) == WAIT_OBJECT_0)
            bRet = true;
          else
          {
            bRet = TerminateProcess(hChildProc, 0);
          }
          ::CloseHandle(hChildProc);
        }
      }
      bContinue = ::Process32Next(hSnap, &pe);
    }
 
    // Завершение основного процесса;
 HANDLE hProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, myprocID);
 
    if (hProc)
    {
        ::TerminateProcess(hProc, 1);
        ::CloseHandle(hProc);
    }
  }
  return bRet;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD myprocID = 0;
myprocID = GetProcessByExeName("notepad.exe");
DWORD dwTimeout;
if (myprocID!=0) {
KillProcessTree(myprocID, dwTimeout);
}
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2014, 23:17
Помогаю со студенческими работами здесь

Не работает безопасное завершение дочерних процессов с использованием CreateRemoteThread
Необходимо завершать процесс и все его дочерние процессы в программе на Microsoft Visual C++ Используется немного измененный код. ...

Список дочерних процессов определённого процесса
Друзья, подскажите пожалуйста, как с помощью python, получить список дочерних процессов определённого процесса?

Завершение процесса по его PID
Пишу прожку, которая запускает и завершает процесы. Нужно что-бы она определила свой PID и по нему завершилась. Как грохнуть процесс по...

Перехват запуска процесса и его завершение
Всем привет! Я пишу программу на c# и возник следующий вопрос: как сделать, что бы когда программа включена, работал "перехватчик...

Поиск запущенного процесса и его завершение
Доброго всем времени суток. Сам в VBS не силен, но необходимо: Скрипт проверяет наличие запущенного процесса, если процесс запущен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru