此例并不是关于ps命令的详解,也不是进程体系的深究。只是无意中把自己遇到的两个小知识点(僵尸进程和Linux下查看进程信息的方法)结合了。
首先引入一个僵尸进程实例:
//zombie.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main (void)
{
pid_t pid;
pid = fork();
if(pid < 0){
perror("fork failed");
exit(1);
}
if(pid > 0){
int x ;
for( x =1; ; x++){
sleep(1);
printf("The parent has slept %d seconds\n",x);
}
}
return 0;
}
ps命令用处为显示进程,后边跟着列表详情,可以随意缩减
#ps -eo pid,tid,ppid,comm
ppid是parent
#ps -eo pid,tid
由于ppid是parent's pid,我就小追溯一下,一个终端编译运行zombie.c,打开另一终端进行进程查看
h@ubuntu:~$ ps -u
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
h 2427 0.0 0.3 6940 3636 pts/0 Ss Nov11 0:02 bash
h 6381 0.0 0.3 6940 3628 pts/1 Ss+ Nov11 0:01 bash
h 13961 0.0 0.0 1700 248 pts/0 S+ 00:28 0:00 ./zombie
h 13962 0.0 0.0 0 0 pts/0 Z+ 00:28 0:00 [zom] <defunct>
h 13968 0.1 0.3 6940 3624 pts/2 Ss 00:28 0:00 bash
h 14086 0.0 0.1 4708 1192 pts/2 R+ 00:39 0:00 ps -u
可以看到[zom]<defunct>,这个进程已经是僵尸了~!
再看看父子关系。
#ps -eo -pid,tid,ppid,comm
PID TID PPID COMMAND 1 1 0 init 2 2 0 kthreadd 3 3 2 ksoftirqd/0 6 6 2 migration/0 7 7 2 cpuset 8 8 2 khelper 9 9 2 netns 10 10 2 sync_supers 11 11 2 bdi-default 12 12 2 kintegrityd 13 13 2 kblockd 14 14 2 kacpid 15 15 2 kacpi_notify 16 16 2 kacpi_hotplug 17 17 2 ata_sff 18 18 2 khubd 19 19 2 md 22 22 2 khungtaskd 23 23 2 kswapd0 ....... 2422 2422 1 gnome-terminal 2426 2426 2422 gnome-pty-helpe 2427 2427 2422 bash 4132 4132 1 bamfdaemon 6341 6341 414 udevd 6344 6344 2 kworker/u:0 6381 6381 2422 bash 6750 6750 1 soffice.bin 7829 7829 414 udevd 11248 11248 1 dbus-launch 11249 11249 1 dbus-daemon 12410 12410 1 check-new-relea 12687 12687 609 dhclient 13769 13769 2 kworker/0:2 13917 13917 2 kworker/0:0 13961 13961 2427 zombie 13962 13962 13961 zombie <defunct>其中,第三列是PPID,即使不是很清楚这里边的内涵,闭着眼猜也能猜出个一二来了。可以看到僵尸进程13962确实是由父进程13961(我的可执行文件叫zombie)创造的,而13961是2427bash创造的,2427是由2422gnome-terminal,也就是我打开的终端创造的,那么终端2422的parent就是1了,1已经是init了,这大概也就是这个系统从初始化到我运行的这个东西的一个流程了吧,这个Linux还真是便于学习,一目了然,具体进程1、进程2、进程3等等都是干什么的就先不管了,很多进程全是直接衍生自进程1和进程2,而间接衍生自0(这个神秘的带头大哥0到底是什么,列表上没有显示出来,也许他根本就不存在,但是为什么1和2的PPID是0呢?留下一个悬念~!)。
验证:第一个zombie不代表系统方面的含义,是我自己明明的文件名,只是一条command。
只有[zom]<defunct>是系统赋予的含义(系统手懒,都是喜欢缩写的。。。。)
过程如下,command改成了zombieName
h@ubuntu:~$ ps -u Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND h 2427 0.0 0.3 6940 3636 pts/0 Ss Nov11 0:02 bash h 6381 0.0 0.3 6940 3628 pts/1 Ss+ Nov11 0:01 bash h 13968 0.0 0.3 6940 3624 pts/2 Ss 00:28 0:00 bash h 14102 0.0 0.0 1700 244 pts/0 S+ 00:41 0:00 ./zombieName h 14103 0.0 0.0 0 0 pts/0 Z+ 00:41 0:00 [zom] <defunct> h 14105 0.0 0.1 4708 1188 pts/2 R+ 00:42 0:00 ps -u
本例只作为一个引入,以后会深究。