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

这篇具有很好参考价值的文章主要介绍了linux c++ 根据进程名杀死一个进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、知识点储备

环境: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.判断进程是否在运行文章来源地址https://www.toymoban.com/news/detail-580071.html

// 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;
                    else
                        return -2; // zombie
                }
            }
        }
        else
            return -1;
    }

到了这里,关于linux c++ 根据进程名杀死一个进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux如何杀死kill -9杀不掉的进程

    在Linux中,我们经常使用kill或者kill -9来杀死特定的进程,但是有些时候,这些方法可能无法终止某些进程。本文将详细解释为什么会出现这种情况,以及如何处理这种问题。 首先,我们来理解一下为什么有些进程无法被杀死。通常,这是因为这些进程处于以下两种状态之一

    2024年02月09日
    浏览(48)
  • linux下查看php进程,开启php-fpm&杀死php进程

    1、查看php进程 出现如图结果说明未开启 2、查看php安装路径 3、开启php-fpm 再次查看ps -ef |grep php 以树状图的方式展现php进程 4、关闭php-fpm

    2024年02月11日
    浏览(45)
  • windows杀死进程命令

            有时候由于病毒或其他原因,启动了一系列的进程,并且有时杀了这个,又多了那个。这时候我们可以特定选择一种杀,很多人对windows杀死进程命令比较感兴趣,所以今天小编就为大家来详细讲一讲windows命令行关闭进程教程,感兴趣的用户一起来看看吧。 windo

    2024年02月02日
    浏览(40)
  • window端口占用如何杀死进程

    1、输入命令:netstat -ano|findstr “8099” 2、杀死命令 taskkill /PID 2980 -T -F

    2023年04月11日
    浏览(42)
  • linux根据进程PID查找任务安装目录

    1、通过top 命令 找到PID,执行top命令后可以按住shift+m 按照内存从大到小倒序排列 2、假设pid为23730 通过 如下命令 可以查看任务详情 ps -aux|grep -v grep |grep 23730 3、通过cd /proc/23730 查看任务目录 4、进入目录后执行 ls -ail 出现的列表中 cwd- 开头的是任务目录

    2024年02月12日
    浏览(42)
  • Windows中杀死占用某个端口的进程

            Windows本地微服务并发启动后,断开微服务,重新启动微服务发现端口被占用,网上搜索一些前辈的建议,现在汇总一下,如有误还望大家指正。         第一步:打开dos命令窗         具体是点击起始菜单(或是通过win+R快捷键),在输入框中输入cmd,点击确

    2024年02月11日
    浏览(38)
  • 怎么使用cmd命令查看和杀死进程

    一、查看进程 1、首先使用快捷键win+R打开运行窗口,并输入cmd 2、命令提示符界面输入tasklist命令,可以获取到当前计算机的所有活动进程 二、杀死进程 在上图中,红框圈住的地方,有一个名为PID的列,这一列,就是我们的进程ID,我们可以直接输入 “taskkill /f /pid xxxx” ,其

    2024年02月13日
    浏览(50)
  • Golang杀死子进程的三种方式

    目录 前言 正文 一、cmd.Process.Kill() 二、syscall.Kill 三、cmd.Process.Signal 结论 熟悉Golang语言的小伙伴一定都知道,杀死子进程有三种方式,今天就来简单介绍一下。 Golang中有三种方式可以杀死子进程,分别是cmd.Process.Kill(), syscall.Kill,和 cmd.Process.Signal。它们都是通过向进程发送

    2024年01月21日
    浏览(31)
  • 【Selenium & Other】使用quit()无法关闭窗口 & 一键杀死进程

    有位读者留言,遇到了一件两难全的事儿。在关闭Python使用os模块执行cmd命令调用的chromedriver驱动打开的chrome浏览器时,有以下问题~ 使用 driver.quit() 退出浏览器, chromedriver.exe 进程退出,关闭没有窗口 使用 driver.close() 退出浏览器, chromedriver.exe 进程没有退出,窗口关闭 但是

    2024年02月05日
    浏览(63)
  • 【python】【centos】使用python杀死进程后自身也会退出

    使用python杀死进程后自身程序也会退出,无法执行后边的代码 这样不行: 使用shell脚本杀死进程,然后再让shell脚本运行该python程序 替代方案:

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包