Esecuzione equivalente di & # 8220; Kill Process Tree & # 8221; in C ++ su Windows

StackOverflow https://stackoverflow.com/questions/604522

  •  03-07-2019
  •  | 
  •  

Domanda

Abbiamo un compito C ++ che farà fork di un nuovo processo. Tale processo a sua volta può avere diversi processi figlio. Se l'attività viene eseguita oltre un tempo assegnato, vorremmo terminare quel processo biforcato.

Tuttavia, non vogliamo rendere orfani i processi che ha generato. Vogliamo che muoiano tutti. Ho usato Process Explorer e ha un " Kill Process Tree " opzione, simile a "End Process Tree" di Task Manager di Windows, quindi suppongo / suppongo che ci sia un'API pubblica per farlo. Qualcuno ha fatto questo o conosce un riferimento a un'API pubblica che lo fa?

È stato utile?

Soluzione

Potresti prendere in considerazione l'API "Offerte di lavoro". CreateJobObject e amici. È possibile applicare processi figlio per rimanere all'interno del Lavoro, impostando l'attributo appropriato. Quindi puoi chiamare TerminateJobObject quando vuoi.

Chiarimento: questo NON è ciò che Task Manager fa.

Altri suggerimenti

Suggerisco di seguire il percorso dell'oggetto lavoro, come indicato sopra, sarà il più affidabile.

Se non è possibile seguire il percorso dell'oggetto lavoro, è possibile utilizzare l'API del toolhelp per ottenere gli ID del processo padre e costruire l'albero in quel modo. Tuttavia, fai attenzione, poiché Windows non ha una forte relazione genitore / figlio ed è possibile che i PID vengano riciclati. Puoi usare GetProcessTimes per interrogare il tempo di creazione del processo e verificare che sia più vecchio del figlio. Se viene terminato un processo intermedio nella struttura ad albero, non sarà possibile camminare ulteriormente.

// 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));

Esiste una funzione Win32 chiamata TerminateProcess () . Dovrebbe fare il lavoro per te.

In alternativa, ho trovato il comando taskkill utile per cose come questa.

dalla riga di comando:

taskkill /F /T /IM program.exe

dal codice:

system("taskkill /F /T /IM program.exe");

altri switch (direttamente da 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.

-John

Desideri trovare l'id del processo per il processo che desideri terminare, quindi " walk the tree " dei suoi figli (e dei loro figli, e così via ...), annota i loro pid e quindi uccide tutti i processi in modo rapido e piacevole.

È inoltre possibile utilizzare WMI, pianificazione del percorso è possibile creare una classe per eseguire le attività.
Vedi questo " Dove posso trovare la documentazione WMI? & Quot;
e La libreria COM WMI
e Esempi di applicazioni WMI C ++

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top