【Linux】进程基础:task_struct、fork 与查看进程

目录

[1. 进程是什么?PCB 与 task_struct](#1. 进程是什么?PCB 与 task_struct)

[2. 如何查看进程](#2. 如何查看进程)

[3. 通过系统调用获取进程标识符](#3. 通过系统调用获取进程标识符)

[4. fork:创建新进程](#4. fork:创建新进程)


1. 进程是什么?PCB 与 task_struct

课本上说,进程是程序的一次执行实例。从内核的视角,进程就是分配系统资源(CPU 时间、内存等)的实体

在 Linux 内核中,进程的所有信息都存放在一个叫做 PCB (Process Control Block,进程控制块)的数据结构里。Linux 的 PCB 实现是 task_struct ,定义在 <linux/sched.h> 中。每创建一个进程,内核就分配一个 task_struct,并把它的指针加入链表,由此实现对进程的管理。

task_struct 包含了极其丰富的信息,大致可以分为几类:

  • 标识符:进程 ID(PID),父进程 ID(PPID),是进程的唯一编号。

  • 状态:进程处于运行、睡眠、停止等状态。

  • 优先级:决定调度时的先后顺序。

  • 程序计数器:指向下一条将要执行的指令地址。

  • 内存指针:指向代码段、数据段、堆栈等。

  • 上下文数据:进程切换时,CPU 寄存器的内容保存在这里。

  • I/O 状态:打开的文件列表、分配的 I/O 设备等。

  • 记账信息:累计使用 CPU 的时间、时钟数等。

在系统中,所有 task_struct 通过双链表连接,内核可以遍历、查找、调度任何一个进程。

2. 如何查看进程

第一种方式:通过 /proc 虚拟文件系统。/proc 下的每个以数字命名的目录对应一个进程的 PID,里面包含了该进程的所有内核信息。

bash

复制代码
ls /proc/1        # 查看 PID 为 1 的进程信息
cat /proc/1/status

第二种方式:使用用户级工具 pstop

bash

复制代码
ps aux            # 显示所有进程详细信息
ps -l             # 显示 PID、PPID、PRI、NI 等字段
top               # 动态刷新,按 CPU 或内存排序

通过 ps -l 可以看到 UID、PID、PPID、PRI(优先级)、NI(nice 值)等关键字段,后面讲优先级时会用到这些概念。

3. 通过系统调用获取进程标识符

cpp

复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
    printf("pid: %d\n", getpid());   // 当前进程 ID
    printf("ppid: %d\n", getppid()); // 父进程 ID
    return 0;
}

每个进程都有一个父进程,除了 init(或 systemd)是进程树的根。父子关系是进程管理的关键线索。

4. fork:创建新进程

在 Linux 下,新进程只能通过复制现有进程来创建。fork() 系统调用就是做这件事。

cpp

复制代码
pid_t id = fork();
if (id == -1) {
    perror("fork");
} else if (id == 0) {
    // 子进程
    printf("child: pid=%d, ppid=%d\n", getpid(), getppid());
} else {
    // 父进程
    printf("parent: pid=%d, child=%d\n", getpid(), id);
}

fork 调用一次,返回两次------父进程中返回子进程的 PID,子进程中返回 0。这是一个让初学者困惑的地方,后续讲虚拟地址空间时会理解底层的写时拷贝机制如何支持这一点。

父子进程共享代码段,数据段采用写时拷贝:只有当一方尝试修改数据时,内核才复制一份私有的物理页。这种设计既保证了进程独立性,又避免了一开始就全量拷贝的浪费。

fork 之后通常需要用 if 分流来区分父子逻辑。如果不分流和不控制退出顺序,很容易造成僵尸进程或孤儿进程,这在下一篇详细展开。

相关推荐
专注API从业者4 小时前
告别人工盯品!借助 Open Claw 搭建电商商品自动化监控与数据分析系统(完整可运行源码)
大数据·运维·数据库·数据分析·自动化
爱喝水的鱼丶5 小时前
SAP-ABAP:ABAP 用户出口参数传递与上下文获取:SAP 标准数据读取与交互逻辑实现
运维·性能优化·交互·sap·abap·经验交流·出口
IT大白鼠5 小时前
PentestGPT作为AI运维编排工作流自动化底座的技术架构与应用价值评估
运维·人工智能·自动化·pentestgpt
M78佐菲6 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
ltl6 小时前
QUIC 协议拆解(上):为什么 TCP 改不动了
linux
j7~6 小时前
【Git】《Git 系列指南(二):Git基本操作与 reset 三种模式》
运维·git·git安装·git基本操作·git配置·创建git仓库·git reset三种模式
zzzll11116 小时前
n8n 工作流自动化平台入门指南
运维·自动化
Hrain-AI7 小时前
Anthropic oncall-kit 开源拆解:运维 Agent 落地范式的四基石与权限边界
运维·人工智能·开源
HXDGCL7 小时前
从“转盘困局”到“直线破局”:华创力科技PTS精密分度输送系统如何重塑自动化产线
运维·科技·自动化
戴西软件7 小时前
国内有哪些智能化RPA工具?——从“录数据”到“做判断”,国产数字员工正在重新定义自动化
运维·自动化·rpa