僵尸进程的产生原因

在Linux系统中,僵尸进程是已经执行完毕,但是没有被父进程回收的子进程。判断僵尸进程的一个方法是使用ps命令查看进程状态。如果进程状态是Z,说明这是一个僵尸进程。

 

在多进程的程序中,父进程会启动若干个子进程来处理任务。当子进程退出后,除了在进程表中占用的一个进程表项,子进程所使用的资源(文件描述符、内存等)都会被释放。保留子进程的进程表项,是为了把子进程的执行结果告诉给父进程。父进程调用waitpid()来得到子进程的执行结果。

如果子进程执行完毕,而父进程没有退出,也没有调用waitpid()来得到子进程的执行结果,这时,子进程已经不存在了,却还占用着一个进程表项。这样的进程叫做僵尸进程。当父进程调用waitpid()后,僵尸进程占用的进程表项被释放,僵尸进程彻底消失。

如果父进程在调用waitpid前退出,子进程(包括僵尸进程)的父进程会变为init进程。由init进程负责回收子进程,所以不会产生僵尸进程。

僵尸进程消耗的唯一资源是进程表项。也就是说,如果产生了大量的僵尸进程占满了进程表,系统将无法创建新的进程。除此之外,僵尸进程不会对系统造成影响。

僵尸进程不能使用kill来杀死。因为僵尸进程已经执行完毕了,无法杀死。要消除僵尸进程,方法是找到父进程,杀死父进程。这时僵尸进程会由init收回。

下面是一个展示僵尸进程产生原因的例子。


 

/*
   展示Linux系统中僵尸进程的产生原因。
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>


int main(void){

  pid_t pid;

  if ((pid = fork()) < 0){
    perror("");
    exit(0);
  } else if (pid == 0){
    exit(0);
  } else {
    char ch;
    char buffer[1024];
    int status;

    printf("See the zombie process?\n");
    printf("child process pid: %d\n", pid);
    sprintf(buffer, "ps -ef | grep %d\0", pid);
    printf("execute '%s'\n", buffer);
    system(buffer);

    waitpid(pid, &status, 0);

    printf("It's gone.\n");
    printf("execute '%s'\n", buffer);
    printf("child process (%d) exited with status: %d\n", pid, status);
    system(buffer);
  }

  return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值