diff options
author | Michael I. Bushnell <mib@gnu.org> | 1994-07-21 19:03:46 +0000 |
---|---|---|
committer | Michael I. Bushnell <mib@gnu.org> | 1994-07-21 19:03:46 +0000 |
commit | 1cde8b2682dc438ef0aafa37c4a8ca9863b1e33f (patch) | |
tree | 5eeba5d1f8aa7e8e559805e67b2203f4a1a0fd98 /utils/old-ps.c | |
parent | 3e0f07c7d45f5e6ba6cff0215656db105a5e20af (diff) |
Initial revision
Diffstat (limited to 'utils/old-ps.c')
-rw-r--r-- | utils/old-ps.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/utils/old-ps.c b/utils/old-ps.c new file mode 100644 index 00000000..0ff927e3 --- /dev/null +++ b/utils/old-ps.c @@ -0,0 +1,152 @@ +/* + Copyright (C) 1994 Free Software Foundation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include <hurd.h> +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <string.h> + +/* return a string describing the amount of memory SIZE represents. */ +char * +mem_str (vm_size_t size) +{ + char *ret = malloc (10); + char *spec=" KMG"; + int dec = 0; + + while (size > 1000) + { + dec = size % 1000; + size /= 1000; + spec++; + } + + if (size >= 100) + sprintf (ret, "%d%c", size, *spec); + else if (size >= 10) + sprintf (ret, "%d.%d%c", size, dec / 100, *spec); + else + sprintf (ret, "%d.%d%c", size, dec / 10, *spec); + + return ret; +} + +/* Return a string representing time T. */ +char * +time_str (time_value_t *t) +{ + char *ret = malloc (20); + int time; + + time = t->seconds * 1000000 + t->microseconds; + sprintf (ret, "%.2f", (double)time / 1000000.0 ); + return ret; +} + +/* Print a string describing the args of proc PID */ +void +print_args_str (process_t proc, pid_t pid) +{ + char *args; + u_int nargs = 0; + char *p; + error_t err; + + err = proc_getprocargs (proc, pid, &args, &nargs); + if (err) + return; + p = args; + while (p - args < nargs) + { + printf ("%s ", p); + p = strchr (p, '\0') + 1; + } + vm_deallocate (mach_task_self (), (vm_address_t) args, nargs); +} + + +/* Very simple PS */ +int +main () +{ + process_t proc; + pid_t pids[20]; + pid_t *pp = pids; + u_int npids = 20; + int ind; + struct thread_basic_info tbi; + struct thread_sched_info tsi; + +#if 0 + stdout = mach_open_devstream (getdport (1), "w"); +#endif + + puts ("PID\tUSER\tPP\tPG\tSS\tVMem\tRSS\tPRI\t%CPU\tUser\tSystem\tArgs"); + proc = getproc (); + proc_getallpids (proc, &pp, &npids); + for (ind = 0; ind < npids; ind++) + { + int procinfobuf[0]; + struct procinfo *pi = (struct procinfo *) procinfobuf; + u_int pisize = 0; + int i; + + proc_getprocinfo (proc, pp[ind], (int **)&pi, &pisize); + + if (pi->state & PI_NOPARENT) + continue; + + bzero (&tbi, sizeof tbi); + bzero (&tsi, sizeof tsi); + for (i = 0; i < pi->nthreads; i++) + { + tsi.base_priority += pi->threadinfos[i].pis_si.base_priority; + tsi.cur_priority += pi->threadinfos[i].pis_si.cur_priority; + tbi.cpu_usage += pi->threadinfos[i].pis_bi.cpu_usage; + tbi.user_time.seconds += pi->threadinfos[i].pis_bi.user_time.seconds; + tbi.user_time.microseconds + += pi->threadinfos[i].pis_bi.user_time.microseconds; + tbi.system_time.seconds + += pi->threadinfos[i].pis_bi.system_time.seconds; + tbi.system_time.microseconds + += pi->threadinfos[i].pis_bi.system_time.microseconds; + } + tsi.base_priority /= pi->nthreads; + tsi.cur_priority /= pi->nthreads; + tbi.user_time.seconds += tbi.user_time.microseconds / 1000000; + tbi.user_time.microseconds %= 1000000; + tbi.system_time.seconds += tbi.system_time.microseconds / 1000000; + tbi.system_time.microseconds %= 1000000; + printf ("%d\t%d\t%d\t%d\t%d\t%s\t%s\t%d/%d\t%d\t%s\t%s\t", + pp[ind], + (pi->state & PI_NOTOWNED) ? -1 : pi->owner, + pi->ppid, + pi->pgrp, + pi->session, + mem_str (pi->taskinfo.virtual_size), + mem_str (pi->taskinfo.resident_size), + tsi.base_priority, + tsi.cur_priority, + tbi.cpu_usage, + time_str (&tbi.user_time), + time_str (&tbi.system_time)); + print_args_str (proc, pp[ind]); + putchar ('\n'); + } + return 0; +} |