2012-08-13 108 views
4

前段时间我需要编写C++代码来杀死一些进程。在我的主程序中,我使用带有不同文件名字符串的系统(“...”)运行大型CAE系统程序包。 CAE软件创建了许多进程,其中包含进程名称字符串,文件名为)。一些CAE流程工作时间的>MAX_TIME,比我更需要关闭它们:如何在C++中杀死进程,只知道其名称的一部分

//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,调用系统(“name_of_script.sh”),其中脚本包含kill -9 *filename*,但结果相同。
使用kill/bin/kill也给出了相同的输出bash -c kill...
使用kill从我的系统(Ubuntu的纳蒂)GNOME终端

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

关闭所有必要的过程!它作品

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

我也尝试使用pthreads将计算进程包装到子线程中,并使用pthread_cancel将其停止,但由于CAE-系统进程没有收到信号(我认为将其捕获)方式是SIGTERM。
用pthread_kill杀死子线程“换行”也杀死父母(我的主程序)。

我不知道CAE进程的PID调用kill from signals.h
关闭主程序不停止CAE流程(和没有-Z标志,所以是他们不是我的程序处理孩子的?)

如何关闭从我的主程序运行MAXTIME的CAE进程?


的问题是,我是运行经由调试器(GDB)在QtCreator主程序。如果没有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并剪切该分支。

+1

这些流程是从您的程序创建的吗?记住pid并以这种方式杀死它们会容易得多。 – Wug 2012-08-13 12:07:41

+1

你确定你真的想在C++而不是shell中做到这一点吗? – pmr 2012-08-13 12:08:08

+0

我用系统调用CAE(“launcher.sh文件名”);文件名每次都不相同。哦,我只能拿起发射器的pid,在两秒钟内完成并创建CAE进程。 – 2012-08-13 12:09:31

回答

11

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

+2

阅读'/ proc/xxx/cmdline'查看我的答案在这里:http://stackoverflow.com/questions/6898337/c-determine-programmatically-if-a-program-is-running/6898456#6898456 – 2012-08-13 12:59:09

+0

谢谢!/proc扫描是一件好事!虽然问题,据我了解,过程是从gdb空间开始的。 – 2012-08-13 13:20:08

+0

更正确:在QtCreator中,启动了gdb – 2013-07-26 20:45:27

0

这应该只是工作假设文件名是不是太多外来的或包含一个正则表达式模式:

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

作为一个方面说明,是不得已的信号,不是你应该下手。因此,我会推荐不那么残酷:

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