top: add -m ("memory") option

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2009-09-11 23:26:42 +02:00
parent 56573cb4f7
commit 0052882200
4 changed files with 86 additions and 57 deletions

23
TODO
View File

@ -320,6 +320,29 @@ vdprintf() -> similar sized functionality
Unicode work needed: Unicode work needed:
Unicode support uses libc multibyte functions if LOCALE_SUPPORT is on
(in this case, the code will also support many more encodings),
or uses a limited subset of re-implemented multibyte functions
which only understand "one byte == one char" and unicode.
This is useful if you build against uclibc with locale support disabled.
Unicode-dependent applets must call check_unicode_in_env() when they
begin executing.
Applet code may conditionalize on FEATURE_ASSUME_UNICODE
in order to use more efficient code if unicode support is not requested.
Available functions (if you need more, implement them in libbb/unicode.c
so that they work without LOCALE_SUPPORT too):
int bb_mbstrlen(str) - multibyte-aware strlen
size_t mbstowcs(wdest, src, n)
size_t wcstombs(dest, wsrc, n)
size_t wcrtomb(str, wc, wstate)
int iswspace(wc)
int iswalnum(wc)
int iswpunct(wc)
Applets which only need to align columns on screen correctly: Applets which only need to align columns on screen correctly:
ls - already done, use source as an example ls - already done, use source as an example

View File

@ -4566,7 +4566,7 @@
"Defaults: SECS: 10, SIG: TERM." \ "Defaults: SECS: 10, SIG: TERM." \
#define top_trivial_usage \ #define top_trivial_usage \
"[-b] [-nCOUNT] [-dSECONDS]" "[-b] [-nCOUNT] [-dSECONDS]" IF_FEATURE_TOPMEM(" [-m]")
#define top_full_usage "\n\n" \ #define top_full_usage "\n\n" \
"Provide a view of process activity in real time.\n" \ "Provide a view of process activity in real time.\n" \
"Read the status of all processes from /proc each SECONDS\n" \ "Read the status of all processes from /proc each SECONDS\n" \

View File

@ -147,15 +147,15 @@ const char *opt_complementary
Special characters: Special characters:
"-" A dash as the first char in a opt_complementary group forces "-" A group consisting of just a dash forces all arguments
all arguments to be treated as options, even if they have to be treated as options, even if they have no leading dashes.
no leading dashes. Next char in this case can't be a digit (0-9), Next char in this case can't be a digit (0-9), use ':' or end of line.
use ':' or end of line. For example: Example:
opt_complementary = "-:w-x:x-w"; opt_complementary = "-:w-x:x-w"; // "-w-x:x-w" would also work,
getopt32(argv, "wx"); getopt32(argv, "wx"); // but is less readable
Allows any arguments to be given without a dash (./program w x) This makes it possible to use options without a dash (./program w x)
as well as with a dash (./program -x). as well as with a dash (./program -x).
NB: getopt32() will leak a small amount of memory if you use NB: getopt32() will leak a small amount of memory if you use

View File

@ -131,7 +131,8 @@ enum {
OPT_d = (1 << 0), OPT_d = (1 << 0),
OPT_n = (1 << 1), OPT_n = (1 << 1),
OPT_b = (1 << 2), OPT_b = (1 << 2),
OPT_EOF = (1 << 3), /* pseudo: "we saw EOF in stdin" */ OPT_m = (1 << 3),
OPT_EOF = (1 << 4), /* pseudo: "we saw EOF in stdin" */
}; };
#define OPT_BATCH_MODE (option_mask32 & OPT_b) #define OPT_BATCH_MODE (option_mask32 & OPT_b)
@ -895,7 +896,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
pfd[0].fd = 0; pfd[0].fd = 0;
pfd[0].events = POLLIN; pfd[0].events = POLLIN;
#endif /* FEATURE_USE_TERMIOS */ #endif
INIT_G(); INIT_G();
@ -909,10 +910,15 @@ int top_main(int argc UNUSED_PARAM, char **argv)
#endif #endif
/* all args are options; -n NUM */ /* all args are options; -n NUM */
opt_complementary = "-"; opt_complementary = "-"; /* options can be specified w/o dash */
col = getopt32(argv, "d:n:b", &str_interval, &str_iterations); col = getopt32(argv, "d:n:b"IF_FEATURE_TOPMEM("m"), &str_interval, &str_iterations);
#if ENABLE_FEATURE_TOPMEM
if (col & OPT_m) /* -m (busybox specific) */
scan_mask = TOPMEM_MASK;
#endif
if (col & OPT_d) { if (col & OPT_d) {
/* work around for "-d 1" -> "-d -1" done by getopt32 */ /* work around for "-d 1" -> "-d -1" done by getopt32
* (opt_complementary == "-" does this) */
if (str_interval[0] == '-') if (str_interval[0] == '-')
str_interval++; str_interval++;
/* Need to limit it to not overflow poll timeout */ /* Need to limit it to not overflow poll timeout */
@ -934,7 +940,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
bb_signals(BB_FATAL_SIGS, sig_catcher); bb_signals(BB_FATAL_SIGS, sig_catcher);
tcsetattr_stdin_TCSANOW(&new_settings); tcsetattr_stdin_TCSANOW(&new_settings);
#endif /* FEATURE_USE_TERMIOS */ #endif
#if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE #if ENABLE_FEATURE_TOP_CPU_USAGE_PERCENTAGE
sort_function[0] = pcpu_sort; sort_function[0] = pcpu_sort;
@ -942,7 +948,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
sort_function[2] = time_sort; sort_function[2] = time_sort;
#else #else
sort_function[0] = mem_sort; sort_function[0] = mem_sort;
#endif /* FEATURE_TOP_CPU_USAGE_PERCENTAGE */ #endif
while (1) { while (1) {
procps_status_t *p = NULL; procps_status_t *p = NULL;
@ -956,7 +962,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
sleep(interval); sleep(interval);
continue; continue;
} }
#endif /* FEATURE_USE_TERMIOS */ #endif
if (col > LINE_BUF_SIZE-2) /* +2 bytes for '\n', NUL, */ if (col > LINE_BUF_SIZE-2) /* +2 bytes for '\n', NUL, */
col = LINE_BUF_SIZE-2; col = LINE_BUF_SIZE-2;
@ -1015,7 +1021,7 @@ int top_main(int argc UNUSED_PARAM, char **argv)
qsort(top, ntop, sizeof(top_status_t), (void*)mult_lvl_cmp); qsort(top, ntop, sizeof(top_status_t), (void*)mult_lvl_cmp);
#else #else
qsort(top, ntop, sizeof(top_status_t), (void*)(sort_function[0])); qsort(top, ntop, sizeof(top_status_t), (void*)(sort_function[0]));
#endif /* FEATURE_TOP_CPU_USAGE_PERCENTAGE */ #endif
} }
#if ENABLE_FEATURE_TOPMEM #if ENABLE_FEATURE_TOPMEM
else { /* TOPMEM */ else { /* TOPMEM */