---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)Linux系统编程训练营 - 目录
文章目录
- 1. 进程理论状态切换
- 1.1 问题
- 1.2 进程生命周期
- 1.3 Linux进程基本概念
- 1.4 Linux进程生命周期
- 1.5 Linux进程状态剖析
- 1.6 Linux进程必知必会
- 1.7 问题
- 2. Linux进程树
- 3. Linux进程创建
- 3.1 fork()的工作方式
- 3.2 思考
- 3.3 execve()的工作方式
- 3.4 问题
1. 进程理论状态切换
1.1 问题
1.2 进程生命周期
进程是“活”的实体

1.3 Linux进程基本概念
- 进程 是Linux任务的 执行单元,也是Linux系统资源的 分配单元
- 每个Linux应用程序运行后由一个或多个进程构成
- 每个Linux进程可以执行一个或多个程序
- Linux进程有多个 不同状态( 即:Linux进程有 不同“活法” )
1.4 Linux进程生命周期

- 就绪/运行状态(R):TASK_RUNNING
- 阻塞状态:
- 可中断(S):TASK_INTERRUPTIBLE
- 不可中断(D):TASK_UNINTERRUPTIABLE
- 区别:可中断的阻塞状态可以被唤醒
- 停止状态(T):TASK_STOPPED
- 退出状态:
- 僵尸(X):EXIT_ZOMBIE
- 死亡(Z):EXIT_DEAD
1.5 Linux进程状态剖析

// loop.c
int main()
{while (1);return 0;
}

1.6 Linux进程必知必会
每个进程都有一个唯一的标识(进程标识符,PID)
每个进程都是由另一进程创建而来(即:父进程)

如1.5示例所示:命令行进程创建了loop进程(./loop.out &
)。
1.7 问题
2. Linux进程树
- 整个Linux系统的所有进程构成一个树状结构
- 树根由内核自动创建,即:IDLE(PID=0)
- 系统中的 第1个进程 是 初始化进程 (PID=1,一些Linux版本叫 init,一些叫 systemd)
- 0号进程创建1号进程,1号进程负责完成内核部分初始化工作
- 1号进程加载执行初始化程序,演变为用户态1号进程


3. Linux进程创建
pid_t fork(void);
==> 系统调用
通过当前进程创建新进程,当前进程为父进程,新进程为子进程int execve(const char *pathname, char *const argv[], char *const encp[]);
==> 系统调用
在当前进程中执行pathname指定的程序代码- 先创建进程,才能执行程序代码
3.1 fork()的工作方式


3.2 思考
3.3 execve()的工作方式
int execve(const char *pathname, char *const argv[], char *const encp[]);
- 根据参数路径 pathname 加载可执行程序 ==> 加载到当前进程中
- 通过可执行程序信息构建进程数据,并写入当前进程空间
- 将程序执行位置重置到入口地址处( 即:main() )
- execve()将 重置当前进程空间(代码&数据)而不会创建新进程
3.4 问题


- fork()与execve()结合使用创建新进程:

