在 Linux 系统编程中,进程(Process) 是操作系统进行资源分配和调度的基本单位。理解进程的概念是掌握系统编程、多任务处理、并发编程的基础。


目录

一、什么是进程?

定义:

二、进程的生命周期

示例:查看当前系统中的进程

三、进程的状态(STAT)

四、进程的父子关系与进程树

示例:查看进程树

关键概念:

五、进程标识符(PID 和 PPID)

示例:查看当前 shell 的 PID 和 PPID

六、前台进程与后台进程

示例:将进程放入后台运行

七、进程的优先级(Nice 值)

查看 nice 值:

设置 nice 值启动进程:

修改已有进程的 nice 值:

八、进程相关的系统调用(C语言接口)

九、第一个 C 程序:演示 fork() 创建进程

示例代码:process_example.c

编译并运行:

十、总结知识点图解(知识树状图)

十一、课后练习建议


一、什么是进程?

定义:

进程是一个程序的执行实例,包括:

  • 程序代码(Text Segment)
  • 当前活动(如寄存器的状态、程序计数器等)
  • 数据段(Data Segment)
  • 堆栈(Stack)
  • 打开的文件、信号处理函数等资源

简单来说:一个正在运行的程序就是一个进程。


二、进程的生命周期

一个进程从创建到终止,会经历以下几个阶段:

+-------------------+
|     创建进程      |   fork()
+-------------------+|v
+-------------------+
|    运行/就绪状态  |
+-------------------+|v
+-------------------+
| 阻塞(等待I/O等) |
+-------------------+|v
+-------------------+
|     终止或退出    | exit(), _exit()
+-------------------+

示例:查看当前系统中的进程

ps aux

输出示例(简化):

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 168944  9348 ?        Ss   09:00   0:01 /sbin/init
user1     1234  0.1  0.5 500000 20000 ?        Sl   09:10   0:02 /usr/bin/vim

各列含义简要说明:

列名含义
USER进程所有者
PID进程 ID
%CPU占用 CPU 百分比
%MEM占用内存百分比
VSZ虚拟内存使用量(KB)
RSS实际物理内存使用量(KB)
TTY控制终端
STAT进程状态
START进程启动时间
TIME占用 CPU 时间总和
COMMAND启动命令

三、进程的状态(STAT)

Linux 中进程常见的状态有以下几种:

状态字符含义
R (Running)正在运行或准备运行
S (Sleeping)可中断的睡眠状态(等待某事件)
D (Disk Sleep)不可中断的睡眠(通常在 I/O)
Z (Zombie)僵尸进程(已结束但未被回收)
T (Stopped)被停止(如收到 SIGSTOP)
X (Dead)已死亡(不会出现在 ps 中)

四、进程的父子关系与进程树

每个进程都有一个父进程(除了 init/systemd),通过 fork() 创建子进程。

示例:查看进程树

pstree

输出示例:

systemd─┬─NetworkManager───2*[{NetworkManager}]├─login───bash└─sshd───bash───vim

关键概念:

  • 父进程(Parent Process):创建其他进程的进程。
  • 子进程(Child Process):由父进程创建的进程。
  • 僵尸进程(Zombie Process):子进程结束后,父进程没有调用 wait() 或 waitpid() 获取其退出状态,该子进程变成僵尸进程。
  • 孤儿进程(Orphan Process):父进程先于子进程结束,子进程成为孤儿进程,由 init(PID=1)接管。

五、进程标识符(PID 和 PPID)

  • PID(Process ID):进程的唯一标识号。
  • PPID(Parent Process ID):父进程的 PID。

示例:查看当前 shell 的 PID 和 PPID

echo "Current PID: $$"
echo "Parent PID: $PPID"

输出示例:

Current PID: 12345
Parent PID: 11111

你也可以使用 ps 查看详细信息:

ps -p 12345 -o pid,ppid,comm

六、前台进程与后台进程

  • 前台进程:占用终端,用户可以直接交互。
  • 后台进程:不占用终端,通常用于长时间运行的任务。

示例:将进程放入后台运行

sleep 100 &   # 在后台运行

查看后台进程:

jobs

七、进程的优先级(Nice 值)

Linux 使用 nice 值 来控制进程的优先级,默认值为 0,范围为 -20(最高优先级)到 19(最低优先级)。

查看 nice 值:

ps -l

设置 nice 值启动进程:

nice -n 10 sleep 100 &

修改已有进程的 nice 值:

renice 5 -p 12345

八、进程相关的系统调用(C语言接口)

这些是 Linux 编程中最常用的系统调用:

系统调用功能描述
fork()创建子进程
exec() 系列替换当前进程为新程序
wait()等待子进程结束
exit()终止当前进程
getpid()获取当前进程的 PID
getppid()获取父进程的 PID

九、第一个 C 程序:演示 fork() 创建进程

示例代码:process_example.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid;printf("Before fork: This is the parent process (PID: %d)\n", getpid());pid = fork();  // 创建子进程if (pid < 0) {fprintf(stderr, "Fork failed\n");return 1;} else if (pid == 0) {// 子进程printf("This is the child process (PID: %d), Parent PID: %d\n", getpid(), getppid());} else {// 父进程printf("This is the parent process again (PID: %d), Child PID: %d\n", getpid(), pid);}return 0;
}

编译并运行:

gcc process_example.c -o process_example
./process_example

输出示例(顺序可能不同):

Before fork: This is the parent process (PID: 12345)
This is the parent process again (PID: 12345), Child PID: 12346
This is the child process (PID: 12346), Parent PID: 1

注意:由于父进程和子进程是并发执行的,所以输出顺序可能不确定。


十、总结知识点图解(知识树状图)

进程的概念
│
├── 什么是进程?
│   ├── 程序的执行实例
│   └── 包含代码、数据、堆栈、资源等
│
├── 进程生命周期
│   ├── 创建 → 运行 → 阻塞 → 终止
│   └── fork(), exec(), exit()
│
├── 进程状态(STAT)
│   ├── R/S/D/Z/T/X
│
├── 进程关系与进程树
│   ├── 父进程与子进程
│   ├── 僵尸进程 vs 孤儿进程
│   └── pstree 命令查看树结构
│
├── 进程标识符
│   ├── PID(当前进程ID)
│   └── PPID(父进程ID)
│
├── 前台进程 vs 后台进程
│   ├── jobs, &, fg, bg
│
├── 进程优先级(nice)
│   ├── nice, renice 命令
│
└── 进程相关系统调用(C语言)├── fork()├── exec()├── wait()├── exit()├── getpid()└── getppid()

十一、课后练习建议

  1. 使用 ps 命令查找当前运行的所有 bash 进程。
  2. 写一个 Shell 脚本,在后台运行多个 sleep 命令,并使用 jobs 查看它们的状态。
  3. 编写一个 C 程序,使用 fork() 创建两个子进程,分别打印不同的信息。
  4. 尝试使用 nice 和 renice 修改某个进程的优先级。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913181.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913181.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913181.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业物联网中的 Modbus:传感器与网关通信实战(二)

四、实战案例解析 4.1 项目背景与目标 某智能工厂致力于提升生产过程的自动化和智能化水平&#xff0c;对生产线上的各种设备进行实时监控和数据分析。在该工厂的一个生产车间中&#xff0c;存在着大量的传感器&#xff0c;用于监测设备的运行状态、环境参数等信息。这些传感…

飞算 JavaAI 智控引擎:全链路开发自动化新图景

免责声明: 此文章的所有内容皆是本人实验测评&#xff0c;并非广告推广&#xff0c;并非抄袭。如有侵权&#xff0c;请联系&#xff0c;谢谢! 文章目录&#x1f4dd;前言一、飞算 Java AI 智能开发助手简介1.1何为飞算 Java AI智能助手&#xff1f;2.2 飞算Java AI 直击开发全场…

MYSQL数据库(九)MVCC-多版本并发控制

目录 一 前景导入 1 当前读 2 快照读 二 MVCC 1 隐藏字段 2 UndoLog 回滚日志 (1 UndoLog日志 (2 UndoLog版本链 3 Read View 面试八股 介绍一下MVCC 一 前景导入 1 当前读 可使当前事务读取的是最新版本的数据&#xff0c;读取时还要保证其他并发事务不能修改当中…

[Pytest] [Part 2]增加 log功能

开始实现需求之前先做个log类&#xff0c;可以给其他模块使用&#xff0c;也方便以后修改log类的功能和属性。 使用的是python中的logging包来进行简单的封装&#xff0c;具体代码如下 import logging import sysclass TefLogger:def __init__(self, logger_nameTEST_FRAMEWOR…

NeighborGeo:基于邻居的IP地理定位(三)

NeighborGeo:基于neighbors的IP地理定位 X. Wang, D. Zhao, X. Liu, Z. Zhang, T. Zhao, NeighborGeo: IP geolocation based on neighbors, Comput. Netw. 257 (2025) 110896, 3. NeighborGeo 本文提出NeighborGeo,利用图结构学习和有监督对比学习来建立可靠的地标-目标关…

python使用fastmcp包编写mcp服务端(mcp_server)和mcp客户端(mcp_client)

安装fastmcp pip install fastmcp编写mcp服务端代码 from fastmcp import FastMCP mcp FastMCP(weather)mcp.tool() def get_weather(city: str):获取对应城市的天气:param city: 目标城市:return: 该城市的天气return f"{city}天气晴朗&#xff0c;温度60度&#xff01…

(1)机器学习小白入门 YOLOv:从概念到实践

(1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 目标检测一直是一个机器学习的一个重要的应用方向。而 YOLOv&#xff08;You Only Look Once&…

Appium 简介

Appium 是一个开源的移动应用自动化测试框架&#xff0c;用于测试原生应用(native)、混合应用(hybrid)和移动网页应用(mobile web)。它支持 iOS、Android 和 Windows 平台。 https://www.bilibili.com/video/BV1R93szkEhi/? App自动化测试&#xff1a;App测试AppiumUiAutomato…

【C语言刷题】第十一天:加量加餐继续,代码题训练,融会贯通IO模式

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为…

免费版安全性缩水?ToDesk、TeamViewer、向日葵、网易UU远程访问隐私防护测评

一、前言 在这个居家办公、远程技术支持成为常态的时代&#xff0c;我们经常需要把电脑控制权交给远方的同事或技术人员。但你想过没有&#xff0c;那些免费远程控制软件&#xff0c;真的能保护好你的隐私吗&#xff1f; 好用的远程软件通常会收费运营&#xff0c;投入经费去开…

nginx部署发布Vite项目

1 引言 在之前的文章《Ubuntu云服务器上部署发布Vite项目》中笔者使用了Vite提供的预览服务(npm run preview)来在云服务器上发布Web应用。这样做轻量应用是没问题的&#xff0c;不过遇到一些专业的问题就不行了&#xff0c;最好还是使用专业的HTTP服务器。除此之外&#xff0…

Unity文件夹标签 —— FolderTag

GitHub地址 FolderTag 下载之后解压&#xff0c;将FolderTag文件夹拖进Unity项目的Assets文件夹 选中文件夹&#xff0c;填上标签

【0基础开发油猴脚本】某漫画网站图片旋转

有朋友在用某漫画网站在线看漫画&#xff0c;但是那个网站会把漫画图片右旋90度&#xff0c;如图。于是&#xff0c;他就像我发起了求助&#xff0c;问我能不能写个脚本。我说&#xff0c;AI都发展到2025了&#xff0c;前端&#xff08;脚本&#xff09;这种东西还用自己写吗&a…

Vue Router 中,params参数的名称必须与路由配置中的动态路径参数名完全一致

路由配置与 params 参数的绑定关系 在路由配置中&#xff0c;使用 冒号&#xff08;:&#xff09; 定义动态路径参数&#xff1a; // router.js&#xff08;路由配置&#xff09; { path: /search/:keyword, // 这里的:keyword是动态路径参数 name: Search, component: S…

Spring Boot 应用开发实战指南:从入门到实战(内含实用技巧+项目案例)

&#x1f4d8; Spring Boot 应用开发实战指南&#xff1a;从入门到实战&#xff08;内含实用技巧项目案例&#xff09;&#x1f680; 你是否还在为 Spring 配置复杂、开发效率低下而苦恼&#xff1f;Spring Boot 早已成为 Java 后端开发的“标配”&#xff0c;本篇文章将带你全…

【NLP入门系列五】中文文本分类案例

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒…

【微信小程序】- 监听全局globalData数据

【微信小程序】- 监听全局globalData数据 数据劫持&#xff08;Object.defineProperty&#xff09;实现适用场景 数据劫持&#xff08;Object.defineProperty&#xff09; 实现 通过拦截 globalData 的属性读写实现自动监听&#xff0c;适合精确监听特定变量。 ​实现步骤​&…

高速公路闲置土地资源化利用:广西浦北互通3MW分布式光伏监控实践

摘要&#xff1a; 分布式光伏项目在清洁能源转型中扮演重要角色&#xff0c;其创新的空间利用模式有助于缓解能源开发与土地资源间的矛盾。广西大唐至浦北高速公路&#xff08;浦北互通&#xff09;项目&#xff0c;利用高速公路沿线闲置空地建设光伏电站&#xff0c;发挥了分布…

【Linux网络编程】网络基础

目录 计算机网络背景 初识协议 网络协议 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 再识协议 为什么要有TCP/IP协议&#xff1f; 什么是TCP/IP协议&#xff1f; 重谈协议 网络传输基本流程 局域网传输流程 跨网络传输流程 Socket编程预备 理解源IP地址与目的…

BlenderBot对话机器人大模型Facebook开发

文章目录 &#x1f680; BlenderBot 的关键特性&#x1f9ea; 版本与改进&#x1f4ca; 应用实例 Blender是搅拌机&#xff0c;果汁机&#xff0c;混合机的意思。 BlenderBot 是由 Facebook AI Research (FAIR) 开发的一种先进的对话生成模型。它旨在通过融合多种对话技能&…