summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--px.c66
1 files changed, 19 insertions, 47 deletions
diff --git a/px.c b/px.c
index 7547c00..bd2537a 100644
--- a/px.c
+++ b/px.c
@@ -1,5 +1,4 @@
-// gcc -g -O2 -Wall -o px px.c -lprocps
-
+#include <sys/auxv.h>
 #include <sys/sysinfo.h>
 
 #include <stdint.h>
@@ -10,27 +9,6 @@
 
 #include <proc/readproc.h>
 
-time_t seconds_since_boot;
-int Hertz;
-
-static int want_this_proc_pcpu(proc_t *buf){
-  unsigned long long used_jiffies;
-  unsigned long pcpu = 0;
-  unsigned long long seconds;
-
-//  if(!want_this_proc(buf)) return 0;
-
-  used_jiffies = buf->utime + buf->stime;
-//  if(include_dead_children) used_jiffies += (buf->cutime + buf->cstime);
-
-  seconds = seconds_since_boot - buf->start_time / Hertz;
-  if(seconds) pcpu = (used_jiffies * 1000ULL / Hertz) / seconds;
-
-  buf->pcpu = pcpu;  // fits in an int, summing children on 128 CPUs
-
-  return 1;
-}
-
 static void
 print_human(intmax_t i)
 {
@@ -53,18 +31,15 @@ int
 main(int argc, char *argv[])
 {
 	proc_t **result;
-	int hz;
+	int clktck;
 
-	if((hz = sysconf(_SC_CLK_TCK)) > 0){
-		Hertz = hz;
-	} else {
-		Hertz = 100; 	/* shrug */
-	}
+	if ((clktck = getauxval(AT_CLKTCK)) <= 0)
+		if ((clktck = sysconf(_SC_CLK_TCK)) <= 0)
+			clktck = 100; 	/* educated guess */
 
 	struct sysinfo si;
 	sysinfo(&si);
 
-	seconds_since_boot = si.uptime;
 	time_t now = time(0);
 
 	result = readproctab(PROC_FILLMEM | PROC_FILLCOM | PROC_FILLUSR |
@@ -89,19 +64,26 @@ match:
 		if (matched == 1)
 			printf("  PID USER     %%CPU  VSZ  RSS START ELAPSED   TIME COMMAND\n");
 
-		want_this_proc_pcpu(p);
-
 		printf("%5d", p->tid);
 		printf(" %-8.8s", p->euser);
-		printf(" %4.1f", p->pcpu/10.0);
+
+		double pcpu = 0;
+		time_t seconds;
+
+		seconds = si.uptime - p->start_time / clktck;
+		if (seconds)
+			pcpu = ((p->utime + p->stime) * 100.0 / clktck) / seconds;
+
+		printf(" %4.1f", pcpu);
 		print_human(p->vm_size*1024);
 		print_human(p->vm_rss*1024);
 
 		time_t start;
 		time_t seconds_ago;
-		start = (now - si.uptime) + p->start_time / Hertz;
+		start = (now - si.uptime) + p->start_time / clktck;
 		seconds_ago = now - start;
-		if(seconds_ago < 0) seconds_ago=0;
+		if (seconds_ago < 0)
+			seconds_ago=0;
 
 		char buf[7];
 		if (seconds_ago > 3600*24)
@@ -128,7 +110,7 @@ match:
 			printf("   %2u:%02u", mm, ss);
 
 
-		t = (p->utime + p->stime) / Hertz;
+		t = (p->utime + p->stime) / clktck;
 		ss = t%60;
 		t /= 60;
 		mm = t%60;
@@ -152,17 +134,7 @@ match:
 		if (p->state == 'Z')
 			printf(" <defunct>");
 		printf("\n");
-
-#if 0
-		printf("%d %s %f %ld %ld %ld %lld %lld %lld %s\n",
-		    p->tid, p->euser, p->pcpu/10.0, pmem,
-		    p->vm_size, p->vm_rss, p->start_time, 0ULL, p->utime,
-		    p->cmd
-		);
-#endif
 	}
 
-//	freeproctab(result);
-
-	exit(matched > 0);
+	exit(!matched);
 }