2010-12-14 14 views
5

abgebrochen wird Wie kann ich einen Hintergrundprozess beenden, der mit einem Systemfunktionsaufruf in C-Sprache ausgeführt wurde. Wie zum Beispiel habe ich einen kompilierten Anwendungsaufruf "Fooprocess". Dann habe ich ein Programm schreiben mag, dass die fooprocess Anwendung im Hintergrund ausgeführt wird, die System-Funktion, bitte bitte unter dem Code sehen,Wie Hintergrundprozess vom Systemfunktionsaufruf

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

Wie man dort sieht ein „&“ Charakter ist, so dass ich kann Führen Sie die Fooprocess-Anwendung im Hintergrund aus. Wie kann ich diesen Prozess beenden?

Vielen Dank.

+1

Vielleicht 'System (" pkill fooprocess ");'? – jweyrich

+0

@jweyrich, danke krank versuche das. – domlao

Antwort

5

Um mit dem Prozess zu interagieren, benötigen Sie seine PID. Ich bin mir nicht sicher, ob es mit system möglich ist, aber eine Alternative ist, den Prozess mit fork + exec selbst zu forchen.

+0

Danke, kannst du dafür einen Basiscode angeben. – domlao

+1

Mit 'system' ist das nicht möglich. Wenn OPs System 'posix_spawn' hat, ist es wahrscheinlich einfacher zu verwenden als' fork' und 'exec'. –

0


Ich habe versucht, ihr Problem dies mit:

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

Sie können in System, dass platzieren() wie folgt:

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

, die funktioniert.

+0

Wenn alles, was Sie haben, ist ein Hammer ... –

+0

@Adam Rosenfield: was bedeutet das? :-) –

+2

Was ich versuche zu sagen ist, dass 'system' das falsche Werkzeug für den Job ist. "Wenn du nur einen Hammer hast, sieht alles wie ein Nagel aus." Die richtige Lösung besteht darin, 'fork' +' exec' anstelle von 'system' zu verwenden, um den untergeordneten Prozess zu erzeugen, und dann ist es viel einfacher, mit diesem Prozess zu interagieren. –

2

Sie können system("foo &"); absolut nicht verwenden, um Hintergrundprozesse zu erstellen, die Sie später überwachen/löschen können. Jede solche Verwendung hat einen inhärenten Fehler gigantischen: auch wenn Sie die PID kennen, gibt es keine Möglichkeit zu sagen, ob der Prozess mit dieser PID ist der Prozess, den Sie ursprünglich ausgeführt, oder einen völlig anderen Prozess, der die gleiche PID später erhalten .

Um dieses Problem zu lösen (und unzählige andere Probleme, die Sie über nicht denken oder es wird Ihr Kopf verletzt machen), sollten Sie vergessen, dass Sie jemals gelernt über die system Funktion und erstellen Sie Ihr Kind Prozesse mit fork und exec oder posix_spawn. Dies führt zu einem direkten Kindprozess (Ihre aktuelle Methode erstellt Enkel, die durch den init-Prozess verwaist werden), die Sie wait/waitpid aktivieren können, und bis Sie eine wait-Operation ausführen, gehört die pid des untergeordneten Prozesses zu Ihnen und kann nicht wiederverwendet werden, so ist es sicher, Signale zu senden, etc.