文章目录
1.进程创建
之前我们已经学了使用fork来创建进程,现在我们主要谈的是写时拷贝!!!

因此有写时拷⻉技术的存在,所以⽗⼦进程得以彻底分离离!完成了进程独立性的技术保证!写时拷⻉,是⼀种延时申请技术,可以提⾼整机内存的使⽤率。
当然fork也有可能会创建失败:①系统中进程太多②用户的实际进程超过了限制(对用户有限制)
2.进程终止
当进程终止时,操作系统要做些什么呢?我们main函数退出时我们都会写个return 0,为什么要写,是给谁返回的呢?

我们把return 0叫做进程退出的退出码,未来系统会获得这个return 0退出码,用来让系统辨别该进程的执行情况。
我们将上面的代码改成return 10看看情况:

?会记录最近一个进程执行完的退出码,$?是取出该数值。echo也是一个命令,退出码为0表示运行成功。
Q:为什么要有退出码?
A:子进程把父进程交给自己的任务,办的怎么样,父进程是需要知道的,就是通过看退出码来看:0表示成功了,非0表示没有成功,1,2,3...表明不同的失败原因。
Linux Shell 中的主要退出码:

C语言给我们提供了一些内置的错误原因函数:
strerror

在进程的PCB中会有个属性exit_code保存这个退出码的信息。

如下我们正式来谈进程终止。
进程退出,无非就是三种情况:①代码跑完,结果对②代码跑完,结果不对③代码没跑完,进程异常。现在我们主要处理前两种情况,代码跑完了,结果对不对由退出码来决定。代码异常了,退出码没有意义。当进程异常了,信号需要知道,管理者OS一定会知道,一般都是杀掉这个进程,用信号来杀掉进程:kill -9 XXX
Q:那么退出码从哪里获取呢?
A:方法一:main函数进行return n,n表示的就是退出码;方法二:直接调用exit(n),exit的参数n等同于return的返回值,表示退出码;方法三:系统调用,直接调用_exit(n)


Q1:return和exit方式有什么区别
A1:return通常表示函数调用结束,main函数比较特殊,return表示进程退出;exit表示的是进程结束,在我们的代码里面,任何地方调用,都会导致进程退出。
Q2:exit和_exit方式有什么区别
A2:exit是C语言库函数,_exit是系统调用,exit终止进程会自动刷新缓冲区,_exit直接终止进程不会刷新缓冲区。而return也会在进程结束时,也会刷新缓冲区。(与exit一样)

补充:进程终止必定要调用系统调用,必须要让操作系统完整真正的让进程删除退出。库函数和系统调用是上下层关系,exit只是在底层封装了_exit,这样才能完成真正的进程终止。
Q:那么输出缓冲区应该在哪里呢?
A:
