一、进程
1.定义:
在Linux系统编程中,进程(Process) 是一个正在执行的程序的实例。它是操作系统进行资源分配和调度的基本单位。进程的出现是为了实现多任务,宏观上看是并行,但是微观上看还是串行的
2.进程 VS 程序:
-
程序:静态的、存储在磁盘上的可执行文件
-
进程:动态的、正在执行的程序实例,拥有独立的内存空间和系统资源
3.进程的特性:
-
独立性:每个进程有独立的地址空间
-
并发性:多个进程可以同时运行(并发/并行)
-
动态性:有创建、运行、阻塞、终止等生命周期
-
异步性:进程按各自独立、不可预知的速度前进
二、进程的组成
1.进程控制块(PCB):
是操作系统用来描述进程的各种信息的数据结构,它包含了进程的标识符、状态、优先级、CPU 寄存器信息、内存管理信息等。PCB 是进程存在的唯一标志,操作系统通过 PCB 来感知和控制进程。(Linux中为task_struct)

2.进程地址空间:分为多个段
1)代码段(text):可执行指令
2)数据段:
- 已初始化数据段(.date)
- 未初始化数据段(.bss)
- 只读数据段(.rodate)
3)堆(heap):动态分配的内存
4)栈(stack):函数调用和局部变量
三、进程的状态
进程的生命周期------从无到有再到无
-
生命周期:描述进程从创建到消亡的完整过程(宏观视角)
-
状态:描述进程在某个具体时刻的行为特征(微观视角)
1.进程的五个基本状态:
新建、就绪、执行、阻塞、终止

2.Linux内核中进程状态的具体转换关系
3.ps命令中进程状态码的官方说明

四、进程的相关命令
1.top
动态查看进程的信息:pid号、进程的状态信息、进程名等等
2.ps aux | grep a.out
查看进程快照,可以查看进程的pid号和状态信息。(a.out为可执行文件名,根据实际情况替换)
3.kill
发信号
- kill -l :查看所有信号
2)kil -命令编号 进程pid号 :向指定进程执行指定指令
18------SIGCONT (signal continue,继续进程)
19------SIGSTOP (signal stop,暂停进程)
9------杀死进程
4.killall
是 Linux/Unix 系统中用于按进程名发送信号的命令。它可以根据进程名称(而不是进程ID)向多个进程发送信号

5.pstree -sp pid号
显示指定进程的完整进程树路径,包括所有父进程

6.ps -eLf | grep a.out
查找名为 a.out 的进程及其所有线程的详细信息。

五、进程的使用
- 创建好进程之后,做与父进程类似的事情
- 创建好进程之后,做与父进程不同的事情
1.进程的创建
(1)格式:
cs
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
1)功能:创建进程(通过复制 调用进程(父进程)创建新进程(子进程)
2)参数:void
3)返回值:
成功:父进程 返回 子进程的pid,子进程返回0
失败:返回-1
补充:pid 的最小值为-1
cs
//判断父进程
if (pid > 0)
{ }
cs
//判断子进程
if (pid == 0)
{ }
(2)注意:
- fork之后父进程和子进程的运行顺序是不确定的,最终顺序取决于操作系统的调度
- fork之后,父子进程各自拥有自己独立的4G进程空间。因为父子进程的空间独立,所以数据之间没有相互影响,进程安全性可靠性高
- fork成功后,父子进程都是从fork的下一句开始执行的


(3)练习
1)一次fork生成几个进程?她们之间有什么关系?
一次 fork() 调用会生成 2 个进程:原有的父进程和新创建的子进程
2)如果两次fork同时前后执行,会生成几个进程?
会生成3个新进程:两个子进程,一个孙进程。加上调用进程就有四个进程

3)fork()&&fork()||fork() 总共几个进程?
总共5个进程

4)从键盘输入一个n,要求创建n个子进程
5)创建四个子进程,假设四个子进程分别复制无人机的 do_fiy,do_video,do_transmit,do_store四种工作模式
6)通过fork创建一个子进程,分别尝试杀死父/子进程,观察子/父进程的状态

