首页 > 系统相关 >Linux的fork和vfork

Linux的fork和vfork

时间:2024-07-27 21:28:27浏览次数:18  
标签:fork globvar pid var exit Linux 进程 vfork

  1. fork

    • 用于创建子进程。
    • 在调用时,返回两次:子进程的返回值是0,父进程的返回值的新建子进程的ID。
    • 子进程是父进程的副本。子进程和父进程继续执行 fork 之后的指令。
      • 子进程获得父进程的 数据空间、堆、栈的副本
      • 共享的是:文件描述符、mmap建立的映射区
      • 子进程和父进程共享的是 代码段fork 之后各自执行。
      • 父进程和子进程的执行顺序谁先谁后是未知的,是竞争的关系。
    • COW
      COW 即写时复制(Copy-On-Write), 数据空间、堆、栈的副本在创建子进程时并不创建副本。而是在父进程或者子进程修改这片区域时,内核为修改区域的那块内存制作一个副本,以提高效率。
    • fork
      fork 失败的原因:
      • 系统中已经有太多的进程
      • 该实际用户Id的进程数超过了系统限制
    • 案例
      #include<stdio.h>
      #include<stdlib.h>
      #include<unistd.h>
      
      int globvar = 10;
      char buf[] = "a writte to stdout.\n";
      
      int main(int argv, char* argc[]){
      
          int var;
          pid_t pid;
      
          var = 88;
          if(write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1){
              printf("write error");
              exit(1);
          }
          printf("before fork.\n");
          // 创建子进程后,后面的代码,父进程和子进程独立运行。
          if((pid=fork()) < 0){
              printf("fork() error.\n");
              exit(1);
          }
          else if(pid == 0){
              globvar++; //子进程运行不改变父进程的值
              var++;
          }
          else
              sleep(2);
          printf("pid=%ld, globvar=%d, var=%d.\n",(long)getpid() , globvar, var);
          retdurn 0;
      }
      
  2. vfork

    • fork 一样都创建新的进程,他的是目的是执行一个程序。

    • fork 的区别在于:

      • 它并不将父进程的地址空间复制到子进程中 。在子进程 exec/exit 之前,和父进程共享地址空间,提高了工作效率。但是在在子进程 exec/exit 之前,子进程如果修改了数据、进行函数调用、返回都会带来未知的结果。
      • vfork 保证子进程比父进程先运行,在子进程 exec/exit 之后父进程才会运行。
    • 案例

      // 将上面的修改如下:
      if((pid=vfork()) < 0){
          printf("fork() error.\n");
          exit(1);
      }
      else if(pid == 0){
          globvar++; // 会改变父进程的变量值
          var++;
          _exit(0);
      }
      // 去掉sleep(2)是因为vfork能保证子进程先运行
      
    • 结果对比:

      # fork 
      szz@ubuntu:~/Study/SystemProgram/IO$ ./f
      a writte to stdout.
      before fork.
      pid=4304, globvar=11, var=89. # 子进程
      pid=4303, globvar=10, var=88. # 父进程
      
      # vfork
      szz@ubuntu:./vf
      a writte to stdout.
      before fork.
      pid=4301, globvar=11, var=89.# 父进程
      
  • 补充:
    fork 的两次返回:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • gdb 调试
    set follow-fork-mode child : 跟踪子进程
    set follow-fork-mode parent : 跟踪父进程
  • 进程和程序的区别
    程序占用磁盘空间,进程占用系统资源。

标签:fork,globvar,pid,var,exit,Linux,进程,vfork
From: https://blog.csdn.net/H520xcodenodev/article/details/140741537

相关文章

  • linux磁盘配额
    目录磁盘配额Linux磁盘配额的基本概念概述:重要性:磁盘配额可以进行两方面的限制:磁盘配额的限制方法分为软限制和硬限制两种:磁盘配额操作开启磁盘配额功能(rpm-qa|grepquota)文件系统重新挂载(/cet/fstab)永久挂载 临时挂载设置许可模式(setenforce0)生成配额文件(qu......
  • linux磁盘分区与挂载
    目录硬盘接口IDE硬盘接口SATA接口SCSI接口磁盘分区与文件系统挂载磁盘在Linux系统中的表示方法IDE接口的硬盘在Linux系统中的表示方法SATA接口/SCSI接口/USB接口的硬盘在Linux系统中的表示方法文件系统挂载挂载点挂载文件系统(mount)挂载光盘:df-hT  查看磁盘......
  • linux实战手册(一)-文件管理
    初识linux相信大家对linux都有所耳闻,linux和我们的windows一样都是操作系统,但是windows一般工作在大家的桌面上,平时玩游戏听歌上网都是windows系统,但是我们在网站上购买商品,浏览新闻,这些都是运行在服务器上的。而在服务器上边大部分操作系统用的是linux。linux的名字是从哪里来的......
  • Linux: 更新系统相关依赖命令yum update执行失败: One of the configured repositorie
    环境:CentOS7(ISO映像文件=CentOS-7-x86_64-DVD-2009.iso)解决思路:系统repo镜像源连接问题导致执行失败,切换repo为国内源即可#切换仓库镜像源curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-7.repo#或者wget-O/etc/yum.rep......
  • Linux捣鼓记录:debian12日志警告:firmware: failed to load iwl-debug-yoyo.bin (-2)
    问题现象:网卡为intelax200,系统为debian12蓝牙wifi使用功能一切正常,根据wiki检查了驱动也都已经安装,但每次开机后,查看cockpit日志会看到警告:firmware:failedtoloadiwl-debug-yoyo.bin(-2)......问题分析:检索网络得到初步结论:iwl-debug-yoyo.bin是一个intel网卡相关的de......
  • linux学习记录(docker)
    DockeDocker是基于Go语言实现的开源容器项目。它诞生于2013年年初,最初发起者是dotCloud公司。Docker自开源后受到业界广泛的关注与参与,目前已有80多个开源组件,逐渐形成了围绕Docker容器的完整的生态体系。dotCloud公司于2013年年底改名为DockerIoc,专注于Docker相关技术和产......
  • Java全栈课程之Linux——账号管理
    一、简介Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文......
  • [RHEL7基础篇-14] Linux中的LVM管理
    简介LVM(逻辑卷管理)是一种在Linux系统上使用的逻辑卷管理工具。它允许用户管理磁盘分区和分卷,以便更有效地使用存储空间。LVM是一种强大的存储管理工具,使用户能够更有效地管理磁盘空间,并提供高级功能来保护数据和增强系统的可用性。下面我们将使用RHEL7来学习LVM的使用。LV......
  • Linux磁盘管理
    Linux磁盘管理Linux在使用过程中产生的数据量不断增大,逐渐导致初始配置的磁盘空间不足,这时候就需要进行扩容,以满足业务需求。一般情况下会选择新添加磁盘,本文介绍了如何将新磁盘分区、格式化、挂载或制作LVM逻辑卷,进行磁盘空间扩容。1.基本分区磁盘的分区格式一共有两种:一......
  • Linux应用层开发(6):SPI通信
            本章通过讲解在应用层中使用SPI总线与外部设备的通讯,讲解Linux系统总线类型设备驱动架构的应用,它与上一章的I2C总线操作方法非常相似,可以对比学习。在Linux内核文档的Documentation/SPI目录下有关于SPI驱动非常详细的说明。1. SPI通讯协议简介     ......