Linux C++中获取指定pid、tid的CPU与内存占用信息

 
 
  1. #include<iostream> 
  2. using namespace std; 
  3. #define _LINE_LENGTH 300 
  4.  
  5.  
  6. bool GetCpuMem(float &cpu,size_t &mem, int pid,int tid = -1) 
  7.     bool ret = false
  8.     char cmdline[100]; 
  9.     sprintf(cmdline, "ps -o %%cpu,rss,%%mem,pid,tid -mp %d", pid); 
  10.     FILE *file; 
  11.     file = popen(cmdline, "r"); 
  12.     if (file == NULL)  
  13.     { 
  14.         printf("file == NULL\n"); 
  15.         return false
  16.     } 
  17.  
  18.     char line[_LINE_LENGTH]; 
  19.     float l_cpuPrec=0; 
  20.     int l_mem=0; 
  21.     float l_memPrec=0; 
  22.     int l_pid=0; 
  23.     int l_tid=0; 
  24.     if (fgets(line, _LINE_LENGTH, file) != NULL)  
  25.     { 
  26.     //  printf("1st line:%s",line); 
  27.         if (fgets(line, _LINE_LENGTH, file) != NULL)  
  28.         { 
  29.     //      printf("2nd line:%s",line); 
  30.             sscanf( line, "%f %d %f %d -", &l_cpuPrec, &l_mem, &l_memPrec, &l_pid ); 
  31.             cpu = l_cpuPrec; 
  32.             mem = l_mem/1024; 
  33.             if( tid == -1 ) 
  34.                 ret = true
  35.             else 
  36.             { 
  37.                 while( fgets(line, _LINE_LENGTH, file) != NULL ) 
  38.                 { 
  39.                     sscanf( line, "%f - - - %d", &l_cpuPrec, &l_tid ); 
  40.     //              printf("other line:%s",line); 
  41.     //              cout<<l_cpuPrec<<'\t'<<l_tid<<endl; 
  42.                     if( l_tid == tid ) 
  43.                     { 
  44.                         printf("cpuVal is tid:%d\n",tid); 
  45.                         cpu = l_cpuPrec; 
  46.                         ret = true
  47.                         break
  48.                     } 
  49.                 } 
  50.                 if( l_tid != tid ) 
  51.                     printf("TID not exist\n"); 
  52.             } 
  53.         } 
  54.         else 
  55.             printf("PID not exist\n"); 
  56.     } 
  57.     else 
  58.         printf("Command or Parameter wrong\n"); 
  59.     pclose(file); 
  60.     return ret; 
  61.  
  62. int main(int argc, char** argv) 
  63.     float cpu=0; 
  64.     size_t mem=0; 
  65.     int pid=0; 
  66.     int tid=-1; 
  67.     if( argc > 1 ) 
  68.         pid = atoi(argv[1]); 
  69.     else 
  70.         pid = getpid(); 
  71.     if( argc > 2 ) 
  72.         tid = atoi(argv[2]); 
  73.     while(1) 
  74.     { 
  75.         if( GetCpuMem( cpu, mem, pid, tid ) ) 
  76.         { 
  77.             printf("%%CPU:%.1f\tMEM:%dMB\n", cpu, mem); 
  78.         } 
  79.         else 
  80.             printf("return false\n"); 
  81.         break
  82.         sleep(5); 
  83.     } 
  84.  
  85.     return 0; 

编译:g++ GetInfo.cpp -o GetInfo -g

测试命令:

./GetInfo pid

显示pid进程cpu及内存信息

./GetInfo pid tid

显示pid进程的内存占用和其中tid线程的cpu占用信息

./GetInfo 什么参数都不输入显示本进程cpu及内存信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值