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显示出来。 ![]() (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |