首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c++中杀死进程,只知道其名称的一部分

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

Stack Overflow用户
提问于 2012-08-13 12:03:54
回答 2查看 29.8K关注 0票数 4

不久前,我需要编写c++代码来终止某些进程。在我的主程序中,我运行带有system的大型CAE-system包(“.”)在输入上有不同的文件名字符串。CAE-软件创建许多进程,其中包含在进程名字符串文件名)。有些CAE-处理工作时间> max_time,比我需要关闭它们:

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

产出如下:

代码语言:javascript
复制
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运行,尝试使用在bash脚本上运行杀死或pkill的不同方式,调用系统(“name_of_script.sh”),其中脚本包含kill -9 *filename*,但结果是一样的。

使用kill/bin/kill提供了相同的输出,bash -c kill...也是如此。

在我的系统中使用kill (Ubuntu ) gnome-terminal:

代码语言:javascript
复制
kill -9 `ps aux | grep filename | awk {'print $2'}`

关闭所有必要的进程!它是工作的。

当使用pkill时,正如我所理解的,我们需要完整的进程名来终止它,但是我只有部分名称。

我还试图使用p线程将计算进程封装到子线程中,并使用pthread_cancel停止它,但是由于--系统进程不接收信号(我认为,捕获它们),唯一的方法是SIGTERM。

使用pthread_kill杀死子线程-“main”也会杀死父程序(我的主程序)。

我不知道CAE可以调用从信号中杀死

关闭主程序不停止CAE-进程(并且没有-Z标志,所以它们不是我的程序进程子程序吗?)

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

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

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

代码语言:javascript
复制
cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"

其中,$P是一个变量,其pid为终止过程。以下是几种方法来杀死所有子进程。

我会写封信的。类似于C++,它会扫描/proc/xxxx/status直到PPid= ppid_of_my main_program并切断分支。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-13 12:56:16

你不需要打开一个shell就可以终止一个进程。只需使用“杀死”函数:

代码语言:javascript
复制
#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“文件中找到生成该进程的命令的名称。然后,可以使用正则表达式或字符串比较来标识要终止的进程。

票数 15
EN

Stack Overflow用户

发布于 2013-07-26 22:15:33

如果文件名不太异国情调,或者包含正则表达式模式,这就可以工作了:

代码语言:javascript
复制
string s="pkill -9 -f "+filename";
system(s.c_str());

顺便说一句,-9是最后的信号,而不是你应该开始的东西。因此,我建议不那么残忍:

代码语言:javascript
复制
string s="pkill -f "+filename"+";sleep 2; pkill -9 -f "+filename;
system(s.c_str());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11933969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档