【知识讲解】 Linux进程的认识与创建

目录

前言

Part1. 进程概念

Part2. 创建进程 fork()

Part3. 结语

前言
在Linux的学习中认识进程是至关重要的一环,所以接下来来跟随小编的视角来认识一下进程的概念吧。

let's go!!!!!!!!

Part1. 进程概念
进程:正在运行的程序

磁盘上存放的是可执行程序,当程序被加载到内存之后,就变成进程。
操作系统中会同时运行大量进程,操作系统维护一个结构体,存放进程全部信息:代码地址、数据地址、pid等。

PCB(task_struct):Linux下的进程控制块。
PCB + 代码和数据 = 进程

PCB(task_struct)是内核用来管理进程的结构体,PCB是对进程的描述,进程真正的代码、数据在内存当中。

task_struct核心属性

1. pid:进程id,区分不同进程

2. 进程状态

3. 优先级

4. 程序计数器

5. 内存指针

系统当中所有运行的程序,都是一个个进程。

相关系统调用与命令

1. getpid():头文件 <sys/types.h>,获取当前进程pid。

2. ps axj:查看系统全部进程。

shell符号小知识

• a && b:执行A成功之后,才执行B

• a ; b:无论A执行成功失败,之后都执行B

# 过滤进程
ps axj | head -1
ps axj | grep 进程名

进程操作命令

1. ctrl + c:终止前台进程

2. kill -9 n:n为pid号,强制杀死对应进程

/proc 虚拟文件系统

/proc是内存当中的虚拟文件夹。

• ls /proc/n:n代表进程pid,查看该进程对应的文件表

• exe:符号链接,指向进程原始可执行程序。
即使磁盘原始程序被删除,进程依旧可以正常运行。因为程序数据已经加载到内存,删除的只是磁盘文件。

• cwd:符号链接,记录进程当前的绝对工作目录。
相对路径,是相对于当前工作目录cwd;修改cwd,相对路径的查找逻辑会跟着改变。

chdir("..."):修改进程当前工作目录。头文件 <unistd.h>。

getppid():获取父进程pid。
现象:子进程pid变化,父进程pid不变。

shell命令行:bash是命令行解释器,我们在命令行执行的指令,绝大多数都会交给bash创建子进程去执行。

Part2. 创建进程
//头文件
#include <sys/types.h>
#include <unistd.h>
//基础示例
printf("父进程:%d\n", getpid());
fork();
printf("子进程:%d\n", getpid());
//fork之后,会存在两个进程,父子进程都会继续执行后续代码。
//子进程会拷贝父进程的代码和数据,拥有自己独立的页表。
用码道免费领 1 个月 Token
cpp
运行
fork返回值(核心考点)

• 返回0:代表当前是子进程

• 返回大于0:返回值是子进程pid,代表当前是父进程

• 返回‑1:fork创建进程失败

pid_t id = fork();
if(id == -1){
// 出错处理
}else if(id == 0){
// 子进程执行逻辑
}else{
// 父进程执行逻辑
}
用码道免费领 1 个月 Token
cpp
运行
为什么fork会有两个不同返回值?

内核层面:

1. fork内部申请PCB,拷贝父进程数据、代码;生成子进程PCB。

2. 父子两个进程,都会执行return id;。

3. 父进程拿到子进程pid;子进程拿到返回值0。
所以同一个id变量,父子进程看到的值不一样,因此可以使用if‑else区分父子进程。

写时拷贝原理:

父子进程刚fork完成时,共享同一份数据。
当任意一个进程尝试修改数据,操作系统才会把对应内存拷贝一份,父子进程各自拥有独立副本。
不修改数据,则不会发生拷贝,节省内存开销。

Part3. 结语
这篇文章我们认识并知道了如何创建进程,接下来,小编还会带来更多Linux相关的知识,敬请期待~
最后,祝大家可以:春风得意马蹄疾,一日看尽长安花!

最后的最后,要是觉得本文还可以的话,可以点点赞,关注小编一波,谢谢大家!~

上一篇 StorCLI
下一篇 Ubuntu24.04下的VSCode通过ChatGPT5.5登陆codex:sign-in could not be complete 问题解决方案