Mac OS X: modo più veloce per uccidere / uscire un intero albero processo dall'interno di un'applicazione Cocoa

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

Domanda

So che ci sono molte domande e risposte su questo, ma sto cercando una soluzione efficiente e robusto. Ho bisogno di uccidere un processo e tutti i suoi processi figli all'interno di un'applicazione Cocoa. Ho avuto l'ID del processo e quello che sto per il codice è quello di eseguire il comando kill in questo modo

kill -- -<parent PID>

da dentro il mio app ... ma che sembra terribilmente hacky e brutale per me. Non c'è una soluzione migliore? KillProcess di carbonio () ei suoi amici Process Manager non sembrano molto aiuto a meno che non ho costruire un albero di rappresentanza processo di me stesso. Mi sto perdendo qualcosa?

ho anche un po 'di codice per inviare il Quit di Apple Event sulla base di PID. Sarebbe ancora più bello per essere in grado di inviare che per ogni processo nella struttura definita da un processo padre, basso verso l'alto. Ma questo è solo un nice-to-have. Una risposta alla prima domanda ottiene il "punto".

È stato utile?

Soluzione

Si può semplicemente utilizzare killpg per terminare il processo e tutto il suo gruppo:

#include <signal.h>
#include <unistd.h>

/* ... */

killpg(getpgid(pid), SIGTERM);

controllo degli errori corretta dovrebbe essere fatto, naturalmente, ma si dovrebbe ottenere il succo. Vedere la kill(2) pagine man e killpg(2) per maggiori informazioni.

Altri suggerimenti

L'ultima volta che ho guardato in questo (che era a pochi anni fa, ma non credo che sia cambiato molto) la soluzione migliore che ho trovato è stato solo per chiamare il comando di sistema kill.

system( "ps axwww | grep -i CoreServices/Dock.app/Contents/MacOS/Dock | grep -v grep | awk '{print $1}' | xargs kill -3" );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top