1. 进程创建
(一)认识fork函数
从已存在进程中创建一个新进程(新进程为子进程,而原进程为父进程)
进程调用fork,当控制转移到内核中的fork代码后,内核做:
- 分配新的内存块和内核数据结构给子进程
- 将父进程部分数据结构内容拷贝至子进程
- 添加子进程到系统进程列表当中
- fork返回,开始调度器调度
注意:
- 当一个进程调用fork之后,就有两个二进制代码相同的进程。进程是独立的,互不干扰对方运行
- fork之后,谁先执行完全由调度器决定
(二)fork函数返回值
- 子进程返回0
- 父进程返回子进程的 pid
(三)写实拷贝
通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自管理数据
(四)fork常规用法
- 一个父进程希望复制自己,使父子进程同时执行不同的代码段
- 一个进程要执行一个不同的程序(发生进程替换)
(五)fork调用失败的原因
- 系统中有太多的进程
- 实际用户的进程数超过了限制
2. 进程终止
(一)进程退出场景
- 代码运行完毕,结果正确
- 代码运行完毕,结果不正确
- 代码异常终止
(二)进程常见退出方法
- 正常终止(可以通过 echo $? 查看进程退出码 $? : 表示最近一次的进程退出时候的得到的退出码)
- 从main返回
main函数的返回值,本质表示:进程进行完成时,是否得到正确的结果,如果不是,可以用不同的数字代表不同的出错原因
- 调用exit
exit : 中止一个进程
注意:
- exit 在任意一个位置被调用,表示进程直接退出
- return 在函数里面代表函数结束,在main函数里面代表进程退出
exit 使用
- _exit
_exit : 中止一个进程
exit 和 _exit 的区别:
exit 执行时,会冲刷缓冲区的数据 (即可以看到数据刷新的结果)
_exit 执行时,不会冲刷缓冲区的数据
注意:
缓冲区在用户区
$? 的使用
return返回的是退出码,且子进程退出时得到的退出码会给父进程
第一个 echo $? 得到的退出码是执行 ./test 进程的
第二个 echo $? 得到的退出码是执行 上一个echo 进程的
. . .
注意:
系统提供的错误码和错误码描述的有对应关系的
错误码及对应的错误码描述
注意:
strerror 可以用过退出码得到退出码描述
errno 可以储存最近一次错误码
- 异常退出
ctrl + c,信号终止