07 - 进程创建大盘点
---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)Linux系统编程训练营 - 目录
文章目录
- 1. 进程创建回顾
- 2. 再论进程创建
- 2.1 思考
- 2.2 vfork()深度分析
- 2.3 vfork()要点分析
- 2.4 fork()的现代优化
- 2.5 编程实验:fork() & vfork()
- 3. exec与system简介
- 3.1 exec函数家族
- 3.2 进程创建库函数
- 3.3 编程实验:system("./helloworld")
1. 进程创建回顾
- 问题
- 进程创建是否只能依赖于fork()和execve() ?
2. 再论进程创建
- fork()通过 完整复制 当前进程的方式创建新进程
- execve()根据参数覆盖进程数据(一个不留)
注释:如果fork后立马调用execve,那么没必要复制父进程的数据
- pid_t vfork(void);
- vfork()用于创建子进程,然而 不会复制 父进程空间中的数据
- vfork()创建的子进程直接使用父进程空间(没有完整独立的进程空间)
- vfork()创建的子进程对数据(变量)的修改会直接反馈到父进程中
- vfork()是为了execve()系统调用而设计的
2.1 思考
下面的程序运行后会发生什么?
【参看链接】:07 - 进程创建大盘点 / 07 / 00vfork / main.c
2.2 vfork()深度分析
2.3 vfork()要点分析
- vfork()成功后,父进程将等待子进程结束
- 子进程 可以使用父进程的数据(堆、栈、全局)
- 子进程可以从创建点调用其它函数,但不要从创建点返回
- 当子进程执行流回到创建点或者需要结束时,使用 _exit(0) 系统调用
- 如果 使用 return 0 将破坏栈结构,导致后续父进程执行出错
【参看链接】:07 - 进程创建大盘点 / 07 / 01vfork / main.c
2.4 fork()的现代优化
- Copy-on-Write技术
多个任务访问同一资源时,在写入操作修改资源时,复制资源的原始副本 - fork()引入Copy-on-Write之后,父子进程共享相同的进程空间
- 当父进程或子进程的其中之一修改内存数据,则实时复制进程空间
- fork() + execve() <==> vfork() + execve()
2.5 编程实验:fork() & vfork()
【参看链接】:07 - 进程创建大盘点 / 07 / 02
3. exec与system简介
3.1 exec函数家族
【参看链接】:07 - 进程创建大盘点 / 07 / 03 / test.c
3.2 进程创建库函数
- #include <stdlib.h>
- int system(const char* command);
- 参数:程序名及进程参数(如:pstree -A -p -s $$)
- 返回值:进程退出状态
注释:system 首先会创建shell进程,效率比我们自己创建的create_process(…) 低
【参看链接】:07 - 进程创建大盘点 / 07 / 04 / test.c
3.3 编程实验:system(“./helloworld”)
【参看链接】:07 - 进程创建大盘点 / 07 / 05