僵尸进程和孤儿进程代码编写及atexit相关验证

今天分享一下僵尸进程和孤儿进程代码编写及atexit相关验证。

僵尸进程:子进程结束运行,但父进程依旧运行,还没有接受子进程的运行结果和释放子进程的PCB等资源,此时结束运行的子进程即处于僵尸状态(Z),同时子进程也被称作是僵尸进程。

僵尸进程:程序代码及运行结果截图

Zombie.c
   #include<stdio.h>
   #include<unistd.h>
   #include<stdlib.h>
  
   int main()
   {
       pid_t id = fork();
       if(id<0)//build wrong
       {
          printf("fork wrong");
          return 1;
      }
 
      while(1)
      {
          if(id == 0)//child
          {
              printf("this pid:%d,ppid:%d\n", getpid(), getppid());
             sleep(5);
              exit(0);
          }
          else
          {
              printf("this pid:%d,ppid:%d\n", getpid(), getppid());
              sleep(1);
          }
      }
 
      return 0;
  }
 
Makefile
   run:zombie.c
       gcc -o run zombie.c
  
   .PHONY:clean
   clean:
       rm -f run

运行结果

 

 

    孤儿进程:产生子进程的父进程提前结束了运行,而子进程依旧在运行中,此时的子进程被称为孤儿进程,子进程将会被init1号)进程收养,并由init进程对孤儿进程的状态进行回收。

孤儿进程:程序代码及运行结果截图

orphan.c
    #include<stdio.h>
   #include<unistd.h>
   #include<stdlib.h>
  
   int main()
   {
       pid_t id = fork();
       if(id<0)//build wrong
       {
          printf("fork wrong");
          return 1;
      }
 
      int i=0;
      while(i<50)
      {
          if(id == 0)//child
          {
              printf("this pid:%d,ppid:%d\n", getpid(), getppid());
              sleep(1);
              i++;
          }
          else
          {
              printf("this pid:%d,ppid:%d\n", getpid(), getppid());
              sleep(5);
              exit(0);
          }
      }
 
      return 0;
  }                                                                                                                                                            
 
Makefile
   run:orphan.c
       gcc -o run orphan.c
   .PHONY:clean
   clean:
       rm -f run

运行结果

 

  

atexit:终止进程,按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由main()函数或exit()函数自动调用。且atexit()注册的函数类型应为不接受任何参数的void函数。

  1>下面我们来验证一下atexit()的功能。

代码截图

 

 

运行结果

 

首先由printf函数打印出”i have a pen!”,接下来因sleep(3)而睡3秒,接下来由于调用return 0,也会自动调用到atexit(fun1)函数,从而调用fun1函数而打印出”this is fun1”.

 

2> 如果同时调用好几个atexit()会发生些什么呢?

代码如下:

atexit.c
   #include<stdio.h>
   #include<unistd.h>
  #include<stdlib.h>
   
  void fun1(){
       printf("this is fun1\n");
   }
   
   void fun2(){
      printf("this is fun2\n");
  }
  
  void fun3(){
      printf("this is fun3\n");
  }
  
  int main()
 {
      atexit(fun1);
      atexit(fun2);
      atexit(fun3);
  
      printf("i have a pen!\n");
      sleep(3);
      exit(0);
 }
Makefile
   run:atexit.c
       gcc -o run atexit.c
  
   .PHONY:clean
   clean:
       rm -f run

运行结果

 

    首先由printf函数打印出”i have a pen!”,接下来因sleep(3)而睡3秒,接下来由于调用exit(0),也会依次调用离exit(0)近的atexit(),所以依次调用atexit(fun3)atexit(fun2)atexit(fun1)函数,从而依次自动调用fun3fun2fun1函数从而依次打印出”this is fun3”、”this is fun2”.”this is fun1”.

此次分享如下,希望共同进步,不要生病。

ps:生病真的很难受,千万不要生病。T_T

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值