diff --git a/NEWS b/NEWS index 8b919011..cc660c80 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ procps-3.2.3 --> procps-3.2.4 +support 64-bit MIPS with n32 binary +sparc32 optimized for sparc32 again ps: more room for some columns +watch: passes COLUMNS and LINES in environment procps-3.2.2 --> procps-3.2.3 diff --git a/proc/module.mk b/proc/module.mk index 30fd76b1..48c87e45 100644 --- a/proc/module.mk +++ b/proc/module.mk @@ -44,6 +44,8 @@ ifeq ($(SHARED),1) ALL += proc/$(SONAME) INSTALL += ldconfig LIBFLAGS := -DSHARED=1 $(FPIC) +# This is in gcc 3.5, but exported functions must be marked. +#LIBFLAGS += $(call check_gcc,-fvisibility=hidden,) LIBPROC := proc/$(SONAME) else ALL += proc/$(ANAME) diff --git a/proc/procps.h b/proc/procps.h index c704e4ac..0aa49486 100644 --- a/proc/procps.h +++ b/proc/procps.h @@ -90,10 +90,13 @@ // so no need to do dynamic linking at run-time. // This might work with slightly older compilers too. #define HIDDEN __attribute__((visibility("hidden"))) +// The opposite, in case -fvisibility=hidden used +#define EXPORT __attribute__((visibility("default"))) // Tell g++ that a function won't throw exceptions. #define NOTHROW __attribute__((__nothrow__)) #else #define HIDDEN +#define EXPORT #define NOTHROW #endif diff --git a/proc/sysinfo.c b/proc/sysinfo.c index df9f5b0e..6c266fd0 100644 --- a/proc/sysinfo.c +++ b/proc/sysinfo.c @@ -488,7 +488,7 @@ unsigned long kb_inact_laundry; unsigned long kb_inact_dirty; unsigned long kb_inact_clean; unsigned long kb_inact_target; -unsigned long kb_swap_cached; /* late 2.4 only */ +unsigned long kb_swap_cached; /* late 2.4 and 2.6+ only */ /* derived values */ unsigned long kb_swap_used; unsigned long kb_main_used; @@ -501,6 +501,10 @@ unsigned long kb_dirty; unsigned long kb_inactive; unsigned long kb_mapped; unsigned long kb_pagetables; +// seen on a 2.6.x kernel: +unsigned long kb_vmalloc_chunk; +unsigned long kb_vmalloc_total; +unsigned long kb_vmalloc_used; void meminfo(void){ char namebuf[16]; /* big enough to hold any row name */ @@ -525,7 +529,7 @@ void meminfo(void){ {"LowTotal", &kb_low_total}, {"Mapped", &kb_mapped}, // kB version of vmstat nr_mapped {"MemFree", &kb_main_free}, // important - {"MemShared", &kb_main_shared}, // important + {"MemShared", &kb_main_shared}, // important, but now gone! {"MemTotal", &kb_main_total}, // important {"PageTables", &kb_pagetables}, // kB version of vmstat nr_page_table_pages {"ReverseMaps", &nr_reversemaps}, // same as vmstat nr_page_table_pages @@ -533,6 +537,9 @@ void meminfo(void){ {"SwapCached", &kb_swap_cached}, {"SwapFree", &kb_swap_free}, // important {"SwapTotal", &kb_swap_total}, // important + {"VmallocChunk", &kb_vmalloc_chunk}, + {"VmallocTotal", &kb_vmalloc_total}, + {"VmallocUsed", &kb_vmalloc_used}, {"Writeback", &kb_writeback}, // kB version of vmstat nr_writeback }; const int mem_table_count = sizeof(mem_table)/sizeof(mem_table_struct); @@ -621,29 +628,48 @@ void vminfo(void){ char *tail; static const vm_table_struct vm_table[] = { {"allocstall", &vm_allocstall}, + {"kswapd_inodesteal", &vm_}, {"kswapd_steal", &vm_kswapd_steal}, {"nr_dirty", &vm_nr_dirty}, // page version of meminfo Dirty {"nr_mapped", &vm_nr_mapped}, // page version of meminfo Mapped {"nr_page_table_pages", &vm_nr_page_table_pages},// same as meminfo PageTables {"nr_pagecache", &vm_nr_pagecache}, // gone in 2.5.66+ kernels - {"nr_reverse_maps", &vm_nr_reverse_maps}, // page version of meminfo ReverseMaps + {"nr_reverse_maps", &vm_nr_reverse_maps}, // page version of meminfo ReverseMaps GONE {"nr_slab", &vm_nr_slab}, // page version of meminfo Slab + {"nr_unstable", &vm_}, {"nr_writeback", &vm_nr_writeback}, // page version of meminfo Writeback {"pageoutrun", &vm_pageoutrun}, {"pgactivate", &vm_pgactivate}, - {"pgalloc", &vm_pgalloc}, + {"pgalloc", &vm_pgalloc}, // GONE (now separate dma,high,normal) + {"pgalloc_dma", &vm_}, + {"pgalloc_high", &vm_}, + {"pgalloc_normal", &vm_}, {"pgdeactivate", &vm_pgdeactivate}, {"pgfault", &vm_pgfault}, {"pgfree", &vm_pgfree}, + {"pginodesteal", &vm_}, {"pgmajfault", &vm_pgmajfault}, {"pgpgin", &vm_pgpgin}, // important {"pgpgout", &vm_pgpgout}, // important - {"pgrefill", &vm_pgrefill}, + {"pgrefill", &vm_pgrefill}, // GONE (now separate dma,high,normal) + {"pgrefill_dma", &vm_}, + {"pgrefill_high", &vm_}, + {"pgrefill_normal", &vm_}, {"pgrotated", &vm_pgrotated}, - {"pgscan", &vm_pgscan}, - {"pgsteal", &vm_pgsteal}, + {"pgscan", &vm_pgscan}, // GONE (now separate direct,kswapd and dma,high,normal) + {"pgscan_direct_dma", &vm_}, + {"pgscan_direct_high", &vm_}, + {"pgscan_direct_normal", &vm_}, + {"pgscan_kswapd_dma", &vm_}, + {"pgscan_kswapd_high", &vm_}, + {"pgscan_kswapd_normal", &vm_}, + {"pgsteal", &vm_pgsteal}, // GONE (now separate dma,high,normal) + {"pgsteal_dma", &vm_}, + {"pgsteal_high", &vm_}, + {"pgsteal_normal", &vm_}, {"pswpin", &vm_pswpin}, // important {"pswpout", &vm_pswpout} // important + {"slabs_scanned", &vm_}, }; const int vm_table_count = sizeof(vm_table)/sizeof(vm_table_struct); diff --git a/ps/ps.1 b/ps/ps.1 index 12ab797b..b54daed8 100644 --- a/ps/ps.1 +++ b/ps/ps.1 @@ -550,8 +550,13 @@ parent process repeatedly forks off short\-lived children to do work. .TP .B c Show the true command name. This is derived from the name of the -executable file, rather than from the argv value which could be -modified by a user. Command arguments are not shown. +executable file, rather than from the argv value. Command arguments +and any modifications to them (see\ \fIsetproctitle\fR(3)) are +thus not shown. This option +effectively turns the \fBargs\fR format keyword into the \fBcomm\fR +format keyword; it is useful with the \fB\-f\fR format option and with +the various BSD\-style format options, which all normally +display the command arguments. See the \fB\-f\fR option, the format keyword \fBargs\fR, and the format keyword \fBcomm\fR. @@ -745,10 +750,6 @@ This is not ideal, and\ it does not conform to the standards that \fBps\fR otherwise conforms\ to. CPU\ usage is unlikely to add up to exactly\ 100%. -Programs swapped out to disk will be shown without command line arguments, -and unless the \fBc\fR option is given, -in\ brackets. - The SIZE and RSS fields don't count some parts of a process including the page tables, kernel stack, struct thread_info, and struct task_struct. This is usually at least 20\ KiB of memory that is always resident. @@ -946,6 +947,7 @@ keyword, the \fB\-f\fR option, and the \fBc\fR option. When specified last, this column will extend to the edge of the display. If \fBps\fR can not determine display width, as when output is redirected (piped) into a file or another command, the width of this column is undefined. +(it may be 80, unlimited, determined by the \fBTERM\fR variable, and so on) The \fBCOLUMNS\fR environment variable or \fB\-\-cols\fR option may be used to exactly determine the width in this case. The \fBw\fR or \fB\-w\fR option may be also be used to adjust width. @@ -1026,6 +1028,7 @@ keyword, the \fB\-f\fR option, and the \fBc\fR option. When specified last, this column will extend to the edge of the display. If \fBps\fR can not determine display width, as when output is redirected (piped) into a file or another command, the width of this column is undefined. +(it may be 80, unlimited, determined by the \fBTERM\fR variable, and so on) The \fBCOLUMNS\fR environment variable or \fB\-\-cols\fR option may be used to exactly determine the width in this case. The \fBw\fR or \fB\-w\fR option may be also be used to adjust width. diff --git a/watch.c b/watch.c index 66dde649..18ded5e5 100644 --- a/watch.c +++ b/watch.c @@ -25,6 +25,11 @@ #include #include "proc/procps.h" +#ifdef FORCE_8BIT +#undef isprint +#define isprint(x) ( (x>=' '&&x<='~') || (x>=0xa0) ) +#endif + static struct option longopts[] = { {"differences", optional_argument, 0, 'd'}, {"help", no_argument, 0, 'h'}, @@ -77,15 +82,54 @@ winch_handler(int notused) screen_size_changed = 1; } +static char env_col_buf[24]; +static char env_row_buf[24]; +static int incoming_cols; +static int incoming_rows; + static void get_terminal_size(void) { struct winsize w; - if (ioctl(2, TIOCGWINSZ, &w) == 0) { - if (w.ws_row > 0) - height = w.ws_row; - if (w.ws_col > 0) - width = w.ws_col; + if(!incoming_cols){ // have we checked COLUMNS? + const char *s = getenv("COLUMNS"); + incoming_cols = -1; + if(s && *s){ + long t; + char *endptr; + t = strtol(s, &endptr, 0); + if(!*endptr && (t>0) && (t<(long)666)) incoming_cols = (int)t; + width = incoming_cols; + snprintf(env_col_buf, sizeof env_col_buf, "COLUMNS=%d", width); + putenv(env_col_buf); + } + } + if(!incoming_rows){ // have we checked LINES? + const char *s = getenv("LINES"); + incoming_rows = -1; + if(s && *s){ + long t; + char *endptr; + t = strtol(s, &endptr, 0); + if(!*endptr && (t>0) && (t<(long)666)) incoming_rows = (int)t; + height = incoming_rows; + snprintf(env_row_buf, sizeof env_row_buf, "LINES=%d", height); + putenv(env_row_buf); + } + } + if (incoming_cols<0 || incoming_rows<0){ + if (ioctl(2, TIOCGWINSZ, &w) == 0) { + if (incoming_rows<0 && w.ws_row > 0){ + height = w.ws_row; + snprintf(env_row_buf, sizeof env_row_buf, "LINES=%d", height); + putenv(env_row_buf); + } + if (incoming_cols<0 && w.ws_col > 0){ + width = w.ws_col; + snprintf(env_col_buf, sizeof env_col_buf, "COLUMNS=%d", width); + putenv(env_col_buf); + } + } } }