Windows의 C ++에서 "킬 프로세스 트리"와 동등한 성능
문제
우리는 새로운 프로세스를 포크 할 C ++ 작업이 있습니다. 그 과정에는 차례로 몇 가지 아동 과정이있을 수 있습니다. 작업이 할당 된 시간을 지나면 그 포크 과정을 죽이고 싶을 것입니다.
그러나 우리는 그것이 생성 된 프로세스를 고아를 원하지 않습니다. 우리는 그들 모두가 죽기를 원합니다. 프로세스 탐색기를 사용했으며 Windows Task Manager의 "End Process Tree"와 유사한 "킬 프로세스 트리"옵션이 있으므로 공개 API가 있다고 가정하고 있습니다. 이 작업을 수행했거나 공개 API에 대한 언급을 알고 있습니까?
해결책
"Jobs API"를 고려할 수 있습니다. CreateJobObject
그리고 친구들. 적절한 속성을 설정하여 어린이 프로세스를 직무 내에서 유지하도록 시행 할 수 있습니다. 그런 다음 전화 할 수 있습니다 TerminateJobObject
당신이 원할 때마다.
설명 : 이것은 작업 관리자가하는 일이 아닙니다.
다른 팁
위에 표시된 것처럼 작업 대상 경로를 사용하는 것이 가장 신뢰할 수 있습니다.
작업 객체 경로를 사용할 수없는 경우 ToolHelp API를 사용하여 상위 프로세스 ID를 가져 와서 트리를 그렇게 만들 수 있습니다. 그러나 Windows는 강한 부모/자식 관계가없고 PID가 재활용 될 수 있으므로 조심해야합니다. 당신이 사용할 수있는 GetProcessTimes
프로세스의 생성 시간을 쿼리하고 아이보다 나이가 있는지 확인하십시오. 나무의 중간 과정이 종료되면 나무를 더 걸을 수 없습니다.
// Error handling removed for brevity
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
Process32First(snapshot, &process);
do
{
// process.th32ProcessId is the PID.
// process.th32ParentProcessID is the parent PID.
} while (Process32Next(snapshot, &process));
Win32 기능이 호출됩니다 종료 프로세스 (). 그것은 당신을 위해 일을해야합니다.
또는 TaskKill 명령이 이와 같은 것들에 유용하다는 것을 알았습니다.
명령 줄에서 :
taskkill /F /T /IM program.exe
코드에서 :
system("taskkill /F /T /IM program.exe");
다른 스위치 (TaskKill /?에서 바로) :
TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T] Description: This command line tool can be used to end one or more processes. Processes can be killed by the process id or image name. Parameter List: /S system Specifies the remote system to connect to. /U [domain\]user Specifies the user context under which the command should execute. /P [password] Specifies the password for the given user context. Prompts for input if omitted. /F Specifies to forcefully terminate process(es). /FI filter Displays a set of tasks that match a given criteria specified by the filter. /PID process id Specifies the PID of the process that has to be terminated. /IM image name Specifies the image name of the process that has to be terminated. Wildcard '*' can be used to specify all image names. /T Tree kill: terminates the specified process and any child processes which were started by it. /? Displays this help/usage.
-남자
당신은 당신이 죽이고 싶은 과정에 대한 프로세스 ID를 찾고, 아이들의 "나무를 걷다"(그리고 자녀들 등), PID를 기록한 다음 모든 과정을 멋지고 빠르게 죽입니다. .
WMI를 사용할 수도 있고 경로 계획을 사용할 수도 있습니다. 작업을 수행하기 위해 클래스를 생성 할 수 있습니다.
이거 "WMI 문서는 어디에서 찾을 수 있습니까?"
그리고 WMI COM 라이브러리
그리고 WMI C ++ 응용 프로그램 예제