2010-12-14 25 views
5

Come posso eliminare un processo in background che è stato eseguito utilizzando una chiamata di funzione di sistema in linguaggio C. Ad esempio, ho una richiesta di compilazione chiamata "fooprocess". Poi voglio scrivere un programma che eseguirà l'applicazione fooprocess in background utilizzando la funzione di sistema, si prega gentilmente di vedere sotto il codice,Come interrompere il processo in background dalla chiamata di funzione di sistema

const char app[] = "fooprocess &"; 
system(app); 

Come potete vedere c'è un carattere "&" in modo che posso eseguire l'applicazione fooprocess in background. Come posso uccidere questo fooprocess?

Molte grazie.

+1

Forse 'system (" pkill fooprocess ");'? – jweyrich

+0

@jweyrich, grazie di non provarlo. – domlao

risposta

5

Per interagire con il processo è necessario il suo PID. Non sono sicuro che sia possibile con system ma una alternativa è quella di eseguire il fork del processo usando fork + exec.

+0

Grazie, puoi dare un codice base per questo. – domlao

+1

Non è possibile con 'system'. Se il sistema di OP ha 'posix_spawn', probabilmente è più facile da usare di' fork' e 'exec'. –

0


Ho provato il problema utilizzando questo:

ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill 

è possibile inserire che nel sistema di() in questo modo:

system("ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill"); 

che funzionerà.

+0

Quando tutto quello che hai è un martello ... –

+0

@Adam Rosenfield: che cosa significa? :-) –

+2

Quello che sto cercando di dire è che 'system' è lo strumento sbagliato per il lavoro. "Quando tutto ciò che hai è un martello, tutto sembra un chiodo". La soluzione giusta è usare 'fork' +' exec' invece di 'system' per generare il processo figlio, e quindi è molto, molto più facile interagire con quel processo. –

2

Non è assolutamente possibile utilizzare system("foo &"); per creare processi in background che è possibile monitorare/uccidere in un secondo momento. Qualsiasi utilizzo di questo tipo ha un bug intrinseco gigantesco: anche se si conosce il pid, non c'è modo di sapere se il processo con quel pid è il processo originariamente eseguito, o un processo completamente diverso che è accaduto per ottenere lo stesso pid in un secondo momento .

per risolvere questo problema (e innumerevoli altri problemi non si vuole pensare o che renderà il vostro mal di testa) si dovrebbe dimenticare mai imparato a conoscere la funzione system e creare i processi figli con fork e exec, o posix_spawn. Ciò si tradurrà in un processo figlio diretto (il tuo metodo attuale sta creando nipoti che diventano orfani e acquisiti dal processo init) che puoi wait/waitpid e fino a quando non esegui un'operazione wait, il pid del processo figlio appartiene a te e non può essere riutilizzato, quindi è sicuro inviare segnali ad esso, ecc.