前言
大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁
主要内容含:
一.前置知识——pid和ppid
1.系统调用接口查看pid,ppid
- pid:当前进程
- ppid:父进程
- 每一次启动的进程, 系统会重新生成pid ,系统只保证当前生命周期内pid有效;
- 但是 父进程不会变
2.为什么ppid父进程id不变?——bash命令行解释器与bash进程
- 当我们运行一个进程时,命令行解释器会把这个指令解释成bash的子进程
- 接着再由这个bash的子进程执行对应的命令
- 当这个子进程出现问题时,并不影响bash的进程
- 即:每一条命令被执行,都属于bash的子进程
- 我们执行一段代码,parent对应的是getppid()函数;
我们接着用ps+grep过滤指令查看这个16815进程,发现其就是bash进程
二.fork( )函数原理与应用详解
1.fork()函数基本介绍
- fork(): 创建子进程
- 返回值给 【父进程返回子进程PID,给子进程返回0】
2.fork()返回值有两个:——>变成了两个进程(父子进程)——>实现两个死循环同时跑
- 我们观察发现,他们不但生成了两个进程,而且还是父子进程关系
- 由此我们得到了进程之间的 关系图
3.为什么fork要有两个返回值?
- 返回不同的返回值,是为了 区分
- 为了让fork以后的if判断while等,来让父子进程执行 不同 的代码片段
4.为什么fork要给子进程返回0,给父进程返回子进程pid?
- 父进程要标记子进程,确保其 唯一性
5.fork函数究竟在干什么?————>父子进程共享代码段,各自拥有数据段(写时拷贝)
- 进程=内核数据结构+代码和数据
- 多了一个子进程,说明内存中一定会多出一个PCB供操作系统调度
- fork出来的子进程,和父进程 共享同一个代码
- 任何平台,进程在运行的时候,是具有 独立性 的
- 因为数据 可能被修改 (一开始除外), 所以需要访问子进程的数据时 ,不能让他们共享数据;
- 代码 不可以被修改 ,所以可以共享
子进程需要访问数据时,单独开空间用多少,拷贝多少,进行了写时拷贝
父子进程共享代码段现象:fork以后的代码执行了两次
- 先不调用fork函数,观察这段代码执行结果
- 代码正常执行一次
- 调用fork()以后:
- 我们发现fork以后的代码 执行了两次
6.一个函数是如何做到返回两次的?——>父子进程共享return代码段
- fork是一个函数, return语句 也属于 代码片段
- 从5小点我们知道 父子进程共享代码段 ,于是有了以下过程
7.一个变量怎么会有不同的内容?——>地址空间
- 地址空间章节传送门