码迷,mamicode.com
首页 > 系统相关 > 详细

14僵尸进程方式3 4补充

时间:2018-06-23 01:29:33      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:void   函数代码   test   补充   执行   方式   this   get   \n   

前面的进程控制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\n",getpid());

           _exit(0);

      }

      else

      {

           printf("this is a parent:%d\n",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\n",getpid());

           _exit(0);

      }

      else

      {

           //父进程忽略SIGCHLD

           signal(SIGCHLD,SIG_IGN);

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

           while(1);

      }

}

 

捕获SIGCHLD信号方式:

void func(int sig)

{

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

      wait(NULL);

}

 

void testZomb()

{

      pid_t pid=fork();

      if(pid==0)

      {

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

           _exit(0);

      }

      else

      {

           //父进程对SIGCHLD进行处理

           signal(SIGCHLD,func);

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

           while(1);

      }

 

}

 

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

 

14僵尸进程方式3 4补充

标签:void   函数代码   test   补充   执行   方式   this   get   \n   

原文地址:https://www.cnblogs.com/gd-luojialin/p/9216000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!