6 votes

Comment tuer un processus d'arrière-plan à partir d'un appel de fonction système

Comment puis-je tuer un processus d'arrière-plan qui a été exécuté en utilisant un appel de fonction système en langage C. Par exemple, j'ai une application compilée appelée "fooprocess". Ensuite, je veux écrire un programme qui va exécuter l'application fooprocess en arrière-plan en utilisant la fonction système, s'il vous plaît voir ci-dessous le code,

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

Comme vous pouvez le voir, il y a un caractère "&" qui me permet d'exécuter l'application fooprocess en arrière-plan. Comment puis-je tuer ce fooprocess ?

Merci beaucoup.

5voto

codaddict Points 154968

Pour interagir avec le processus, vous avez besoin de son PID. Je ne suis pas sûr que cela soit possible avec system mais une alternative est de forker le processus vous-même en utilisant fork + exec.

3voto

R.. Points 93718

Vous ne pouvez absolument pas utiliser system("foo &"); pour créer des processus d'arrière-plan que vous pourrez ensuite surveiller/supprimer. Toute utilisation de ce type a un gigantesque bogue inhérent : même si vous connaissez le pid, il n'y a aucun moyen de savoir si le processus avec ce pid est le processus que vous avez lancé à l'origine, ou un processus complètement différent qui a obtenu le même pid plus tard.

Pour résoudre ce problème (et d'innombrables autres problèmes auxquels vous ne voulez pas penser, car cela vous ferait mal à la tête), vous devez oublier que vous avez appris l'existence du system et créez vos processus enfants avec fork y exec ou posix_spawn . Il en résultera un processus enfant direct (votre méthode actuelle crée des petits-enfants qui deviennent orphelins et sont pris en charge par le processus enfant de l init ) que vous pouvez wait / waitpid et jusqu'à ce que vous effectuiez une wait l'opération, le pid du processus enfant vous appartient et ne peut être réutilisé, il est donc sûr d'y envoyer des signaux, etc.

0voto

Neilvert Noval Points 796

J'ai essayé votre problème en utilisant ceci :

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

vous pouvez le placer dans system() comme ceci :

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

Ça va marcher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X