03 - 初识Linux进程
创始人
2025-05-31 14:54:31

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)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 问题

  • strace输出中得到execve(…)究竟是什么?

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 问题

  • 第1个进程是什么?
  • 如何创建进程?

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()的工作方式

  • 为子进程申请内存空间,并将父进程数据完全复制到子进程空间中

  • 两个进程中的程序执行位置完全一致(fork()函数调用位置)

  • 不同之处:

    • 父进程:fork() 返回 子进程PID
    • 子进程:fork() 返回 0
      • 通过fork()返回值判断父子进程,执行不同代码
        在这里插入图片描述
  • 示例

    • 下面的程序输出什么?为什么?

在这里插入图片描述
在这里插入图片描述

3.2 思考

  • 如何理解“每个Linux进程可以执行一个或多个程序”?
    在这里插入图片描述

3.3 execve()的工作方式

int execve(const char *pathname, char *const argv[], char *const encp[]);

  • 根据参数路径 pathname 加载可执行程序 ==> 加载到当前进程中
  • 通过可执行程序信息构建进程数据,并写入当前进程空间
  • 将程序执行位置重置到入口地址处( 即:main() )
  • execve()将 重置当前进程空间(代码&数据)而不会创建新进程

3.4 问题

  • 下面的程序输出什么?为什么?

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

退市苏吴:股票于12月9日进入... 新京报贝壳财经讯 退市苏吴12月16日公告,公司A股股票于2025年12月12日、2025年12月1...
云南3名村民擅入封闭矿硐窒息死... 出事硐口警示标志 今年8月22日,云南迪庆州维西县白济汛乡3名村民私自破坏长期停用探矿硐封堵设施进入...
甘露特钠迎转机,复星医药拟控股... 12月15日,复星医药宣布,控股子公司复星医药产业与绿谷(上海)医药科技有限公司(“绿谷医药”)及其...
“铁饭碗”迟早要打破? 文/洛水钟鸣(识局微信公共账号zhijuzk)到了今天,谁要再说体制内是“金饭碗”,只能说明他太不了...
卖早餐的蜜雪冰城,被嫌弃了? 近日,蜜雪冰城在大连、西安、南宁和杭州4座试点城市上线早餐产品。 图源:蜜雪冰城小程序 产品线分...