• signal(SIGCHLD, SIG_IGN);的使用及验证


    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include<stdlib.h>
    #include<signal.h>
    int main(int argc , char **argv)
    {signal(SIGCHLD, SIG_IGN);
     int id;
     id=fork();
     if(id<0)
      {
      printf("fork error
    ");
      }
     else if(id==0)
      {
       printf("I'm in child process%d parent process%d
    ",getpid(),getppid());
       exit(0);
       }
     else if(id>0)
       {
       printf("I'm in parent process%d
    ",getpid());
       sleep(60);
       }
       //signal(SIGCHLD, SIG_IGN);
      return 0;
    }
    [root@linux Desktop]# gcc 僵尸进程.c
    [root@linux Desktop]# ./a.out
    I'm in parent process8072
    I'm in child process8073 parent process8072  //第二行
    [root@linux Desktop]# 
    在第二行输出后会阻塞大概1分钟,我们执行以下命令
    [root@linux Desktop]# ps aux | grep  'Z'
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root      8076  0.0  0.0   4340   740 pts/1    S+   22:47   0:00 grep Z
    可以发现没有僵尸进程啊,感觉很奇怪吧!
    这是因为init进程调用wait把子进程的进程表项等资源清理了!
    为啥子进程没有成为僵尸进程而成为了init的子进程呢?
    很奇怪吧!因为signal(SIGCHLD, SIG_IGN);这一行代码,所以子进程成为了init的子进程!
    一定要注意signal(SIGCHLD, SIG_IGN);的位置,因为程序执行时,是从上面往下执行的,因为我们执行那些
    命令时,这行代码还未执行,然而这时子进程已经成为了僵尸进程了!见下面
    如果这行代码的位置在最后面,那么结果将是不一样的,下面就是执行结果:
    [root@linux Desktop]# ps aux | grep -w 'Z'
    root      8734  0.0  0.0      0     0 pts/0    Z+   23:32   0:00 [a.out] <defunct>
    root      8737  0.0  0.0   4336   792 pts/1    S+   23:32   0:00 grep -w Z
    [root@linux Desktop]# 可以看出产生了僵尸进程!
    
    我们可以用ps --ppid 1来查看父进程号为1的进程!(那个进程号都可以)
    也可以用  ps --pid 1 来查看进程号为1的进程 
    [root@linux Desktop]# ps --pid 1
      PID TTY          TIME CMD
        1 ?        00:00:04 init
    但是我们一定要记住使用这些命令时,一定要记住在程序运行时,才能得到结果的!程序一旦结束是看不到的!
    下面是一个例子,在一个窗口中
    [root@linux Desktop]# ./a.out
    I'm in parent process8853
    I'm in child process8854 parent process8853//会停顿大概一分钟,为了能看清楚,
    [root@linux Desktop]# 
    下面的要在另一个窗口看
    [root@linux Desktop]# ps --pid 8854
      PID TTY          TIME CMD
     8854 pts/0    00:00:00 a.out
    [root@linux Desktop]# ps --ppid 8853
      PID TTY          TIME CMD
     8854 pts/0    00:00:00 a.out
    [root@linux Desktop]# ps --ppid 8853
      PID TTY          TIME CMD         //注意这儿没有输出任何结果,是因为程序执行结束了
    [root@linux Desktop]# 
    一定要记住在程序正在运行时看,包括查看僵尸进程,因为一旦程序结束了,那么僵尸进程估计就看不到了!切记。。。
    记住只要父进程不死,子进程(这里来说指的是僵尸进程),就不会被init进程接管,他会一直停在系统中占用资源,只有当父进程死的时候,内核才会去扫描看是否有子进程(包括僵尸进程),若果有然后将其子进程交给init进程接管!
     
  • 相关阅读:
    2016/2/22 1、DOM的基本概念 2、Window对象操作 3、Windows.history对象 4、Window.location对象 5、Window.status对象
    2016/2/21 JavaScript简介
    2016/2/19 position: fixed absolute relative z-index float 半透明效果
    2016/2/19 css样式表 Cascading Style Sheet 叠层样式表 美化HTML网页
    2016/2/18 html 图片热点,网页划区,拼接,表单
    2016/2/18 html 标签 表格
    重载
    面向对象 Java练习
    Car 加油
    大乐透 Java随机码
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4076609.html
Copyright © 2020-2023  润新知