目录
前言
哈喽,小伙伴们大家好,今天我来带大家了解一下进程控制的相关知识。我将主要从四个方面进行讲解,分别是进程创建、进程终止、进程等待和进程替换。希望小伙伴们看完本文后能对进程有更加深刻的认识。
一、进程创建
1、fork函数
在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
- fork函数有两个返回值:子进程中返回0,父进程返回子进程pid,出错返回-1。
- fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。
fork的基本使用在上一篇文章中介绍过,这里不做赘述,下面我们重点思考两个问题。
(1)为何要给子进程返回0,给父进程返回子进程的pid?
计算机中的父子关系和现实中的父子关系一样,一个父亲可以有多个孩子,但一个孩子只能有一个父亲。假设老王有三个儿子,三个儿子统一管老王叫爸爸即可。但当三个儿子同时在场时,老王想要找他们中的一个时不能简单的称呼为儿子,因为这样会造成混淆,必须叫他们对应的姓名才能加以区分。
在操作系统中也是如此,父进程不需要标识,子进程需要标识,子进程是要执行任务的,父进程需要对它们进行区分。
(2)如何理解fork有两个返回值的问题?
进程调用fork,当控制转移到内核中的fork代码后,内核做:
- 分配新的内存块和内核数据结构给子进程
- 将父进程部分数据结构内容拷贝至子进程
- 添加子进程到系统进程列表当中
在返回之前,这一系列操作已经完成,子进程已经创建成功,返回这条代码由父子进程一起执行,所以有两个返回值。

fork调用失败的原因:
- 系统中有太多的进程。
- 实际用户的进程数超过了限制。
2、写时拷贝
通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。

为何需要写时拷贝?
因为进程具有独立性,要保证两个进程的数据不互相干扰。
那么为何不在一开始就把数据分开呢?
因为子进程不一定会用到或写入父进程的所有数据,如果把所有数据都拷贝一份的话会造成内存浪费。写时拷贝可以保存按需分配,同时也满足了延时分配,就好比银行一样,有人取钱时它才会给,其余时间就可以自由支配这些资源,达到资源利用的最大化。
二、进程终止
1、退出码
进程运行的目的是为了完成某种工作,那么这种工作有没有成功完成呢?进程需要给出一个反馈,来供用户查看工作是否返程,这种反馈就叫做退出码。
指令: echo $? 打印最近一次的退出码

进程退出场景:
- 代码运行完毕,结果正确
- 代码运行完毕,结果不正确
- 代码异常终止
前两种退出场景:当代码运行结果正确时,退出码为0,当代码运行结果不正确时,退出码为非0。因为成功了就是成功了,不需要加以解释,而失败了一般都是有原因的,需要将失败的原因反馈出来。不同的非0值代表着不同的失败原因。由于计算机是很擅长处理数字的,所以退出码在计算机中是以数字的形式传递

本文详细介绍了Linux下的进程控制,包括进程创建的fork函数和写时拷贝机制,进程终止的正常与异常退出,进程等待的重要性及wait、waitpid方法,以及进程程序替换的概念和exec函数家族的使用。通过本文,读者将对Linux进程控制有更深入的理解。
最低0.47元/天 解锁文章
759

被折叠的 条评论
为什么被折叠?



