* Copyright (c) 1980, 1992 The Regents of the University of California.
* %sccs.include.proprietary.c%
static char sccsid
[] = "@(#)pigs.c 5.15 (Berkeley) %G%";
* Pigs display from Bill Reeves at Lucasfilm
int compar
__P((const void *, const void *));
struct kinfo_proc
*pt_kp
;
static long stime
[CPUSTATES
];
return (subwin(stdscr
, LINES
-5-1, 0, 5, 0));
char *uname
, *pname
, pidname
[30];
/* Accumulate the percent of cpu per user. */
for (i
= 0; i
<= nproc
; i
++) {
/* Accumulate the percentage. */
total
+= pt
[i
].pt_pctcpu
;
qsort(pt
, nproc
+ 1, sizeof (struct p_times
), compar
);
for (k
= 0; i
> 0 && pt
[k
].pt_pctcpu
> 0.01; i
--, y
++, k
++) {
if (pt
[k
].pt_kp
== NULL
) {
ep
= &pt
[k
].pt_kp
->kp_eproc
;
uname
= (char *)user_from_uid(ep
->e_ucred
.cr_uid
, 0);
pname
= pt
[k
].pt_kp
->kp_proc
.p_comm
;
mvwaddstr(wnd
, y
, 0, uname
);
sprintf(pidname
, "%10.10s", pname
, 0);
mvwaddstr(wnd
, y
, 9, pidname
);
for (j
= pt
[k
].pt_pctcpu
*factor
+ 0.5; j
> 0; j
--)
wmove(wnd
, y
, 0); wclrtobot(wnd
);
static struct nlist namelist
[] = {
if (namelist
[X_FIRST
].n_type
== 0) {
if (kvm_nlist(kd
, namelist
)) {
if (namelist
[X_FIRST
].n_type
== 0) {
error("namelist failed");
KREAD(NPTR(X_CPTIME
), stime
, sizeof (stime
));
NREAD(X_CCPU
, &ccpu
, LONG
);
NREAD(X_FSCALE
, &fscale
, LONG
);
lccpu
= log((double) ccpu
/ fscale
);
register struct proc
*pp
;
static int lastnproc
= 0;
if (namelist
[X_FIRST
].n_type
== 0)
if ((kpp
= kvm_getprocs(kd
, KERN_PROC_ALL
, 0, &nproc
)) == NULL
) {
error("%s", kvm_geterr(kd
));
if ((pt
= (struct p_times
*) malloc
((nproc
+ 1) * sizeof(struct p_times
))) == NULL
) {
* calculate %cpu for each proc
for (i
= 0; i
< nproc
; i
++) {
if (time
== 0 || (pp
->p_flag
& SLOAD
) == 0)
*pctp
= ((double) pp
->p_pctcpu
/
fscale
) / (1.0 - exp(time
* lccpu
));
* and for the imaginary "idle" process
KREAD(NPTR(X_CPTIME
), ctime
, sizeof (ctime
));
for (i
= 0; i
< CPUSTATES
; i
++)
t
+= ctime
[i
] - stime
[i
];
pt
[nproc
].pt_pctcpu
= (ctime
[CP_IDLE
] - stime
[CP_IDLE
]) / t
;
for (i
= 0; i
< CPUSTATES
; i
++)
wmove(wnd
, 0, 0); wclrtoeol(wnd
);
"/0 /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
return (((struct p_times
*) a
)->pt_pctcpu
>
((struct p_times
*) b
)->pt_pctcpu
)? -1: 1;