busybox中ps命令源代码分析

busybox/procps/ps.c
busybox/libbb/procps.c

我们在串口终端通过ps命令查看系统当前正在运行的进程:

~ # ps
  PID USER       VSZ STAT COMMAND
    1 root      1080 S    init
    2 root         0 SW   [kthreadd]
    3 root         0 SW   [ksoftirqd/0]
    4 root         0 SW   [kworker/0:0]
    5 root         0 SW<  [kworker/0:0H]
    6 root         0 SW   [kworker/u2:0]
    7 root         0 SW   [rcu_preempt]
    8 root         0 SW   [rcu_bh]
    9 root         0 SW   [rcu_sched]
   10 root         0 SW<  [khelper]
   11 root         0 SW<  [writeback]
   12 root         0 SW<  [bioset]
   13 root         0 SW<  [kblockd]
   14 root         0 SW   [khubd]
   15 root         0 SW   [kworker/0:1]
   16 root         0 SW<  [cfg80211]
   17 root         0 SW<  [rpciod]
   18 root         0 SW   [kswapd0]
   19 root         0 SW<  [nfsiod]
   20 root         0 SW<  [cifsiod]
   21 root         0 SW<  [crypto]
   34 root         0 SW<  [dwc_otg]
   35 root         0 SW   [kworker/u2:1]
   54 root         0 SW<  [deferwq]
   55 root         0 SW   [kworker/0:2]
   56 root         0 SW<  [kworker/0:1H]
  233 root         0 SWN  [jffs2_gcd_mtd3]
  238 root      1080 S    syslogd
  240 root      1072 S    klogd
  241 root      1084 S    -/bin/sh
  242 root      1080 R    ps
720                 puts("  PID USER       VSZ STAT COMMAND");

在busybox/procps/ps.c文件中ps_main函数,是与ps命令的第一行输出对应的。

procps_status_t *p;

728         while ((p = procps_scan(p, psscan_flags)) != NULL) {
...
781                                 const char *user = get_cached_username(p->uid);
782                                 len = printf("%5u %-8.8s %s %s  ",
783                                         p->pid, user, buf6, p->state);
...
787                 {
788                         int sz = terminal_width - len;
789                         char buf[sz + 1];
790                         read_cmdline(buf, sz, p->pid, p->comm);
791                         puts(buf);
792                 }
}

先看p = procps_scan(p, psscan_flags),这个函数在busybox/libbb/procps.c中实现,每一个进程都会在/proc目录下新建一个进程号对应的文件夹,这个函数通过读取/proc目录下所有进程号对应的文件夹,读取文件夹下的stat, cmdline等文件,并将读取的这些文件的信息保存在procps_status_t* sp这个结构体里面并返回这个结构体。

再看get_cached_username函数,他根据procps_scan函数返回的procps_status_t* p指针中的p->uid来返回进程的用户名,然后下一行的printf打印出了PID USER VSZ STAT这些字段的信息都是从指针p中获取。

最后再看read_cmdline这个函数,他会读取执行程序的命令并复制到buf中,让下一行的puts打印出来。如果进程占用的VSZ为0,那么他会在程序对应的命令的两边加上’[ ]’,比如dwc_otg,khubd这些进程由于VSZ都是0,所以在他们的两边都有’[ ]’。

最后要说一句,不管是内核创建的进程还是用户空间创建的进程都会在/proc目录下新建一个进程号对应的文件夹,所以都会通过ps显示出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckywang1103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值