1️⃣ 进程退出
正常终止
- main函数的返回
- 调用exit
- _exit
异常终止
Ctrl + c (信号终止)
1.main函数的返回就是return 0;程序退出这个在高级语言里面就学过了不多说。
2.exit(x)的使用如下
第一次测试:错误码与main函数里面打印的值。
========================================================================
第二次测试:有错误码但是main函数里的printf却没有进行打引。
=========================================================================
第三次测试:我们发现也没有打印但也有_exit 的错误码
通过比较我们发现exit与_exit是有区别的。
_exit:直接中止进程,不会有任何刷新操作。
exit:终止进程,刷新缓冲区。
补充说明:echo ¥?是返回上一个命令的状态,0表示没有错误,其它任何值表明有错误。(你没看错就是¥只是博客显示是这样的)
2️⃣ 进程等待
为什么要进程等待?
1.子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
2.另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
3.最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
4.父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。
3️⃣ 写时拷贝
关于写时拷贝是由os的内存管理模块完成的。
我们打的比方我们的子进程想要用父进程的某部分数据。我们的子进程可以通过页表获取到物理地址。这边有个细节操作系统不会直接给你父进程的地址。会进行拷贝,将拷贝的物理地址给子进程。
为什么需要写时拷贝?
- 父进程的数据,子进程不一定全用,即使使用,数据也不一定全部写入。 – 存在空间浪费。
- 只有需要修改的数据进行分离拷贝。不需要修改共享数据就可以 – 从技术角度实现复杂。
- 如果fork创建子进程,就将全部 数据给子进程,会出现成本增加(内存和时间。就好比我电脑开机时间长短。磁盘需要开启多个开机就开启应用或者加载大量数据的时候会延长开机时间,不像刚刚买的电脑开机速度杠杠的。