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





К счастью, убить его, как только у вас есть PID, довольно легко.
OpenProcess чтобы получить дескриптор процесса из PID
PROCESS_TERMINATE право.TerminateProcess чтобы убить процесся должен проверить, запущен ли процесс, прежде чем я завершу процесс? Что делать, если процесс не существует?
@lll: если процесс не существует, ваш вызов OpenProcess завершится ошибкой и вернет NULL. Вы можете обнаружить это и распечатать сообщение об ошибке, или вы можете просто проигнорировать тот факт, что это NULL, и все равно передать его TerminateProcess (и тогда, конечно, тоже произойдет сбой).
Это не то же самое, что taskkill.exe без параметра /F, который отправляет WM_CLOSE в окна приложения верхнего уровня и окна только для сообщений (обнаружено путем перечисления всех WindowStations и рабочих столов в сеансе и сопоставления окна с процессом через GetWindowThreadProcessId). Отправка сообщения о закрытии позволяет процессу корректно завершиться. Сначала попробуйте изящно, и если приложение все еще работает после тайм-аута, вернитесь к OpenProcess и TerminateProcess.
Если у процесса нет окон, то это может быть консольный процесс, но не ведущий процесс в сеансе консоли (т. е. не фактический владелец окна консоли; conhost.exe является настоящим владельцем, но система лжет во благо) . Вы можете попробовать AttachConsole(pid), и если это удастся, вызовите SetConsoleCtrlHandler, чтобы игнорировать управляющие события в вашем процессе, и GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0), чтобы отправить Ctrl+Break всем процессам, подключенным к консоли. Уничтожение всех процессов, подключенных к консоли, сомнительно, но не более, чем то, что taskkill.exe уже делает для ведущего консольного процесса.
Вы можете убить процесс, используя OpenProcess() и TerminateProcess(). Код будет выглядеть примерно так:
HANDLE handle = OpenProcess(PROCESS_TERMINATE, FALSE, ProcessID);
if (NULL != handle) {
TerminateProcess(handle, 0);
CloseHandle(handle);
}
За неудобство использования system("taskkill /pid xxxx") приглашаю прочитать эта почта. Было дано большое количество ответов, чтобы объяснить, почему не использовать это выражение.
Медленно: для простой операции приходится пролистывать множество ненужного кода Windows и отдельную программу.
Не переносимый: зависит от программы паузы.
Нехороший стиль: выполнение системного вызова должно выполняться только тогда, когда это действительно необходимо.