Linux操作系统学习_用户进程之由新进程创建到可执行程序的加载

分析Linux内核创建一个新进程的过程 新进程的执行源于以下前提: - dup_task_struct中为其分配了新的堆栈 - 调用了sched_fork,将其置为TASK_RUNNING - copy_thread中将父进程的寄存器上下文复制给子进程,保证了父子进程的堆栈信息是一致的 - 将ret_from_fork的地址设置为eip寄存器的值 最终子进程从ret_from_fork开始执行 阅读详情
  fork()函数大家应该都不陌生,一个现有进程可以调用fork函数来创建一个新进程,由fork()创建的新进程通常被称为子进程。fork()函数被调用一次,但返回两次,两次返回的区别在于,子进程的返回值为0,父进程返回值为子进程的PID值。但是,就是这大家都非常熟悉的一个函数,在你调用fork进行新进程创建的过程中,操作系统到底做了哪些工作,具体的工作过程又是什么,不知道又有多少人清楚的知道。下面在这里,将这一过程大体走一遍。

      当用户编写一个程序或一段代码后,通过编译链接生成可执行文件(这里这一具体过程在前一篇博文中已经具体介绍过了,这里不再赘述),这里假设这一可执行文件的名字为str1,当用户在操作系统的shell终端界面中输入一条指令./str1,shell程序便会响应并解析这条指令,经解析得知,用户现在要执行str1这个程序,于是shell将调用fork函数开始创建进程,接下来会产生int 0x80软中断,软中断产生后,system_call函数会对此响应,并最终执行call sys_call_table(,%eax,4)这行代码,这一过程为查询系统调用表,其中%eax寄存器中存储的为系统调用号。通过查询系统调用表之后,最终映射到函数sys_fork中。之后,调用do_fork函数,分别为str1进程申请一个可用的进程号和在进程槽task[64]中为该进程申请一个空闲的位置。

      然后通过调用copy_process函数,准备将当前shell进程的管理结构复制给str1。首先,在主内存中为用户进程str1申请一个页面的空间,然后将这个申请到的空闲页面与之前申请到的进程槽task[64]中的相应的空闲项相挂接。这里需要指出的是,这个内存页面除了用来存储str1自身的管理结构之外,还用来存储str1进程的“内核栈”数据。

      这里涉及到系统的两个状态——“用户态”和“内核态”。

       当进程运行在内核态时,可以执行指令集中的任何指令,并且可以访问系统中任何存储器。

       当进程运行在用户态时,不允许执行特权指令,也不允许直接引用地址空间中内核区内的代码和数据。用户程序必须通过系统调用接口间接地访问内核代码和数据。

      之前申请到的空闲页面被用来存储进程管理结构的数据和内核栈的数据,它们被放在同一个页面内,分别处于同一页面的两端。当用户程序执行时,通常进程处于用户态,这时候用户程序会致使多少数据需要压栈,操作系统的设计者是不可能预知的。所以就根据程序执行时的具体需要,在主内存中分配页面,以此来承载栈数据。但是,一旦内核程序开始执行,即处于内核态,那么内核程序运行时会有多少数据需要压栈,系统设计者是可以预知的,尤其可以预知最多会有多少数据需要压栈。所以,设计者敢于将内核栈的数据与进程管理结构的数据放在同一个页面内,将来用户进程str1进入内核态的时候,压栈的数据将向着str1管理结构所在的位置不断地积累,但绝对不可能覆盖掉进程管理结构的数据。

      copy_process函数还有一项非常重要的任务,即将当前运行进程shell的进程管理结构task_struct,复制到刚才新申请的空闲页面的起始端。这就是str1的task_struct的雏形。这里有人会问,如果将str1的task_struct设置成与shell的一样,那新建的用户进程怎么去执行用户的程序?那岂不是和shell执行一样的程序了?这里此处先埋下一个伏笔,这个问题留到后面介绍完页目录项和页表项之后进行解释。

      下面调用copy_mm函数为新建的用户进程str1在线性地址空间中指定一个位置。这里提一下,对普通用户程序而言,能够接触到的只有逻辑地址,即在所有用户程序看来,它们的地址范围都是0~64MB这个空间内;而内核根据不同的用户程序所在的进程将其对应成线性地址,并将此线性地址解析成“页目录项”、“页表项”、“页内偏移”,最终映射到物理页面内。这里对str1进程设置的线性地址范围是专供内核使用的。

      下面调用copy_page_tables函数把shell进程对应页表的全部表项复制给str1进程,并为此新建一套页目录项。正因为str1进程的页表信息是由其父进程shell复制过来的,所以str1进程现在暂时先与其父进程shell共享相同的内存页面,将来str1有了属于自己的程序后,再另行调整。这里的调整指的是将这些建立好的内存映射、页表项关系全部解除。那么会有人有疑问,既然后面子进程有了自己的程序之后这种关系要解除,为什么之前还要这样将父进程的页表项内容不加修改的复制到子进程的页表中呢?

      这个意义是重大的,因为有一个对str1进程独立运行来说非常关键的步骤需要基于上述复制页表和设置页目录项的操作来解决。我们知道,在str1创建并执行之初,该进程并没有对应的执行程序,这就需要加载程序,于是就要调用execve函数。然而,调用execve函数的这行代码又在哪里呢?很显然,只能在它的父进程,即shell程序中,这就意味着,str1进程一旦开始执行,必须有能力执行shell程序里面的代码,这样才能开展以后的加载工作,直到它自己的子程序加载完毕。要想具备这种能力,只有一个办法,就是让str1进程在创建之初就能够共享shell程序所占用的页面,一旦执行,共享能力马上生效。而这里的复制页表和设置页目录项的工作就是为str1能够具备这个能力所做的准备工作。str1和shell的线性地址肯定不同,但是通过复制页表和设置页目录项,就可以使不同的线性地址映射到相同的物理地址上,以此来实现共享。

      在调整完str1进程中与文件相关的结构之后,就要建立str1进程与全局描述符表GDT的关联。将用户进程str1的任务状态描述符表TSS,以及局部数据描述符表LDT挂接在全局描述符表的指定位置。所有进程都要把这两套描述符表挂接在全局描述符表中,这样在进程切换时,系统就可以通过全局描述符表找到当前进程的LDT和TSS,并把相关的信息保存在当前进程的LDT和TSS中。同时,还可以找到即将切换到的进程的TSS和LDT,并用它们里面存储的数据信息来设置局部数据寄存器和任务状态寄存器。可见,现在所做的挂接工作是系统能够进行进程间切换的最根本的保障。

      然后将str1进程的状态设置为“就绪态”,至此,这个用户进程的管理结构就创建完毕了。

      shell创建完str1进程的管理结构之后,通过shell自身的代码继续执行,最终会切换到str1进程去执行,由str1进程来加载自己对应的程序。str1进程开始执行后,会调用execve函数,为了支持str1程序加载的准备工作更好的完成,系统将一些数据进行了压栈保存。首先execve函数将文件的路径名、参数、环境变量压栈,以此来支持将来参数和环境变量的加载。创建str1用户进程时,参数和环境变量的具体信息是由shell程序自身的代码来提供的,任何一个用户进程所对应的参数和环境变量都是由创建它的父进程来提供的。随后,产生软中断,映射到一个系统调用函数sys_execve中执行,硬件将EIP的值压栈,这个值决定中断程序结束后执行哪一条指令。sys_execve中要做的最重要的事情,就是把EIP值“所在栈空间的地址值”压栈。这里注意,Intel CPU是不能通过指令直接修改EIP寄存器的值,有了前面的压栈,操作系统就可以通过这个值找到栈中的EIP值,修改栈中的EIP的值。

      然后,进入do_execve函数,先做外围准备工作,即为管理str1进程参数和环境变量所占用的页面做准备。在此过程中有一个小插曲,就是需要在中间时刻暂停外围准备工作,转而将str1进程的可执行文件的i节点由硬盘中读入到内存中,读入这个i节点的目的就是为了对这个str1文件进行检测,看其是否具备载入条件。之后再继续回去做外围准备工作,把参数和环境变量的个数统计出来。具体过程如下:

                                            

 

      然后,对读取的i节点进行分析,通过对i节点中“文件属性”的分析,可以得知这个str1文件是不是一个“常规文件”。因为只有是常规文件,即,除了块设备文件、字符设备文件、目录文件、管道文件等特殊文件之外的文件,才有被载入的可能。同时还要检测当前进程是否有执行权限,并对用户ID等信息进行设置。

      接下来要对可执行文件的文件头进行检测,文件头中记载了这个可执行程序的代码段长度和数据段长度等关键的属性信息,这些信息直接影响到可执行程序将来被加载入内存后是否能够正常执行,而且若这个可执行程序确实能够执行,那么这个文件头中的信息将引导系统对可执行程序的加载。因为可执行程序也是以数据块的形式存储在虚拟盘上的,所以它的文件头,正常情况下在它的第一个逻辑块内。系统将这个文件头从硬盘上读入到缓冲块内,先对这个文件头进行备份,然后根据文件头和i节点提供的信息,对可执行文件进行检测,判断可执行程序是否能被加载。

      当经过前面的文件检测,系统可以确定,shell程序确实具备加载的能力,接下来要把前面统计的参数和环境变量及其相关辅助信息拷贝到内存指定的页面中去。到这里,加载str1程序的外围准备工作和对str1这个可执行文件的检测工作就全部结束了。接下来,要根据实际情况,对str1进程的管理结构进行调整。先要更改该文件的executable字段,这个字段就是str1进程对应的可执行文件的i节点,目前str1该字段对应的是创建其的shell进程的可执行文件。str1进程创建时,由于shell管理机构中的信息全部都复制给了str1进程,所以这里面也一定包括shell进程与其可执行文件的关系,现在str1进程就要拥有自己的程序了,也一定会对应一个属于自己的可执行文件的i节点,所以原来这个关系已经没有必要继续维护下去了,这就要先把它与shell可执行文件的关系解除掉,这里具体表现为释放这个文件的i节点,并把str1这个可执行文件的i节点与str1进程挂接上。

PS:这里注意,并不是当str1要加载新程序时就会把所有之前与文件的关系都解除掉。str1加载子程序后也会用到的关系是不会被解除的。

      接着调整str1进程管理结构,将与文件和信号相关的数据信息进行调整,与信号相关的信息全部清0,这是因为每个进程都会接受各自的信号,这些都是进程私有的信息,彼此之间不能交叉使用,所以str1把shell进程的信号继承下来毫无意义,而且由于信号还会影响到进程的执行状态,继承下来有可能造成混乱,因此全部清空。

      下面释放str1进程原先的代码段和数据段所占用的物理页面。这里主要有两个原因:1、str1将要对应的程序与shell程序肯定有所不同,但是str1进程现在与shell进程正在共享着相同的页面和管理页表,所以要把这个共享关系解除掉。2、str1与shell进程共享页面,共享就意味着这些页面必须是“只读”的,现在str1由于加载新程序不再需要这些页面中的程序了,如果还共享着原来shell程序的页面,一来毫无意义,二来也会影响到shell程序对这些页面的应用,所以关系也要解除。

      然后,根据之前拷贝进内存的str1可执行文件的文件头所提供的信息重新设置str1程序代码段的描述符以及重新设置数据段描述符。具体表现为,代码段限长被设置为与str1.c文件的代码段长度相同。数据段长度设置为64MB,之后再将参数与环境变量所在的物理页面映射到str1这个进程的线性地址空间内。

      接着创建环境变量和参数的指针表,并将其地址存放到环境变量和参数所在的主内存区的页面中。

      然后对str1用户进程管理结构中的brk、start_stack等信息进行设置,这些信息都是直接或者间接从str1可执行文件的文件头中采集出来的,这与从shell进程对应的可执行文件中采集出来的程序肯定是不一样的,所以这里必须重新设置,以支持str1进程在加载子程序后运行。到此为止,为str1程序加载所做的工作中,针对str1进程管理结构自身的属性进行调整的工作就全部做完了。

      系统现在开始为str1程序的加载做最后的准备工作,即对EIP的值进行调整,使之指向str1程序的第一条指令处,这将导致软中断服务程序执行完毕后,系统会从str1程序起始位置开始执行,并会发生缺页中断。另外,为了保证str1执行后能够使用栈空间,也要对栈顶指针进行设置,即对esp进行设置,使其指向str1的栈底。前面已经介绍过,系统将EIP值“所在栈空间的地址值”压栈,这个地址值将成为这里所进行设置的基础,系统将分别用str1程序起始地址值和当前进程栈顶位置值,来对EIP和栈顶指针ESP进行设置,设置完毕后,通过sys_execve函数中的ret指令,将重新设置的EIP值载入eip寄存器,并指引代码的执行。(此处原理参见这篇文章)

      到此,为str1程序的加载所需要做的准备工作就全部完成了,接下来,str1程序就可以加载了。

分析Linux内核创建一个新进程的过程(Linux) ------------分析Linux内核创建一个新进程的过程--------------        这次实验要详细分析Linux内核创建新进程的过程。那么我们应该先明确,一个进程在Linux内核中是怎样的。那么就是要知道如下的几个知识。        进程(Process)                系统进行资源分配和调度的基本单位,一个进程是一个程序的运行实例。 阅读详情

相关推荐

计算机组成原理与系统结构 实验教程 西安

目录 第1 章运算器......................................................................................................................................1 1.1 基本运算器实验.....................................................................................................................1 1.2 超前进位加法器设计实验.....................................................................................................6 1.3 阵列乘法器设计实验...........................................................................................................12 第2 章存储系统................................................................................................................................14 2.1 静态随机存储器实验...........................................................................................................14 2.2 Cache控制器设计实验.........................................................................................................18 第3 章控制器....................................................................................................................................23 3.1 时序发生器设计实验...........................................................................................................23 3.2 微程序控制器实验...............................................................................................................26 第4 章系统总线与总线接口............................................................................................................36 4.1 系统总线和具有基本输入输出功能的总线接口实验.......................................................36 4.2 具有中断控制功能的总线接口实验...................................................................................41 4.3 具有DMA控制功能的总线接口实验..................................................................................43 第5 章模型计算机............................................................................................................................45 5.1 CPU与简单模型机设计实验...............................................................................................45 5.2 硬布线控制器模型机设计实验...........................................................................................53 5.3 复杂模型机设计实验...........................................................................................................57 第6 章输入输出系统........................................................................................................................71 6.1 带中断处理能力的模型机设计实验...................................................................................71 6.2 带DMA控制功能的模型机设计实验..................................................................................85 6.3 典型I/O接口8253 扩展设计实验.......................................................................................91 第7 章精简指令系统计算机............................................................................................................95 7.1 计算机的指令系统..................................................................................................................95 7.2 基于RISC技术的模型计算机设计实验................................................................................98 第8 章重叠处理机..........................................................................................................................103 8.1 重叠的基本原理和思想.....................................................................................................103 8.2 基于重叠技术的模型计算机设计实验.............................................................................105 第9 章流水线处理机........................................................................................................................ 114 9.1 流水线的原理及基本思想.................................................................................................114 9.2 基于流水技术的模型计算机设计实验.............................................................................

操作系统-15-进程的创建

从这一节起,我们将详细讲解进程的一生。进程如人生,进程的一生同样包含三个阶段,创建,运行和终结,本节是进程三部曲的开篇:进程创建。 接下来,我们讲解关于进程创建的诸多问题。 进程是由谁创建的?在什么情况下创建的? 幸好这个问题不像鸡生蛋蛋生鸡那样,这个问题的答案相对简单,进程的创建者有两种: 1.操作系统可以创建新的进程 2.进程也可以创建新的进程 其中,进程的创建者被称为父进程,创建出的进程被称为子进程。 1,操作系统创建进程:初始化 作为计算机的Boss,最初的进程是由操作系统创建的,操作系统在初始化的

FairLikeSnow的博客 1万+

PostgreSQL+PostGIS空间数据入库实战:从矢量栅格到GeoServer发布全流程

本文详细介绍了将矢量与栅格空间数据导入PostgreSQL并利用PostGIS扩展进行管理的完整流程。内容涵盖环境搭建、使用shp2pgsql和raster2pgsql工具进行数据入库、基础空间查询验证,以及最终通过GeoServer发布为地图服务的实战步骤,为构建空间数据平台提供清晰指引。

weixin_29268267的博客 289

【Linux操作系统】进程概念详解

Linux操作系统,进程概念的讲解,冯诺依曼体系结构的理解,操作系统的概念,进程PCB,上下文数据,fork子进程,进程状态,进程优先级,环境变量。

m0_57018588的博客 2558

逆向实战:Soul聊天协议加密与Frida绕过检测技术解析

本文详细解析了Soul聊天协议的逆向工程实战,重点介绍了使用Frida绕过检测技术的具体方法。通过IDA和JADX进行静态分析,结合Frida动态调试,揭示了数据加密与解密的核心逻辑,并提供了完整的逆向工作流和实用技巧,帮助开发者深入理解协议逆向过程。

weixin_29260291的博客 925

操作系统笔记(含王道计算机考研——操作系统课件)

操作系统(OS) 笔记根据B站王道计算机考研——操作系统视频整理所得,视频链接:https://b23.tv/0I2qex 视频中所用课件:链接:https://pan.baidu.com/s/101bFWm0Tv0emNpEneidYPA 提取码:y3dd 1.计算机系统概述 1.简介 什么是操作系统? 操作系统(Operating Ststem, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是

拧发条鸟的博客 6万+

Linux进程加载过程以及内存分析

进程加载过程以及Linux进程内存分析 1、进程加载分析 进程的加载过程从bash调用fork()系统调用创建一个新进程开始,新进程调用execve()系统调用执行指定的ELF文件,在执行execve()后,内核就开始了真正的装载过程,execvp()系统调用对应的入口是sys_execve(),在sys_execve()进行了一些参数的检查复制后,调用do_execve(),之后do_exe...

zhongfujin的博客 3722

系统磁盘从MBR格式转换成GPT格式来升级win11

之前的《》中说到,需要把磁盘格式转化为MBR格式才能执行下去。问题是,win10升级win11要求启动方式为UEFI的话,磁盘格式不能为MBR。其实不升级也不影响啥,但是就是想好看点。所以花了点时间折腾了一下。我这是双系统,所以直接去A系统修复B系统的磁盘格式和引导。

qq_42520962的博客 9040

Linux进程调度与管理:(二)进程的加载与启动

文章介绍: 介绍新进程如何获取可执行程序并运行的

abobob的博客 869

Floyd算法在社交网络中的应用:如何找到六度人脉的最短路径?

本文探讨了Floyd算法在社交网络分析中的核心应用,特别是如何利用该算法高效计算任意两人之间的最短路径,从而量化“六度人脉”理论。文章通过构建微型社交网络模型,详细拆解了Floyd算法的动态规划原理与代码实现,并展示了如何从计算出的最短路径距离矩阵中挖掘节点中心性、识别社群等关键洞察,为社交推荐、影响力分析等场景提供技术支撑。

blockchain9miner的博客 1002

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

Linux下创建新进程

创建新进程在Linux的下是由父进程来完成的,创建完成的新进程是子进程。子进程有三种执行顺序的可能性: 父进程和子进程并发执行; 子进程先执行,父进程等待子进程执行完毕。 父进程先执行,子进程后执行。 另外新进程的地址空间有两种可能性: 子进程是父进程的复制品(除了PID和task_struct中是子进程自己的,其余的都从父进程复制而来) 子进程装入另一个程序。 在Linux下的fork...

zy010101博客 2万+

swl安装无法与服务器建立链接,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 2072

【Linux操作系统分析】进程的创建与可执行程序的加载

进程的创建与可执行程序的加载 SA***189         周肃 一 进程的创建         进程0是所有进程的祖先。进程1被创建并选择后调用execve()系统调用转入可执行程序init,init进程一直存活,创建和监控在操作系统外层执行的所有进程的活动。         当fork()被调用时,主要由函数do_fork()函数来处理。do_fork()函数的执行

面团的专栏 1967

2025 提高电力交易价格预测的疾风大模型方法综述

电力现货市场价格预测正转向大模型驱动的新范式。传统方法在极端波动、政策突变等场景下表现不佳,而Transformer、预训练时序模型(如Chronos-Bolt)和LLM混合框架展现出显著优势。关键技术包括多模态数据融合、两段式预训练微调、MoE架构和LLM-RAG增强解释性。案例显示,澳大利亚NSW市场误差降低43%,但混合模型路由仍必要。未来趋势涵盖数字孪生电网和多智能体竞价,需平衡模型创新与行业合规要求。大模型通过跨域学习与业务耦合提升预测,但需持续优化数据隐私、算力消耗和极端事件应对能力。

专注AI大模型,软件混淆,授权 1052

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

进程的创建与可执行程序的加载

进程的创建与可执行程序的加载 一 进程相关简介         进程就是程序的一次执行,OS是通过进程的PCB对进程进行管理的,在Linux中task_struct结构即是进程的PCB,task_struct的结构如附录一所示,这里主要介绍跟进程创建和可执行程序加载密切相关的部分。 1.首先是next_task,pre_task。我们知道在linux中维护一个所有进程链表struct lis

呼呼的专栏 2763

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

操作系统实验一·创建进程

操作系统实验一 1.实验目的: 使用系统调用实现“mytime”命令,通过命令行参数运行可执行程序。创建一个新进程来运行此可执行程序,并记录该程序的运行时间。实现Windows版本和Linux版本。 2.实验内容: 2.1 Windows实现 •使用CreateProcess()创建新流程 •在“mytime”命令中使用WaitForSingleObject()与创建的进程同步。 •使用GetSystemTime()获取时间。 2.2 Linux实现 •使用fork()/execv()创建新流程 •使用wa

zhj12399的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

fork()是如何创建新进程的

进程,我们一般都把它看做是程序执行的一个实例,是进程实体的运行过程,是系统进行资源分配和调度的一个独立的单位。有产生、有消亡。当一个进程创建时,子进程可以继承父进程所有资源,撤销时,也要归还所有资源。 一、进程描述符        我们一般所说的进程控制块PCB对应到linux内核里面是一个task_struct的类型结构,它的字段包含了与一个进程相关的所有信息。下图即是一个linux

mightySheldor的专栏 6416

20252820_Linux 内核创建一个新进程的过程

本实验从用户态的简单fork()。通过阅读,理解了进程在内核中的数据结构表示,尤其是父子关系、地址空间、文件表和线程上下文等关键字段,这些字段正是在中被复制或重建的。通过 gdb 跟踪,验证了子进程第一次执行的位置确实在,说明内核在创建阶段已经为新进程准备好了完整的执行现场。

m0_63863049的博客 686

Linux操作系统实验二:进程的创建与可执行程序的加载

SA*****210    *明 进程是计算机中已运行程序的实体。程序本身只是指令的集合,进程才是程序(那些指令)的真正运行。进程也是一个可以执行的程序指令集;和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);程序的执行上下文  系统用一个叫做“进程表”的东西来维护中系统中的进程,进程表中的一个条目维护着存储着一个进程的相关信息,比如进程号,进程状态,寄存器值等等... 当

zhinenghuming的专栏 2870

Linux基础----创建新进程

前言 好久没学习了,最近都在忙着上班的事情,过年后这段时间感觉每天都有事情做,忙忙忙,学Linux感觉说实话,有点枯燥,比当初学FPGA还要枯燥。真的是毕业之后,再去学习的动力就下降很多吗。但是还是要坚持啊。。。 1. 程序和进程 1.1 程序和进程的关系 程序: 简单来说程序是一个静态的文件,这个文件中包含了为特定任务的指令和序列。 进程: 进程是程序执行的具体实例。当一个程序被执行之后,它就是一个进程,直到程序运行结束,进程会被销毁。 在程序执行的过程中,它享有系统的资源, 至少包括进程的运行环境、C

black_pigeon博客 1047

新进程的创建

新进程的创建

chenjinlei456的专栏 919

linux创建新进程的函数,Linux fork函数创建一个新进程

在Linux中创建一个新进程的唯一方法是使用fork函数,fork()执行一次但有两个返回值。在父进程中,返回值是子进程的进程号;在子进程中,返回值为0。因此可通过返回值来判断当前进程是父进程还是子进程。使用fork函数得到的子进程是父进程的一个复制品,它从父进程处复制了整个进程的地址空间,包括进程上下文,进程堆栈,内存信息,打开的文件描述符,信号控制设定,进程优先级,进程组号,当前工作目录,根目...

weixin_39607473的博客 832

Linux创建新进程

在Linux系统中,创建新进程涉及到两个系统调用API:分别是fork()和exec(). 首先,在当前进程中,调用fork()复制出自身的一个拷贝,此时主要涉及到内核中与进程上下文相关的数据复制操作,而用户代码和数据则采用写时复制技术共享同一份资源。当一个进程复制后,原进程称为父进程,新进程则称为子进程. 然后,在子进程用一个新进程镜像替代自身,即从磁盘中装入一个新程序,并作为当前的子进程运行.这可通过调用exec()函数簇中的一个函数来实现,exec()函数簇中的所有函数都完成同样的工作,所不同的是

wy912809861的博客 967
上一篇: Linux 进程切换 0.11与2.4的比较
下一篇: malloc 函数工作机制
nodeathphoenix
博客等级 码龄16年 97粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值