007 Linux fork()函数

news2024/10/5 21:25:26

前言

本文将会以提问的形式展开向你介绍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.coloradmin.cn/o/1189297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微服务】API治理发展历史与未来趋势

目录 一、前言 二、API治理的价值和意义 2.1 API治理概念 2.2 API治理价值和意义 2.2.1 提升团队协同效率 2.2.2 降低产品运维成本 2.2.3 识别和降低系统的外部风险 2.2.4 提供更多的拓展性 三、API生命周期管理 ​编辑 3.1 规划阶段 3.2 开发阶段 3.3 测试阶段 3…

【Linux网络】网卡配置与修改主机名,做好基础系统配置

目录 一、网络配置命令 1、查看网卡信息ifconfig Linux永久修改ip地址 2、主机名修改 ①hostname 临时修改主机名 ②永久修改主机名 第一种&#xff0c;使用命令修改 第二种&#xff1a;修改配置文件 3、路由信息 再来拓展一下&#xff0c;永久修改路由表信息 4、检查…

如何在双11入手经济实惠的家用监控摄像头?把这篇文章看完再决定!

随着双十一大促的临近&#xff0c;后台收到了许多想要入手家用监控但不知道如何选择的用户私信。关于家用监控我们之前也和大家探讨过&#xff0c;感兴趣的可以查看《家用智能安防系统包括哪几个部分&#xff1f;如何应用&#xff1f;》&#xff0c;那么今天小编就和大家聊聊如…

TikTok shop美国小店适合哪些卖家做?附常见运营问题解答

一、Tiktok shop小店分类 大家都知道&#xff0c;美国小店可以分为5 种&#xff1a; 美国本土个人店: 最灵活&#xff0c;有扶持政策&#xff1b;美国法人企业店&#xff1a;要求高&#xff0c;有扶持政策&#xff1b;美国公司中国人占股店 (ACCU店) : 权重相对低&#xff0c…

C语言数据结构-----单链表(无头单向不循环)

前言 本篇讲述了单链表的相关知识&#xff0c;以及单链表增删查改的代码实现。 文章目录 前言1.链表1.1 链表的结构和概念 2.(增删查改)单链表的实现2.1 打印链表2.2 尾插2.3 尾删2.4 头插2.5 头删2.6 查找2.7 在指定位置(pos)前插入2.8 在指定位置(pos)删除2.9 在指定位置(p…

骨传导蓝牙耳机推荐,2023骨传导耳机选购攻略

相信大家佩戴入耳式耳机时间长后&#xff0c;都会出现耳朵痛的情况&#xff0c;这也是这类耳机的一个通病了&#xff0c;为了缓解这一问题&#xff0c;骨传导耳机出现了&#xff0c;并且凭借佩戴舒适&#xff0c;并且不会耳痛等优点迅速成为当下最受欢迎的耳机款式&#xff0c;…

第14章,lambda表达式与流处理例题

package 例题;import java.util.List; import java.util.stream.Collectors; import java.util. stream.Stream;public class 例题19 { public static void main(String[] args){List<例题14> list 例题14.get例题14List();//获取公共类的测试数据Stream<例题14>…

leetCode 206.反转链表 图解

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* s NULL;ListNode* phead;while(p) {headhead->nex…

分享4个MSVCP100.dll丢失的解决方法

msvcp100.dll是一个重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。如果计算机系统中msvcp100.dll丢失或者损坏&#xff0c;就会导致软件程序无法启动运行&#xff0c;会…

python-jupyter实现OpenAi语音对话聊天

1.安装jupyter 这里使用的是jupyter工具&#xff0c;安装时需要再cmd执行如下命令&#xff0c;由于直接执行pip install jupyter会很慢&#xff0c;咱们直接使用国内源 pip install --user jupyter -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.t…

leetcode一道比较难的链表题

今天还是继续来分享我们的链表题&#xff0c;这个题目有点难&#xff0c;主要是思路比较难想&#xff0c;但是如果沥青思路写起来就比较简单了&#xff08;我乱讲的&#xff09; 随机链表的复制 这个是题目的描述&#xff0c;大家也可以在链接里看&#xff0c;那我把这道题目…

React中组件之间如何通信?

一、是什么 我们将组件间通信可以拆分为两个词&#xff1a; 组件通信 回顾Vue系列的文章&#xff0c;组件是vue中最强大的功能之一&#xff0c;同样组件化是React的核心思想 相比vue&#xff0c;React的组件更加灵活和多样&#xff0c;按照不同的方式可以分成很多类型的组件…

Unity游戏开发基础之数据结构部分

设计模式 含义&#xff1a;帮助我们降低对象之间的耦合度常用的方法称为设计模式。使用设计模式是为了可重用代码&#xff0c;让代码更容易被其他人所理解&#xff0c;保证代码可靠性&#xff0c;使代码编制真正工程化&#xff0c;这是软件工程的基石。 分类&#xff1a; 创建…

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech&#xff0c;这2个设计软件是目前市场上很受欢迎的专业UI设计软件&#xff0c;在全球各地都有很多粉丝用户。但是相对来说&#xff0c;Figma与Sketch只支持iOS系统有所不同&#xff0c;Figma是一个在线设计软件&#xff0c;不限…

Flink(二)【Flink 部署模式】

前言 今天是Flink学习的第二天&#xff0c;我的心情异常的复杂哈哈哈&#xff08;苦笑&#xff09;&#xff0c;学习上还是比较顺利的&#xff0c;感情上我并不擅长&#xff0c;所以心情波动大在所难免。害&#xff0c;至少还有学习让我不被各种糟糕琐碎的日常生活里的人和事所…

【2023方案开发】无刷电机自动打气泵方案

如今新能源车大行其道&#xff0c;而车厂在考虑成本和设计的情况下&#xff0c;将备胎给取消了&#xff0c;那假如在车胎气压不足的状态下&#xff0c;没有备胎更换&#xff0c;那将如何解决困境。气压不住需要打气&#xff0c;那配备一台打气泵尤为重要&#xff0c;即使常年可…

Git系列之Git入门级(带你走进Git的世界)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…

论文速览 MobiCom 2023 | NeRF2 : Neural Radio-Frequency Radiance Fields

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 Xiaopeng Zhao, Zhenlin An, Qingrui Pan, and Lei Yang. 2023. NeRF2: Neural Radio-Frequency Radiance Fields. In Proceedings of the 29th Annual International Conference on Mobil…

AIGC:使用生成对抗网络GAN实现MINST手写数字图像生成

1 生成对抗网络 生成对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;是一种非常经典的生成式模型&#xff0c;它受到双人零和博弈的启发&#xff0c;让两个神经网络在相互博弈中进行学习&#xff0c;开创了生成式模型的新范式。从 2017 年以后&#x…

kubectl声明式资源管理命令

一、声明式资源管理介绍&#xff1a; 适合于对资源的修改操作声明式资源管理方法依赖于资源配置清单文件对资源进行管理资源配置清单文件有两种格式&#xff1a;yaml&#xff08;人性化&#xff0c;易读&#xff09;&#xff0c;json&#xff08;易于api接口解析&#xff09;对…