How to calculate the CPU usage of a process by PID in Linux from C? How to calculate the CPU usage of a process by PID in Linux from C? linux linux

How to calculate the CPU usage of a process by PID in Linux from C?


You need to parse out the data from /proc/<PID>/stat. These are the first few fields (from Documentation/filesystems/proc.txt in your kernel source):

Table 1-3: Contents of the stat files (as of 2.6.22-rc3).............................................................................. Field          Content  pid           process id  tcomm         filename of the executable  state         state (R is running, S is sleeping, D is sleeping in an                uninterruptible wait, Z is zombie, T is traced or stopped)  ppid          process id of the parent process  pgrp          pgrp of the process  sid           session id  tty_nr        tty the process uses  tty_pgrp      pgrp of the tty  flags         task flags  min_flt       number of minor faults  cmin_flt      number of minor faults with child's  maj_flt       number of major faults  cmaj_flt      number of major faults with child's  utime         user mode jiffies  stime         kernel mode jiffies  cutime        user mode jiffies with child's  cstime        kernel mode jiffies with child's

You're probably after utime and/or stime. You'll also need to read the cpu line from /proc/stat, which looks like:

cpu  192369 7119 480152 122044337 14142 9937 26747 0 0

This tells you the cumulative CPU time that's been used in various categories, in units of jiffies. You need to take the sum of the values on this line to get a time_total measure.

Read both utime and stime for the process you're interested in, and read time_total from /proc/stat. Then sleep for a second or so, and read them all again. You can now calculate the CPU usage of the process over the sampling time, with:

user_util = 100 * (utime_after - utime_before) / (time_total_after - time_total_before);sys_util = 100 * (stime_after - stime_before) / (time_total_after - time_total_before);

Make sense?


getrusage() can help you in determining the usage of current process or its child

Update:I can't remember an API. But all details will be in /proc/PID/stat, so if we could parse it, we can get the percentage.

EDIT:Since CPU % is not straight forward to calculate, You could use sampling kind of stuff here. Read ctime and utime for a PID at a point in time and read the same values again after 1 sec. Find the difference and divide by hundred. You will get utilization for that process for past one second.

(might get more complex if there are many processors)


Easy step to step for beginners like me:

  1. Read the first line of /proc/stat to get total_cpu_usage1.
    sscanf(line,"%*s %llu %llu %llu %llu",&user,&nice,&system,&idle);    total_cpu_usage1 = user + nice + system + idle;
  1. Read /proc/pid/stat where pid is the PID of the process you want to know the CPU usage, like this:
    sscanf(line,    "%*d %*s %*c %*d" //pid,command,state,ppid    "%*d %*d %*d %*d %*u %*lu %*lu %*lu %*lu"    "%lu %lu" //usertime,systemtime    "%*ld %*ld %*ld %*ld %*ld %*ld %*llu"    "%*lu", //virtual memory size in bytes    ....)
  1. Now sum usertime and systemtime and get proc_times1
  2. Now wait 1 second or more
  3. Do it again, and get total_cpu_usage2 and proc_times2

The formula is:

(number of processors) * (proc_times2 - proc_times1) * 100 / (float) (total_cpu_usage2 - total_cpu_usage1)

You can get the amount of CPU's from /proc/cpuinfo.