top,ps: improve /proc/PID/cmdinfo reading code

function                                             old     new   delta
display_status                                         -    1231   +1231
read_cmdline                                           -     101    +101
parse_conf                                          1284    1303     +19
arith                                               2033    2042      +9
collect_blk                                          467     474      +7
fsck_main                                           1909    1911      +2
dhcprelay_main                                      1125    1122      -3
singlemount                                         4555    4547      -8
read_close                                            50      36     -14
get_lcm                                              123     105     -18
ed_main                                             3111    3084     -27
func_args                                             73      28     -45
procps_scan                                          732     658     -74
top_main                                            2187     899   -1288
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 4/8 up/down: 1369/-1477)       Total: -108 bytes
   text    data     bss     dec     hex filename
 676048    2744   13968  692760   a9218 busybox_old
 675940    2744   13968  692652   a91ac busybox_unstripped
This commit is contained in:
Denis Vlasenko 2007-06-30 14:47:41 +00:00
parent 8b1409896d
commit 98ebab8b76
5 changed files with 80 additions and 59 deletions

View file

@ -102,7 +102,7 @@ procps_status_t *alloc_procps_scan(int flags)
void free_procps_scan(procps_status_t* sp)
{
closedir(sp->dir);
free(sp->cmd);
free(sp->argv0);
USE_SELINUX(free(sp->context);)
free(sp);
}
@ -266,6 +266,7 @@ procps_status_t *procps_scan(procps_status_t* sp, int flags)
}
#if 0 /* PSSCAN_CMD is not used */
if (flags & (PSSCAN_CMD|PSSCAN_ARGV0)) {
if (sp->argv0) {
free(sp->argv0);
@ -292,10 +293,42 @@ procps_status_t *procps_scan(procps_status_t* sp, int flags)
sp->cmd = xstrdup(buf);
}
}
#else
if (flags & PSSCAN_ARGV0) {
if (sp->argv0) {
free(sp->argv0);
sp->argv0 = NULL;
}
strcpy(filename_tail, "/cmdline");
n = read_to_buf(filename, buf);
if (n <= 0)
break;
if (flags & PSSCAN_ARGV0)
sp->argv0 = xstrdup(buf);
}
#endif
break;
}
return sp;
}
void read_cmdline(char *buf, int col, unsigned pid, const char *comm)
{
ssize_t sz;
char filename[sizeof("/proc//cmdline") + sizeof(int)*3];
sprintf(filename, "/proc/%u/cmdline", pid);
sz = open_read_close(filename, buf, col);
if (sz > 0) {
buf[sz] = '\0';
while (--sz >= 0)
if ((unsigned char)(buf[sz]) < ' ')
buf[sz] = ' ';
} else {
snprintf(buf, col, "[%s]", comm);
}
}
/* from kernel:
// pid comm S ppid pgid sid tty_nr tty_pgrp flg
sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \