僵尸进程与孤儿进程

在linux中子进程是由父进程创建的。如果进程出现异常就出现一些问题,僵尸进程和孤儿进程。
孤儿进程:一个父进程退出,而他的子进程还在运行,那么子进程将会成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。
下面用例子来了解孤儿进程和僵尸进程
1. 孤儿进程

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
int main()
{
    pid_t pid;
    //创建一个进程
    pid = fork();
    //创建失败
    if (pid < 0)
   {
       perror("fork error:");
       exit(1);
    }
     //子进程
    if (pid == 0)
     {
        printf("I am the child process.\n");
        //输出进程ID和父进程ID
        printf("pid: %d\tppid:%d\n",getpid(),getppid());
        printf("I will sleep five seconds.\n");
       //睡眠5s,保证父进程先退出
        sleep(5);
        printf("pid: %d\tppid:%d\n",getpid(),getppid());
        printf("child process is exited.\n");
     }
     //父进程
    else
    {
        printf("I am father process.\n");
        //父进程睡眠1s,保证子进程输出进程id
        sleep(1);
        printf("father process is  exited.\n");
    }
     return 0;
}

这里写图片描述
从运行结果可以看出,开始父进程号为:8965 子进程号为:8966
在父进程结束,子进程继续运行时,父进程号为:1 子进程号为:8966
现在子进程已经是孤儿进程,子进程也已经被init进程(进程号为1)所收养。
2.僵尸进程

#include <sys/types.h>                                                      
#include <unistd.h>                                                         
#include <stdio.h>                                                          
#include <stdlib.h>                                                         
int main()                                                                      
{                                                                           
    pid_t pid;                                                              
    pid = fork();                                                           
    if(pid < 0)                                                             
        printf("error occurred!\n");                                        
    else if(pid == 0) {                                                     
        printf("Hi father!\n");                                             
        exit(0); //子进程退出                                                   
     }                                                                       
    else { 
       sleep(10);  //父进程睡眠10秒,子进程已经退出,父进程并没有调用wait或waitpid获取子进程的状态信息    
       wait(NULL);                                                   
     }                                                                       
}

这里写图片描述
由图可见,子进程的状态变为Z,僵尸状态

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值