初探Linux进程——僵尸进程和父子关系

13 篇文章 0 订阅

此例并不是关于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


本例只作为一个引入,以后会深究。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值