fork()两次不同返回值的实现

fork()系统调用参数返回值详解 linux系统调用fork()的详细剖析,必然令你恍然大悟~~~ 立即下载

http://www.cnblogs.com/hongzg1982/articles/2152093.html

fork()两次不同返回值的实现

【NOTE4】

首先必须有一点要清楚,函数的返回值是储存在寄存器eax中的。

其次,当fork返回时,新进程会返回0是因为在初始化任务结构时,将eax设置为0;

在fork中,把子进程加入到可运行的队列中,由进程调度程序在适当的时机调度运行。也就是从此时开始,当前进程分裂为两个并发的进程。

无论哪个进程被调度运行,都将继续执行fork函数的剩余代码,执行结束后返回各自的值。

【NOTE5】

对于fork来说,父子进程共享同一段代码空间,所以给人的感觉好像是有两次返回,其实对于调用fork的父进程来说,如果fork出来的子进程没有得到 调度,那么父进程从fork系统调用返回,同时分析sys_fork知道,fork返回的是子进程的id。再看fork出来的子进程,由 copy_process函数可以看出,子进程的返回地址为ret_from_fork(和父进程在同一个代码点上返回),返回值直接置为0。所以当子进 程得到调度的时候,也从fork返回,返回值为0。
关键注意两点:1.fork返回后,父进程或子进程的执行位置。(首先会将当前进程eax的值做为返回值)2.两次返回的pid存放的位置。(eax中)

进程调用copy_process得到lastpid的值(放入eax中,fork正常返回后,父进程中返回的就是lastpid)
子进程任务状态段tss的eax被设置成0,
fork.c 中
p->tss.eax=0;(如果子进程要执行就需要进程切换,当发生切换时,子进程tss中的eax值就调入eax寄存器,子进程执行时首先会将eax的内容做为返回值)
当子进程开始执行时,copy_process返回eax的值。
fork()后,就是两个任务同时进行,父进程用他的tss,子进程用自己的tss,在切换时,各用各的eax中的值.

所以,“一次调用两次返回”是2个不同的进程!

看这一句:pid=fork()
当执行这一句时,当前进程进入fork()运行,此时,fork()内会用一段嵌入式汇编进行系统调用:int 0×80(具体代码可参见内核版本0.11的unistd.h文件的133行_syscall0函数)。这时进入内核根据此前写入eax的系统调用功能号 便会运行sys_fork系统调用。接着,sys_fork中首先会调用C函数find_empty_process产生一个新的进程,然后会调用C函数 copy_process将父进程的内容复制给子进程,但是子进程tss中的eax值赋值为0(这也是为什么子进程中返回0的原因),当赋值完成 后,copy_process会返回新进程(该子进程)的pid,这个值会被保存到eax中。这时子进程就产生了,此时子进程与父进程拥有相同的代码空 间,程序指针寄存器eip指向相同的下一条指令地址,当fork正常返回调用其的父进程后,因为eax中的值是新创建的子进程号,所以,fork()返回 子进程号,执行else(pid>0);当产生进程切换运行子进程时,首先会恢复子进程的运行环境即装入子进程的tss任务状态段???,其中的 eax值(copy_process中置为0)也会被装入eax寄存器,所以,当子进程运行时,fork返回的是0执行if(pid==0)。

【NOTE5】

理解它关键在于理解堆栈的切换和压栈,弹栈!

关于子进程的返回:
子进程复制了父进程的栈内容,从高到低
SS
ESP
EFLAGS
CS
EIP 此是int 0×80 的下一条指令,也是子进程开始执行的地方!!!!
DS
ES
FS
EDX
ECX
EBX
GS
ESI
EDI
EBP
EAX(0)

由于 EAX = 0,所以子进程返回 0 给 fork.

注:新进程的用户栈设为其父进程的用户栈(最后弹出的SS,ESP)。如果父子进程以copy_on_write方式共用用户堆栈
(Linux之下就是这样的),而且在此之前父进程修改了该堆栈(如果父进程先返回,这几乎是肯定的),那么,系统已经为父进程创建了该用户栈的副本,父进程原来的用户栈留给了子进程。那么新进程的系统栈已经清空,新进程回到了用户态,返回到了函数fork。

分类:  Linux相关
EPS+ArcGIS+CASS三剑客:等高线裁剪的完整工作流与避坑指南 本文详细介绍了EPS、ArcGIS和CASS三款软件在等高线裁剪中的协同工作流程与避坑指南。通过发挥各软件优势,解决数据完整性、拓扑准确性和流程可靠性等核心挑战,提升40%以上的工作效率。特别适合大型测绘项目中复杂地形的处理,涵盖数据准备、核心处理到后期优化的全流程。 阅读详情

相关推荐

深入理解命名实体识别(NER)

命名实体识别(NER,Named Entity Recognition)是自然语言处理(NLP)中的一项重要技术,用于从文本中识别出特定类型的实体,并将这些实体分类到预定义的类别中。实体通常包括人名、地名、组织名、日期、时间、数量、货币等。例如,在句子“Barack Obama was born in Hawaii in 1961”中,NER任务的目标是识别“Barack Obama”作为人名,“Hawaii”作为地名,以及“1961”作为日期。

AngelCryToo的专栏 4638

fork函数详解_fork()(1),分享PDF高清版

假设我们的main进程pid是1001,注意看左边的1,2,4进程其实都是main进程1001。这个语句的意思是定义了一个pid_t类型的变量pid,fork()函数返回一个进程号,这个进程号赋给了pid。两个判断的代码都执行了,这是非常不可思议的,但fork函数确实实现了这样的功能。第三步: 父进程的代码执行完了,程序又会把fork后面的函数再执行一遍,此时pid的值变为0,所以进入判断2。***注意:**这里的pid_t类似一个类型,就像int型一样,int型定义的变量都是。

m0_60606468的博客 558

ArcGIS通过已知坐标点转面(通过excel文件,有工具可批量生成面要素)

通过使用ArcGIS中的工具,将坐标点XY数据转换成可视化的点线面矢量数据,更加方便快捷有效的获取对应信息

qq_41046162的博客 3万+

linux中fork()函数详解(原创!!实例讲解)

一、fork入门知识 二、fork进阶知识 三、fork高阶知识

jason的专栏 44万+

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2874

Unity VR 零基础开发之 Pico4 MR

2、弹出弹窗后,点击Android选项,然后再点击Switch Platform按钮切换成安卓平台。3、切换完成后Android选项后面会显示unity图标。

十画的博客 5096

关于操作系统fork()函数详解

Hello!fork( ) 对于操作系统的fork()函数,我也是在学操作系统时第一次接触,做实验时对这个函数的功能也是很懵,后期经过大量的学习、实验才讲这个函数拿下。 fork基础 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Mark你 功能快捷键 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y

北芒的博客 4118

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1159

linux fork函数的精辟解说

【IT168 技术】  #include ;   #include ;   main ()   {   pid_t pid;   pid=fork();   if (pid   printf("error in fork!");   else if (pid == 0)   printf("i am the child process, my process id is %dn

那些年 597

RK3588 C++ MeloTTS 推理

本文介绍了基于RK3588平台和RKNN工具链实现的端侧语音合成(TTS)系统。该系统支持中英文混合输入处理,通过自动合并英文单词、转换标点符号等方式预处理文本,并将其转换为音素和声调序列。核心推理流程包含编码器、中间处理和解码器三个阶段:编码器将音素序列转为隐藏状态,中间处理调节音调和语速,解码器生成最终波形。代码示例展示了输入数据设置和模型推理过程,利用RK3588内置NPU实现高效语音合成。该系统展现了在边缘计算设备上实现复杂AI任务的能力。

J。 199

第8讲:基于CST PCB Studio的电源完整性仿真(IR Drop + PDN)

本文系统介绍了电源完整性(PI)仿真的两大核心模块:直流IRDrop仿真与交流PDN阻抗仿真。文章详细阐述了两种仿真的原理、算法(PEEC和3DFE-FD)及完整操作流程,包括参数配置、软件实操步骤和常见问题解决方案。IRDrop仿真用于分析直流供电压降问题,PDN仿真则针对高频电源噪声和谐振问题。文中还提供了优化建议和故障排查方法,如调整铜箔厚度、优化电容布局等,为高速数字系统的电源完整性设计提供了全面的技术指导。(149字)

一只豌豆象的博客 235

FORK()函数的两次返回的具体情况

FORK()函数的两次返回的具体情况对于fork来说,父子进程共享同一段代码空间,所以给人的感觉好像是有两次返回,其实对于调用 fork的父进程来说,如果fork出来的子进程没有得到调度,那么父进程从fork系统调用返回,同时分析sys_fork知道,fork返回的是子进 程的id。再看fork出来的子进程,由copy_process函数可以看出,子进程的返回地址为ret_from_fork(

fatsandwich的专栏 2133

后仿真中《SDF反标必懂连载篇》之 <INTERCONNECT/IOPATH> 到底反标电路路径是哪里

对于SDF INTERCONNECT ENTRY 描述,我们在之前的文章有详解。读万卷书,行万里路。实践很重要。今天,搞一下SDF INTERCONNECT / IOPATH 延迟数据信息,究竟反标的是哪一路径延时?究竟在电路上一段段如何表现出延迟现象的呢?

那么菜的博客 2131

unix/linux fork函数实例分析

unix/linux fork()实例分析 打算分析一下fork() 函数。 代码 #include <stdio.h> #include <sys/types.h> int main(){ pid_t pid; pid = fork(); if(pid == 0){ printf("Run in Child proces...

bwxzing的专栏 339

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

fork()两次不同返回值

【NOTE4】 首先必须有一点要清楚,函数的返回值是储存在寄存器eax中的。 其次,当fork返回时,新进程会返回0是因为在初始化任务结构时,将eax设置为0; 在fork中,把子进程加入到可运行的队列中,由进程调度程序在适当的时机调度运行。也就是从此时开始,当前进程分裂为两个并发的进程。 无论哪个进程被调度运行,都将继续执行fork函数的剩余代码,执行结束后返回各自的值。 【NOTE5...

Kk_01110001B的博客 759

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

fork()函数的底层实现原理

在之前的博客 进程控制【创建、等待、终止和替换】 - 优快云博客 https://blog.youkuaiyun.com/qq_37964547/article/details/79720027中只是简单的讲到了fork函数,但并没有深入,今天在复习知识的时候,就把fork函数重新学习了一遍,做了一下总结。 在Linux中,fork函数是非常重要的函数,他从一个已存在的进程中创建一个新进程;新进程...

everthing willl be ok 1万+

fork两次不同返回值的实现

【NOTE4】首先必须有一点要清楚,函数的返回值是储存在寄存器eax中的。其次,当fork返回时,新进程会返回0是因为在初始化任务结构时,将eax设置为0;在fork中,把子进程加入到可运行的队列中,由进程调度程序在适当的时机调度运行。也就是从此时开始,当前进程分裂为两个并发的进程。无论哪个进程被调度运行,都将继续执行fork函数的剩余代码,执行结束后返回各自的值。【NOTE5】对于fork来说,父

FallingU的博客 2315

详解fork()函数的两个返回值

-首先,在调用fork函数时,操作系统会从用户态切换到内核态来进行进程的创建,会调用fork函数中的_CREATE函数和_CLONE函数。 -在调用_CREATE函数时,子进程进行虚拟地址申请,在子进程的内核空间中进行不完全拷贝,因为PID作为每个进程的唯一标识符,就像每个人的身份证一样,是不可能完全一样的,所以这个地方时不完全拷贝,所以PID就需要自己生成。 ...

qq_55914897的博客 6861

关于fork()函数的两个返回值

对于刚刚接触Unix/Linux操作系统,在Linux下编写多进程的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。  首先我们来看下fork函数的原型: #include #include         pid_t fork(void); 返回值: 负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。 零:在子进程中

danelumax2的专栏 7578

关于fork()返回值

fork简介:         fork英文原意是“分岔,分支”的意思,而在操作系统中,乃是著名的Unix(或类Unix,如Linux,Minix)中用于创建子进程的系统调用。 【NOTE1】 fork () 的作用是什么?换句话说,你用

jack.A!!en 1189

调用 fork() 两次以避免僵死进程

当我们只fork()一次后,存在父进程和子进程。这时有两种方法来避免产生僵尸进程: 父进程调用waitpid()等函数来接收子进程退出状态。父进程先结束,子进程则自动托管到Init进程(pid = 1)。       目前先考虑子进程先于父进程结束的情况:      若父进程未处理子进程退出状态,在父进程退出前,子进程一直处于僵尸进程状态。若父进程调用waitpid()(这里使用

张勤一 6771

【Linux】——进程创建fork()详解

文章目录一、fork作用二、fork()特性1、父子进程之间的关系2、父子进程返回情况3、父子进程执行情况三、写时拷贝技术1、概念2、特点 一、fork作用 我们都知道fork可以用于进程的创建,那首先我们来了解一下fork的两种用法才真正的了解我们何时才会用到fork来进行进程的创建 用法一:一个父进程希望复制自己,使父、子进程同时执行不同的代码段。 这在网络服务进程中是最常见的——父进程等待客...

qq_43412060的博客 1万+
上一篇: 电感的特性
下一篇: 动态加载so
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值