007 Linux fork()函数

前言

本文将会以提问的形式展开向你介绍fork函数

文章重点

关于fork函数,本文重点在于解决以下疑问

疑问一:
为什么fork之前的代码只有父进程执行,然而fork之后的代码父子进程都要执行
疑问二:
1、既然fork之后父子进程会执行一样的代码,那么子进程的意义是什么?
2、为什么fork的两个返回值,会给父进程返回子进程的pid,给子进程返回0
疑问三:
1、为什么fork会有两个返回值
2、如何理解同一个变量,会有不同的值
3、fork之后,父子进程谁先运行

引入fork()函数

linux系统是用c语言写的,所以在linux中创建一个进程实际上也要调用c语言的函数也就是用代码创建进程叫做系统调用,fork函数是Linux系统中实现多进程编程的基础,通过fork函数,可以创建一个子进程,然后在子进程中执行不同的任务,从而实现并行计算和多任务处理。

fork解析一

使用man指令查看fork函数信息
在这里插入图片描述

#include<stdio.h>    
#include<unistd.h>    
#include<sys/types.h>    
int main()    
{    printf("我是一个进程,pid:%d ppid:%d\n",getpid(),getppid());                                                                                                         while(1)    {              fork();                                                          printf("i am a process,pid:%d ppid:%d\n",getpid(),getppid());    sleep(1);    }       return 0;
}   

观察结果
在这里插入图片描述
可以观察到子进程已经被创建出来了(pid为5584)

疑问:为什么fork之前的代码只有父进程执行,然而fork之后的代码父子进程都要执行(观察结果的后两行->父子进程都执行了代码),并且为什么子进程不会从头开始执行父进程的代码?

原因是: 子进程以父进程为模板,把父进程中的大部分属性拷贝给子进程
fork会创建子进程,系统中会多出一个子进程,操作系统以父进程为模板为子进程创建PCB,但是创建的子进程是没有代码和数据的!!目前和父进程共享代码和数据
所以fork之后,父子进程会执行一样的代码,创建出来的子进程并不从头开始执行父进程的代码,而是从fork函数之后的代码开始执行(父进程的大部分属性拷贝给了子进程,包括寄存器的状态->用于记录当前指令的执行位置和保存临时数据)

fork解析二

观察第二第三行分别是父进程和子进程执行的结果
在这里插入图片描述

疑问二:
1、既然fork之后父子进程会执行一样的代码,那么子进程的意义是什么?
2、为什么fork的两个返回值,会给父进程返回子进程的pid,给子进程返回0

引入: fork成功的时候会有两个不同的返回值,给子进程返回0,给父进程返回子进程的pid
为什么要创建子进程呢:我们想让子进程协作父进程完成一些工作,这些工作是单进程解决不了的
可以通过判断fork的返回值,来让父子进程执行不一样的代码,让子进程实现和父进程不一样的功能,比如:我们可以一边玩游戏一边听着音乐,这两个过程就是不同的进程在执行

#include<stdio.h>                                                                                                                                                       
#include<sys/types.h>    
#include<unistd.h>    
int main()    
{    printf("我是一个父进程,我的pid是: %d\n",getpid());    pid_t id = fork();    if(id==0)//子进程的代码片段    {    while(1)    {    printf("我是子进程: pid:%d ppid: %d ret:%d,我在进行下载任务\n",getpid(),getppid(),id);    sleep(1);    }    }    else if(id>0)//父进程的代码片段    {    while(1)    {    printf("我是父进程: pid:%d ppid: %d ret:%d,我在进行播放任务\n",getpid(),getppid(),id);    sleep(1);    }    }return 0;
}

pid_t id = fork();
观察结果:fork成功的时候会有两个不同的返回值,给子进程返回0,给父进程返回子进程的pid
在这里插入图片描述

一个父进程可以创建很多个子进程,然而一个子进程只对应一个父进程,所以fork函数会返回子进程的id给父进程,方便父进程管理它的子进程

fork解析三

1、为什么fork会有两个返回值
2、如何理解同一个变量,会有不同的值
3、fork之后,父子进程谁先运行

在这里插入图片描述

1、创建完子进程后,子进程会共享父进程的代码和数据,很明显return也是一句代码,所以父子进程都会执行return语句,fork函数有两个返回值

pid_t id = fork();
打印id地址
在这里插入图片描述
观察到父子进程的返回值id是不一样的,但是地址却是一样的。
怎么可能同一个变量,同一个地址,会有不同的内容(变量id在父进程和子进程中值不同)呢?

2、进程具有独立性,首先表现在进程各自的PCB运行时不会相互影响,很明显,代码本身只是可读的,所以不是影响代码,但是对于数据来说,父子的数据是可能不同的(可能会被修改)
所以系统是怎样做到让数据在各个进程都自己私有一份的,答案是写时拷贝,数据会在需要使用时被写时拷贝到PCB,然而fork返回值赋值给变量时,本质也是写入,返回时也会发生写时拷贝,所以不同的进程执行的代码中的变量id获取的值不同

3、那么fork之后,父子进程谁先运行?
在调度队列中,cpu会选择一个进程去运行它,谁先被调度谁先运行,所以fork之后父子进程谁现在运行是不确定的,这是由各自进程PCB中的调度信息决定的,比如优先级,算法信息等。

小结

今日的分享就到这里啦,后面将会向你带来进程的状态,优先级,进程地址空间等知识,如果本文存在疏漏或错误的地方还请您能够指出!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/188311.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机玻璃盖板为什么需要透光率检测

手机盖板&#xff0c;也称为手机壳或保护套&#xff0c;是一种用于保护手机外观和延长使用寿命的装置。它们通常由塑料、硅胶、玻璃或金属等材料制成&#xff0c;并固定在手机外壳上,其中任何一个工序出现差错&#xff0c;都有可能导致手机盖板产生缺陷&#xff0c;例如漏油、透…

JavaScript如何实现钟表效果,时分秒针指向当前时间,并显示当前年月日,及2024春节倒计时,源码奉上

本篇有运用jQuery&#xff0c;记得引入jQuery库&#xff0c;否则不会执行的喔~ <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <meta name"chenc" content"Runoob"> <met…

Netty入门指南之NIO Selector监管

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题解…

kafka微服务学习

消息中间件对比&#xff1a; 1、吞吐、可靠性、性能 Kafka安装 Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装zookeeper Docker安装zookeeper 下载镜像&#xff1a; docker pull zookeeper:3.4.14创建容器 do…

ObjectArx动态加载及卸载自定义菜单

上节中我们介绍了如何制作自定义菜单即cuix文件&#xff1a;给CAD中添加自定义菜单CUIX-CSDN博客https://blog.csdn.net/qianlixiaomage/article/details/134349794在此基础上&#xff0c;我们开发时通常需要在ObjectArx程序中进行动态的添加或者删除cuix菜单。 创建ObjectArx…

C语言 每日一题 PTA 11.8 day14

1.矩阵A乘以B 给定两个矩阵A和B&#xff0c;要求你计算它们的乘积矩阵AB。需要注意的是&#xff0c;只有规模匹配的矩阵才可以相乘。 即若A有Ra​行、Ca列&#xff0c;B有Rb行、Cb列&#xff0c;则只有Ca与Rb​相等时&#xff0c;两个矩阵才能相乘。 输入格式&#xff1a; 输入…

【树与二叉树的转换,哈夫曼树的基本概念】

文章目录 树与二叉树的转换将二叉树转化为树森林与二叉树的转化&#xff08;二叉树与多棵树之间的关系&#xff09;二叉树转换为森林森林的先序遍历1&#xff09;先序遍历2&#xff09;后序遍历 哈夫曼树的基本概念森林转换成二叉树&#xff08;二叉树与多棵树的关系&#xff0…

【java:牛客每日三十题总结-4】

java:牛客每日三十题总结 总结如下 总结如下 集合相关知识点 元素是否排序和插入顺序无关&#xff0c;取决与集合实现是否考虑了传入对象的java.lang.Comparable接口抽象类和接口相关知识 只能说越来越抽象了 java线程通信的方式 在Java中&#xff0c;常用的线程通信方式有两…

运行npm install卡住不动的几种解决方案

在前端开发经常会遇到运行npm install 来安装工具包一直卡住不动&#xff0c;为此这里提供几种解决方案&#xff0c;供大家参考学习&#xff0c;不足之处还请指正。 第一种方案、首先检查npm代理&#xff0c;是否已经使用国内镜像 // 执行以下命令查看是否为国内镜像 npm con…

【React-Native开发3D应用】React Native加载GLB格式3D模型并打包至Android手机端

【React-Native开发3D应用】React Native加载GLB格式3D模型并打包至Android手机端 【加载3D模型】**React Native上如何加载glb格式的模型**第零步&#xff0c;选择相关模型第一步&#xff0c;导入相关模型加载库第二步&#xff0c;自定义GLB模型加载钩子第三步&#xff0c;借助…

RK3568平台 查看内存的基本命令

一.free命令 free命令显示系统使用和空闲的内存情况&#xff0c;包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略。 Mem 行(第二行)是内存的使用情况。 Swap 行(第三行)是交换空间的使用情况。 total 列显示系统总的可用物理内存和交换空间大小。 used 列显…

k8s、数据存储

数据存储的概念 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;…

springboot中定时任务cron不生效,fixedRate指定间隔失效,只执行一次的问题

在调试计算任务的时候&#xff0c;手动重置任务为初始状态&#xff0c;但是并没有重新开始计算&#xff0c;检查定时任务代码&#xff1a; 从Scheduled(fixedRate 120000)可以看到&#xff0c;应该是间隔120秒执行一次该定时任务&#xff0c;查看后台日志&#xff0c;并没有重…

不可否认程序员的护城河已经越来越浅了

文章目录 那些在冲击程序员护城河低代码/无代码开发平台自动化测试和部署工具AI辅助开发工具在线学习和教育平台 面临冲击&#xff0c;程序员应该怎么做深入专业知识&#xff1a;不断学习全栈技能开发解决问题的能力建立人际网络管理和领导技能 推荐阅读 技术和应用的不断发展对…

《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》阅读笔记

论文标题 《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》 Swin 这个词貌似来自后面的 Shifted WindowsShifted Windows&#xff1a;移动窗口Hierarchical&#xff1a;分层 作者 微软亚洲研究院出品 初读 摘要 提出 Swin Transformer 可以…

学习笔记:深度学习(3)——卷积神经网络(CNN)理论篇

学习时间&#xff1a;2022.04.10~2022.04.12 文章目录 3. 卷积神经网络CNN3.1 卷积神经网络的概念3.1.1 什么是CNN&#xff1f;3.1.2 为什么要用CNN&#xff1f;3.1.3 人类的视觉原理 3.2 CNN的基本原理3.2.1 主要结构3.2.2 卷积层&#xff08;Convolution layer&#xff09;1.…

VR全景如何应用在房产行业,VR看房有哪些优势

导语&#xff1a; 在如今的数字时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术的迅猛发展为许多行业带来了福音&#xff0c;特别是在房产楼盘行业中。通过利用VR全景技术&#xff0c;开发商和销售人员可以为客户提供沉浸式的楼盘浏览体验&#xff0c;从而带来诸多优…

1994-2021年分行业二氧化碳排放量数据

1994-2021年分行业二氧化碳排放量数据 1、时间&#xff1a;1994-2021年 2、来源&#xff1a;原始数据整理自能源年鉴 3、指标&#xff1a;统计年度、行业代码、行业名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧化碳排放量、煤油二氧化碳排放…

[云原生案例2.2 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】网络插件部分

文章目录 1. Kubernetes的网络类别2. Kubernetes的接口类型3. CNI网络插件 ---- Flannel的介绍及部署3.1 简介3.2 flannel的三种模式3.3 flannel的UDP模式工作原理3.4 flannel的VXLAN模式工作原理3.5 Flannel CNI 网络插件部署3.5.1 上传flannel镜像文件和插件包到node节点3.5.…

[Linux打怪升级之路]-信号的保存和递达

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、信号的保…