【问题标题】:"ps aux" command in CC中的“ps aux”命令
【发布时间】:2020-11-20 23:50:11
【问题描述】:

对于一个学校项目,我需要在 C 中重新编写 ps aux 命令(如下图所示):

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 168028 12052 ?        Ss   06:20   0:07 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    06:20   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   06:20   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   06:20   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   06:20   0:00 [kworker/0:0H-kblockd]
root           9  0.0  0.0      0     0 ?        I<   06:20   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S    06:20   0:00 [ksoftirqd/0]
root          11  0.0  0.0      0     0 ?        I    06:20   0:03 [rcu_sched]
root          12  0.0  0.0      0     0 ?        S    06:20   0:00 [migration/0]
root          13  0.0  0.0      0     0 ?        S    06:20   0:00 [idle_inject/0]
root          14  0.0  0.0      0     0 ?        S    06:20   0:00 [cpuhp/0]
root          15  0.0  0.0      0     0 ?        S    06:20   0:00 [cpuhp/1]
root          16  0.0  0.0      0     0 ?        S    06:20   0:00 [idle_inject/1]
root          17  0.0  0.0      0     0 ?        S    06:20   0:00 [migration/1]
root          18  0.0  0.0      0     0 ?        S    06:20   0:00 [ksoftirqd/1]
root          20  0.0  0.0      0     0 ?        I<   06:20   0:00 [kworker/1:0H-kblockd]
root          21  0.0  0.0      0     0 ?        S    06:20   0:00 [cpuhp/2]
root          22  0.0  0.0      0     0 ?        S    06:20   0:00 [idle_inject/2]
root          23  0.0  0.0      0     0 ?        S    06:20   0:00 [migration/2]
root          24  0.0  0.0      0     0 ?        S    06:20   0:00 [ksoftirqd/2]

我设法重新编程了除 %CPU%MEM 之外的所有列。 和另一个一样,我知道我的答案在 /proc//[stat|status] 中,但我不知道我需要采用什么值以及计算百分比的公式是什么。

有什么想法吗?

【问题讨论】:

标签: c pid stat ps


【解决方案1】:

您显示的内容取决于您模仿的ps 命令。

BSD ps 手册页中提到了 %CPU:

进程的CPU利用率;这是之前(实际)时间最多一分钟的衰减平均值。因为计算它的时间基数不同(某些进程可能非常年轻),所有 %cpu 字段的总和可能超过 100%。

%mem 的描述是这样的:

此进程使用的实际内存百分比。

注意它说的是“真实”内存,我认为这意味着计算中不包括虚拟内存。

【讨论】:

  • 我认为问题在于如何获取这些信息
【解决方案2】:

查看source codeps 命令。

%CPU

如下:

  • pp->utime = /proc/[pid]/stat 的字段#14
  • pp->stime = /proc/[pid]/stat 的字段#15
  • pp->cutime = /proc/[pid]/stat 的字段#16
  • pp->cstime = /proc/[pid]/stat 的字段#17
  • pp->start_time = /proc/[pid]/stat 的字段#22
  • seconds_since_boot = /proc/uptime 的字段#1
  • include_dead_children = 1 如果通过了“S”选项(总结一些信息,例如 CPU 使用率,从死子进程到其父进程)
[...]
#define cook_etime(P) (((unsigned long long)seconds_since_boot >= (P->start_time / Hertz)) ? ((unsigned long long)seconds_since_boot - (P->start_time / Hertz)) : 0)
[...]
Hertz = sysconf(_SC_CLK_TCK);
[...]
  /* jiffies used by this process */
  total_time = pp->utime + pp->stime;
  if(include_dead_children) total_time += (pp->cutime + pp->cstime);

  /* seconds of process life */
  seconds = cook_etime(pp);

  /* scaled %cpu, 999 means 99.9% */
  if(seconds) pcpu = (total_time * 1000ULL / Hertz) / seconds;
  if (pcpu > 999U)
    return snprintf(outbuf, COLWID, "%u", pcpu/10U);
  return snprintf(outbuf, COLWID, "%u.%u", pcpu/10U, pcpu%10U);
[...]

%MEM

如下:

  • pp->vm_rss = /proc/[pid]/stat 的字段#24
  • kb_main_total = /proc/meminfoMemTotal 字段
   /* pp->vm_rss * 1000 would overflow on 32-bit systems with 64 GB memory */
   pmem = pp->vm_rss * 1000ULL / kb_main_total;
   if (pmem > 999) pmem = 999;

   snprintf(outbuf, COLWID, "%2u.%u", (unsigned)(pmem/10), (unsigned)(pmem%10));

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 2013-02-12
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多