如何在c ++中杀死进程,只知道其部分名称

时间:2012-08-13 12:03:55

标签: c++ linux unix process kill

前段时间我需要编写c ++代码来杀死某些进程。在我的主程序中,我使用系统(“...”)运行大型CAE系统包,输入时使用不同的文件名字符串。 CAE软件创建了许多进程,其中包含进程名称字符串 filename )。一些CAE流程工作时间> max_time ,比我需要关闭它们:

//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运行,尝试different ways running kill or pkill over bash script,调用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'}`

关闭所有必要的流程!它有效

当我使用pkill时,我可以理解,我们需要完整的进程名称来杀死它,但我只有部分名称。

我还尝试使用pthreads将计算过程包装到子线程中并使用pthread_cancel将其停止,但由于CAE系统进程没有接收到信号(我认为,捕获它们),它不起作用,唯一的方法是SIGTERM。
用pthread_kill杀死子线程“换行”也会杀死父(我的主程序)。

我不知道调用kill from signals.h的CAE流程pid 关闭主程序不会停止CAE进程(并且没有-Z标志,所以它们不是我的程序进程子进程吗?)

如何关闭运行>的CAE流程?来自我主程序的MAXTIME?


问题是我在QtCreator中通过调试器(gdb)运行主程序。没有QtCreator shell脚本以正确的方式运行参数,尽管参数都是双向正确传递的。


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

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

其中$P是一个带有已杀死进程的pid的变量。 Here are several methods杀死所有子进程。

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

2 个答案:

答案 0 :(得分:11)

您无需打开shell即可终止进程。只需使用“kill”功能:

#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”文件中找到生成该进程的命令的名称。然后,您可以使用正则表达式或字符串比较来识别要杀死的进程。

答案 1 :(得分:0)

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

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());