IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux waitpid vfork exit函数 -> 正文阅读

[系统运维]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=fork();

     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=fork();

     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;
}

在这里插入图片描述

验证成功
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:16:02  更:2022-04-26 12:16:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:35:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码