【操作系统原理】进程优先级与命令行参数、环境变量详解


🎉博主首页: 有趣的中国人

🎉专栏首页: 操作系统原理

🎉其它专栏: C++初阶 | C++进阶 | 初阶数据结构

亲爱的小伙伴们,大家好!这篇文章我们把握 Linux 中三块"高频且基础"的知识:
进程优先级命令行参数(argc/argv)环境变量
它们决定了一个程序"如何被启动、如何被调度、在什么环境里运行"。
如果本文对你有启发,请点赞 👍、收藏 🌟、留言 📝 支持!

### 文章目录

  • [@[toc]](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [1. 进程优先级(Priority)](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [1.1 本质与作用](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [1.2 为什么要有优先级](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [1.3 术语对照](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [1.4 常用命令](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [1.5 调度循环(示意)](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [2. 命令行参数(argc / argv)](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [2.1 main 的入口](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [2.2 参数从哪里来(调用链)](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [2.3 演示代码](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [3. 环境变量(Environment Variables)](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [3.1 概念速记](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [3.2 常见环境变量](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [3.3 `PATH` 的搜索与修改](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [3.4 继承与写时拷贝(COW)](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [3.5 C 接口常用法](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [4. 内建命令 vs 外部命令](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [4.1 区别一览](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [4.2 如何辨别](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [4.3 简化执行流程](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [5. 实验清单(可直接跑)](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [5.1 查看进程优先级](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [5.2 PATH 与永久生效](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [5.3 区分内建与外部](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [5.4 程序中打印 `argv` 与 `environ`](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [6. 常见疑问速记](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)
  • [7. 小结](#文章目录 @[toc] 1. 进程优先级(Priority) 1.1 本质与作用 1.2 为什么要有优先级 1.3 术语对照 1.4 常用命令 1.5 调度循环(示意) 2. 命令行参数(argc / argv) 2.1 main 的入口 2.2 参数从哪里来(调用链) 2.3 演示代码 3. 环境变量(Environment Variables) 3.1 概念速记 3.2 常见环境变量 3.3 PATH 的搜索与修改 3.4 继承与写时拷贝(COW) 3.5 C 接口常用法 4. 内建命令 vs 外部命令 4.1 区别一览 4.2 如何辨别 4.3 简化执行流程 5. 实验清单(可直接跑) 5.1 查看进程优先级 5.2 PATH 与永久生效 5.3 区分内建与外部 5.4 程序中打印 argvenviron 6. 常见疑问速记 7. 小结)

1. 进程优先级(Priority)

1.1 本质与作用

  • 在 Linux 中,每个进程对应一个 task_struct,其中保存调度相关字段(优先级、时间片等)。
  • 优先级越高,越容易获得 CPU 时间片;优先级越低,等待时间更长。

1.2 为什么要有优先级

  • CPU/内存/IO 等资源有限;任务数量多且类型不同(前台交互、后台服务、内核线程等)。
  • 通过优先级实现 公平 + 效率 的折中:关键任务优先,低优先级任务让步。

1.3 术语对照

名称 说明
NI(nice 值) 用户可调节的"偏移量"
PRI(动态优先级) 调度器综合计算出的优先级
记忆口诀 nice 越小越"凶",优先级越高
  • nice 值范围:[-20, +19]
    • -20 → 最高优先级
    • +19 → 最低优先级
  • 普通用户:只能调低自身优先级(增大 nice 值)
  • root:可以把进程优先级调高(减小 nice 值)

1.4 常用命令

bash 复制代码
ps -al                 # 查看 PRI/NI 等字段
top                    # 实时查看;在 top 界面按 r 修改某 PID 的 nice
renice -n 5 PID        # 修改已存在进程的 nice 值
sudo nice -n -5 ./a.out  # 更高优先级启动新程序(需 root)

1.5 调度循环(示意)

回到就绪队列等待 调度器按优先级挑选进程 分配时间片运行 时间片耗尽或被更高优先级抢占


2. 命令行参数(argc / argv)

2.1 main 的入口

cpp 复制代码
int main(int argc, char *argv[])
  • argc:参数个数
  • argv[]:参数数组(argv[0] 通常是程序名)

2.2 参数从哪里来(调用链)

  1. 用户在 bash 输入命令;
  2. bash 解析字符串并构建 argv[]
  3. fork() 创建子进程;
  4. 子进程调用 execve(path, argv, envp)
  5. 内核 加载可执行文件,新程序从 main(argc, argv, envp) 开始执行。

2.3 演示代码

cpp 复制代码
#include <stdio.h>
int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\\n", i, argv[i]);
    }
    return 0;
}

示例

bash 复制代码
$ ./a.out linux kernel study
argv[0] = ./a.out
argv[1] = linux
argv[2] = kernel
argv[3] = study

3. 环境变量(Environment Variables)

3.1 概念速记

  • 环境变量是进程的运行时配置表(键值对)。
  • 每个进程都有自己的副本,默认从父进程继承

3.2 常见环境变量

变量名 说明
PATH 查找可执行文件的目录列表
HOME 用户主目录
PWD 当前工作目录
SHELL 当前使用的 Shell 程序
HISTSIZE bash 历史条数

3.3 PATH 的搜索与修改

  • 执行命令时,bash 会按 PATH 中的目录顺序搜索可执行文件。
  • 临时修改(仅当前终端有效):
bash 复制代码
export PATH="$PATH:/usr/local/mybin"
  • 永久生效 (下次终端也有效):把上面这行写入 ~/.bashrc(或登录 Shell 的 ~/.bash_profile),然后:
bash 复制代码
source ~/.bashrc

3.4 继承与写时拷贝(COW)

  • fork() 后,子进程继承父进程的环境变量副本(COW:按需复制)。
  • execve() 执行新程序时,默认沿用当前环境(也可以传入自定义 envp)。
graph LR A[父进程 bash] -->|fork| B[子进程:共享只读页] B -->|写环境时才复制| C[按需复制] B -->|execve 继承/替换| D[新程序:envp 可自定义]

3.5 C 接口常用法

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("HOME = %s\\n", getenv("HOME"));
    setenv("TEST_VAR", "hello", 1); // 覆盖
    printf("TEST_VAR = %s\\n", getenv("TEST_VAR"));
    return 0;
}

一次性打印全部环境变量

c 复制代码
#include <stdio.h>
extern char **environ;
int main() {
    for (int i = 0; environ[i]; ++i) puts(environ[i]);
    return 0;
}

4. 内建命令 vs 外部命令

4.1 区别一览

类型 典型示例 是否创建子进程 为什么
内建命令 cdexportaliasecho(也可能有外部版) 在 bash 进程内直接执行,能修改当前 Shell 状态(例如 cd 改变目录)
外部命令 /usr/bin/echo/usr/bin/pwd 通过 fork + exec 启动新程序

关键点:如果 cd 作为外部程序运行,就无法改变当前终端的工作目录,所以它必须是内建。

4.2 如何辨别

bash 复制代码
type -a cd
type -a echo
type -a pwd
  • 显示 is a shell builtin → 内建;
  • 显示路径如 /usr/bin/echo → 外部程序(有些命令内建与外部版本并存)。

4.3 简化执行流程

是 否 bash 接收命令 内建吗? 在当前 bash 进程里执行函数 fork 子进程 execve 加载外部程序 运行完毕返回父进程


5. 实验清单(可直接跑)

5.1 查看进程优先级

bash 复制代码
ps -al | head
top                  # 在 top 界面按 r 可修改某个进程的 nice

5.2 PATH 与永久生效

bash 复制代码
echo "$PATH"
export PATH="$PATH:$HOME/bin"   # 临时
echo 'export PATH="$PATH:$HOME/bin"' >> ~/.bashrc
source ~/.bashrc                # 让当前会话立即生效

5.3 区分内建与外部

bash 复制代码
type -a echo
type -a pwd
type -a cd

5.4 程序中打印 argvenviron

c 复制代码
#include <stdio.h>
extern char **environ;
int main(int argc, char *argv[]) {
    puts("[argv]");
    for (int i = 0; i < argc; ++i) printf("argv[%d]=%s\\n", i, argv[i]);
    puts("[environ]");
    for (int i = 0; environ[i]; ++i) puts(environ[i]);
    return 0;
}

6. 常见疑问速记

  • Q:为什么我不显式给子进程传环境变量,子进程也有?

    A:fork 会继承父进程的环境(COW),execvp 默认沿用当前进程的环境,所以能看到与 bash 相同的变量。

  • Q:修改 PATH 后,新开终端又恢复?

    A:你只在当前 Shell 做了临时修改。写入 ~/.bashrc(或登录 Shell 的 ~/.bash_profile)并 source 才会对新会话生效。

  • Q:为什么 echo/pwd 既是内建又存在 /usr/bin/echo

    A:为了兼容不同 Shell、脚本或最小化环境。type -a echo 可以查看优先级顺序;通常优先使用内建版本。

  • Q:cd 参数是否合法怎么判断?

    A:在 C 程序中检查 chdir(path) 返回值是否为 -1;在 Shell 里可用 [[ -d "$1" ]] 判断目录是否存在。

  • Q:普通用户能把进程优先级调高吗?

    A:不能。普通用户只能降低 自身优先级(增大 nice 值);提升 优先级需要 root


7. 小结

  • 优先级(PRI + nice) 决定进程拿到 CPU 的速度与频率;
  • 命令行参数(argc/argv) 由 bash 解析并通过 execve 传给 main
  • 环境变量 通过 fork 继承,execve 继续使用或替换;
  • 内建命令 在 bash 内执行以便修改当前会话状态,外部命令则走 fork+exec

把这四块打通,你就掌握了"一个命令如何被解析、加载与调度"的全流程。欢迎在评论区补充你的实验结果或遇到的问题!

相关推荐
崎岖Qiu5 天前
【OS笔记25】:页的共享和保护、页式虚拟存储管理
笔记·操作系统·os
岑梓铭17 天前
考研408《操作系统》复习笔记,第二章《2.3 进程调度》
笔记·考研·操作系统·os
千里马学框架20 天前
安卓系统中线程优先级Priority查看方式汇总
android·framework·线程·安卓framework开发·优先级·priority
崎岖Qiu22 天前
【OS笔记11】:进程和线程9-死锁及其概念
笔记·操作系统·os
HIT_Weston1 个月前
149、【OS】【Nuttx】【周边】效果呈现方案解析:VSCode 打开外部链接(二)
vscode·os·nuttx·文档渲染
HIT_Weston1 个月前
145、【OS】【Nuttx】【周边】效果呈现方案解析:VSCode Remote Server
os·nuttx·文档渲染
崎岖Qiu1 个月前
【OS笔记04】:进程和线程2-进程控制
笔记·操作系统·os
jz_ddk1 个月前
[嵌入式] U-Boot 环境变量深度解析:从 QSPI 到 eMMC 的 Linux 启动完整指南
linux·运维·服务器·嵌入式·环境变量·u-boot·内核加载
岑梓铭2 个月前
考研408《操作系统》复习笔记,第四章(1)《文件管理概念》
笔记·考研·操作系统·408·os