문제

우리는 새로운 프로세스를 포크 할 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 ++ 응용 프로그램 예제

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top