Linux进程控制

文章详细介绍了Linux中进程的创建,包括fork和vfork函数,强调了写时拷贝技术在提高子进程创建效率中的作用。此外,还讨论了进程的退出机制,如exit和_exit的区别,以及程序退出返回值的意义和不同退出场景。
摘要由CSDN通过智能技术生成

大致阐述完毕Linux中进程的概念,接下来我们需了解的部分是:进程控制。

进程控制中存在四大模块:创建、退出、等待和程序替换,我们首先来看创建这一模块。、

目录

1.创建

1.1写时拷贝技术

1.2pid_t vfork(void)

2.退出

2.1如何退出进程

2.2程序退出返回值

2.3进程的三种退出场景

1.创建

pid_t fork(void) -- 通过复制父进程来创建一个新的子进程。(代码共享,数据独有)

父进程和子进程都存在自己独有的虚拟地址空间和栈区。

返回值:对于父进程返回新创建的子进程pid;对于子进程返回0;创建出错返回-1。

于是我们可以通过返回值的不同来进行代码分流,让父子进程进入到不同的if语句分支中运行。

这也是我们演示虚拟地址中,对于全局变量同一地址存在不同值的方法。

当我们修改子进程中全局变量的值时,本质上是子进程在物理地址中开辟了一份新空间,来存储修改后的全局变量内容,并且修改自身中页表的对应关系来访问新开辟的物理地址。

而在上述操作当中,未曾产生修改虚拟地址的功能,仅是开辟新的物理内存存储修改后的全局变量和改变子进程的页表映射关系。

所以,当我们打印父子进程中各自的全局变量地址时,会发现两份地址完全相同。因为,我们并未对父子进程中的全局变量的地址做修改。

上述内容其实蕴含了一个技术的主要思量,即“写时拷贝技术。”

1.1写时拷贝技术

写时拷贝技术:子进程复制了父进程中的绝大部分信息,因此子进程会拥有自己的变量,并且自己的变量经过页表映射后与父进程访问的时同一块物理地址。

而当该内存空间中的数据进行修改时,则会给子进程重新开辟内存空间(新的页表映射关系),并拷贝修改后的数据过去。

写时拷贝技术的产生,主要是提升子进程创建效率,避免不必要的内存消耗。

在了解写时拷贝技术之后,我们可以对malloc函数有新的理解:malloc函数动态申请空间,本质上时先分配了一份虚拟地址(物理地址并未直接开辟),当我们第一次要对空间进行修改时才会被分配内存。

1.2pid_t vfork(void)

pid_t vfork(void) -- 创建一个子进程(在fork接口实现写时拷贝技术后,就很少使用)

vfork接口也是创建一个子进程,其中父子进程公用同一块虚拟地址空间,并且创建的子进程会阻塞父进程运行,知道自己exit退出;或程序替换之后,父进程再开始运行。

父子进程共用同一块虚拟地址空间,即可认为两者使用同一个栈,所以如果两者同时运行则会导致栈紊乱,出现错误。

因此对于vfork接口,它想阻塞父进程,直到子进程退出(函数出栈),或者程序替换(子进程开辟空间,创建了自己的栈),父进程才会接着运行。

2.退出

2.1如何退出进程

对于进程的终止这一模块,我们首先需要了解的是:如何终止一个进程。

  1. 在main函数中return;
  2. 库函数:void exit(int reval),在程序任意位置调用,都可以退出程序运行;
  3. 系统调用接口:void _exit(int reval),在程序任意位置调用,都可退出程序运行。

那么对于库函数和系统调用接口中的程序退出,肯定是存在某种不同的,不然也就没有了封装系统调用接口的必要。

我们可以通过上述两部分代码看出,对于使用库函数的程序退出,printf函数照常打印出结果;但对于使用系统调用接口的程序退出,printf函数并未打印出结果。

而当我们加入换行(刷新缓冲区)之后,使用系统调用接口退出程序也能照常打印结果。

造成这样结果的原因很简单,即缓冲区是否刷新。

打印的本质其实是把数据写入标准输出当中,只有刷新缓冲区才会将数据显示出来。

那么对于exit和_exit的区别已经呼之欲出了,即是否在程序退出前将缓冲区中的数据进行刷新写入到文件之中。

程序终止的存在多种退出方式,我们只需要在合适的场景使用恰当的退出方式即可。

顺带一提,main函数中的return也会将缓冲区刷新。

2.2程序退出返回值

在了解完程序终止的方式后,我们需要认识程序退出返回值。对于返回值,我们要从两方面入手来进行剖析,即返回值的大小,和返回值的作用。

对于返回值的大小,返回值的大小主要源于开发时的设计或者某种约定俗成,这里我们不做详解。

我们着重来理解程序退出返回值的作用,我们明白:一个程序的运行肯定是为了完成某种任务,而对于任务完成的好坏,并没有办法直接获取,所以我们需要设计返回值来表示当前进程任务处理的结果。

对于return和exit给定的数据其实是进程的退出码,用来标记当前进程的结果。

2.3进程的三种退出场景

进程的三种退出场景分贝对应了程序的三种运行结果:

  • 任务完成,正常退出;
  • 任务未能完成,正常退出;
  • 出错,异常退出。

不同的退出场景,即对应不同的退出码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值