僵尸进程

   在UNIX术语中,一个已经终止、但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵尸进程(zombie)。

僵尸进程出现的条件:

    子进程先结束,且父进程没有wait

如何杀掉僵尸进程:

   僵尸进程本身不能使用kill杀掉,但可以kill 其父进程,此时僵尸进程将会被init进程收养,从而消除僵尸进程.(1号进程本身例wait子进程)  

僵尸进程的避免
一,让父进程比子进程先结束,让init进程来领养子进程。
比如可以fork 2次:A进程 fork出B子进程,B子进程再fork出C子进程,再杀掉B子进程。这样C子进程就由init进程领养了。
  一个由init进程领养的进程终止时会发生什么?它会不会变成一个僵尸进程?对此问题的回答是“否”,因为init被编写成只要有一个子进程终止,init就会调用一个wait函数取得其终止状态。这样也就防止了在系统中有很多僵尸进程。当提及“一个init的子进程”时,这指的是init直接产生的进程,或者是其父进程已终止,由init领养的进程。
二,父进程使用waitpid等待子进程返回.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
  pid_t pid;
  if ((pid = fork()) < 0)
    {
      puts("fisrt fork error");
      exit(1);
    }
  if (pid == 0) //first child
    {
      if ((pid = fork()) < 0)
        {
          puts("second fork error");
          exit(1);
        }
      if (pid == 0) // second child
        {
          sleep(2);
          printf("The second child pid :%d ---- My parent: %d \n", getpid(), getppid());
          exit(0);
        }
      else // second fork 's child  's parent == first child
        {

          printf("The first child pid :%d ---- My parent: %d \n", getpid(), getppid());
          exit(0);
        }
    }
  if (pid != waitpid(pid, NULL, 0))
    {
      printf("wait error.\n");
    }
  printf("My pid :%d ---- My parent: %d \n", getpid(), getppid());
  exit(0);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值