如何在 c++ 中杀死进程,只知道其名称的一部分
How to kill process in c++, knowing only part of its name
前段时间我需要编写c ++代码来终止某些进程。在我的主程序中,我运行带有系统("...")的大型CAE系统包,输入时具有不同的文件名字符串。CAE 软件创建许多进程,其中包含进程名称字符串文件名)。一些 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 运行,尝试了不同的方式在 bash 脚本上运行 kill 或 pkill,调用 system("name_of_script.sh"),其中脚本包含 kill -9 *filename*
但结果是相同的。
使用 kill
和 /bin/kill
给出了相同的输出,bash -c kill...
也是如此。
使用我的系统(Ubuntu Natty)gnome-terminal中的kill
:
kill -9 `ps aux | grep filename | awk {'print $2'}`
关闭所有必要的进程!它有效。
使用 pkill
时,据我所知,我们需要完整的进程名称来杀死它,但我只有部分名称。
我还尝试使用 pthreads 将计算过程包装到子线程中并用 pthread_cancel 停止它,但由于 CAE 系统进程没有接收信号(我认为,捕获它们),它不起作用,唯一的方法是 SIGTERM。
用pthread_kill杀死子线程"包装"也会杀死父线程(我的主程序)。
我不知道CAE进程pids从信号中调用kill.h
关闭主程序不会停止 CAE 进程(并且没有 -Z 标志,所以它们不是我的程序进程子进程吗??
如何关闭从我的主程序> MAXTIME 运行的 CAE 进程?
问题是我通过QtCreator中的调试器(gdb)运行主程序。如果没有QtCreator,shell脚本以正确的方式运行参数,尽管参数以两种方式正确传递。
此外,我还必须清除一些CAE进程,这些进程在cmdline中没有文件名,但是此过程的父项或子项。在 shell 脚本中,您可以使用:
cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"
其中$P
是具有 pid 的终止过程的变量。以下是终止所有子进程的几种方法。
我会在C++中写类似的 smth,它会扫描/proc/xxxx/status
直到 PPid
= ppid_of_my main_program 并切断该分支。
您不必打开 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());
- C++:如何使函数只返回作为列表一部分的字符串
- std::sort()函数无法对向量的一部分进行排序
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 反转整数的一部分(一半)的函数
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- C 指针和对象作为不同类的一部分
- 如何分析代码的哪一部分创建了线程?
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 复制矩阵的一部分并粘贴到另一个矩阵C++上
- 我可以将c ++清理器仅应用于程序的一部分而不是第三方库吗?
- C++向量的哪一部分在传递给函数时被复制
- C++结构的一部分
- 在 MPI 中共享数组的一部分
- 如何检测文件夹是否太重,如果是,请删除其中的一部分
- 如何将文件的一部分读取到std::list缓冲区?
- c++中的交叉编译(作为跨平台应用程序的一部分或作为服务)
- 将constexpr字节数组与缓冲区的一部分(指向数据的指针)进行比较
- 如何将字符串的一部分转换为整数
- 如何有效地将一个大std::字符串的一部分转换为float
- OpenCV-如何将vale添加到图像一部分的所有像素