Comment tuer les processus en c++, ne connaissant qu'une partie de son nom

Il y a quelques temps j'avais besoin d'écrire du code c++ pour tuer le processus. Dans mon programme principal, je exécuter de grands CAE-système de package avec system("...") avec un nom de fichier différent à cordes sur entrée. CAE-logiciel crée de nombreux processus, qui contiennent dans le processus de chaîne de nom de nom de fichier). Certains de la CAE-processus worktime > max_time, que j'ai besoin de les arrêter:

//filename contains part of CAE-process name
    string s="/bin/kill -9 `ps aux | grep "+filename+" | awk {'print $2'}`";
    system(s.c_str());

La sortie a été:

Usage:
  kill pid ...              Send SIGTERM to every process listed.
  kill signal pid ...       Send a signal to every process listed.
  kill -s signal pid ...    Send a signal to every process listed.
  kill -l                   List all signal names.
  kill -L                   List all signal names in a nice table.
  kill -l signal            Convert between signal numbers and names.

J'ai essayé de courir avec execvp, essayé différents moyens de fonctionnement pour tuer ou pkill plus de script bash, système d'appel("name_of_script.sh"), où le script contenu kill -9 *filename* mais le résultat était le même.

À l'aide de kill et /bin/kill a donné le même résultat, bash -c kill... trop.

À l'aide de kill de mon système (Ubuntu Natty) gnome-terminal:

kill -9 `ps aux | grep filename | awk {'print $2'}`

l'arrêt de tous les processus nécessaires! Il œuvres.

Lors de l'utilisation de pkill, comme j'ai pu le comprendre, nous avons besoin d'un nom de processus pour tuer, mais j'ai une partie seulement de nom.

J'ai aussi essayé d'envelopper les processus de calcul d'un enfant thread à l'aide de pthreads et l'arrêter avec pthread_cancel, mais il ne fonctionne pas en raison de CAE-processus système ne reçoit pas de signaux (je pense, de le piéger), le seul moyen est de SIGTERM.

Meurtre de l'enfant-thread-"wrap" avec pthread_kill tue aussi les parents (mon programme principal).

Je ne sais pas CAE-processus de pid à l'appel tuer des signaux.h

Clôture du programme principal n'arrêtez pas de CAE-processus (et ils n'ont pas de -Z drapeau, de sorte qu'ils ne sont pas de mon processus de programme de childs??)

Comment puis-je fermer CAE-processus qui s'exécutent > MAXTIME de mon programme principal?


Le problème était que j'était en cours d'exécution du programme principal via le débogueur (gdb) dans QtCreator. Sans QtCreator shell-script s'exécute avec les arguments de la droite, même si les arguments sont passés correctement dans les deux sens.


Aussi j'ai effacer certaines CAE processus, qui n'ont pas de nom de fichier dans cmdline, mais ce sont les parents ou les enfants de ce processus.
Dans un shell-script, vous pouvez utiliser:

cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"

$P est une variable avec le pid de tués processus.
Voici plusieurs méthodes de tuer tous les processus enfants.

Je vais écrire qch. similaire en C++ qui scanne /proc/xxxx/status jusqu'à PPid= ppid_of_my main_program et de couper la branche.

Ces processus sont-ils ceux que vous êtes en train de créer à partir de votre programme? Il serait beaucoup plus facile de se rappeler les pid et les tuer de cette façon.
Êtes-vous sûr que vous voulez vraiment faire cela en C++ au lieu de shell?
J'appelle CAE avec system("launcher.sh nom de fichier"); nom de fichier diffère à chaque fois. Oh, je ne peux que prendre du lanceur pid, qui se termine en deux secondes et crée CAE processus.
Shell est le bienvenu. Je peux appeler un script à l'aide du système("script.sh"); où scripts.sh contient #/bin/bash kill -9 `ps aux | grep $1 | awk {'print $2'}` ne fonctionne pas (la même erreur: utilisation: tuer...)
system("script.sh nom de fichier") bien sûr.

OriginalL'auteur John_West | 2012-08-13