linux waitpid vfork exit函数

回顾

前面讲了 wait 函数 
主要两个功能 
1 回收子进程的pid 这个必须是父进程进行的
2 调用一次 只能回收一个 
继续往下

一 waitpid 函数

waitpid 函数和wait函数 都一个用法 
区别是形参多了点 

在这里插入图片描述

1 先看阻塞的情况 最后形参设置为0 

情况 1

如果wpid==0 返回的就是任意的子进程 想象子进程是有限的 
一直while 它总会有尽头的 所以 最后返回就是一个 看起来不会那么重复了
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>


int main()
{
     pid_t a;

     a=fork();

     if(a>0)
     {
         while(wt=waitpid(-1,&status,0)!=-1)
         {
               if(wt==0)  //多了这里 
                { 
                continue; 
                }
              printf("huishou is %d\n",wt);
             printf("father pid is %d\n",getpid());
         }
     }
     else if(a==0)
     {    
         printf("child pid is %d ppid is %d \n",getpid(),getppid());
     }

     return 0;
}

情况2

不过 还会发生一种情况  不管 没有 wpid==0 他也会 直接回收一个子进程 
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>


int main()
{
     pid_t a;

     a=fork();

     if(a>0)
     {
         while(wt=waitpid(-1,&status,0)!=-1)
         {
            //   if(wt==0)  //多了这里  不要了 
              //  { 
               // continue; 
                //}  
              printf("huishou is %d\n",wt);
             printf("father pid is %d\n",getpid());
         }
     }
     else if(a==0)
     {    
         printf("child pid is %d ppid is %d \n",getpid(),getppid());
     }

     return 0;
}

情况1和2的本质

回归函数的本质  只能满足 回收 子进程的功能就行了
 不需要杀死 因为 子进程没有while

在这里插入图片描述

返回为1 正常 成功了 

如果不阻塞呢 它会乱飞 但是最后还是会收到 子进程信息,但是没必要

第三个参数 WNOHANG 替换 0
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>


int main()
{
     pid_t a;

     a=fork();

     if(a>0)
     {
         while(wt=waitpid(-1,&status,WNOHANG)!=-1)
         {
           
              printf("huishou is %d\n",wt);
             printf("father pid is %d\n",getpid());
         }
     }
     else if(a==0)
     {    
         printf("child pid is %d ppid is %d \n",getpid(),getppid());
     }

     return 0;
}

在这里插入图片描述

二 vfork 函数

在这里插入图片描述
在这里插入图片描述

两者区别 马上出来了  
没有拷贝就相当于 是同个东西 
拷贝了 就是多个东西 
vfork 函数 可以想成一块蛋糕  肯定是爸爸先给你吃好的 你不吃了  爸爸才吃。

三 vfork exit配合使用

exit 函数
在这里插入图片描述

如果用break 退出呢 
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>


int main()
{
     pid_t a;
     int fs=0;
     a=vfork();

     if(a>0)
     {
         while(1)
         { 
              printf("!!!fs=== %d\n",fs);
             printf("father pid is %d\n",getpid());
         }
     }
     else if(a==0)
     {
          while(1)
          {
            fs+=1;
            if(fs==3)
            {
              break;
            }
             printf("*****fs=== %d\n",fs);
              printf("child pid is %d ppid is %d \n",getpid(),getppid());

          }
        
     }

     return 0;
}


在这里插入图片描述

子进程打印正常  为什么用break 就归零了 
它应该是一直打印3的  因为break 突然的退出 父进制并不知道 
 

1 让父进程接收到子进程退出信号的办法

break 可以理解强制退出 
改为exit(0);即可 

在这里插入图片描述

形参赋值随意 
```csharp
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>


int main()
{
     pid_t a;
     int fs=0;
     a=vfork();

     if(a>0)
     {
         while(1)
         { 
              printf("!!!fs=== %d\n",fs);
             printf("father pid is %d\n",getpid());
         }
     }
     else if(a==0)
     {
          while(1)
          {
            fs+=1;
            if(fs==3)
            {
              exit(0);
            }
             printf("*****fs=== %d\n",fs);
              printf("child pid is %d ppid is %d \n",getpid(),getppid());

          }
        
     }

     return 0;
}

在这里插入图片描述

验证成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值