linux c/c 定位cpu占用,Linux c获取CPU占用率

本文介绍了一个C/C++程序,通过读取/proc/stat和/proc/pid/stat文件,计算并监控CPU使用情况。作者详细解释了如何获取进程CPU时间和总CPU时间,最后实现了一个函数来统计特定进程的CPU占用率,每3秒更新一次。
摘要由CSDN通过智能技术生成

第一步:

查看/proc/stat

这里面统计的是CPU的信息。第一行是所有CPU的统计信息。我们需要前4个数字

cpu 130216 19944 162525 1491240 3784 24749 17773 0 0 0

前四位分别表示:

user,nice, system, idle

将他们相加得到total_CPU

第二步:

查看/proc/数字(pid)/stat

这里统计的是某个进程的信息,路径中的数字就是进程的pid。

这里有52个数字。我们需要第14和15个,表示该程序的用户态时间和内核态时间

将这两个数字相加得到proc_CPU

第三步

查看CPU个数

再/proc/cpuinfo里面查看

记为num_CPU

第四步

统计一次total_CPU和proc_CPU记为total_CPU1和proc_CPU1

sleep3秒钟

再统计一次total_CPU和proc_CPU记为total_CPU2和proc_CPU2

然后根据公式统计出CPU占用率

num_CPU*(proc_CPU2-proc_CPU1)*100.0/(total_CPU2-total_CPU1)

代码

#include

#include

#include

#include

#include

#include

FILE *CPULog;

void shutdownGetCPU()

{

fclose(CPULog);

exit(0);

}

//获取总的CPU时间

unsigned long get_cpu_total_occupy(){

FILE *fd;

long int temp[10];

char buff[1024]={0};

fd =fopen("/proc/stat","r");

fgets(buff,sizeof(buff),fd);

char name[64]={0};

sscanf(buff,"%s %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld",name,&temp[0],&temp[1],&temp[2],&temp[3],&temp[4],&temp[5],&temp[6],&temp[7],&temp[8],&temp[9]);

fclose(fd);

//temp[0]+temp[1]+temp[2]+temp[3]+temp[4]+temp[5]+temp[6]+temp[7]+temp[8]+temp[9]

return temp[0]+temp[1]+temp[2]+temp[3];

}

//获取进程的CPU时间

int get_cpu_proc_occupy(unsigned int pid){

char file_name[64]={0};

FILE *fd;

char line_buff[1024]={0};

sprintf(file_name,"/proc/%d/stat",pid);

fd = fopen(file_name,"r");

if(NULL == fd){

return 0;

}

fgets(line_buff,sizeof(line_buff),fd);

char temp[3][64];

int i,cnt=0,p=0;

int len=strlen(line_buff);

for(i=0;i

{

if(line_buff[i]!=' ')

{

temp[2][p]=line_buff[i];

p++;

}

else if(line_buff[i]==' ')

{

temp[2][p]='\0';

p=0;

cnt++;

if(cnt==14||cnt==15)

{

strcpy(temp[cnt-14],temp[2]);

}

}

}

fclose(fd);

//printf("%s %s\n",temp[0],temp[1]);

return atoi(temp[0])+atoi(temp[1]);

}

//获取CPU占用率

float get_proc_cpu(unsigned int pid){

float totalcputime1,totalcputime2;

float procputime1,procputime2;

totalcputime1=get_cpu_total_occupy();

procputime1=get_cpu_proc_occupy(pid);

sleep(3);

totalcputime2=get_cpu_total_occupy();

procputime2=get_cpu_proc_occupy(pid);

//printf("debug: %f %f %f %f\n",totalcputime1,procputime1,totalcputime2,procputime2);

float pcpu = 0.0;

if(0 != totalcputime2-totalcputime1){

pcpu=(procputime2-procputime1)*100.0*40.0/(totalcputime2-totalcputime1);

if(pcpu>100.0)pcpu=100.0;

}

else

printf("total is 0\n");

return pcpu;

}

//进程本身

int get_pid(const char* process_name)

{

char* user = getlogin();

char cmd[512];

if (user){

sprintf(cmd, "pgrep %s -u %s", process_name, user);

}

FILE *pstr = popen(cmd,"r");

if(pstr == NULL){

return 0;

}

char buff[512];

memset(buff, 0, sizeof(buff));

if(NULL == fgets(buff, 512, pstr)){

return 0;

}

return atoi(buff);

}

int main(int argc, char *argv[])

{

CPULog=fopen("CPULog.csv","w");

unsigned int ppid=getppid();

printf("GetCPU pid:%d ppid:%u\n",getpid(),ppid);

while(1)

{

signal(SIGUSR1,shutdownGetCPU);

//printf("%f,",get_proc_cpu(pid));

fprintf(CPULog,"%f,",get_proc_cpu(ppid));

}

fclose(CPULog);

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux系统中,获取指定进程的CPU占用率c可以使用top命令或ps命令。这两个命令都可以查看系统中运行的进程信息,包括进程的CPU占用率。 使用top命令获取指定进程的CPU占用率可以通过以下步骤实现: 1. 打开终端,输入top命令。 2. 按下shift+p,然后输入要查看的进程号或名称,回车。 3. top命令将会显示该进程的CPU占用率。 使用ps命令获取指定进程的CPU占用率可以通过以下步骤实现: 1. 打开终端,输入ps命令,加上选项p和进程号或名称。 2. 在选项中加上-o选项,后面输入%cpu或%CPU。 3. 执行该命令,将会显示该进程的CPU占用率。 以上两个命令都可以实现获取指定进程CPU占用率的功能,具体使用哪种方法取决于用户的需求。需要注意的是,这两个命令获取CPU占用率是该进程在系统整体CPU使用率中的占比,并不是该进程的实际CPU使用率。如果需要获取该进程的实际CPU使用率,需要使用更为专业的工具或命令。 ### 回答2: 在Linux系统中,我们可以通过多种方式获取指定进程的CPU占用率。以下是几个常用的方法: 1. top命令 top命令是一个基于终端的系统监控工具,它能够显示系统中进程的实时信息,包括CPU占用率。要获取指定进程的CPU占用率,可以按下“Shift + P”键,然后输入进程ID或进程名称即可。 2. ps命令 ps命令是另外一个常用的用于获取进程信息的命令。它可以显示所有进程的信息,也可以根据进程ID或进程名称来获取指定进程的信息。要获取指定进程的CPU占用率,可以使用如下命令: ps -o pid,%cpu,comm -p 进程ID 其中,“%cpu”表示CPU占用率,它是ps命令的一个输出参数。 3. pidstat命令 pidstat是一个用于进程性能监测的工具,它可以显示每个进程的CPU占用率、内存占用率等详细信息。要获取指定进程的CPU占用率,可以使用如下命令: pidstat -p 进程ID 其中,“-p”参数表示指定要监测的进程ID。 4. top -n命令 top命令还可以使用“-n”参数来指定监测次数。这样,我们可以在一定时间内获取指定进程的平均CPU占用率。例如,要获取进程ID为123的进程在10秒内的平均CPU占用率,可以使用如下命令: top -b -n 10 -d 1 -p 123 |grep "123" 其中,“-b”表示以批处理模式运行top命令,“-n”表示监测次数,“-d”表示监测间隔,“-p”表示要监测的进程ID。最后使用grep命令来过滤输出信息,只保留目标进程的信息。 ### 回答3: 获取指定进程 CPU 占用率的方法,在 Linux 系统中有多种实现方式。本文将介绍两种常见的方法: 方法一:使用 top 命令 top 命令可以查看系统中所有进程的 CPU 占用情况,可以通过 top 命令获取指定进程的 CPU 占用率。具体方法如下: 1. 打开终端,输入 top 命令; 2. 按下“Shift + P”组合键,进入按 CPU 占用率排序模式; 3. 找到目标进程对应的 PID(进程 ID),使用“k”命令杀掉该进程并记录其 CPU 占用率,或记录当前 CPU 占用率。 方法二:使用 ps 命令和 awk 命令 ps 命令可以列出系统中所有进程的信息,awk 命令可以对列数据进行处理。使用这两个命令可以获取指定进程的 CPU 占用率。具体方法如下: 1. 打开终端,输入“ps aux | grep [进程名称]”命令,获取目标进程的 PID; 2. 输入“top -p [PID]”命令,实时监控目标进程的 CPU 占用率,并记录需要的信息; 3. 按下“Ctrl + C”组合键退出 top 命令。 需要注意的是,在使用这两种方法获取 CPU 占用率时,数据的精确性和稳定性都受到系统负载等因素的影响。为获得更准确的结果,可以多次测量、取平均值,或使用更具专业性的系统监控工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值