14僵尸进程方式3 4补充

Posted gd-luojialin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14僵尸进程方式3 4补充相关的知识,希望对你有一定的参考价值。

前面的进程控制2,介绍了僵尸进程,和解决方式4种中的两种。下面再补充两种。

 

解决方式:

3:忽略SIGCHLD信号

父进程设置忽略 SIGCHLD信号,子进程结束自动释放进程表资源

忽略SIGCHLD信号:

signal(SIGCHLD, SIG_IGN)

4:捕获SIGCHLD信号

父进程捕获SIGCHLD信号,并在捕获函数代码中 执行wait()

处理SIGCHLD信号:

void pFun(int nSignal) 

signal(SIGCHIL, pFun)

 

僵尸进程:

void testZomb()

{

      pid_t pid=fork();

      if(pid==0)

      {

           printf("this is a child:%d ",getpid());

           _exit(0);

      }

      else

      {

           printf("this is a parent:%d ",getpid());

           while(1);

      }

 

}

 

rowe       3440   3110 92 23:04 pts/0    00:00:08 ./main

rowe       3441   3440  0 23:04 pts/0    00:00:00 [main] <defunct>

 

<defunct>说明就是僵尸进程,并且无法使用kill命令进行终止,也无法对其进行任何操作。

 

 

忽略SIGCHLD信号方式:

void testZomb()

{

      pid_t pid=fork();

      if(pid==0)

      {

           printf("this is a child:%d ",getpid());

           _exit(0);

      }

      else

      {

           //父进程忽略SIGCHLD

           signal(SIGCHLD,SIG_IGN);

           printf("this is a parent:%d ",getpid());

           while(1);

      }

}

 

捕获SIGCHLD信号方式:

void func(int sig)

{

      printf("receive signal:%s[%d] ",strsignal(sig),sig);

      wait(NULL);

}

 

void testZomb()

{

      pid_t pid=fork();

      if(pid==0)

      {

           printf("this is a child:%d ",getpid());

           _exit(0);

      }

      else

      {

           //父进程对SIGCHLD进行处理

           signal(SIGCHLD,func);

           printf("this is a parent:%d ",getpid());

           while(1);

      }

 

}

 

wait结束后,由init释放进程资源表。

 

以上是关于14僵尸进程方式3 4补充的主要内容,如果未能解决你的问题,请参考以下文章

进程补充和线程

记一次僵尸进程的处理

僵尸进程

Linux 如何杀死僵尸进程

5.1.4 网络编程进程---僵尸进程与孤儿进程

Linux从青铜到王者第六篇:Linux进程概念第二篇