如何杀死在c + +的过程,只知道它的名字的一部分

前段时间我需要编写c ++代码来杀死一些进程。 在我的主程序中,我使用系统(“…”)在input上运行带有不同文件名string的大型CAE系统软件包。 CAE软件创build了许多进程,包含进程名string文件名 )。 一些CAE进程worktime > max_time ,比我需要closures他们:

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

输出是:

 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. 

我试图用execvp来运行,尝试了不同的方式,运行kill或者pkill over bash脚本 ,调用system(“name_of_script.sh”),其中脚本包含kill -9 *filename*但结果是一样的。
使用kill/bin/kill给出了相同的输出, bash -c kill...
从我的系统使用kill (Ubuntu Natty) gnome-terminal

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

closures所有必要的程序! 它工作

在使用pkill ,据我所知,我们需要完整的进程名来杀死它,但是我只有部分名字。

我也尝试使用pthreads将计算进程包装到子线程中,并使用pthread_cancel来停止它,但由于CAE-系统进程没有收到信号(我认为会陷入它们),所以它不起作用,唯一的方法就是SIGTERM。
用pthread_kill杀死子线程“包装”也杀死父母(我的主程序)。

我不知道CAE进程的pid 从 signals.h中调用kill
closures主程序不要停止CAE进程(并且没有-Z标志,所以它们不是我的程序进程subprocess)

如何closuresCAE进程,从我的主程序运行MAXTIME?


问题是我在QtCreator中通过debugging器(gdb)运行主程序。 没有QtCreator shell脚本以正确的方式运行参数,虽然参数是正确的两种方式。


另外,我还要清除一些CAE进程,这些进程没有cmdline的文件名,但是这个进程的父母或孩子。 在shell脚本中,您可以使用:

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

$P是一个variables,pid是被杀死的进程。 这里有几种杀死所有subprocess的方法。

我会写smth。 在C ++中类似,它将扫描/proc/xxxx/status直到PPid = ppid_of_my main_program并剪切该分支。

Solutions Collecting From Web of "如何杀死在c + +的过程,只知道它的名字的一部分"

你不必打开一个shell来杀死一个进程。 只要使用“杀”功能:

 #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 

http://linux.die.net/man/2/kill

要找到一个杀进程读取以下目录:

的/ proc / #### / CMDLINE

其中####是任何正在运行的进程ID的编号。 所以代码大概是读取/ proc目录并列出所有数字目录,这些是当前正在运行的进程,并且在该目录的“cmdline”文件中找到生成该进程的命令的名称。 然后可以使用正则表达式或字符串比较来标识要杀死的进程。

这应该只是工作假设文件名不是太多的异国情调或包含正则表达式模式:

 string s="pkill -9 -f "+filename"; system(s.c_str()); 

作为一个方面说明, -9是最后的手段信号,而不是你应该开始。 因此,我会建议较不残酷的:

 string s="pkill -f "+filename"+";sleep 2; pkill -9 -f "+filename; system(s.c_str());