bash top fourth_line - ceragon/LinuxDoc GitHub Wiki

top fourth line

完整日志

top - 10:49:30 up 4 days, 13:08,  1 user,  load average: 0.10, 0.28, 0.20
任务: 306 total,   1 running, 304 sleeping,   0 stopped,   1 zombie
%Cpu(s):  3.5 us,  1.4 sy,  0.0 ni, 95.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15897.9 total,    235.3 free,   8007.0 used,   7655.7 buff/cache
MiB Swap:   2048.0 total,   1687.5 free,    360.5 used.   7403.8 avail Mem 

 进程号 USER      PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND                                                                                              
 446465 ceragon   20   0   11.7g   5.1g 535188 S  25.0  33.0  38:23.92 ld-linux-x86-64                                                                                      
 517659 ceragon   20   0   15112   3984   3204 R  12.5   0.0   0:00.02 top                                                                                                  
    452 root     -51   0       0      0      0 S   6.2   0.0   0:52.38 irq/168-iwlwifi                                                                                      
 328018 ceragon   20   0   11.7g   2.4g 465028 S   6.2  15.2  69:05.34 ld-linux-x86-64                                                                                      
      1 root      20   0  169256  11512   6604 S   0.0   0.1   0:09.36 systemd                                                                                              
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.09 kthreadd                                                                                             
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                                               
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp

信息显示

内容

MiB Mem :  15897.9 total,    235.3 free,   8007.0 used,   7655.7 buff/cache
MiB Swap:   2048.0 total,   1687.5 free,    360.5 used.   7403.8 avail Mem 

代码

const char *Uniq_nlstab[uniq_MAX];
static void build_uniq_nlstab (void) {
    Uniq_nlstab[MEMORY_lines_fmt] = _(""
      "%s %s:~3 %9.9s~2total,~3 %9.9s~2free,~3 %9.9s~2used,~3 %9.9s~2buff/cache~3\n"
      "%s %s:~3 %9.9s~2total,~3 %9.9s~2free,~3 %9.9s~2used.~3 %9.9s~2avail %s~3\n");
}
const char *Norm_nlstab[norm_MAX];
static void build_norm_nlstab (void) {
    Norm_nlstab[WORD_abv_mem_txt] = _("Mem ");
    Norm_nlstab[WORD_abv_swp_txt] = _("Swap");
}
unsigned long kb_main_free;
unsigned long kb_main_total;
unsigned long kb_swap_free;
unsigned long kb_swap_total;
unsigned long kb_main_available;
unsigned long kb_swap_used;
unsigned long kb_main_used;

static void summary_show (void) {
    struct {
        char buf[10];
    } buftab[8];
    #define bfT(n)  buftab[n].buf
    // kb 转 mb
    #define mkM(x) (float)kb_main_ ## x / scT(div)
    // kb 转 mb
    #define mkS(x) (float)kb_swap_ ## x / scT(div)
    unsigned long kb_main_my_misc = kb_main_buffers + kb_main_cached;
    // total=kb_main_total;     free=kb_main_free
    prT(bfT(0), mkM(total)); prT(bfT(1), mkM(free));
    // used=kb_main_used;       my_misc=kb_main_mymisc
    prT(bfT(2), mkM(used));  prT(bfT(3), mkM(my_misc));
    // total=kb_swap_total;     free=kb_swap_free
    prT(bfT(4), mkS(total)); prT(bfT(5), mkS(free));
    // used=kb_swap_used;       available=kb_main_available
    prT(bfT(6), mkS(used));  prT(bfT(7), mkM(available));
    show_special(0, fmtmk(N_unq(MEMORY_lines_fmt)
            , scT(label), N_txt(WORD_abv_mem_txt), bfT(0), bfT(1), bfT(2), bfT(3)
            , scT(label), N_txt(WORD_abv_swp_txt), bfT(4), bfT(5), bfT(6), bfT(7)
            , N_txt(WORD_abv_mem_txt)));
}

定时刷新

调用链

int main (int dont_care_argc, char **argv) {
    for (;;) {
        frame_make();
    }
}
static void frame_make (void) {
    sysinfo_refresh(0);
}
static void sysinfo_refresh (int forced) {
    static time_t sav_secs;
    time_t cur_secs;
    cur_secs = time(NULL);
    if (3 <= cur_secs - sav_secs) {
        meminfo();
        sav_secs = cur_secs;
    }
}

主体逻辑

$ cat /proc/meminfo 
MemTotal:       16279476 kB
MemFree:         8392428 kB
MemAvailable:    9981320 kB
Buffers:          127504 kB
Cached:          1722676 kB
SwapCached:            0 kB
typedef struct mem_table_struct {
  const char *name;     /* memory type name */
  unsigned long *slot; /* slot in return struct */
} mem_table_struct;
#define MEMINFO_FILE "/proc/meminfo"
static int meminfo_fd = -1;
static char buf[8192];
void meminfo(void){
    char namebuf[32];
    // findme 就是 namebuf
    mem_table_struct findme = { namebuf, NULL};
    mem_table_struct *found;
    char *head;
    char *tail;
    static const mem_table_struct mem_table[] = {
            {"Buffers",      &kb_main_buffers},
            {"Cached",       &kb_page_cache},
            {"MemAvailable", &kb_main_available},
            {"MemFree",      &kb_main_free},
            {"MemTotal",     &kb_main_total}, 
            {"SReclaimable", &kb_slab_reclaimable},
            {"SwapFree",     &kb_swap_free}, 
            {"SwapTotal",    &kb_swap_total},
    }
    // 将 /proc/meminfo 的内容复制到 buf 中
    FILE_TO_BUF(MEMINFO_FILE,meminfo_fd);
    head = buf;
    for(;;){
        tail = strchr(head, ':');
        *tail = '\0';
        // 将 head 的内容复制到 namebuf 中
        // 由于上面将 : 替换为了 \0,所以只会复制 : 前面的内容
        strcpy(namebuf,head);
        // 就是检索 name 并找到相应的结构体。findme 就是 namebuf
        found = bsearch(&findme, mem_table, mem_table_count,
            sizeof(mem_table_struct), compare_mem_table_structs
            );
        head = tail+1;
        // 为 slot 也就是 value 赋值
        *(found->slot) = (unsigned long)strtoull(head,&tail,10);
    }
    
    kb_main_cached = kb_page_cache + kb_slab_reclaimable;
    // 交换空间已使用内存
    kb_swap_used = kb_swap_total - kb_swap_free;
    
    mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;
    kb_main_used = (unsigned long)mem_used;
}
⚠️ **GitHub.com Fallback** ⚠️