孤儿进程和僵尸进程

IT知识
350
0
0
2023-01-24
linux基础

僵尸进程

当进程exit()退出之后,他的父进程没有通过wait()系统调用回收他的进程描述符的信息,该进程会继续停留在系统的进程表中,占用内核资源,这样的进程就是僵尸进程。

#include <unistd.h>
#include <stdio.h>

int main ()
{
    /*fpid表示fork函数返回的值,fork会返回两次,
    一次是父进程,返回值是子进程的Pid,在子进程会返回0*/ 
    pid_t fpid;
    fpid=fork();//fork后会出现两个分支执行下面的代码,一个父进程,一个新的子进程 
    if (fpid < 0)
        printf("fork error!");
    else if (fpid == 0) { // 
        printf("child id is %dn",getpid());
        sleep(30);//睡眠30s,在父进程之前退出 
        printf("child finally...");
    }
    else { //父进程 
        printf("parent id is %dn",getpid());
        sleep(60);
        printf("parend finally...");
    }
}

孤儿进程

当一个进程正在运行时,他的父进程忽然退出,此时该进程就是一个孤儿进程。作为一个进程,需要找到一个父进程,否则这种进程在退出之后没人回收他的进程描述符,空耗内存。此时该进程会找到一个父进程,如果自己所在的进程组没人收养,那就作为init进程的子进程。

#include <unistd.h>
#include <stdio.h>

int main ()
{
    /*fpid表示fork函数返回的值,fork会返回两次,
    一次是父进程,返回值是子进程的Pid,在子进程会返回0*/ 
    pid_t fpid;
    fpid=fork();//fork后会出现两个分支执行下面的代码,一个父进程,一个新的子进程 
    if (fpid < 0)
        printf("fork error!");
    else if (fpid == 0) { // 
        printf("child id is %dn",getpid());
        sleep(100);
    }
    else { //父进程 
        printf("parent id is %dn",getpid());
        sleep(30);//睡眠30s,在子进程之前退出 
        printf("parend finally...");
    }
}

处置方式

孤儿进程会由init进程收养作为子进程,所以不会有什么危害;僵尸进程会占用进程号,以及未回收的文件描述符占用空间,如果产生大量的僵尸进程,将会导致系统无法分配进程号,说明父进程的代码编写有问题。

$ ps -aux|grep Z 在理想情况下,可以通过kill命令将进程杀死该进程的父进程来结束僵尸进程。当然也要结合具体场景来对待。