加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

busybox中ps命令源代码详解

发布时间:2021-11-18 12:37:01 所属栏目:PHP教程 来源:互联网
导读: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 [kwo

 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显示出来。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读