一.进程创建
1.写时拷贝
通常父子进程使用的数据是一份的,但是如果哪个进程想要更改其中的某个数据时,则系统会将这个数据拷贝一份给这个进程
因为有写时拷贝的存在,父子进程才得以彻底分离!保证了进程的独立性!

2.fork函数
(1)功能:创建子进程
(2)使用场景:一个父进程希望复制自己,使父子进程同时执行不同的代码段
(3)调用失败原因:
a.系统中有太多进程,内存不足以再创建进程
b.系统可能会对用户创建进程数量有限制,用户创建的进程数超过限制也会创建失败
二.进程终止
1.进程退出场景
a.代码运行完毕,结果正确
b.代码运行完毕,结果错误
c.代码异常终止
针对前两种情况,通常通过进程返回的++错误码++来进行判断
2.进程常见退出方法
(1)main函数执行完成返回
退出码:由main函数return的数字就是退出码,不同的数字代表不同的退出状态,我们可以用退出码来判断程序是成功结束的还是以错误结束的
可以用echo $? 打印最近一个程序(进程)退出时的退出码

(2)调用exit函数
C语言的库函数,使用该函数退出进程时,会刷新缓存区
(3)调用_exit
系统调用接口,使用该函数退出进程时,不会刷新缓存区
exit()和_exit()的区别

三.进程等待(等待子进程退出)
1.进程等待的必要性
a.子进程退出,如果父进程不管不顾,就会造成子进程一直处于僵尸状态,造成内存泄露,即使是杀人不眨眼的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程
b.父进程派给子进程完成的任务完成的如何,我们需要知道,如:子进程运行完成,是不是正常退出的,完成的结果对还是不对
2.进程等待是什么?
父进程通过进程等待的方式,回收子进程资源(最重要的),获得子进程退出信息(可选获取不获取)
3.实际操作

(1)wait函数

(2)waitpid函数

4.实验代码
