Esecuzione equivalente di “Kill Process Tree” in C++ su windows

Abbiamo un C++ compito che un fork di un nuovo processo. Processo che, a sua volta, può avere diversi processi figli. Se l’operazione viene eseguita passato un tempo prestabilito, ci vuole uccidere, che a forcella processo.

Tuttavia, non vogliamo che per i processi che ha generato. Li vogliamo tutti a morire. Ho usato il Processo Explorer e ha un “Kill Process Tree” opzione, simile al Task Manager di Windows è “termina Processo” struttura ad Albero, quindi sto cercando di indovinare/supponendo che non c’è una API pubblica per fare questo. Qualcuno ha fatto questo o è a conoscenza di un riferimento a una API pubblica che fa?

  • Credo che il Task Manager fa una varietà di cose che non sono disponibili tramite Api pubbliche.
  • mentre non avrei nessun problema a credere che 😉 il fatto che il Processo di Explorer non mi fa meraviglia. Credo che sia stato scritto prima che la società è stata acquisita la mia SIGNORA
  • Sì, ma il ragazzo che ha scritto process explorer – Mark Russinovich – usato per lavorare per Microsoft Windows NT (prima di avere la sua azienda acquistata da Microsoft) e ha letteraria, ha scritto il libro su Windows internals. microsoft.com/learning/en/us/books/12069.aspx
  • Ti posso garantire che il Processo di Explorer fa le cose che non sono documentati. Questo è il punto!

 

5 Replies
  1. 20

    Si potrebbe desiderare di prendere in considerazione i “Lavori di API”. CreateJobObject e amici. È possibile applicare i bambini processi di rimanere nell’ambito del Lavoro, impostando l’attributo appropriato. È quindi possibile chiamare TerminateJobObject ogni volta che si desidera.

    Precisazione: questo NON è ciò che il Task Manager non.

    • follow-up, se a forcella processo muore e gli orfani dei suoi posti di lavoro, sarà TerminateJobObject ancora essere in grado di uccidere gli orfani abbandonati?
    • Sì, vedere le relative API doc. A meno che un processo è stato creato con CREATE_BREAKAWAY_FROM_JOB bandiera.
    • Anche se in esecuzione di distanza non è possibile se JOB_OBJECT_LIMIT_BREAKAWAY_OK limite nel lavoro in oggetto non è impostato.
    • Attenzione problemi con Vista Explorer.exe. L’ho visto mettere processi avviati attraverso un collegamento in un posto di lavoro, impedendo la creazione di un job.
    • Ma se un bambino processo genera un altro processo, c’è una possibilità che si avvale anche di un lavoro oggetto di controllo. Così l’assegnazione di tale progetto per un oggetto processo può portare a disturbi della sua esecuzione, in quanto annidati i lavori sono ammesse a partire solo con Windows 8 e Windows Server 2012.
  2. 6

    Io suggerisco di andare al lavoro oggetto del percorso, come sopra indicato, sarà più affidabile.

    Se non si può andare al lavoro oggetto del percorso, è possibile utilizzare il toolhelp API per ottenere l’ID di processo del genitore e costruire l’albero in quel modo. Essere cauti, però, dal momento che Windows non ha una forte relazione padre/figlio, è possibile per i PID per ottenere riciclati. È possibile utilizzare GetProcessTimes per interrogare l’ora di creazione del processo, e verificare che è precedente a quella del bambino. Se un processo intermedio nella struttura è terminato, non sarà in grado di camminare albero 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));
    • Sì, questo è quello che avrete bisogno per l’uso su Vista.
    • È necessario che su XP troppo.
  3. 5

    C’è una funzione Win32 chiamato TerminateProcess(). Si dovrebbe fare il lavoro per voi.

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

    dalla riga di comando:

    taskkill /F /T /IM program.exe

    da codice:

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

    altre opzioni (direttamente dalla taskkill /? ):

     TASKKILL [/S sistema [/U nomeutente [/P 
    [password]]]] 
    { [/FI filtro] [/PID processid | /IM imagename] } [/F] [/T] 
    
    Descrizione: 
    Questo strumento della riga di comando può essere utilizzato per terminare uno o più processi. 
    I processi possono essere uccisi con l'id di processo o il nome dell'immagine. 
    
    Elenco Di Parametri: 
    /S sistema Specifica il sistema remoto a cui connettersi. 
    
    /U [dominio\utente di Specificare l'utente contesto in cui 
    eseguire il comando. 
    
    /P [password] Specifica la password per il dato 
    contesto utente. Se omesso, viene richiesto. 
    
    /F Specifica per forza terminare 
    processo(es). 
    
    /FI filtro Visualizza una serie di attività che corrispondono a un 
    criteri specificati dal filtro. 
    
    /PID del processo id Specifica il PID del processo che 
    deve essere terminato. 
    
    /Immagine IM nome Specifica il nome dell'immagine di processo 
    che deve essere terminato. Il carattere jolly '*' 
    può essere utilizzato per specificare tutti i nomi delle immagini. 
    
    /T Albero di uccidere: termina il processo specificato 
    e ogni bambino i processi che sono stati avviati da essa. 
    
    /? Mostra questo aiuto/utilizzo.

    -Giovanni

    • TerminateProcess non automaticamente uccidere tutti i processi figli.
  4. 1

    Si desidera trovare l’id di processo per il processo che si desidera uccidere, quindi “a piedi l’albero” dei suoi figli (e i loro figli, e così via…), nota la loro pid, e poi uccidere tutti i processi in maniera piacevole e veloce.

Lascia un commento