Способ программно убить процесс по PID

Рабочая среда: c++, windows.

Я хочу сохранить все pids (не имя процесса), а затем программно убить процессы, когда я хочу убить. Я знаю, что могу убить процесс с помощью системы("taskkill /pid xxxx"), но я хочу знать лучший/лучший способ убить процесс с помощью pid. Как лучше всего убить процесс и почему?

Как лучше всего убить процесс и почему? отправляет ему сообщение и вежливо просит закрыть его, когда это будет безопасно. Гораздо меньше места для нежелательных побочных эффектов.
user4581301 12.04.2019 02:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 020
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

К счастью, убить его, как только у вас есть PID, довольно легко.

  1. do OpenProcess чтобы получить дескриптор процесса из PID
    • обязательно укажите PROCESS_TERMINATE право.
  2. сделать TerminateProcess чтобы убить процесс

я должен проверить, запущен ли процесс, прежде чем я завершу процесс? Что делать, если процесс не существует?

lll 12.04.2019 02:55

@lll: если процесс не существует, ваш вызов OpenProcess завершится ошибкой и вернет NULL. Вы можете обнаружить это и распечатать сообщение об ошибке, или вы можете просто проигнорировать тот факт, что это NULL, и все равно передать его TerminateProcess (и тогда, конечно, тоже произойдет сбой).

Jerry Coffin 12.04.2019 03:12

Это не то же самое, что taskkill.exe без параметра /F, который отправляет WM_CLOSE в окна приложения верхнего уровня и окна только для сообщений (обнаружено путем перечисления всех WindowStations и рабочих столов в сеансе и сопоставления окна с процессом через GetWindowThreadProcessId). Отправка сообщения о закрытии позволяет процессу корректно завершиться. Сначала попробуйте изящно, и если приложение все еще работает после тайм-аута, вернитесь к OpenProcess и TerminateProcess.

Eryk Sun 12.04.2019 12:33

Если у процесса нет окон, то это может быть консольный процесс, но не ведущий процесс в сеансе консоли (т. е. не фактический владелец окна консоли; conhost.exe является настоящим владельцем, но система лжет во благо) . Вы можете попробовать AttachConsole(pid), и если это удастся, вызовите SetConsoleCtrlHandler, чтобы игнорировать управляющие события в вашем процессе, и GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0), чтобы отправить Ctrl+Break всем процессам, подключенным к консоли. Уничтожение всех процессов, подключенных к консоли, сомнительно, но не более, чем то, что taskkill.exe уже делает для ведущего консольного процесса.

Eryk Sun 12.04.2019 12:44

Вы можете убить процесс, используя OpenProcess() и TerminateProcess(). Код будет выглядеть примерно так:

HANDLE handle = OpenProcess(PROCESS_TERMINATE, FALSE, ProcessID);
if (NULL != handle) {   
    TerminateProcess(handle, 0);
    CloseHandle(handle);
}

За неудобство использования system("taskkill /pid xxxx") приглашаю прочитать эта почта. Было дано большое количество ответов, чтобы объяснить, почему не использовать это выражение.

  • Медленно: для простой операции приходится пролистывать множество ненужного кода Windows и отдельную программу.

  • Не переносимый: зависит от программы паузы.

  • Нехороший стиль: выполнение системного вызова должно выполняться только тогда, когда это действительно необходимо.

Другие вопросы по теме