Hi tech@,
Maybe it is need to check sysctl return value in usr.bin/systat/pigs.c.
E.g., in read_pg() function:
......
size = sizeof(ctimes);
sysctl(cp_time_mib, 2, &ctimes, &size, NULL, 0);
t = 0;
for (i = 0; i < CPUSTATES; i++)
t += ctimes[i] - stime[i];
......
If sysctl() failed, the values in ctimes are indeterminate. Apologize if
I am wrong. Thanks!
Index: pigs.c
===================================================================
RCS file: /cvs/src/usr.bin/systat/pigs.c,v
retrieving revision 1.30
diff -u -p -r1.30 pigs.c
--- pigs.c 12 Sep 2015 15:59:36 -0000 1.30
+++ pigs.c 4 May 2018 05:14:13 -0000
@@ -183,7 +183,8 @@ read_pg(void)
* and for the imaginary "idle" process
*/
size = sizeof(ctimes);
- sysctl(cp_time_mib, 2, &ctimes, &size, NULL, 0);
+ if (sysctl(cp_time_mib, 2, &ctimes, &size, NULL, 0) < 0)
+ return 1;
t = 0;
for (i = 0; i < CPUSTATES; i++)
@@ -234,13 +235,16 @@ initpigs(void)
fixpt_t ccpu;
size = sizeof(stime);
- sysctl(cp_time_mib, 2, &stime, &size, NULL, 0);
+ if (sysctl(cp_time_mib, 2, &stime, &size, NULL, 0) < 0)
+ return (-1);
size = sizeof(sysload);
- sysctl(sysload_mib, 2, &sysload, &size, NULL, 0);
+ if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0)
+ return (-1);
size = sizeof(ccpu);
- sysctl(ccpu_mib, 2, &ccpu, &size, NULL, 0);
+ if (sysctl(ccpu_mib, 2, &ccpu, &size, NULL, 0) < 0)
+ return (-1);
lccpu = log((double) ccpu / sysload.fscale);
--
Best Regards
Nan Xiao