zoukankan      html  css  js  c++  java
  • 孤儿进程与僵死进程

    孤儿进程:

    因父亲进程先退出而导致一个子进程被 init 进程收养的进程为孤儿进程,即孤儿进程的父亲更改为 init 进程,该进程在孤儿进程退出后回收它的内核空间资源。

    僵死进程:

    进程已经退出,但它的父亲进程还没有回收内核资源的进程为僵死进程,即该进程在内核空间的 PCB(进程控制块) 没有释放。

    1.以下是一个孤儿进程的示例程序,在此程序中,让父进程先退出,然后子进程再次输出自己的父亲进程号:

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
        int pid;
    
        if((pid = fork()) == -1)
            perror("fork Err");
        else if(!pid){
            printf("Child: pid : %d, ppid : %d 
    ", getpid(), getppid());
            sleep(2);
            printf("Child: pid : %d, ppid : %d 
    ", getpid(), getppid());
    }
        else{
            sleep(1);
            printf("Parent: pid : %d, ppid : %d 
    ", getpid(), getppid());
    }
    
        return 0;
    }
    
    

    运行结果如下:

    从结果来看,子进程的父进程前后发生了变化。

    2.以下是僵死进程的示例程序,在此程序中,父进程让子进程退出但不处理,然后父进程调用 system 函数列出当前前台进程信息,代码如下:

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    int main()
    {
        int pid;
    
        if((pid = fork()) == -1)
            perror("fork err");
        else if(!pid){
            exit(0);
    }
        sleep(1);
        system("ps");
    
        return 0;
    }
    
    

    运行结果如下:

    红框的进程即为僵死状态。

    怎样来清除僵尸进程:
    1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。
    2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
    
    wait()与waitpid()

    wait():

    调用 wait() 函数的父亲进程将阻塞式等待该进程的任意一个子进程结束后,回收该子进程的内核进程资源。

    waitpid():

    waitpid()函数可以用来等待指定子进程(指定PID的子进程)结束。函数声明如下:

    可以通过 /proc/{pid}/maps 文件查看进程资源。

  • 相关阅读:
    WCF基础 (续 更多关于配置文件的内容)
    WCF基础 (续 暴露元数据交换节点)
    简单的asp.net文件上传类
    根据年份月份,获得此月份的所有日期[转]
    JS 设为首页/加入收藏
    WCF基础 (续 使用代码生成WCF服务)
    WPF自定义标题栏——窗口移动和按钮状态转换[转]
    WCF元数据交换
    WCF基础 (续 为一个ASMX服务实现一个WCF客户端) 完结
    WCF基础 (续 通过代码和配置文件写一个WCF服务)
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8410804.html
Copyright © 2011-2022 走看看