linux c++ 根据进程名杀死一个进程

news/2025/2/6 1:55:51/

一、知识点储备

环境:centos6 , x86,g++
需求:输入参数:进程名和超时时间;功能:杀死超时的进程

  1. 杀死进程的方法:前期考虑用boost::process库以达到跨平台的目的,但是学习之后发现该库是用来管理子进程的,不能用来杀死一个不相干的进程。在linux中杀死一个进程可以使用kill(pid,SIGKILL)函数通过发送信号实现杀死进程的目的。
#include<sys/types.h>
int kill(int pid, int SIG); //第一个参数是进程的id,第二个参数是发送的信号,返回值:0--成功

2.根据进程名获得进程pid
linux系统中所有正在运行的进程都会在/proc/路径下拥有一个以自身pid命名的文件夹,文件夹中存储了该进程相关的一些信息,其中:
exe:是该进程所运行的程序的软连接;
cmd:是该程序所在的目录
status文件(/proc/***pid***/status):文件中第一行标明了该进程对应的进程名。
所以可以通过遍历/proc/下所有文件夹中的status的方式获取到该进程名对应的所有进程pid
(所谓的进程名就是执行的程序的名字,一个程序可以同时有多个进程去运行,所以一个名字可能对应多个进程pid)

3. 获取进程的运行时长
目前我查到的信息来看,没找到一个封装好的c++函数可以让我们方便得得到一个进程得运行时长,linux中普遍是通过ps命令来获取到进程的开始时间和运行时长。所以在c++中通过代码来启动命令行来得到结果并将获取到的时间变成总秒数

//将此命令中的pname和pid分别替换成自己的进程名和进程pid即可
//得到的就是一个"日-时:分:秒"结构的运行时长
ps -eo pid,etime,cmd | grep [pname] | grep [pid] | awk '{print $2}'

二、以下是各部分的实现代码

1.获取进程pid

//获取进程pid
vector<string> ProcessKiller::getPidFromName(std::string ProcessName){vector<string> pids;const char* cprocessName=ProcessName.c_str();DIR *dir;struct dirent *ptr;FILE *fp;char filepath[50];//存放cmline文件路径char cur_task_name[50];//存放命令行文本char buf[BUF_SIZE];dir = opendir("/proc"); //打开路径,读取下面每一个文件夹if (NULL != dir){while ((ptr = readdir(dir)) != NULL) {//如果是"."或者".."就跳过if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))continue;if(DT_DIR!=ptr->d_type)continue;sprintf(filepath,"/proc/%s/status",ptr->d_name); fp = fopen(filepath, "r");//打开status文件if (NULL != fp){if( fgets(buf, BUF_SIZE-1, fp)== NULL ){fclose(fp);continue;}sscanf(buf,"%*s %s",cur_task_name);//status中的进程名与要杀死的进程名是否匹配if(!strcmp(cprocessName,cur_task_name)){printf("PID:  %s\n",ptr->d_name);pids.push_back(ptr->d_name);}fclose(fp);}}vector<string>::iterator it;std::cout<<cprocessName<<" --pids:   ";for(it=pids.begin();it!=pids.end();it++){std::cout<<*it<<"   ";}std::cout<<std::endl;closedir(dir);}return pids;}

2.获取进程的运行时长(秒数)

这一段代码较长,放到下一篇了
获取进程运行时长

3.杀死进程

void ProcessKiller::killProcess(vector<string> pids,vector<string> &pids_failed){vector<string>::iterator it;for(it=pids.begin();it!=pids.end();it++){std::cout<<*it<<"   ";int num;sscanf((*it).c_str(), "%d", &num);long runtime=get_process_runtime(num, m_processName.c_str());       //get pid's running time;if(runtime>m_timeout){if(isRunning(num)==0){printf("%d is running,start to kill it\n",num);int retval = kill(num, SIGKILL);  //发送SIGKILL信号给进程,要求其停止运行if (retval<0)   //判断是否发生信号{printf("kill %d failed",num);pids_failed.push_back(*it);}else{printf("%d killed\n", num);}}}else{printf("œø³Ì[ %d ]runtime<timeout, this is no need to kill it\n ",num);}}
}

4.判断进程是否在运行

// 0 : running, -1 : exit, -2 : zombie(僵尸进程)int ProcessKiller::isRunning(int pid){if (0 == kill(pid, 0)){std::string path = std::string("/proc/") + std::to_string(pid) + "/status";std::ifstream fs;fs.open(path);if (!fs)return -1;std::string line;while (getline(fs, line)){std::size_t found = line.find("State:");if (found == std::string::npos)continue;else{found = line.find("zombie");if (found == std::string::npos)return 0;elsereturn -2; // zombie}}}elsereturn -1;}

http://www.ppmy.cn/news/921072.html

相关文章

初夏最后蓝楹花,初夏最后蓝楹花

初夏最后蓝楹花 潇潇洒洒出品赏花骑行守望山诗两首2023年5月13日初夏最后蓝楹花妩媚花容醉年华莫憾花仙飘然去来年还来满天涯美景易逝伤别离黛玉葬花实堪怜赏花骑行守望山登高远眺花千里

云台山春花将逝,热情的盛夏等待您

春天终于走到了尾声&#xff0c;云台山上的春天也是如此&#xff0c;在那曾经满山遍野的春芬之中&#xff0c;花瓣终究好似那终将凋零的少女一般&#xff0c;飘落在地上&#xff0c;飘落在春风里。 一场大雨过后&#xff0c;云台山的一切仿佛都变了&#xff0c;不再有那个红色的…

今日,寒露。读王羲之与陶渊明的魏晋风流。 文/光剑

文/光剑 白居易《暮江吟》云&#xff1a;“可怜九月初三夜&#xff0c;露似真珠月似弓。” 辛丑年寒露节气&#xff0c;正好是阴历九月初三。 《月令七十二候集解》说&#xff1a;“九月节&#xff0c;露气寒冷&#xff0c;将凝结也。” 寒露节气&#xff0c;大雁南飞&#xf…

远逝的自行车

在今日越来越流行和时尚的年代&#xff0c;众多的校园生活不可避免地烙上了新潮的印记&#xff0c;想想我们的中学&#xff0c;除了热播《红高梁》时&#xff0c;伙伴之间的互相怂恿&#xff0c;路上心情的慌乱&#xff0c;剧院门口的迟疑与徘徊以及后来因着胆怯怏怏而去&#…

夏天夏,星星辰。(上)

序章 那一年的仲夏夜 TRY TO REMEMBER 莘辰仰起了头&#xff0c;如水一般的月光立刻温柔地洒落在她白皙的小脸上&#xff0c;于是&#xff0c;她尚显稚气的面庞便蒙上了一层晶莹剔透的光芒。 她的眼睛&#xff0c;闪亮如黑夜中灿烂的星光。 “我爸爸说&#xff…

程序员的浪漫:七夕准备好表白了吗

今天七夕节&#xff0c;有些人在思考如何脱单&#xff0c;有些人在思考如何表白&#xff0c;有些人在思考如何秀恩爱&#xff0c;可今天还要上班怎么破&#xff1f; 其实很多时候礼物不一定就需要花钱买&#xff0c;今天我们就用代码来一次表白吧&#xff0c;把你中意的代码发…

匆匆已逝的几多时光

回想昨天&#xff0c;已浑浑噩噩度过了几个春夏&#xff0c;游戏、逃课、睡觉。。。 要不是哪一刻突然觉醒&#xff0c;可能今天&#xff0c;我依然在等待着时间老去吧。不知不觉&#xff0c;我。已经21 想起了一位成功人士说过的一句话&#xff0c;”人生的路充满的新奇&…

php万年历jb51,php简单的日历 - 夏桀的个人空间 - OSCHINA - 中文开源技术交流社区...

//引用jquery include header.php; class rili{ private $days; private $dweek; private $years; private $month; function __construct(){ $this->yearsisset($_GET[year]) ? $_GET[year]:date(Y);//获取年 $this->monthisset($_GET[month]) ? $_GET[month]:date(m)…