top(1): Migrate top to usr.bin

We've been maintaining top(1) for a long time, and the upstream
hasn't existed/been used in similarly as long. Make it clear that we own
top(1)

Tested with 'make universe'. Everything passed except MIPS which failed
for unrelated reasons. Install also tested for amd64.

Reviewed by:		sbruno
No objections:		imp, mmacy
Differential Revision:	https://reviews.freebsd.org/D15387
This commit is contained in:
eadler 2018-05-19 22:40:23 +00:00
parent 1c2924af1f
commit 2ddbba1d82
43 changed files with 549 additions and 2794 deletions

View File

@ -1,28 +0,0 @@
William LeFebvre
Group sys Consulting
wnl@groupsys.com
+1-770-813-3224
William LeFebvre is available for consulting and teaching engagements
through the company Group sys Consulting. William's specialties are:
Unix system administration issues
Local area network design
Design of safe connections to the Internet
Domain Name Service
Threaded programming with pthreads
Netscape Server API plugins
INN news server configuration
SunOS to Solaris migration
Troubleshooting
Although located in the Atlanta metropolitan area, William can easily
travel to any location in the United States and Canada. Trips to
other countries can be arranged as well.
If you are interested in having William work for your organization,
contact him at +1-770-813-3224 or via the address "wnl@groupsys.com".
You may also wish to visit the Group sys web page at www.groupsys.com.

View File

@ -1,632 +0,0 @@
Thu Mar 30 2000 - wnl (3.5beta12)
Updated modules: m_aix41.c, m_aix43.c, m_mtxinu.c, m_sco5.c,
and m_ultrix4.c.
Included m_irixsgi.c from some source that's been floating around
SGI. Don't yet know how it compares to m_irix62.
Fri Mar 10 2000 - wnl (3.5beta11)
top.c: avoid potential loop if stdout gets closed, use macro
for p_active to avoid collision with system macros.
m_sunos5: widened some fields to accomodate 5.8.
m_decosf1: added ordering support
m_irix62_64: provides 64-bit module based on m_irix62.
m_irix62: skip bogus files in /proc directory
m_svr42MP and m_svr5: complete replacement with updated copies
m_mtxinu: complete replacement with updated copies
m_aix43: new module for 4.3
getans: replaced with a Bourne shell script
Mon Mar 6 2000 - wnl (3.5beta10)
m_sunos5.c: workaround for curses bug: ensure that TERMINFO has
a value.
Fri Jan 15 1999 - wnl (3.5beta10)
top.c: now check return code from read to avoid looping on eof.
top.c: delay of 0 now only valid for root.
decosf1.c: patches from Rainer Orth should fix most of the
problems with this module (including the display of certain
processes and runtime errors).
sunos5.c: Rainer insisted on putting the slash back in the
state field ("run/4") and widened the field to accomodate it.
aix.c: widened PID field for 6-digit pids (shortened NICE field)
module macosx added, thanks to Andrew Townley.
Fri Dec 18 1998 - wnl (3.5beta9)
Configure checks status of "make" and complains if it fails.
Thu Dec 17 1998 - wnl (3.5beta9)
Added module sco5 from Mike Hopkirk.
Added module netbsd132 from moto kawasaki.
Sun Oct 25 1998 - wnl (3.5beta9)
Added Casper's patches for sunos5 for the following:
produce same results as swap -s (5.5 and higher),
don't use system_pages kstat when /dev/kmem can be opened,
skip . and .. when reading /proc, replace use of SOLARIS24
with OSREV.
Fri Sep 11 1998 - wnl (3.5beta9)
Added workaround to getans for the absence of $< in SCO Unix.
Wed Jul 1 1998 - wnl (3.5beta9)
Changed structure member "errno" to "errnum" in commands.c.
Replaced hpux10 module with one from John Haxby.
Fri Apr 17 1998 - wnl (3.5beta8)
Moved definition of _KMEMUSER earlier in m_sunos5.c. This should
fix the compilation problem with gnu 2.7.2.3, obviating the need
for the fixinc.svr4 patch, but hopefully will not affect anything
else.
Added -DORDER to m_sunos4mp.c
Tue Nov 18 1997 - wnl (3.5beta7)
Added gcc 2.7.2.3 patch for fixinc.svr4 and changed INSTALL and
FAQ to refer to it.
Added NetBSD HP9000 fix. Hopefully it doesn't break other
NetBSD platforms.
Fri Oct 24 1997 - wnl (3.5beta7)
Modified m_dcosx.c to change uses of procdir to xprocdir, avoiding
a name clash with an include file (Bryn Parrott)
Sat Oct 11 1997 - wnl (3.5beta6)
Incorporated Casper's patches for Solaris 2.6 and for the multi-
processor bug ("kstat finds too many cpus").
Sun Jan 20 1996 - wnl (3.5beta5)
Fixed Casper's m_sunos5 module: there was a poor interaction with
his use of OSREV and SunOS 5.5.1.
Fri Dec 20 1996 - wnl (3.5beta4)
Replaced m_sunos5 with a reworked version by Casper Dik. This one
should work under 2.6 and may not require that top be run setuid
to root under 2.5 or 2.6. This also fixed a bug in m_sunos5 that
was introduced in beta3.
Fixed calculation of OSREV in Configure.
Wed Nov 20 1996 - wnl (3.5beta3)
Incorporated contributed fixes to: bsdos2, irix62, freebsd20,
ultrix4, sunos5. Changed calculation of swap area in sunos5 (now
uses swapctl). sunos5 now understands idled processors. Changed
Configure to determine os revision using uname (when available)
and adding it to machine.c compiliation in Makefile as -DOSREV.
Changed calls to "exit" in modules to use "quit" instead.
Oct 20 1996 - wnl (3.5beta3)
Removed "time" from list of ordering choices: there's no easy way
to get cpu time for all processes (it's in the u area).
Fri Oct 18 1996 - wnl (3.5beta3)
hpux10 and hpux9: using a better means for determining when a
process is idle.
decosf1 now includes utils.h.
Fri Sep 13 1996 - wnl (3.5beta2)
Fixed Configure to build Make.desc in such a way that doesn't
require a long argument to sed.
Thu Sep 12 1996 - wnl (3.5beta2)
Fixed bug in display.c that affected empty cpustate names.
Created hpux1010 module - a variant of hpux10 that does not use
struct proc or struct user (suitable for HP/UX 10.10).
Wed Sep 11 1996 - wnl (3.5beta2)
Changes to sunos5 module: Removed WCPU column since it is meaningless
on a SVR4-based system. Added THR column to show number of threads
for each process. This was not straightforward: the information is
not stored in prpsinfo but rather in prstatus.
Tue Sep 10 1996 - wnl (3.5beta1)
Added patches for sunos4mp to provide order support.
Added irix62 module.
Changed prime.c to include stdio.h for printf prototype.
Added conditional code to os.h and utils.c to handle systems
where sys_errlist is defined in stdio.h (such as NetBSD).
Mon Sep 09 1996 - wnl (3.5beta1)
Removed tar and shar rules from Makefile.X -- don't need them anymore.
Added -v option to display version number. Updated man page.
Thu Aug 29 1996 - wnl (3.4)
Replaced modules (from Tim Pugh): next 32, next40.
Fixed bug in username.c: hashing negative uids.
Thu Aug 22 1996 - wnl (3.4beta3)
Patched modules: ultrix4, sunos4, sunos5, utek, decosf1, irix5.
Added modules: next40, next32.
Fixed procstates update bug in display.c.
Fixed divide by zero bug in utils.c.
Fixed bad number in layout.h
Minor fixes to Configure.
Complete overhaul of FAQ.
Tue Feb 13 1996 - wnl (3.4beta3)
Added convex module from Warren Vosper (originally written by
William Jones).
Tue Feb 13 1996 - wnl (3.4beta2)
Fixed format_k in utils.c to calculate K and M values correctly.
Added check for gigabyte values ('G'). Changed sumamry_format
in display.c to use format_k where appropriate.
Changed creation of distribution tar file to place everything in
a top level directory.
Tue Jan 30 1996 - wnl (3.4beta2)
Added m_aix41 module. Added new tag type to module comments:
TERMCAP, which defined the library to use for a termcap library.
If no TERMCAP tag is found in the module's initial comment, then
Configure will default to "-ltermcap". AIX needs this since it
put all the termcap routines in libcurses(!)
Added m_bsdos2 (found lingering in my mailbox).
Updated m_svr4 to include support for NCR multiprocessors.
Fixed small bug in utils.c
Thu Jan 25 1996 - wnl (3.4beta1)
Fixed m_sunos5 invocation of gettimeofday to include "NULL" as
second argument. This provides compatability with the Posix-
compliant template provided with SunOS 5.5, but doesn't hurt
previous versions since they do bother with a template for that
function.
Made changes (recommended by net users) to hpux10, ultrix4,
netbsd10, aux3 (replaced aux31). Added module for linux.
Fri Oct 10 1995 - wnl (3.4beta1)
Added user-contributed modules for SCO Unix, IRIX 5, HP/UX 10,
Pyramid DC/OSX. Changed Configure so that it runs in environments
whose c-shells have no 'eval'(!). Added support for multiple sort
ordering methods via the -o switch. This option requires support
from the machine dependent module: such support was added to
sunos5 (thus sunos54) and sunos4.
display.c: Changed CPU states display line to shorten the leading
tag if the data won't fit in the current width. Fixed a divide-by-
zero bug that affected ultrasparc servers (and potentially other
systems).
m_sunos5.c: Now asks the system for the correct pagesize rather than
assuming it is 4K.
Thu Mar 2 1995 - wnl (3.3 RELEASE)
Added module netbsd10 and renamed netbsd to netbsd08. Changed
Configure so that it does not use an initial default module name.
Made other compatability fixes to Configure. Added comments to
decosf1 concerning optimizer bug. Other documentation changes.
Added use of "prime.c" to Configure script.
Tue Feb 7 1995 - wnl (3.3beta6)
Still one more beta....
Fixes for sunos5 2.4 gcc core dump (it was an alignment problem).
Fixed and improvements for decosf1 (including use of format_k
for proper SIZE column formatting). Added modules freebsd20 and
ncr3000.
Thu Feb 2 1995 - wnl (3.3beta5)
One more beta....
Fixed a few bugs in the sunos5 port pertaining to casting and
very large memory counts. Added "ifndef HAVE_GETOPT" to getopt.c
to provide for conditional compilation of the getopt function.
Those systems that have getopt in libc can add -DHAVE_GETOPT to
the CFLAGS line in the module to prevent the function from being
compiled. Added sunos54 module to accomodate SunOS 5.4
peculiarities. Added module for aux3.1.
Wed Jan 4 1995 - wnl (3.3beta4)
This is really taking too long......sigh.
Fixed SIGWINCH handling once and for all. It now remembers the
number of processes you want displayed even thru window resizes.
Fixed buffer conflict in utils.c (itoa and itoa7).
Lots of small improvements to the various modules were made over
the past month: too numberous to list here. SunOS 5 module made
more secure thru use of seteuid calls (other SVR4 modules should
be modified similarly). One final MP fix to sunos5, too. Module
for decosf1 was modified to accomodate V3.0.
Mon Apr 18 1994 - wnl (3.3beta3)
I think I finally got a sunos5 module that will work on MP
machines. Fixed cpu states figure in osmp41a so that
percentages never exceed 100%. Added shell script "install"
since Unix vendors can't seem to make up their minds on what
options they want to use for the one that comes with the OS.
Added netbsd modules from Christos. Fixed lots of other little
things over the past few months that I have long since forgotten.
Wed Dec 15 1993 - wnl (3.3beta2)
Added module patches from various users: hpux9, sunos5.
Fixed bug with batch mode (screen_width wasn't getting set).
Changes to accomodate 64 bit machines.
Fixed some bugs in command parsing ("renice 19 " did something
unexpected).
Mon Aug 30 1993 - wnl (3.3beta)
Added lots of little patches from various users.
Added routines to utils.c for intelligent formatting of kilobytes
and time. These are intended to be used in the modules when
formatting a process line. Added code to "summary_format" in
display.c to do intelligent formatting of memory quantities.
Redid display.c to allow for varying line widths and dynamic
reallocation of the screen buffer.
Added a SIGWINCH handler to top.c!
Added a constant, MAX_COLS, to top.h which defines the absolute
widest line we will ever allow. Changed allocations of "char fmt"
in all machine modules to use this constant rather than an abitrary
number.
Fri Aug 13 1993 - wnl (3.3)
Changed return value definition of time-related functions in top.c,
display.c, and m_ultrix4.c to time_t (stuart@coral.cs.jcu.edu.au).
Fixed bug in display.c: line_update when start != 0.
Wed Aug 4 1993 - wnl (3.2 release)
Changes to Configure from Paul Vixie. Added modules for hpux9 and
bsd386.
Tue Jul 13 1993 - wnl (3.1 release)
More small changes and minor bug fixes. Brought bsd44 up to date
and added a module for svr4.2. Changed shar packaging to use Rich
Salz's cshar stuff.
Wed Jul 7 1993 - wnl (3.1BETA)
More changes and bug fixes to Configure. Applied some other
minor bug fixes and suggestions from the beta testers. Added
the "metatop" shell script and the "installmeta" rule to the
Makefile to make handling multiple machine models and OS versions
easier. Added INSTALL and FAQ files.
Tue May 18 1993 - wnl (3.1BETA)
Changed Configure to be compatible with most SVR4 environments
(differing output from "ls -lg"). Also changed Configure,
Makefile.X, etc., to look for module files in the subdirectory
"machine" (thanks to Christos Zoulas).
Tue Apr 20 1993 - wnl (3.1BETA)
Changed both occurences of "ls -1" in Configure to "ls". This
SHOULD produce the same result, and has the advantage that it
doesn't produce an error on a system 5 machine. Integrated other
changes recommended in the first round of beta testing.
Wed Mar 10 1993 - wnl (3.1BETA)
MAJOR CHANGE: I have added a required function to all machine
dependent modules, called proc_owner. It takes a pid as an argument
and returns the uid of the process's owner. Such capability is
necessary for top to run securely as a set-uid program, something
that is needed for SVR4 implementations to read /proc. I have
retrofitted all modules except dgux with this function, but was
not able to test most of them. Top should now run securely as
a setuid program. Added 386bsd and sunos5 modules. Added sunos4mp
module for MP Suns.
Sat Feb 20 1993 - wnl (3.1ALPHA)
Modified top.c and commands.c to compile correctly on System V
derived Unixes (especially SVR4), but in a way that doesn't rely
on an oracle-like declaration (that is, I don't use "ifdef SYSV").
Fixed some bugs in "Configure" and "getans". Added inspection of
env variable "TOP" for options, and made -I default to showing
idle processes. Added "u" command to change username restriction
on the fly. Created shell script "suntop" for poor multi-version
SunOS folks (like myself).
Wed Jun 3 1992 - wnl (3.0)
"max_topn" wasn't being used everywhere it was supposed to be
in top.c. Many cosmetic changes, including copyright notices in
all the .c files. Version number is now handled by version.c and
reflects the current patchlevel (which is initially set to 0).
Changed Configure and Makefile to allow configurable variables for
certain commands: shell, cc, awk, install. Updated README and
Porting. Ready to release to the world!
Mon May 18 1992 - wnl (2.9BETA)
Added modules provided by Christos Zoulas. Replaced screen.c
with one modified by Christos and that will appropriately select
and handle the sgtty, termio, or termios system. Integrated many
other changes recommended by Christos. Fixed (I hope) the "-b"
batch mode display bug. Had to change loadavg to load_avg to avoid
a conflict with 4.4BSD.
Mon Apr 27 1992 - wnl (2.8BETA)
Added modules provided by Daniel Trinkle. Added patchlevel.h,
but the patch level is not yet reflected in the version number.
Cleaned up m_sunos4.c a little.
Wed Apr 22 1992 - wnl (2.8BETA)
Major internal reorganization. All of the system dependent stuff
is now really and truly separated from everything else. The
system dependent functions are contained in a separate .c file
called a "module". The Configure script knows how to find and
set up these modules, but the human installer still needs to tell
Configure which module to use (no automagic determination of
machine type---sorry). Added -U option to specify one user's
processes, but there is no corresponding command...yet. Other
changes and improvements too numerous to mention here. Currently
there are only two modules: sunos4 and umax. But after this beta
release is sent around, I expect more to be written. I just hope
that the machine-dependent abstractions don't need to change in
the process.
Thu Mar 26 1992 - wnl (2.7BETA)
Beta release with minimal architecture support. Updated README
and added a first cut at a Porting guide. Added ioctl TIOCGWINSZ
code from top2.5+ (courtesy of David MacKenzie). I didn't even
try porting the Ultrix support since I don't have access to an
Ultrix machine.
Fri Oct 11 1991 - wnl (2.6)
This version was not widely released. It contained many changes.
Here are the major ones:
Put in Vixie's idle process hack.
Enhanced type field in new_message to handle delayed messages.
Changed u_process to automatically adjust for varying lines of
output. Management of screenbuf should now be completely contained
in display.c. Removed now extraneous code from CMD_number[12]
portion of command switch in top.c. This was the stuff that dealt
with zeroing out lines in screenbuf.
Finally made it all work correctly on a 386i. Problems I had to
overcome: kvm_nlist doesn't return 0 on success as advertised (it
returns 1 instead); the results of a kvm_nlist are different
(n_type can be zero even for a symbol that exists).
Serious rearrangement for processor dependent stuff. All nlists
are now in separate files with the suffix ".nlist". Most machine
specific code is in "machine.c" surrounded by appropriate ifdefs---
the goal is to eventually have all machine specific code in this
file. Managed to find a way to detect SunOS 4.x at compile-time:
this is contained in the include file "sun.h". Completely changed
the memory display line for SunOS 4.x---it now displays a far
more appropriate report.
Created the shell script "Configure" to aid in the configuration
step.
Fixed a bug in init_termcap: it will now tolerate an environment
which does not have TERM defined (thanks to Sam Horrocks for
pointing this out).
Tue Aug 9 1988 - wnl (2.5)
Added changes to make top work under version 4.0 of the Sun
operating system. Changes were provided by Scott Alexander of the
University of Pennsylvania. Thanks! Compile with "-Dsunos4" to
get them. Virtual memory statistics are not readily accessible
under 4.0, so they don't show up in the output.
Thu Jul 31 1987 - wnl (2.4)
Fixed a problem with the 4.0 Pyramid code. The label "cp_time"
doesn't exist in the 4.0 kernel anymore. I think the code Carl
sent me wants "percpu" instead. That is what I am using and it
appears to work. 375 code is still untested (at least by me).
Also picked a great deal of lint out of the source. Lint now only
complains about a very few nitpicky things (there are far too many
calls to "printf" to put a "(void)" in front of!), at least under
SunOS.
Tue Jul 28 1987 - wnl (2.4a)
Added changes for a Symmetrics Computer Systems s/375 machine.
Changes were provided by Paul Vixie. Thanks! According to Mr.
Vixie: "These changes were not made at, by, or for SCS proper.
SCS would probably be interested in them, but so far only the
users' group has them. They were made in February, 1987, to
version 2.1 of the program, by Paul Vixie
(dual!ptsfa!vixie!paul@ucbvax.Berkeley.EDU)." His changes were
integrated into version 2.3 to make version 2.4.
The SCS peculiarities are summarized in Changes.scs.
Tue Jun 9 1987 - wnl (2.3 for real)
Changed the includes for the extra code Carl sent me to only
compile on Version 4.0 Pyramid machines. This makes top still
compilable on pre-4.0 Pyramids. Specifically, this code is only
compiled when both "pyr" and "CPUFOUND" are defined.
Wed Jun 3 1987 - wnl (2.3 with Pyramid additions)
It's been a month and I still haven't done anything about
distributing this version. However, Carl Gutekunst from Pyramid
has sent me some extra patches for some of the Pyramid code. I
just added those and will make them part of 2.3. This fixes the
following Pyramid problems: adds the inclusion of <sys/systm.h>,
uses the correct size for getting the kernel value _ccpu (this bug
affected the Vax version as well), sums the elements of the percpu
array to calculate a cp_time value (for OSx 4.0).
Fri May 1 1987 - wnl (2.3)
I have finally finished all the changes for better support of
oddbal terminals. Added the low-level routine "clear_eol" which
makes handling terminals without "ce" easy: it uses spaces
instead. All direct uses of "clear_line" outside of screen.c have
been changed to use this primitive. A terminal with "os" is now
handled in such that all situations that need overwriting are
completely avoided (including several commands). This required
some changes to the way commands are translated into action (in
"top.c"). Made several important changes to display.c to prevent
overflowing of any of the fields. Specifically, more than 99
total processes and a cpu state that reaches 100%. Had to make a
small change to two casts in top.c, because the Sun 3.2 compiler
was giving warnings on them. Added the "-q" option which lets
root run top at a nice of -20 (in case he thinks he really needs it).
Tue Dec 30 1986 - wnl (2.2)
I think I fixed a bug reported by Julian Onions at Nottingham.
Occasionally, top will core dump when the sprintf in either
i_process or u_process overflows due to an exceptionally
unrealistic time value. I think it highly unlikely that top can
get a bad proc structure (although I suppose it is possible), but
the process time is read from the user structure, and that can
sometimes be part garbage. So, "get_ucpu" checks the value it
returns to make sure its formatted form will not overflow the
sprintf. If this doesn't fix the bug, then more drastic measures
will be necessary. I plan to make this version the official
"top 2.2". [[ This version was never distributed very widely. ]]
Tue Dec 2 1986 - wnl (2.2c)
Added to top.c the notion of a "failed command". When a command
produces a message (on the message line), an update does not
follow it. Before, the message was written and a new display was
shown---purposefully not overwriting the message. But the
improvements to handle overstriking terminals and terminals
without "ce" clear the screen before every display, which would
erase the message. Now, the message is displayed and top waits
another full time interval before updating the display. This
works much better all around.
Mon Nov 24 1986 - wnl (2.2b)
Created a new file, utils.c, and made appropriate changes to
Makefile. This new file holds all utility functions that can and
may be used by more than one "module". Improved i_memory and
u_memory (display.c) so that screen updates for the values
displayed are only changed when necessary. Also made the line
look better: the last fixes made for a rather ugly display.
Added the locally defined constant "LoadMax" and added code to
top.c to send the cursor home after a space command is entered if
the load average is higher than "LoadMax". This provides visual
feedback on loaded systems.
Mon Nov 3 1986 - wnl (2.2a)
Widened the format for memory usage so that it can display 5
digits. This makes that line look a little ugly---maybe I'll fix
that later. Screen handling now understands "os" and a missing
"ce". It treats them identically: clear the screen between each
display. Screen handling code now uses "cd" when appropriate
(i.e.: when user has shortened the screen). Made i_loadave clear
then screen and took out most of the explicit calls to "clear" in
top.c. This method is cleaner, especially in conjunction with
"os" handling. Added preprocessor variable "RANDOM_PW" for
systems that access the passwd file randomly (Sun's yp and 4.3).
With "RANDOM_PW" set, "getpwuid" is used instead of "getpwnam",
but uid->username mappings are still hashed internally (because
that is still faster than going to disk).
Mon Oct 6 1986 - wnl (2.1)
A bug with the kill command was pointed out by "dciem!tim"---
specifying a signal by name did not work correctly. This bug has
been fixed with a simple change to commands.c. Another bug made
the cpu state percentages incorrect the first time they were
displayed. This bug has also been fixed (changed top.c).
Thu Sep 4 1986 - wnl (2.0, at last)
This is the version that will (hopefully) get released to the
world as top 2.0.
Added the "r" and "k" commands for renice and kill, respectively.
This required adding a way to handle system call errors, and the
addition of the "e" command. Help screen and manual page were
changed to reflect this change. Changed all "#ifdef SUN" directives
to "#ifdef sun", and changed all "#ifdef PYRAMID" directives to
"#ifdef pyr". As much as I hate those choices of preprocessor
names (they too easily conflict with real variable names), it does
make automatic compilation possible---people don't have to change
the Makefile anymore for specific machines. The manual page was
changed to automatically incorporate the defaults as set in the
Makefile (including an infinite value for TOPN) and the way the
manual page is generated by the Makefile was changed to make
maintenance of this information automatic.
Mon Jul 28 1986 - wnl (still pre 2.0)
Real close now. I put in a new definition for the macro "pagetok"
that does an explicit shift of a constant expression involving
PGSHIFT. Appropriate checks are made if PGSHIFT is to small.
"pagetok" is now used exclusively everywhere to convert kernel
clicks to kilobytes. I added a full blown interactive mode with
the ability to change some of the runtime parameters (how many to
display, time delay, etc.) while top is running. I also
incorporated a few ideas from the net: control characters in the
command name are replaced with '?'; the '-S' option makes the
swapper and pager visible; options have been added to control the
number of displays produced (this makes it easier to make
performance snapshots with top). I have also added the notion of
"infinite" values for number of processes and number of displays.
I fixed a long-standing bug in the uid to username mapping code
that was only aggravated on the pyramids: it was an ill-defined
expression (akin to i = i++). I tweaked the proc_compar routine
for qsort slightly so that stopped processes were more likely to
show up. Manual page was updated to reflect all changes
noticeable to the user.
Tue Jul 1 1986 - wnl (pre 2.0 -- 1.9999?)
In the process of major revamping on the way to version 2.0.
I have completely done away with curses by adding my own screen
management routines in a separate file (screen.c). The rationale
for this is that top knows a whole lot more about what is and is
not redundant on the screen and can compare simple integer values
where curses would have to compare strings. This has turned out
to be a very big win speed-wise. The proc_compar routine for
sorting has been rewritten to include several more keys. I
decided this was necessary when I noticed that the "top" process
itself kept disappearing off the top 10 list on a Sun-3. All the
processes had the same percentage (0%) and the sort wasn't really
doing anything worthwhile. I changed the expression that computes
memory usage to use the ctob macro instead of just assuming that
pages were 512 bytes. More work still needs to be done before
this version is usable. I changed options-processing to use
getopt and added appropriate incantations to the Makefile.
Wed Feb 20 1985 - wnl (still 1.8)
Put in the ifdef FOUR_ONE statements to make top still compilable
on a 4.1 system. Apparently, there are some users out there that
need this functionality. Oh well. I don't guarantee any of it,
since I can't test it. Made appropriate changes to README and
final installation related changes to Makefile.
Sat Feb 2 1985 - wnl (1.8)
Removed all the ifdef FOUR_TWO statements and made "top" into a
4.2 only program. If someone really wants to still run it on 4.1,
then they can do all the work. We don't have a 4.1 machine
anymore, so I don't even know if the thing still works under 4.1.
Cleaned up the Makefile and the README. Added installation rules
to the Makefile, as requested by several sites. Fixed a very
obscure divide-by-zero bug. Added a second "key" to the qsort
comparison function (proc_compar) so that comparisons are based on
cpu ticks if the percentages are equal (provided by Jonathon
Feiber at Sun).
Tue Dec 11 1984 - wnl (1.7)
Added the virtual and real memory status line to the header area
(provided by Jonathon Feiber at Sun)
Tue Nov 20 1984 - wnl (1.6)
Added an "exit" if sbrk's fail. Added changes from Jonathon
Feiber at Sun: ifdef SUN to make top work on Suns (they don't use
doubles in the proc structure), register declarations, check for
getting a user structure that has disappeared since the proc array
was read (it used to die, now it just shows the process as swapped).
Tue Nov 13 1984 - wnl (1.5)
If the number of displayable processes ("active_procs") was less
than the number of requested processes ("topn"), top would
segmentation fault. This bug has been fixed. Thanks to Prentiss
Riddle at ut-sally for pointing out the existence of this bug.
Tue Oct 23 1984 - wnl (1.4)
Finally fixed the hash table bug that caused processes owned by
root to sometimes appear with either no name or a different name
that had UID 0 (such as "operator"). Removed all the ifdef DEBUG
blocks to make top ready for distribution to the real world.
Sun Apr 8 1984 - wnl (still 1.3)
Made some slight changes to the display format. It now looks more
aesthetically pleasing. Added some preprocessor constants so that
the two defaults (number of processes and seconds of delay) easier
to change.
Thu Apr 5 1984 - wnl (1.3)
Changed the order in which things are done at initialization time.
This way, if an error occurs before starting the main loop, curses
will never get started. Also changed other error handlers so that
endwin() is called before any flavor of exit. Specifying a number
of processes that is more than the screen can handle is no longer
fatal. It displays a warning message and pretends the user
specified the maximum for the screen. Finally cured all the TSTP
blues (well, almost all). I removed my TSTP handler and convinced
the system to always use the one that curses sets up. Turns out
that "sleep" was stepping all over it during a pause. So, I don't
use sleep anymore. The only problem that remains with it now is
redrawing the old display before updating it after a pause.
Tue Apr 3 1984 - wnl (from 1.0 to 1.2)
I changed the format of the TIME column from just "seconds" to
"minutes:seconds". I also made pausing work correctly. Screen
redraws with an up to date display. For compatibility with 4.2, I
changed the name of the "zero" function to "bzero". The makefile
has been altered to handle versions for 4.1 and 4.2, and README
has been updated to reflect these recent changes.

View File

@ -1,565 +0,0 @@
#!/bin/csh -f
#
# Configuration script for top.
#
# Use with version 3.0 and higher.
#
set PRIME = "/usr/games/primes"
set vars = (module LoadMax topn NominalTopn delay owner group mode random \
TableSize bindir mandir manext mansty \
Cmdshell Cmdcc Cmdawk Cmdinstall cdefs)
set fastrack = 0
set yesno = (no yes)
onintr byebye
# make sure that getans is there and ready
if (! -e getans) then
echo 'This package is not complete. The shell file "getans" is missing.'
exit 10
endif
chmod +x getans
if ($#argv > 0) then
# fast track configuration
set fastrack = 1
else
cat <<'EOF'
Configuration for top, version 3.5
One moment....
'EOF'
endif
# collect file names and module names
ls machine/m_*.c >$$.f
ls machine/m_*.man >$$.m
sed -e 's@^machine/m_@@' -e 's/.c$//' $$.f >$$.n
# build Make.desc
sed -e 's@\.c@.desc\\@' $$.f | sed -e '$s/\\//' >$$.a
sed -e "/^DESCS/r $$.a" Make.desc.X >Make.desc
# build desc files and SYNOPSIS as needed
make -f Make.desc >/dev/null
if ($status != 0) then
echo "Unable to build the synopsis."
echo 'Make sure the command "make" is on your path and try'
echo 'running Configure again.'
exit 1
endif
if (-e .defaults) then
echo ""
echo "Reading configuration from last time..."
source .defaults
set nodefaults = 0
if ($fastrack == 1) then
set module = $1
endif
else
if ($fastrack == 1) then
echo "No previous configuration was found."
set fastrack = 0
set module = $1
else
set module = ""
endif
set LoadMax = 5.0
set topn = 15
set NominalTopn = 18
set delay = 5
set TableSize = 0
set bindir = /usr/local/bin
set mandir = /usr/man/manl
set manext = l
set mansty = man
set nodefaults = 1
set Cmdshell = /bin/sh
set Cmdawk = awk
set Cmdinstall = ./install
set Cmdcc = cc
set cdefs = -O
endif
echo ""
if ($fastrack == 1) then
grep -s $module $$.n >/dev/null
if ($status != 0) then
echo "$module is not recognized. To see a list of available modules"
echo 'run "Configure" with no arguments.'
rm -f $$.[fmna]
exit 1
endif
set random1 = `expr $random + 1`
cat <<EOF
Using these settings:
Bourne Shell $Cmdshell
C compiler $Cmdcc
Compiler options $cdefs
Awk command $Cmdawk
Install command $Cmdinstall
Module $module
LoadMax $LoadMax
Default TOPN $topn
Nominal TOPN $NominalTopn
Default Delay $delay
Random passwd access $yesno[$random1]
Table Size $TableSize
Owner $owner
Group Owner $group
Mode $mode
bin directory $bindir
man directory $mandir
man extension $manext
man style $mansty
EOF
goto fast
endif
cat <<'EOF'
You will be asked a series of questions. Each question will have a
default answer enclosed in brackets, such as "[5.0]". In most cases,
the default answer will work well. To use that value, merely press
return.
'EOF'
# display synopses
getmod:
cat <<'EOF'
The following machine-dependent modules are available:
'EOF'
awk -F: ' { printf "%-10s %s\n", $1, $2 }' SYNOPSIS
echo ''
./getans "What module is appropriate for this machine? " string "$module" .$$
set module = `cat .$$`
if ("$module" == "") then
echo "Please specify a valid module name."
goto getmod
endif
# is it a valid one?
grep -s "$module" $$.n >/dev/null
if ($status != 0) then
echo "That is not a recognized module name."
goto getmod
endif
# display a full description
sed -e '1,/DESCRIPTION:/d' -e '/^$/,$d' machine/m_${module}.desc
# verify it
echo ""
./getans "Is this what you want to use?" yesno 1 .$$
if (`cat .$$` == 0) then
goto getmod
endif
endif
cat <<'EOF'
First we need to find out a little bit about the executables needed to
compile top.
'EOF'
./getans "What is the full path name for the Bourne shell" file "$Cmdshell" .$$
set Cmdshell = `cat .$$`
cat <<'EOF'
Please supply the name of the appropriate command. It need not be a
full path name, but the named command does need to exist somewhere on
the current path.
'EOF'
./getans "AWK Interpreter" path "$Cmdawk" .$$
set Cmdawk = `cat .$$`
./getans "C Compiler" path "$Cmdcc" .$$
set Cmdcc = `cat .$$`
cat <<'EOF'
The installer command needs to understand Berkeley-esque arguments:
"-o" for owner, "-g" for group, and "-m" for mode. A shell script
called "install" is distributed with top and is suitable for use by
top. You can specify a different program here if you like, or use
the shell script (the default).
'EOF'
./getans "Installer" path "$Cmdinstall" .$$
set Cmdinstall = `cat .$$`
cat <<EOF
What other options should be used with the $Cmdcc command (use "none" to
specify no options)?
EOF
./getans "Compiler options" string "$cdefs" .$$
set cdefs = `cat .$$`
if ("$cdefs" == "none") then
set cdefs = ""
endif
cat <<'EOF'
Now you need to answer some questions concerning the configuration of
top itself.
The space command forces an immediate update. Sometimes, on loaded
systems, this update will take a significant period of time (because all
the output is buffered). So, if the short-term load average is above
"LoadMax", then top will put the cursor home immediately after the space
is pressed before the next update is attempted. This serves as a visual
acknowledgement of the command. "LoadMax" should always be specified as a
floating point number.
'EOF'
./getans "LoadMax" number "$LoadMax" .$$
set LoadMax = `cat .$$`
cat <<'EOF'
"Default TOPN" is the default number of processes to show. This is the
number that will be used when the user does not specify the number of
processes to show. If you want "all" (or infinity) as the default, use
the value "-1".
'EOF'
./getans "Default TOPN" neginteger "$topn" .$$
set topn = `cat .$$`
cat <<'EOF'
"Nominal_TOPN" is used as the default TOPN when Default_TOPN is Infinity
and the output is a dumb terminal. If we didn't do this, then
installations who use a default TOPN of Infinity will get every process in
the system when running top on a dumb terminal (or redirected to a file).
Note that Nominal_TOPN is a default: it can still be overridden on the
command line, even with the value "infinity".
'EOF'
./getans "Nominal TOPN" integer "$NominalTopn" .$$
set NominalTopn = `cat .$$`
cat <<'EOF'
Default Delay is the default number of seconds to wait between screen
updates.
'EOF'
./getans "Default Delay" integer "$delay" .$$
set delay = `cat .$$`
echo ""
set rand = 0
if (-e /etc/nsswitch.conf) then
set rand = `grep '^passwd:.*nis' /etc/nsswitch.conf | wc -l`
if ($rand > 1) then
set rand = 1
endif
else
ypwhich >&/dev/null
if ($status == 0 || -e /etc/passwd.dir || -e /etc/pwd.db) then
set rand = 1
endif
endif
if ($rand == 1) then
echo "It looks like you have a passwd file that can be accessed at random."
set pr = 'Do you want top to take advantage of this'
else
echo "It looks like you have conventional passwd file access. Top can take"
echo "advantage of a random access passwd mechanism if such exists. Do"
echo "you want top to assume that accesses to the file /etc/passwd are done"
set pr = 'with random access rather than sequential'
endif
if ($nodefaults == 1) then
set random = $rand
endif
./getans "${pr}?" yesno $random .$$
set random = `cat .$$`
echo ""
echo "Compiling prime.c"
$Cmdcc $cdefs -o prime prime.c -lm
if ($status != 0) then
echo "Oh well."
rm -f prime
endif
echo ""
ypcat passwd.byname >&/tmp/$$.a
if ($status == 0) then
set cnt = `wc -l </tmp/$$.a`
set mapfile = "NIS map"
else
rm /tmp/$$.a
niscat passwd.org_dir >&/tmp/$$.a
if ($status == 0) then
set cnt = `wc -l </tmp/$$.a`
set mapfile = "NISPLUS map"
else
set cnt = `wc -l </etc/passwd`
set mapfile = "file"
endif
endif
rm /tmp/$$.a
set double = `expr $cnt \* 2`
echo "I found $cnt entries in your passwd $mapfile. Top hashes the username to"
echo "uid mappings as it goes along and it needs a good guess on the size of"
echo "that hash table. This number should be the next highest prime number"
echo "after $double."
echo ""
if (-e prime) then
set pr = `./prime $double`
echo "I have calculated that to be $pr."
else if (-e $PRIME) then
set pr = `$PRIME $double | head -1`
echo "I have calculated that to be $pr."
else
set pr = $double
echo "I cannot calculate that prime number, so you will need to provide it for me."
endif
if ($TableSize == 0) then
set TableSize = $pr
endif
./getans "Enter the hash table size" integer "$TableSize" .$$
set TableSize = `cat .$$`
echo ""
# !!! I need to fix this: /dev/kmem might not exist on some machines !!!
# determine the right way to invoke ls to get full output
set ls = "ls -l"
if (`$ls getans | wc -w` < 9) then
set ls = "ls -lg"
endif
set t_owner = root
set t_group = `$ls -d /usr/bin | awk ' { print $4 }'`
if (-e /proc) then
cat <<EOF
I see /proc out there. Many Unix variants provide the /proc file
system as a mechanism to get to a process's address space. This
directory is typically only accessible by root. However, there are a
few systems (such as DG/UX) on which this directory exists, but isn't
used.
EOF
if (-r /proc/0/psinfo) then
set t_mode = 2711
set mode = 2711
set t_group = sys
set group = sys
cat <<EOF
It looks like this system is running Solaris 2.6 or greater. If this
is the case, then top can function just fine installed set group id to
sys. It does not need to be installed set-uid to root.
EOF
else
set t_mode = 4711
set mode = 4711
cat <<EOF
I'm going to assume that top needs to run setuid to root, but you
should double check and use mode 2755 (set group id) if top doesn't
really need root access. If you are running SunOS 5.0 through SunOS
5.5.1 (that's Solaris 2.0 through Solaris 2.5.1) then you will need to
install top setuid root (owner root and mode 4711). In SunOS 5.6
and higher top only requires set group id sys permissions.
EOF
endif
else if (-e /dev/kmem) then
$ls /dev/kmem >/tmp/$$.b
grep '^....r..r..' /tmp/$$.b >&/dev/null
if ($status == 1) then
grep '^....r..-..' /tmp/$$.b >&/dev/null
if ($status == 0) then
set t_group = `awk ' { print $4 }' /tmp/$$.b`
set t_mode = 2755
echo "It looks like only group $t_group can read the memory devices."
else
set t_mode = 4755
echo "It looks like only root can read the memory devices."
endif
else
set t_mode = 755
echo "It looks like anybody can read the memory devices."
endif
else
echo "It looks like there are no memory device special files."
set t_mode = 755
endif
if ($nodefaults) then
set owner = $t_owner
set group = $t_group
set mode = $t_mode
endif
echo "Tell me how to set the following when top is installed:"
./getans "Owner" user "$owner" .$$
set owner = `cat .$$`
./getans "Group owner" group "$group" .$$
set group = `cat .$$`
./getans "Mode" integer "$mode" .$$
set mode = `cat .$$`
rm -f /tmp/$$.b
echo ""
./getans "Install the executable in this directory" file "$bindir" .$$
set bindir = `cat .$$`
echo ""
./getans "Install the manual page in this directory" file "$mandir" .$$
set mandir = `cat .$$`
echo ""
./getans "Install the manual page with this extension" string "$manext" .$$
set manext = `cat .$$`
echo ""
./getans "Install the manual page as 'man' or 'catman'" string "$mansty" .$$
set mansty = `cat .$$`
echo ""
echo "We are done with the questions."
# Some Unix environments are so poor that their csh doesn't even support
# the "eval" builtin. Check for this before relying on its use to save
# the current configuration.
/bin/csh -fc "eval echo foo" >&/dev/null
if ($status == 1) then
echo "Can't save configuration (nonfatal)"
else
echo "Saving configuration..."
# save settings to use as defaults the next time
rm -f .defaults
touch .defaults
foreach v ($vars)
set tmp = `eval echo \$$v`
echo set $v = "'$tmp'" >>.defaults
end
endif
fast:
# clean up
rm -f $$.[fmna]
# set the link for machine.c
rm -f machine.c machine.o
ln -s machine/m_${module}.c machine.c
# get definitions out of the module file
set libs = `grep LIBS: machine/m_${module}.desc | sed -e 's/^.[^:]*: *//'`
set cflgs = `grep CFLAGS: machine/m_${module}.desc | sed -e 's/^.[^:]*: *//'`
set tcap = `grep TERMCAP: machine/m_${module}.desc | sed -e 's/^.[^:]*: *//'`
set math = `grep MATH: machine/m_${module}.desc | sed -e 's/^.[^:]*: *//'`
# get osrev defition, if we can
set uname=""
if (-e /usr/bin/uname) then
set uname=/usr/bin/uname
else if (-e /bin/uname) then
set uname=/bin/uname
endif
if ("$uname" != "") then
# different versions of tr can't agree on the way to specify ranges, so
# we will have to give the range explicitly.....sigh.
set osrev="-DOSREV=`$uname -r | tr -cd ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`"
else
set osrev=""
endif
# default for tcap (termcap)
if ("$tcap" == "") then
set tcap="-ltermcap"
else if ("$tcap" == "none") then
set tcap=""
endif
# allow for the module to override or remove -lm
if ("$math" == "") then
set math="-lm"
else if ("$math" == "none") then
set math=""
endif
if ( { grep -s SIGKILL /usr/include/signal.h } ) then
set signal="/usr/include/signal.h"
else
set signal="/usr/include/sys/signal.h"
endif
echo "Building Makefile..."
sed -e "s|%topn%|$topn|" \
-e "s|%delay%|$delay|" \
-e "s|%owner%|$owner|" \
-e "s|%group%|$group|" \
-e "s|%mode%|$mode|" \
-e "s|%bindir%|$bindir|" \
-e "s|%mandir%|$mandir|" \
-e "s|%manext%|$manext|" \
-e "s|%mansty%|$mansty|" \
-e "s|%tablesize%|$TableSize|" \
-e "s|%libs%|$libs|" \
-e "s|%cflgs%|$cflgs|" \
-e "s|%termcap%|$tcap|" \
-e "s|%math%|$math|" \
-e "s|%cdefs%|$cdefs|" \
-e "s|%signal%|$signal|" \
-e "s|%cc%|$Cmdcc|" \
-e "s|%awk%|$Cmdawk|" \
-e "s|%install%|$Cmdinstall|" \
-e "s|%shell%|$Cmdshell|" \
-e "s|%osrev%|$osrev|" \
Makefile.X >Makefile
echo "Building top.local.h..."
sed -e "s|%LoadMax%|$LoadMax|" \
-e "s|%TableSize%|$TableSize|" \
-e "s|%NominalTopn%|$NominalTopn|" \
-e "s|%topn%|$topn|" \
-e "s|%delay%|$delay|" \
-e "s|%random%|$random|" \
top.local.H >top.local.h
echo "Building top.1..."
sed -e "s|%topn%|$topn|" \
-e "s|%delay%|$delay|" \
top.X >top.1
if (-e machine/m_${module}.man ) then
cat machine/m_${module}.man >>top.1
endif
# clean up
rm -f .$$
echo 'Doing a "make clean".'
make clean
echo 'To create the executable, type "make".'
echo 'To install the executable, type "make install".'
exit 0
byebye:
rm -f .$$ $$.[fmna] /tmp/$$.[ab]
exit 1

View File

@ -1,31 +0,0 @@
DISCLAIMER
"top" is distributed free of charge. It should not be considered an
official product of Group sys Consulting. William LeFebvre supports
"top" in his spare time and as time permits.
NO WARRANTY:
BECAUSE "top" IS DISTRIBUTED FREE OF CHARGE, THERE IS ABSOLUTELY NO
WARRANTY PROVIDED, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING, GROUP SYS CONSULTING, ARGONNE
NATIONAL LABORATORY, NORTHWESTERN UNIVERSITY, WILLIAM N. LeFEBVRE
AND/OR OTHER PARTIES PROVIDE "top" "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
PROGRAM IS WITH YOU. SHOULD THE "top" PROGRAM PROVE DEFECTIVE, YOU
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
IN NO EVENT WILL GROUP SYS CONSULTING, ARGONNE NATIONAL LABORATORY,
NORTHWESTERN UNIVERSITY, WILLIAM N. LeFEBVRE, AND/OR ANY OTHER PARTY
WHO MAY MODIFY AND REDISTRIBUTE "top", BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL
OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A FAILURE OF THE
PROGRAM TO OPERATE WITH OTHER PROGRAMS) THE PROGRAM, EVEN IF YOU HAVE
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY
ANY OTHER PARTY.
So there!

View File

@ -1,264 +0,0 @@
TOP
Version 3.5
Beta Release 11
William LeFebvre
with much help from others
FREQUENTLY ASKED QUESTIONS AND THEIR ANSWERS
This FAQ is broken out in to several topics.
GENERAL
1. "Where do I get the latest version of top?"
The official site for top is "ftp.groupsys.com" in the directory
"/pub/top". It is also available from the following mirror sites:
"pharos.dgim.doc.ca" in /packages/top, "uiarchive.uiuc.edu" in
/pub/packages/top, "sunsite.auc.dk" in /pub/unix/top. European
users should consider using the Denmark (dk) site.
2. "Is there a web page for top?"
Yes. Point your browser at http://www.groupsys.com/top. It includes
all documentation, a nice interactive display which describes the
various components of the output of top, web-based retrieval of the
package, year 2000 information, and pointers to the mailing list.
3. "Is there a mailing list for top?"
The official list for announcements is "top-announce@groupsys.com".
This list is managed by "majordomo@groupsys.com". Announcements of
importance to all top users will be sent to this list, including new
releases, availability of beta test versions, emergency revisions and
patches, etc. Anyone is welcome to join top-announce. This is a
read-only list. The list of subscribers will not (intentionally) be
made available, and postings to the list are limited.
In addition, there is a top developers mailing list that is used by
beta testers and other people who help me port the program to various
machines. Membership to this list is solely at my discretion. If you
feel qualified to act as a beta tester, or if you are doing development
work on top (such as porting to a new platform), you may submit a
request by sending a message to "top-spinners-request@groupsys.com"
containing the word "subscribe". I will contact you within a few days,
as my schedule permits.
4. "What about Year 2000 compliance"?
Top should not experience any problems with the transition to the year
2000. A full statement concerning top and the year 2000 can be found
in the file "Y2K" included with the distribution.
5. "Why does it take so long for a new version of top to go through the
beta test process?"
This is completely my fault. I have just not had the time to give top
the attention it deserves. I thank everyone for their patience, and I
hope that with the recent changes in the direction of my career that I
can spend more time on this.
6. "Top is not written in ANSI C. Do you ever plan to change that?"
Top predates ANSI C by about 5 years. Yeah, it'll get "fixed" eventually.
Probably in 3.6.
CONFIGURING
7. "Configure said that it saw /proc and is recommending that I install top
setuid root. Is there any way around this? Is it safe?"
There is no way around it. Complain to POSIX. Every effort has been made
to make top a secure setuid program. However, we cannot guarantee that
there are no security problems associated with this configuration. The
places where top is most vulnerable are the builtin kill and renice
commands. There is no internal top command that causes top to start a shell
as a subprocess. Some SVR4 systems may contain a bug that enables a user to
renice his own processes downward (to lower nice values that are more
favorable for the process). This problem has been fixed for the Solaris 2.x
modules, but may still exist in others. We will hopefully fix this up in
the next release.
8. "Why is Configure a c-shell script? I thought c-shell scripts were
evil?"
They are. :-) I'll probably be rewriting the Configure script for the
next release, or switching to something like Gnu configure.
COMPILING
9. "We just upgraded our operating system to a new version and top broke.
What should we do?"
Recompile it. Top is very sensitive to changes in internal kernel data
structures. It is not uncommon for a new version of the operating system to
include changes to kernel data structures.
RUNNING
10. "I just finished compiling top and it works fine for root, but when
I try to run it as a regular user it either complains about files
it can't open or it doesn't display all the information it should.
Did I do something wrong?"
Well, you're just not done. On many operating systems today, access to
many of the kernel memory devices and other system files is restricted to
either root or a particular group. The Configure script figures this out
(usually) and makes sure that the "intsall" rule in the Makefile will
install top so that anyone can run it successfully. However, you have to
*install* it first. Do this with the command "make install".
11. "Top is (not) displaying idle processes and I don't (do) want it to."
This default has only changed about a dozen times, and I finally got tired
of people whining about it. Go read the manual page for the current version
and pay special attention to the description of the "TOP" environment
variable.
12. "We have so much memory in our machine that the memory status display
(the fourth line) ends up being longer than 80 characters. This
completely messes up top's output. Is there a patch?"
Most modules have been changed to use new memory formatting functions which
will display large values in terms of megabytes instead of kilobytes. This
should fix all occurences of this problem. If you encounter a system where
this large memory display overflow is still occurring, please let me know
(send mail to <wnl@groupsys.com>). Also note that newer versions of top can
use columns beyond 79, and understand window resizes. So you can always
make your window bigger.
13. "I tried to compile top with gcc and it doesn't work. I get
compilation errors in the include files, or I get an executable that
dumps core, or top displays incorrect numbers in some of the displays.
What's wrong?"
Gnu CC likes very much to use its own include files. Not being a gcc
expert, I can't explain why it does this. But I can tell you that if
you upgrade your operating system (say from Solaris 2.4 to Solaris
2.5) after installing gcc, then the include files that gcc uses will
be incorrect, especially those found in the "sys" directory. Your
choices are: (1) rebuild and reinstall the "standard" include files
for gcc (look for scripts in the distribution called "fixincludes" and
"fixinc.svr4"), (2) compile machine.c with "CFLAGS=-I/usr/include"
then make the rest of the object files normally, or (3) use "cc".
Solaris 2.6 users should also consult FAQ #20.
14. "The cpu state percentages are all wrong, indicating that my machine is
using 95% system time when it is clearly idle. What's wrong?"
This can happen if you compiled with gcc using the wrong include files.
See the previous question.
SUNOS PROBLEMS
15. "I tried compiling top under SunOS version 4.1.x and it got compile time
errors. Is there a patch?"
If you try compiling top in a "System V environment" under SunOS (that is,
/usr/5bin is before /usr/bin on your path) then the compilation may fail.
This is mostly due to the fact that top thinks its being compiled on a
System V machine when it really isn't. The only solution is to put /usr/bin
and /usr/ucb before /usr/5bin on your path and try again.
SVR4-derived PROBLEMS
16. "When I run top on my SVR4-derived operating system, it displays all
the system information at the top but does not display any process
information (or only displayes process information for my own
processes). Yet when I run it as root, everything works fine."
Your system probably uses the pseudo file system "/proc", which is by
default only accessible by root. Top needs to be installed setuid root on
such systems if it is going to function correctly for normal users.
SOLARIS PROBLEMS
17. "Under Solaris 2, when I run top as root it only shows root processes,
or it only shows processes with a PID less than 1000. It refuses to
show anything else. What do I do?"
You probably compiled it with /usr/ucb/cc instead of the real C compiler.
/usr/ucb/cc is a cc front end that compiles programs in BSD source-level
compatability mode. You do not want that. Make sure that /usr/ucb is not
on your path and try compiling top again.
18. "Under Solaris 2, I compiled top using what I am sure is the correct
compiler but when I try to run it it complains about missing dynamic
libraries. What is wrong?"
Check to see if you have LD_LIBRARY_PATH defined in your shell. If you do,
make sure that /usr/ucblib is not on the path anywhere. Then try compiling
top again.
19. "Under Solaris 2, when I try to run top it complains that it can't open
the library "libucb.so.1". So I changed the LIBS line in m_sunos5.c
to include -R/usr/ucblib to make sure that the dynamic linker will look
there when top runs. I figured this was just an oversight. Was I
right?"
No, you were not right. As distributed, top requires NO alterations
for successful compilation and operations under any release of Solaris
2. You probably compiled top with /usr/ucb/cc instead of the real C
compiler. See FAQ #10 for more details.
20. "When I try to compile top under Solaris 2.6 using gcc I get compile
time errors. There appear to be problems with the include files,
such as 'u_rlimit has incomplete type' and/or 'u_saved_rlimit has
incomplete type'. I've already run fixinc.svr4 as per FAQ #13.
Why didn't that fix it?"
Only top versions 3.5 and later are compatible with Solaris 2.6. Make
sure you are using the most up-to-date version. Earlier beta release
copies of version 3.5 had additional problems when compiled with gcc.
Retrieve the official version 3.5 (non-beta) release from one of the
sites listed in FAQ #1 or FAQ #2.
SCO PROBLEMS
21. "When I try to run Configure, it complains about a syntax error."
Some versions of SCO's csh do not understand the syntax "$<". Earlier
releases of top depended on this syntax to read input from the installer's
terminal during the installation process. Version 3.5 fixes this.
SVR42 PROBLEMS
22. "The memory display doesn't work right. Why?"
This is a known bug with the svr42 module. The problem has been traced down
to a potential bug in the "mem" driver. The author of the svr42 module is
working on a fix.
STILL STUCK
23. I'm still stuck. To whom do I report problems with top?"
The most common problems are caused by top's sensitivity to internal kernel
data structures. So make sure that you are using the right include files,
and make sure that you test out top on the same machine where you compiled
it. Sun's BSD Source Compatability Mode is also a common culprit. Make
sure you aren't using either /usr/ucb/cc or any of the libraries in
/usr/ucblib. Finally, make sure you are using the correct module. If there
does not appear to be one appropriate for your computer, then top probably
will not work on your system.
If after reading all of this file and checking everything you can you are
still stuck, then send mail to "wnl@groupsys.com". I will answer your mail
when I have time. Please bear with me in that regard! If it looks like the
problem is machine-specific, I will forward the report along to the module's
author. If you would like to converse directly with the module author, the
authors' names are listed at the beginning of the module .c file in the
"machine" directory.

View File

@ -1,22 +0,0 @@
$FreeBSD$
This file contains notes regarding the upgrade of top(1). See the vendor
import instructions at:
https://www.freebsd.org/doc/en/articles/committers-guide/subversion-primer.html#svn-advanced-use-vendor-imports
The upstream project pages for top(1) are:
http://www.unixtop.org/
https://sourceforge.net/projects/unixtop/
contrib/top/machine.h specifies an interface that must be provided by the
target OS. That interface is implemented in usr.bin/top/machine.c
To enable building on case-insensitive filesystems, the following files were
renamed:
contrib/top/top.X -> contrib/top/top.xs
contrib/top/top.local.H -> contrib/top/top.local.hs

View File

@ -1,166 +0,0 @@
TOP
Version 3.5
William LeFebvre
and a cast of many
INSTALLATION
Configuration and installation of top is very straightforward. After
unpacking the sources, run the script "Configure". It will present you
with a series of questions, all of which should be explained in the
presentation. After you have answered all the questions, "Configure" will
perform all the necessary configuration. Once this is finished, type
"make install". Make will compile the sources then install the resulting
executable and manual page in the appropriate places.
The most difficult step in the configuration is the choice of an
appropriate machine-specific module. The Configure script gives you a
list of choices complete with brief descriptions of when each choice is
appropriate. Each module is contained in a separate c file in the
directory "machine". The module contains all of the machine-specific code
that makes top work correctly on the architecture in question. All of the
code in the top-level directory is machine-independent (or at least
strives to be). Hints for some module choices that are not obvious are
given at the end of this file.
The first comment in each c file in that directory contains the synopsis
AND a detailed description of the machines for which that module is
appropriate. It also contains a list of authors for that module. If you
are really stumped in this choice, use grep to find your machine
manufacturer's name or operating system name in machine/*.c. If you still
can't find one that is appropriate, then chances are very good that one
hasn't been written yet. If that is the case, then you are out of luck.
HANDLING MULTIPLE ARCHITECTURES
If you need to recompile top for a different architecture (that is, using
a different module) you need to reconfigure top. A short cut is available
to make this a little easier. If all of your previous answers to the
configuration questions (except for the module name of course) are
adequate for the new architecture, then you can just use the command
"Configure <modulename>". The configuration script will reconfigure top
using the new module and all the answers you gave last time. It will
finish with a "make clean". Once that completes, type "make install"
and make will compile the sources and do the installation.
HANDLING MULTIPLE OS VERSIONS
By far the most frequently received bug report for top is something like
this: "We just upgraded our operating system to version 99.9.9.9 and top
broke. What should we do?" The simple answer is "recompile".
Top is very sensitive to changes in internal kernel data structures
(especially the proc and user structures). Some operating systems
(especially SunOS) are notorious for changing these structure in every
minor release of the OS. This means that a top executable made under one
version of the OS will not always work correctly (if even at all) under
another version. This is just one of those tough facts of life. There is
really no way around it.
To make life even worse, some operating systems (SunOS again) will use
slightly different proc and user structures on different models. For
example, "top" built on a SparcStation 2 will not run correctly on a
SparcStation 10, even if they are both running SunOS 4.1.3. These
unfortunate circumstances make maintaining top very difficult, especially
in an environment that runs several different versions of the same
operating system.
But there is hope. If your operating system has a properly functioning
"uname" command then you can handle this problem rather gracefully.
Included in the distribution is a shell file called "metatop". All this
shell file does is:
exec top-`uname -m`-`uname -r` "$@"
So when you run this script, it execs a filename that is unique to your
specific machine architecture and your OS revision number.
To use "metatop", do the following:
. on any machine, run Configure and choose the module that is
appropriate for the machine
. for all machines which use the same module:
. group machines according to machine architecture AND OS
revision number (i.e.: sun4-4.1.1, sun4c-4.1.1, sun4c-4.1.2,
sun4-4.1.3, sun4c-4.1.3, sun4m-4.1.3, ...)
. for each group, choose one machine from that group and on it
run "make clean; make installmeta".
The "installmeta" rule in the makefile will insure that top is compiled,
install the shell file "metatop" as "top", then install the executable
"top" with a name appropriate to the machine architecture and OS revision.
HINTS FOR CHOOSING THE CORRECT MODULE:
SOLARIS 2.x
All versions of Solaris will now work with the module sunos5. Version
specific modules (such as sunos54) no longer exist.
SUNOS 4.x AND MULTIPROCESSOR ARCHITECTURES
First, we need to be speaking the same language:
sun4 a regular sparc sun 4 architecture machine (sparc station 1,
sparc station 2, IPC, SLC, etc.)
sun4m a multiprocessor sparc (Sparc 10, 4/670, 4/690)
I intended to write the sunos4 module so that an executable compiled on a
sun4m machine would work correctly on a sun4 machine. Unfortunately my
experiments indicate that this cannot be done. It turns out that the user
structure is so different between these two architectures that nothing
short of a serious hack will make the same executable work correctly on
both machines. I recommend that you use the separate module "sunos4mp"
when making an executable for a sun4m architecture, and use "sunos4" when
making an executable for sun4 or sun4c architectures.
DIGITAL UNIX V4.0
This is the successor to DECOSF/1. Use the module decosf1.
SOLBOURNE OPERATING SYSTEM (OS/MP)
If you are running OS/MP version 4.1A, then use the module "osmp4.1a".
If you are running a version of OS/MP OLDER than 4.1A (that is, one
of its predecessors), use the module "sunos4".
If you are running OS/MP 4.1B or LATER, use the module "sunos4mp".
HP/UX OPERATING SYSTEM
The module hpux8 works on all version 8 systems. Some say that it works
with version 9 as well, but one user did send me a separate module for
version 9. This module has only been tested on series 800 machines. I
would recommend the following for those running version 9: try hpux9 and
if it doesn't work then try hpux8. If neither work, then send mail to me
and/or the modules' authors. Another note: we have a model 730 supposedly
running version 9.01. The module hpux9 did not compile successfully, but
the module hpux8 worked fine. The module hpux10 works on all revisions of
HP/UX 10 except 10.10, where HP removed the definition of the proc structure
from the system include files.
NET/2 386BSD SYSTEMS
If your version of the operating system has patchkit 2.4 installed,
then you will need to modify machine/m_386bsd.c and uncomment the
definition of PATCHED_KVM. This patchkit makes what more than a few
people believe to be a wholly unnecessary patch to the way the kvm
routines work.
A/UX SYSTEMS
There is a module for A/UX 3.0 and 3.1. Whether or not it works for
any other version is not known. Proceed at your own risk.
Although AUX does not generally have a renice systemcall, it can be
implemented by tweeking kernel memory. The flag IMPLEMENT_SETPRIORITY
controls the inclusion of this code. It is off be default. While
such a simple hack should not be difficult to get right, USE THIS
FEATURE AT YOUR OWN RISK!

View File

@ -1,24 +0,0 @@
# Makefile for .desc files
# This makefile is the prototype for "Make.desc", which is used by
# top's Configure script to build .desc files and the SYNOPSIS file.
# Configure then uses these files to ask appropriate questions.
# Written by William LeFebvre, Group sys Consulting
# (formerly of Northwestern University and Rice University)
# DO NOT EDIT "Make.desc"!!! Make changes to "Make.desc.X",
# then "make veryclean", then run "Configure".
# The list of .desc files will be inserted after this next line:
DESCS=\
.SUFFIXES: .desc
.c.desc:
sed -e '/^$$/,$$d' -e 's,^[/ *]*,,' $< > $@
all: SYNOPSIS
SYNOPSIS: $(DESCS)
grep SYNOPSIS: $(DESCS) | sed -e 's@^machine/m_@@' -e 's@.desc:.[^:]*: *@:@' >SYNOPSIS

View File

@ -1,117 +0,0 @@
# Makefile for "top", a top 10 process display for Unix
#
# This makefile is for top, version 3
#
# Written by William LeFebvre, Group sys Consulting
# (formerly of Northwestern University and Rice University)
# DO NOT EDIT "Makefile"!!!! Make changes to "Makefile.X" and rerun
# Configure.
# Executables (these should be obvious):
SHELL = %shell%
CC = %cc%
AWK = %awk%
INSTALL = %install%
# installation information:
# OWNER - name (or uid) for the installed executable's owner
# GROUP - group name (or gid) for the installed executable's group
# MODE - mode for the installed executable (should start with a 0)
# BINDIR - directory where the executable should live
# MANDIR - directory where the manual page should live
# MANEXT - installed man pages end in .$(MANEXT)
# MANSTY - "man" or "catman" depending on what's to be installed
# SIGNAL - <signal.h> or <sys/signal.h>; the one with signal definitions
# TROFF - most appropriate troff command
OWNER = %owner%
GROUP = %group%
MODE = %mode%
BINDIR = %bindir%
MANDIR = %mandir%
MANEXT = %manext%
MANSTY = %mansty%
SIGNAL = %signal%
# Values for the two defaults in "top":
# TOPN - default number of processes to display
# DELAY - default delay between updates
#
# set TOPN to -1 to indicate infinity (so that top will display as many
# as the screen will hold).
TOPN = %topn%
DELAY = %delay%
CFILES = top.c commands.c display.c screen.c username.c \
utils.c version.c getopt.c machine.c
OBJS = top.o commands.o display.o screen.o username.o \
utils.o version.o getopt.o machine.o
CDEFS = %cdefs%
LIBS = %libs%
TERMCAP = %termcap%
MATH = %math%
CFLAGS = %cflgs% $(CDEFS)
LINTFLAGS = -x $(CDEFS)
all: Makefile top.local.h top
Makefile: Makefile.X
@echo 'You need to run the script "Configure" before running "make".'
exit 10
top.local.h: top.local.H
@echo 'You need to run the script "Configure" before running "make".'
exit 10
top: $(OBJS)
rm -f top
$(CC) $(CDEFS) -o top $(OBJS) $(TERMCAP) $(MATH) $(LIBS)
lint: sigdesc.h
$(LINT) $(LINTFLAGS) $(CFILES)
# include file dependencies
top.o: boolean.h display.h screen.h top.h top.local.h utils.h machine.h
commands.o: boolean.h sigdesc.h top.h utils.h
display.o: boolean.h display.h layout.h screen.h top.h top.local.h utils.h
screen.o: boolean.h screen.h
utils.o: top.h
version.o: top.h patchlevel.h
username.o: top.local.h utils.h
# when compiling machine.c, include os revision definition
machine.o: machine.c top.h machine.h utils.h
$(CC) "%osrev%" $(CFLAGS) -c machine.c
# automatically built include file
sigdesc.h: sigconv.awk $(SIGNAL)
$(AWK) -f sigconv.awk $(SIGNAL) >sigdesc.h
clean:
rm -f *.o top core core.* sigdesc.h
veryclean: clean
rm -f Make.desc machine/*.desc .defaults top.tar SYNOPSIS Makefile top.local.h top.1 machine.c prime
install: top top.1 install-top install-$(MANSTY)
install-top:
$(INSTALL) -o $(OWNER) -m $(MODE) -g $(GROUP) top $(BINDIR)
install-man:
$(INSTALL) top.1 $(MANDIR)/top.$(MANEXT)
install-catman:
tbl top.1 | nroff -man > $(MANDIR)/top.$(MANEXT)
installmeta: top top.1
$(INSTALL) -o $(OWNER) -m 755 -g $(GROUP) metatop $(BINDIR)/top
@echo $(INSTALL) -o $(OWNER) -m $(MODE) -g $(GROUP) top $(BINDIR)/top-`uname -m`-`uname -r`
@$(INSTALL) -o $(OWNER) -m $(MODE) -g $(GROUP) \
top $(BINDIR)/top-`uname -m`-`uname -r`
$(INSTALL) top.1 $(MANDIR)/top.$(MANEXT)

View File

@ -1,165 +0,0 @@
Instructions for porting top to other architectures.
This is still a preliminary document. Suggestions for improvement are
most welcome.
My address is now "wnl@groupsys.com".
Before you embark on a port, please send me a mail message telling me
what platform you are porting top to. There are three reasons for
this: (1) I may already have a port, (2) module naming needs to be
centralized, (3) I want to loosely track the various porting efforts.
You do not need to wait for an "okay", but I do want to know that you
are working on it. And of course, once it is finished, please send me
the module files so that I can add them to the main distribution!
----------
There is one set of functions which extract all the information that
top needs for display. These functions are collected in to one file.
To make top work on a different architecture simply requires a
different implementation of these functions. The functions for a
given architecture "foo" are stored in a file called "m_foo.c". The
Configure script looks for these files and lets the configurer choose
one of them. This file is called a "module". The idea is that making
top work on a different machine only requires one additional file and
does not require changes to any existing files.
A module template is included in the distribution, called "m-template".
To write your own module, it is a good idea to start with this template.
If you architecture is similar to one for which a module already
exists, then you can start with that module instead. If you do so,
remember to change the "AUTHOR" section at the top!
The first comment in a module contains information which is extracted
and used by Configure. This information is marked with words in all
capitals (such as "SYNOPSIS:" and "LIBS:"). Go look at m-template: it
is fairly self-explanatory. The text after "LIBS:" (on the same line)
is extracted and included in the LIBS definition of the Makefile so
that extra libraries which may be necessary on some machines (such as
"-lkvm") can be specified in the module. The text after "CFLAGS:"
(on the same line) is extracted and included as flags in the "CFLAGS"
definition of the Makefile (thus in every compilation step). This is
used for rare circumstances only: please don't abuse this hook.
Some operating systems have idiosyncrasies which will affect the form
and/or content of the information top displays. You may wish to
document such anomalies in the top man page. This can be done by adding
a file called m_{modulename}.man (where {modulename} is replaced with
the name of the module). Configure will automatically add this file to
the end of the man page. See m_sunos4.man for an example.
A module is concerned with two structures:
The statics struct is filled in by machine_init. Each item is a
pointer to a list of character pointers. The list is terminated
with a null pointer.
struct statics
{
char **procstate_names; /* process state names */
char **cpustate_names; /* cpu state names */
char **memory_names; /* memory information names */
};
The system_info struct is filled in by get_system_info and
get_process_info.
struct system_info
{
int last_pid; /* last pid assigned (0 means non-sequential assignment) */
double load_avg[NUM_AVERAGES]; /* see below */
int p_total; /* total number of processes */
int p_active; /* number of procs considered "active" */
int *procstates; /* array of process state counters */
int *cpustates; /* array of cpustate counters */
int *memory; /* memory information */
};
The last three pointers each point to an array of integers. The
length of the array is determined by the length of the corresponding
_names array in the statics structure. Furthermore, if an entry in a
_names array is the empty string ("") then the corresponding value in
the value array will be skipped over. The display routine displays,
for example, the string procstate_names[0] then the number
procstates[0], then procstate_names[1], procstates[1], etc. until
procstate_names[N] == NULL. This allows for a tremendous amount of
flexibility in labeling the displayed values.
"procstates" and "memory" are displayed as straight integer values.
Values in "cpustates" are displayed as a percentage * 10. For
example, the (integer) value 105 is displayed as 10.5%.
These routines must be defined by the machine dependent module.
int machine_init(struct statics *)
returns 0 on success and -1 on failure,
prints error messages
char *format_header(char *)
Returns a string which should be used as the header for the
process display area. The argument is a string used to label
the username column (either "USERNAME" or "UID") and is always
8 characters in length.
void get_system_info(struct system_info *)
caddr_t get_process_info(struct system_info *, int, int, int (*func)())
returns a handle to use with format_next_process
char *format_next_process(caddr_t, char *(*func)())
returns string which describes next process
int proc_compare(caddr_t, caddr_t)
qsort comparison function
uid_t proc_owner(pid_t)
Returns the uid owner of the process specified by the pid argument.
This function is VERY IMPORTANT. If it fails to do its job, then
top may pose a security risk.
get_process_info is called immediately after get_system_info. In
fact, the two functions could be rolled in to one. The reason they
are not is mostly historical.
Top relies on the existence of a function called "setpriority" to
change a process's priority. This exists as a kernel call on most 4.3
BSD derived Unixes. If neither your operating system nor your C
library supplies such a function, then you will need to add one to the
module. It is defined as follows:
int setpriority (int dummy, int who, int niceval)
For the purposes of top, the first argument is meaningless.
The second is the pid and the third is the new nice value.
This function should behave just like a kernel call, setting
errno and returning -1 in case of an error. This function MUST
check to make sure that a non-root user does not specify a nice
value less than the process's current value. If it detects such
a condition, it should set errno to EACCES and return -1.
Other possible ERRNO values: ESRCH when pid "who" does not exist,
EPERM when the invoker is not root and not the same as the
process owner.
Note that top checks process ownership and should never call setpriority
when the invoker's uid is not root and not the same as the process's owner
uid.
The file "machine.h" contains definitions which are useful to modules
and to top.c (such as the structure definitions). You SHOULD NOT need
to change it when porting to a new platform.
Porting to a new platform should NOT require any changes to existing
files. You should only need to add m_ files. If you feel you need a
change in one of the existing files, please contact me so that we can
discuss the details. I want to keep such changes as general as
possible.

View File

@ -1,192 +0,0 @@
TOP
Version 3.5
William LeFebvre
and a cast of dozens
If you do not want to read this entire file, then at least read
the section at the end entitled "KNOWN PROBLEMS".
If you are having any problems getting top to work, please read the
file "FAQ" *before* contacting me. Thank you.
"top" is a program that will give continual reports about the state of
the system, including a list of the top cpu using processes. Version 3
of "top" has three primary design goals: provide an accurate snapshot of
the system and process state, not be one of the top processes itself, be
as portable as possible.
Version 3 has many bug fixes from version 2.5, and it has also been
reorganized in a major way to make it easy to port to other platforms.
All system dependent code is now contained in one file.
Top now includes a configuration script called "Configure". It helps
the installer choose the correct parameters for this particular
installation. This script MUST be run before attempting to compile top.
Top requires read access to the memory files "/dev/kmem" and "/dev/mem"
as well as the system image "/vmunix". Some installations have these
files protected from general access. These sites would have to install
this program in the same way that programs such as "ps" are installed.
In addition, on those Unix variants that support the proc filesystem
(such as SVR4 and Solaris 2), top requires read access to all the files
in /proc: typically dictating that top be installed setuid to root.
CAVEAT: version 3 of top has internal commands that kill and renice
processes. Although I have taken steps to insure that top makes
appropriate checks with these commands, I cannot guarantee that these
internal commands are totally secure. IF YOU INSTALL top as a SETUID
program, you do so AT YOUR OWN RISK! I realize that some operating
systems will require top to run setuid, and I will do everything I can
to make sure that top is a secure setuid program.
Configure will ask you to input values for certain parameters. Before
each parameter, Configure will display a description of what the
parameter does. Read the description and choose an appropriate value.
Sometimes a default will appear in brackets. Typing just return will
choose the default.
System support now takes the form of "modules". Adding support for
a different architecture requires only adding a module. Configure
asks which module to use when it is configuring top. See the file
"Porting" for a description of how to write your own module.
To compile and install "top", read the file "INSTALL" and follow the
directions and advice contained therein.
Once you have created a binary for one particular type of machine, you
can reconfigure for another type with "./Configure modulename" where
"modulename" is replaced with the appropriate module name. All other
parameter values are kept the same. Note that in some cases this may
not be appropriate.
If you make any kind of change to "top" that you feel would be
beneficial to others who use this program, or if you find and fix a bug,
please send me the change.
Be sure to read the FAQ enclosed with the distrubution. It contains
answers to the most commonly asked questions about the configuration,
installation, and operation of top.
AVAILABILITY
The latest version of "top" is now being made available via anonymous
FTP from the host "ftp.groupsys.com" in the directory "/pub/top".
Additional modules will be made available in the directory
"/pub/top/m". The site "eecs.nwu.edu" will continue to house copies
of the distribution as well.
Here are HTML links for the four best "top" archive sites:
<A HREF="ftp://ftp.groupsys.com/pub/top">Top archive (groupsys.com)</A>
<A HREF="ftp://eecs.nwu.edu/pub/top">Top archive (eecs.nwu.edu)</A>
<A HREF="ftp://pharos.dgim.doc.ca/packages/top"> Top mirror (dgim.doc.ca)</A>
<A HREF="ftp://uiarchive.uiuc.edu/pub/packages/top/">Top mirror (uiuc.edu)</A>
New releases will be posted to comp.sources.unix as they become
available. Sites which arhive that newsgroup will also contain copies
of the distribution.
Announcements about availability will be made to the mailing list
"top-announce@groupsys.com". This is an open list maintained by
majordomo. To join the list, send a message containing the word
"subscribe" to "top-announce-request@groupsys.com". Addresses of
subscribers to this list are kept confidential and will never be used
for any purpose other than as recipients of announements concerning
this software.
KNOWN PROBLEMS:
Gnu CC
Compiling via Gnu CC continued to be the source of most of the
questions I receive. By far the most common mistake made by those
attempting to compile top with Gnu CC is out of date include files.
When the operating system is upgraded, the include files that are part
of the gcc package MUST also be updated. Gcc maintains its own
include files. Even a minor OS upgrade can involve changes to some of
the kernel's internal data structures, which are defined in include
files in "sys". Top is very sensitive to these changes. If you are
compiling with gcc and experience any sort of strange problems, please
make sure the include files you are using are up to date BEFORE
sending me a bug report. Look in the gcc source distribution for the
shell script "fixincludes".
HP/UX 10.10
In their infinite wisdom, the folks at HP have decided that mere mortals
such as you and I don't need to know what the kernel's proc structure looks
like. To that end, they have removed all useful content from the include
file <sys/proc.h> in version 10.10. As a result, top will not compile
under 10.10. What HP is trying to accomplish with this move is to force
iconoclasts such as myself to use "pstat" for collecting all process
information. I have no immediate solution for this problem, but hope to
obtain a sufficiently complete definition of "struct proc" at some point in
the near future. Stay tuned.
DIGITAL UNIX 4.0 (DECOSF/1 V4.0)
A user has reported that idle processes are not displayed regardless
of the flags used when invoking top. We have not had time to track
this problem down.
DECOSF/1 V3.0
There is a bug either in the module, in utils.c, or in DEC's optimizer that
is tickled by the decosf1 module when compiled under V3.0 (and perhaps
earlier versions). Top compiled using DEC's compiler with optimization
will consistently produce a segmentation fault (in format_next_process
while calling sprintf). To work around this problem, either compile top
with gcc or turn off optimization (compile without -O). We think that
one of the bugs fixed in utils.c fixed this problem as well, but we are
not certain.
System V R 4.2
Load average and memory displays do not work. The problem has been
traced down to a potential bug in the "mem" driver. The author
of the svr42 module is working on a fix.
GRATITUDE
My perpetual thanks to all the people who have helped me support top
on so many platforms. Without these people, top would not be what it
is. Here is a partial list of contributors and other individuals.
Robert Boucher <boucher@sofkin.ca>
Marc Cohen <marc@aai.com>
David Cutter <dpc@grail.com>
Casper Dik <Casper.Dik@Sun.COM>
Charles Hedrick <hedrick@geneva.rutgers.edu>
Andrew Herbert <andrew@werple.apana.org.au>
Jeff Janvrin <jeff.janvrin@columbiasc.ncr.com>
Torsten Kasch <torsten@techfak.uni-bielefeld.de>
Petri Kutvonen <kutvonen@cs.helsinki.fi>
William L. Jones <jones@chpc>
Tim Pugh <tpugh@oce.orst.edu>
Steve Scherf <scherf@swdc.stratus.com>
Phillip Wu <pwu01@qantek.com.au>
(My apologies if I missed anyone.)
AUTHOR
William LeFebvre
Group sys Consulting
wnl@groupsys.com
U.S. Mail address:
William LeFebvre
Group sys Consulting
11585 Jones Bridge Road
Suite 420-139
Alpharetta, GA 30022
(770) 813-3224

View File

@ -1,26 +0,0 @@
Top and the Year 2000
The software package top will not be affected by years numbering
between 2000 and 2037. No portion of the top code stores dates on
disk. All date processing in top is performed with functions from the
Unix C library and Unix kernel. The specific functions are: time(2)
and ctime(3S). These functions deal exclusively with conventional
Unix time values (number of seconds since Midnight January 1, 1970
GMT) and produce strings with a 4-digit year. At no point in the code
for top are the last two digits used to represent a year.
Top and the Year 2038
In the year 2038 top will fail to represent the time of day correctly
on 32-bit Unix operating systems. This is due to a limitation in the
way Unix represents time. Top will only work on systems whose kernel
call "time" and C library call "ctime" have been adjusted to represent
time with a value greater than 32 bits. The exact date and time of
this failure is 3:14:08 January 19, 2038 GMT. Note that this failure
will only affect the display of the current time in the output from
top.
THERE IS ABSOLUTELY NO WARRANTY PROVIDED WITH THIS SOFTWARE.
Please see the contents of the file "DISCLAIMER" for further
information.

View File

@ -1,118 +0,0 @@
#!/bin/sh
# getans prompt type default results_filename
# type is one of
# number
# integer
# neginteger
# file default=default filename
# path
# yesno default=0,1 corres yes or no
# string (default)
RAWPMPT=$1
TYP=$2
DFLT=$3
OFNM=$4
ny0="no"; ny1="yes"
if [ ${TYP} = "yesno" ]; then
eval ny=\$ny${DFLT}
pmpt="${RAWPMPT} [$ny]: "
else
if [ -z "${DFLT}" ]; then
pmpt="${RAWPMPT}"
else
pmpt="${RAWPMPT} [${DFLT}]: "
fi
fi
if [ x"`echo -n`" = x-n ]
then
c=\\c
else
n=-n
fi
while :
do
echo $n "$pmpt"$c
read input
case "$TYP" in
number)
tmp=`echo $input | tr -d 0123456789.`
if [ -n "$tmp" ]; then
echo "Invalid number. Please try again."
continue
fi
;;
integer)
tmp=`echo $input | tr -d 0123456789`
if [ -n "$tmp" ]; then
echo "Invalid integer. Please try again."
continue
fi
;;
neginteger)
if [ "x$input" != "x-1" ]; then
tmp=`echo $input | tr -d 0123456789`
if [ -n "$tmp" ]; then
echo "Invalid integer. Please try again."
continue
fi
fi
;;
file)
if [ -z "$input" ]; then
input=${DFLT}
fi
if [ ! -f "$input" -a ! -d "$input" ]; then
echo "The file $input does not exist. Please try again."
continue
fi
;;
path)
if [ -z "$input" ]; then
input="${DFLT}"
fi
if [ ! -f "$input" ]; then
path=`echo $PATH | sed -e s'/::/ . /g' -e 's/:/ /g'`
x=
for elt in $path; do
if [ -f "$elt/$input" ]; then x=1; break; fi
done
if [ -z "$x" ] ;then
echo "The command $input was not found. Please try again."
continue
fi
fi
;;
yesno)
if [ -z "$input" ]; then
input="${DFLT}"
else
case $input in
y | yes)
input=1 ;;
n | no)
input=0 ;;
*)
echo 'Please answer "yes" or "no".'
continue ;;
esac
fi
;;
*) ;;
esac
break
done
if [ -z "$input" ]; then
input="${DFLT}"
fi
echo $input > ${OFNM}

View File

@ -1,69 +0,0 @@
#!/bin/sh
#
# this shell script is amazingly similar to the old and lamented
# BSD "install" command. It recognized the following options:
#
# -o target file owner
# -m target file mode
# -g target file group owner
#
#
# scan the options
#
while [ $# -gt 0 ]; do
case $1 in
-o)
owner=$2
shift ; shift
;;
-m)
mode=$2
shift; shift
;;
-g)
group=$2
shift ; shift
;;
-*)
echo "install: unknown option $1"
exit
;;
*)
break
;;
esac
done
#
# we need two more: filename and destination
#
if [ $# -ne 2 ]; then
echo "Usage: install [ -o owner ] [ -m mode ] [ -g group ] file destination"
exit
fi
#
# first, copy
#
cp $1 $2
#
# normalize the name
#
dest=$2
if [ -d $2 ]; then
dest=$2/`basename $1`
fi
#
# do optional things
#
if [ "$owner" ]; then
chown $owner $dest
fi
if [ "$group" ]; then
chgrp $group $dest
fi
if [ "$mode" ]; then
chmod $mode $dest
fi

View File

@ -1,241 +0,0 @@
/*
* top - a top users display for Unix
*
* THIS IS A TEMPLATE FILE FOR A MACHINE DEPENDENT (m_...c) FILE
*
* SYNOPSIS: one line description of machine this module works with
*
* DESCRIPTION:
* Detailed description of this machine dependent module.
* It can be multiple lines, but a blank comment line (one with only an
* asterisk) is considered to end it. Place here a complete list of
* the machines and OS versions that this module works on.
*
* LIBS: list of special libraries to include at link step (REMOVE THIS LINE IF NOT NEEDED)
*
* AUTHOR: your name and <your@internet.address>
*/
#include "top.h"
#include "machine.h"
/*
* These definitions control the format of the per-process area
*/
static char header[] =
" PID X PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND";
/* 0123456 -- field to fill in starts at header+6 */
#define UNAME_START 6
#define Proc_format \
"%5d %-8.8s %3d %4d%6dK %4dK %-5s%4d:%02d %5.2f%% %5.2f%% %.14s"
/* these are for detailing the process states */
int process_states[?];
char *procstatenames[] = {
"", " sleeping, ", " ABANDONED, ", " running, ", " starting, ",
" zombie, ", " stopped, ",
NULL
};
/* these are for detailing the cpu states */
int cpu_states[?];
char *cpustatenames[] = {
"user", "nice", "system", "idle",
NULL
};
/* these are for detailing the memory statistics */
int memory_stats[?];
char *memorynames[] = {
"K available, ", "K in use, ", "K free, ", "K locked", NULL
};
/* useful externals */
extern int errno;
extern char *sys_errlist[];
long lseek();
long time();
long percentages();
machine_init(statics)
struct statics *statics;
{
return(0);
}
char *format_header(uname_field)
register char *uname_field;
{
register char *ptr;
ptr = header + UNAME_START;
while (*uname_field != '\0')
{
*ptr++ = *uname_field++;
}
return(header);
}
get_system_info(si)
struct system_info *si;
{
}
static struct handle handle;
caddr_t get_process_info(si, sel, compare)
struct system_info *si;
struct process_select *sel;
int (*compare)();
{
return((caddr_t)&handle);
}
char fmt[128]; /* static area where result is built */
/* define what weighted cpu is. */
#define weighted_cpu(pct, pp) ((pp)->p_time == 0 ? 0.0 : \
((pct) / (1.0 - exp((pp)->p_time * logcpu))))
char *format_next_process(handle, get_userid)
caddr_t handle;
char *(*get_userid)();
{
return(fmt);
}
/*
* getkval(offset, ptr, size, refstr) - get a value out of the kernel.
* "offset" is the byte offset into the kernel for the desired value,
* "ptr" points to a buffer into which the value is retrieved,
* "size" is the size of the buffer (and the object to retrieve),
* "refstr" is a reference string used when printing error meessages,
* if "refstr" starts with a '!', then a failure on read will not
* be fatal (this may seem like a silly way to do things, but I
* really didn't want the overhead of another argument).
*
*/
getkval(offset, ptr, size, refstr)
unsigned long offset;
int *ptr;
int size;
char *refstr;
{
if (kvm_read(kd, offset, ptr, size) != size)
{
if (*refstr == '!')
{
return(0);
}
else
{
fprintf(stderr, "top: kvm_read for %s: %s\n",
refstr, sys_errlist[errno]);
quit(23);
}
}
return(1);
}
/* comparison routine for qsort */
/* NOTE: this is specific to the BSD proc structure, but it should
give you a good place to start. */
/*
* proc_compare - comparison function for "qsort"
* Compares the resource consumption of two processes using five
* distinct keys. The keys (in descending order of importance) are:
* percent cpu, cpu ticks, state, resident set size, total virtual
* memory usage. The process states are ordered as follows (from least
* to most important): WAIT, zombie, sleep, stop, start, run. The
* array declaration below maps a process state index into a number
* that reflects this ordering.
*/
static unsigned char sorted_state[] =
{
0, /* not used */
3, /* sleep */
1, /* ABANDONED (WAIT) */
6, /* run */
5, /* start */
2, /* zombie */
4 /* stop */
};
proc_compare(pp1, pp2)
struct proc **pp1;
struct proc **pp2;
{
register struct proc *p1;
register struct proc *p2;
register int result;
register pctcpu lresult;
/* remove one level of indirection */
p1 = *pp1;
p2 = *pp2;
/* compare percent cpu (pctcpu) */
if ((lresult = p2->p_pctcpu - p1->p_pctcpu) == 0)
{
/* use cpticks to break the tie */
if ((result = p2->p_cpticks - p1->p_cpticks) == 0)
{
/* use process state to break the tie */
if ((result = sorted_state[p2->p_stat] -
sorted_state[p1->p_stat]) == 0)
{
/* use priority to break the tie */
if ((result = p2->p_pri - p1->p_pri) == 0)
{
/* use resident set size (rssize) to break the tie */
if ((result = p2->p_rssize - p1->p_rssize) == 0)
{
/* use total memory to break the tie */
result = PROCSIZE(p2) - PROCSIZE(p1);
}
}
}
}
}
else
{
result = lresult < 0 ? -1 : 1;
}
return(result);
}
proc_owner(pid)
int pid;
{
/* returns uid of owner of process pid */
return(uid);
}

View File

@ -1,25 +0,0 @@
#! /bin/sh
#
# Top is very sensitive to differences in the kernel, so much so that an
# executable created on one sub-architecture may not work on others. It
# is also quite common for a minor OS revision to require recompilation of
# top. Both of these problems are especially prevalent on Suns. For
# example, a top executable made under SunOS 4.1.1 will not run correctly
# under SunOS 4.1.2, and vice versa. "metatop" attempts to solve this
# problem by choosing one of several possible top executables to run then
# executing it.
#
# To use metatop your operating system needs to have the command "uname"
# as part of the standard OS release. MAKE SURE IT DOES before proceeding.
# It will try to execute the command "top-`uname -m`-`uname -r`" For
# example, on a sparcstation 1 running SunOS 4.1.1, it will try to run
# "top-sun4c-4.1.1".
#
# INSTALLATION is easy. Just compile top as normal. Then use the command
# "make metainstall" (on the same machine!) instead of the usual. "make"
# will insure that this shell script is installed correctly then will install
# the most recently made top executable with the correct name. Remember:
# you will need to "make clean" and "make metainstall" on every different
# combination of sub-architecture and OS version that you have.
#
exec $0-`uname -m`-`uname -r` "$@"

View File

@ -1,36 +1,21 @@
# $FreeBSD$
TOPDIR= ${SRCTOP}/contrib/top
.PATH: ${TOPDIR}
PROG= top
SRCS= commands.c display.c machine.c screen.c top.c \
username.c utils.c version.c
username.c utils.c version.c
SRCS+= sigdesc.h top.local.h
CFLAGS+= -DHAVE_GETOPT -DHAVE_STRERROR -DORDER
CFLAGS+= -I${.CURDIR} -I${TOPDIR} -I.
CFLAGS+= -DHAVE_GETOPT -DHAVE_STRERROR -DORDER -I ${.OBJDIR}
MAN= top.1
WARNS?= 0
#
# The table size should be a prime number approximately twice as
# large as the number of lines in /etc/passwd. The default number
# is 20011; use /etc/make.conf to override this.
#
.if defined(TOP_TABLE_SIZE)
CFLAGS+= -D"Table_size=${TOP_TABLE_SIZE}"
.endif
LIBADD= ncursesw m kvm jail
CLEANFILES= sigdesc.h
SIGCONV_AWK= ${SRCTOP}/contrib/top/sigconv.awk
STAGED_INCLUDE_DIR?= ${DESTDIR}/usr/include
SIGNAL_H= ${STAGED_INCLUDE_DIR}/sys/signal.h
sigdesc.h: ${SIGCONV_AWK} ${SIGNAL_H}
awk -f ${SIGCONV_AWK} < ${SIGNAL_H} > ${.TARGET}
SIGNAL_H= ${SRCTOP}/sys/sys/signal.h
sigdesc.h: sigconv.awk ${SIGNAL_H}
awk -f ${SRCTOP}/usr.bin/top/sigconv.awk < ${SIGNAL_H} > ${.TARGET}
CLEANFILES+= top.local.h top.x
.SUFFIXES: .xs .x .hs .h
.xs.x .hs.h:
@${ECHO} Making ${.TARGET} from ${.IMPSRC}
@ -42,8 +27,4 @@ CLEANFILES+= top.local.h top.x
-e's,%random%,1,g' \
${.IMPSRC} > ${.TARGET}
CLEANFILES+= top.1
top.1: top.x top.local.1
cat ${.ALLSRC} > ${.TARGET}
.include <bsd.prog.mk>

543
usr.bin/top/top.1 Normal file
View File

@ -0,0 +1,543 @@
.\" NOTE: changes to the manual page for "top" should be made in the
.\" file "top.X" and NOT in the file "top.1".
.\" $FreeBSD$
.nr N -1
.nr D 2
.TH TOP 1 Local
.UC 4
.SH NAME
top \- display and update information about the top cpu processes
.SH SYNOPSIS
.B top
[
.B \-abCHIijnPqStuvwz
] [
.BI \-d count
] [
.BI \-m io | cpu
] [
.BI \-o field
] [
.BI \-s time
] [
.BI \-J jail
] [
.BI \-U username
] [
.I number
]
.SH DESCRIPTION
.\" This defines appropriate quote strings for nroff and troff
.ds lq \&"
.ds rq \&"
.if t .ds lq ``
.if t .ds rq ''
.\" Just in case these number registers aren't set yet...
.if \nN==0 .nr N 10
.if \nD==0 .nr D 2
.I Top
displays the top
.if !\nN==-1 \nN
processes on the system and periodically updates this information.
.if \nN==-1 \
\{\
If standard output is an intelligent terminal (see below) then
as many processes as will fit on the terminal screen are displayed
by default. Otherwise, a good number of them are shown (around 20).
.\}
Raw cpu percentage is used to rank the processes. If
.I number
is given, then the top
.I number
processes will be displayed instead of the default.
.PP
.I Top
makes a distinction between terminals that support advanced capabilities
and those that do not. This
distinction affects the choice of defaults for certain options. In the
remainder of this document, an \*(lqintelligent\*(rq terminal is one that
supports cursor addressing, clear screen, and clear to end of line.
Conversely, a \*(lqdumb\*(rq terminal is one that does not support such
features. If the output of
.I top
is redirected to a file, it acts as if it were being run on a dumb
terminal.
.SH OPTIONS
.TP
.B \-C
Toggle CPU display mode.
By default top displays the weighted CPU percentage in the WCPU column
(this is the same value that
.IR ps (1)
displays as CPU).
Each time
.B \-C
flag is passed it toggles between \*(lqraw cpu\*(rq mode
and \*(lqweighted cpu\*(rq mode, showing the \*(lqCPU\*(rq or
the \*(lqWCPU\*(rq column respectively.
.TP
.B \-S
Show system processes in the display. Normally, system processes such as
the pager and the swapper are not shown. This option makes them visible.
.TP
.B \-a
Display command names derived from the argv[] vector, rather than real
executable name. It's useful when you want to watch applications, that
puts their status information there. If the real name differs from argv[0],
it will be displayed in parenthesis.
.TP
.B \-b
Use \*(lqbatch\*(rq mode. In this mode, all input from the terminal is
ignored. Interrupt characters (such as ^C and ^\e) still have an effect.
This is the default on a dumb terminal, or when the output is not a terminal.
.TP
.B \-H
Display each thread for a multithreaded process individually.
By default a single summary line is displayed for each process.
.TP
.B \-i
Use \*(lqinteractive\*(rq mode. In this mode, any input is immediately
read for processing. See the section on \*(lqInteractive Mode\*(rq
for an explanation of
which keys perform what functions. After the command is processed, the
screen will immediately be updated, even if the command was not
understood. This mode is the default when standard output is an
intelligent terminal.
.TP
.B \-I
Do not display idle processes.
By default, top displays both active and idle processes.
.TP
.B \-j
Display the
.IR jail (8)
ID.
.TP
.B \-t
Do not display the
.I top
process.
.TP
.BI \-m display
Display either 'cpu' or 'io' statistics. Default is 'cpu'.
.TP
.B \-n
Use \*(lqnon-interactive\*(rq mode. This is identical to \*(lqbatch\*(rq
mode.
.TP
.B \-P
Display per-cpu CPU usage statistics.
.TP
.B \-q
Renice
.I top
to -20 so that it will run faster. This can be used when the system is
being very sluggish to improve the possibility of discovering the problem.
This option can only be used by root.
.TP
.B \-u
Do not take the time to map uid numbers to usernames. Normally,
.I top
will read as much of the file \*(lq/etc/passwd\*(rq as is necessary to map
all the user id numbers it encounters into login names. This option
disables all that, while possibly decreasing execution time. The uid
numbers are displayed instead of the names.
.TP
.B \-v
Write version number information to stderr then exit immediately.
No other processing takes place when this option is used. To see current
revision information while top is running, use the help command \*(lq?\*(rq.
.TP
.B \-w
Display approximate swap usage for each process.
.TP
.B \-z
Do not display the system idle process.
.TP
.BI \-d count
Show only
.I count
displays, then exit. A display is considered to be one update of the
screen. This option allows the user to select the number of displays he
wants to see before
.I top
automatically exits. For intelligent terminals, no upper limit
is set. The default is 1 for dumb terminals.
.TP
.BI \-s time
Set the delay between screen updates to
.I time
seconds. The default delay between updates is \nD seconds.
.TP
.BI \-o field
Sort the process display area on the specified field. The field name
is the name of the column as seen in the output, but in lower case:
\*(lqcpu\*(lq, \*(rqsize\*(lq, \*(rqres\*(lq, \*(rqtime\*(lq,
\*(rqpri\*(lq, \*(rqthreads\*(lq, \*(lqtotal\*(lq, \*(rqread\*(lq,
\*(rqwrite\*(lq, \*(rqfault\*(lq, \*(rqvcsw\*(lq, \*(rqivcsw\*(lq,
\*(lqjid\*(lq, \*(rqswap\*(lq or \*(rqpid\*(lq.
.TP
.BI \-J jail
Show only those processes owned by
.IR jail .
This may be either the
.B jid
or
.B name
of the jail.
Use
.B 0
to limit to host processes.
Using this option implies the
.B \-j
flag.
.PP
.BI \-U username
Show only those processes owned by
.IR username .
This option currently only accepts usernames and will not understand
uid numbers.
.PP
Both
.I count
and
.I number
fields can be specified as \*(lqinfinite\*(rq, indicating that they can
stretch as far as possible. This is accomplished by using any proper
prefix of the keywords
\*(lqinfinity\*(rq,
\*(lqmaximum\*(rq,
or
\*(lqall\*(rq.
The default for
.I count
on an intelligent terminal is, in fact,
.BI infinity .
.PP
The environment variable
.B TOP
is examined for options before the command line is scanned. This enables
a user to set his or her own defaults. The number of processes to display
can also be specified in the environment variable
.BR TOP .
The options
.BR \-a ,
.BR \-C ,
.BR \-H ,
.BR \-I ,
.BR \-j ,
.BR \-P ,
.BR \-S ,
.BR \-t ,
.BR \-u ,
.BR \-w ,
and
.B \-z
are actually toggles. A second specification of any of these options
will negate the first. Thus a user who has the environment variable
.B TOP
set to \*(lq\-I\*(rq may use the command \*(lqtop \-I\*(rq to see idle processes.
.SH "INTERACTIVE MODE"
When
.I top
is running in \*(lqinteractive mode\*(rq, it reads commands from the
terminal and acts upon them accordingly. In this mode, the terminal is
put in \*(lqCBREAK\*(rq, so that a character will be
processed as soon as it is typed. Almost always, a key will be
pressed when
.I top
is between displays; that is, while it is waiting for
.I time
seconds to elapse. If this is the case, the command will be
processed and the display will be updated immediately thereafter
(reflecting any changes that the command may have specified). This
happens even if the command was incorrect. If a key is pressed while
.I top
is in the middle of updating the display, it will finish the update and
then process the command. Some commands require additional information,
and the user will be prompted accordingly. While typing this information
in, the user's erase and kill keys (as set up by the command
.IR stty )
are recognized, and a newline terminates the input.
.PP
These commands are currently recognized (^L refers to control-L):
.TP
.B ^L
Redraw the screen.
.IP "\fBh\fP\ or\ \fB?\fP"
Display a summary of the commands (help screen). Version information
is included in this display.
.TP
.B q
Quit
.IR top.
.TP
.B d
Change the number of displays to show (prompt for new number).
Remember that the next display counts as one, so typing
.B d1
will make
.I top
show one final display and then immediately exit.
.TP
.B m
Toggle the display between 'cpu' and 'io' modes.
.TP
.B n or #
Change the number of processes to display (prompt for new number).
.TP
.B s
Change the number of seconds to delay between displays
(prompt for new number).
.TP
.B S
Toggle the display of system processes.
.TP
.B a
Toggle the display of process titles.
.TP
.B k
Send a signal (\*(lqkill\*(rq by default) to a list of processes. This
acts similarly to the command
.IR kill (1)).
.TP
.B r
Change the priority (the \*(lqnice\*(rq) of a list of processes.
This acts similarly to the command
.IR renice (8)).
.TP
.B u
Display only processes owned by a specific set of usernames (prompt for
username). If the username specified is simply \*(lq+\*(rq or \*(lq-\*(rq,
then processes belonging to all users will be displayed. Usernames can be added
to and removed from the set by prepending them with \*(lq+\*(rq and
\*(lq-\*(rq, respectively.
.TP
.B o
Change the order in which the display is sorted. This command is not
available on all systems. The sort key names vary from system to system
but usually include: \*(lqcpu\*(rq, \*(lqres\*(rq, \*(lqsize\*(rq,
\*(lqtime\*(rq. The default is cpu.
.TP
.B e
Display a list of system errors (if any) generated by the last
.BR k ill
or
.BR r enice
command.
.TP
.B H
Toggle the display of threads.
.TP
.B i
(or
.BR I )
Toggle the display of idle processes.
.TP
.B j
Toggle the display of
.IR jail (8)
ID.
.TP
.B J
Display only processes owned by a specific jail (prompt for jail).
If the jail specified is simply \*(lq+\*(rq, then processes belonging
to all jails and the host will be displayed.
This will also enable the display of JID.
.TP
.B P
Toggle the display of per-CPU statistics.
.TP
.B t
Toggle the display of the
.I top
process.
.TP
.B w
Toggle the display of swap usage.
.TP
.B z
Toggle the display of the system idle process.
.SH "THE DISPLAY"
The actual display varies depending on the specific variant of Unix
that the machine is running. This description may not exactly match
what is seen by top running on this particular machine. Differences
are listed at the end of this manual entry.
.PP
The top few lines of the display show general information
about the state of the system, including
the last process id assigned to a process (on most systems),
the three load averages,
the current time,
the number of existing processes,
the number of processes in each state
(sleeping, running, starting, zombies, and stopped),
and a percentage of time spent in each of the processor states
(user, nice, system, and idle).
It also includes information about physical and virtual memory allocation.
.PP
The remainder of the screen displays information about individual
processes. This display is similar in spirit to
.IR ps (1)
but it is not exactly the same. PID is the process id,
JID, when displayed, is the
.IR jail (8)
ID corresponding to the process,
USERNAME is the name of the process's owner (if
.B \-u
is specified, a UID column will be substituted for USERNAME),
PRI is the current priority of the process,
NICE is the nice amount (in the range \-20 to 20),
SIZE is the total size of the process (text, data, and stack),
RES is the current amount of resident memory,
SWAP is the approximate amount of swap, if enabled
(SIZE, RES and SWAP are given in kilobytes),
STATE is the current state (one of \*(lqSTART\*(rq, \*(lqRUN\*(rq
(shown as \*(lqCPUn\*(rq on SMP systems), \*(lqSLEEP\*(rq, \*(lqSTOP\*(rq,
\*(lqZOMB\*(rq, \*(lqWAIT\*(rq, \*(lqLOCK\*(rq or the event on which the
process waits),
C is the processor number on which the process is executing
(visible only on SMP systems),
TIME is the number of system and user cpu seconds that the process has used,
WCPU, when displayed, is the weighted cpu percentage (this is the same
value that
.IR ps (1)
displays as CPU),
CPU is the raw percentage and is the field that is sorted to determine
the order of the processes, and
COMMAND is the name of the command that the process is currently running
(if the process is swapped out, this column is marked \*(lq<swapped>\*(rq).
.SH NOTES
If a process is in the \*(lqSLEEP\*(rq or \*(lqLOCK\*(rq state,
the state column will report the name of the event or lock on which the
process is waiting.
Lock names are prefixed with an asterisk \*(lq*\*(rq while sleep events
are not.
.SH AUTHOR
William LeFebvre, EECS Department, Northwestern University
.SH ENVIRONMENT
.DT
TOP user-configurable defaults for options.
.SH FILES
.DT
/dev/kmem kernel memory
.br
/dev/mem physical memory
.br
/etc/passwd used to map uid numbers to user names
.br
/boot/kernel/kernel system image
.SH BUGS
Don't shoot me, but the default for
.B \-I
has changed once again. So many people were confused by the fact that
.I top
wasn't showing them all the processes that I have decided to make the
default behavior show idle processes, just like it did in version 2.
But to appease folks who can't stand that behavior, I have added the
ability to set \*(lqdefault\*(rq options in the environment variable
.B TOP
(see the OPTIONS section). Those who want the behavior that version
3.0 had need only set the environment variable
.B TOP
to \*(lq\-I\*(rq.
.PP
The command name for swapped processes should be tracked down, but this
would make the program run slower.
.PP
As with
.IR ps (1),
things can change while
.I top
is collecting information for an update. The picture it gives is only a
close approximation to reality.
.SH "SEE ALSO"
kill(1),
ps(1),
stty(1),
mem(4),
renice(8)
.\" $FreeBSD$
.SH "FreeBSD NOTES"
.SH DESCRIPTION OF MEMORY
Mem: 61M Active, 86M Inact, 368K Laundry, 22G Wired, 102G Free
ARC: 15G Total, 9303M MFU, 6155M MRU, 1464K Anon, 98M Header, 35M Other
15G Compressed, 27G Uncompressed, 1.75:1 Ratio, 174M Overhead
Swap: 4096M Total, 532M Free, 13% Inuse, 80K In, 104K Out
.TP
.B K:
Kilobyte
.TP
.B M:
Megabyte
.TP
.B G:
Gigabyte
.TP
.B %:
1/100
.SS Physical Memory Stats
.TP
.B Active:
number of bytes active
.TP
.B Inact:
number of clean bytes inactive
.TP
.B Laundry:
number of dirty bytes queued for laundering
.TP
.B Wired:
number of bytes wired down, including BIO-level cached file data pages
.TP
.B Buf:
number of bytes used for BIO-level disk caching
.TP
.B Free:
number of bytes free
.SS ZFS ARC Stats
These stats are only displayed when the ARC is in use.
.TP
.B Total:
number of wired bytes used for the ZFS ARC
.TP
.B MRU:
number of ARC bytes holding most recently used data
.TP
.B MFU:
number of ARC bytes holding most frequently used data
.TP
.B Anon:
number of ARC bytes holding in flight data
.TP
.B Header:
number of ARC bytes holding headers
.TP
.B Other:
miscellaneous ARC bytes
.TP
.B Compressed:
bytes of memory used by ARC caches
.TP
.B Uncompressed:
bytes of data stored in ARC caches before compression
.TP
.B Ratio:
compression ratio of data cached in the ARC
.SS Swap Stats
.TP
.B Total:
total available swap usage
.TP
.B Free:
total free swap usage
.TP
.B Inuse:
swap usage
.TP
.B In:
bytes paged in from swap devices (last interval)
.TP
.B Out:
bytes paged out to swap devices (last interval)

View File

@ -1,84 +0,0 @@
.\" $FreeBSD$
.SH "FreeBSD NOTES"
.SH DESCRIPTION OF MEMORY
Mem: 61M Active, 86M Inact, 368K Laundry, 22G Wired, 102G Free
ARC: 15G Total, 9303M MFU, 6155M MRU, 1464K Anon, 98M Header, 35M Other
15G Compressed, 27G Uncompressed, 1.75:1 Ratio, 174M Overhead
Swap: 4096M Total, 532M Free, 13% Inuse, 80K In, 104K Out
.TP
.B K:
Kilobyte
.TP
.B M:
Megabyte
.TP
.B G:
Gigabyte
.TP
.B %:
1/100
.SS Physical Memory Stats
.TP
.B Active:
number of bytes active
.TP
.B Inact:
number of clean bytes inactive
.TP
.B Laundry:
number of dirty bytes queued for laundering
.TP
.B Wired:
number of bytes wired down, including BIO-level cached file data pages
.TP
.B Buf:
number of bytes used for BIO-level disk caching
.TP
.B Free:
number of bytes free
.SS ZFS ARC Stats
These stats are only displayed when the ARC is in use.
.TP
.B Total:
number of wired bytes used for the ZFS ARC
.TP
.B MRU:
number of ARC bytes holding most recently used data
.TP
.B MFU:
number of ARC bytes holding most frequently used data
.TP
.B Anon:
number of ARC bytes holding in flight data
.TP
.B Header:
number of ARC bytes holding headers
.TP
.B Other:
miscellaneous ARC bytes
.TP
.B Compressed:
bytes of memory used by ARC caches
.TP
.B Uncompressed:
bytes of data stored in ARC caches before compression
.TP
.B Ratio:
compression ratio of data cached in the ARC
.SS Swap Stats
.TP
.B Total:
total available swap usage
.TP
.B Free:
total free swap usage
.TP
.B Inuse:
swap usage
.TP
.B In:
bytes paged in from swap devices (last interval)
.TP
.B Out:
bytes paged out to swap devices (last interval)