news 2026/3/13 22:25:34

进程(3)创建进程与fork系统调用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进程(3)创建进程与fork系统调用详解

本章目标

1.getpid与getppid
2.重谈查看进程
3.创建进程

1.getpid与getppid

在上一篇文章,我们提到了如何通过系统调用获取当前进程的pid
在linux操作系统当中进程的创建都是通过父进程创建子进程的方式实现的
那么为了区分父子进程,在一个进程中除了标识当前进程的pid还要包含父进程的pid



getppid这个系统调用的工作原理是通过当前进程中指向父进程的task_struct指针间接拿到父进程的pid.

我们打开上一次的代码,我们通过打监控的方式看到了当前进程的pid,我们能够看到当前进程的pid和ppid.
那么对于test进程,pid我们很明确那么ppid是谁?


我们重新启动进程,
在这里补充一个问题.我们pid是进程启动的时候系统给分配的.这个pid的个数在操作系统中,我们可以理解为是一个全局变量.一旦超出这个数它就会回绕.因为每次启动都会分配一个pid,它也就是线性递增的
回到我们当前的话题.
我们重新拿到了这个进程的pid在,我们看到当前test进程的test的ppid,我们通过监控可以看到,这个进程的父进程是bash,也就是我们的命令行解释器.
这也就印证了我们前面的说法,我们的进程在linux操作系统当中是通过父进程创建子进程的方式创建出来的.
我那现在演示时下ppid的用法.


它的使用方法是与getpid的方法类似的

2.重谈查看进程


在之前的我们讨论过我们可以直接查看根目录的中proc目录下的内容.
这里面放着的就是当前操作系统下所以的实时进程
一旦进程创建,我们就会在这个目录下创建一个当前进程pid为名字的目录.
里面放着的就是我们当前进程的pcb也就是task_struct的内容.
我们在这里要重新讨论一个问题.
我们之前有关于文件操作的时候
我们fopen以写的时候打开然后给一个在当前目录下的没有的文件名.这个
函数是如何知道我们我们要在这个工作目录下创建该文件.
谁告诉它的
它实际上是从当前进程的pcb里面拿的

每一个进程在创建的时候,会将它所启动的位置,也就是当前进程的exe文件所在的目录记录在这个pcb中,也就是这个cwd这个链接文件.
我们在调用fopen这个函数,如果我们没有指定这个路径的话,会用这个pcb中的cwd
给的路径去拼接这个文件名去创建.
那么我们该如何去证明这个问题,我们可以通过一个系统调用去修改当前进程的cwd

chdir这个系统调用有一个参数,我们可以给它一个相对路径或者说是绝对路径,然后去修改当前进程的cwd.
我们现在演示以下


这是没使用系统调用前的状态,一切按照我们的想法,这个文件创建在这个和这个二进制可执行文件在一起的地方了.
现在我们系统调用去修改工作路径.但要注意权限问题.我们不能直接扔根目录里面,我们只是普通用户.

当我们通过系统调用去修改当前进程的工作路径的时候,它创建在我们所指定的目录,也就是我们当前用户的家目录当中.

3.创建进程

在前面我们聊过在Linux中创建新进程的方式是通过父进程创建子进程的方式去进程创建的.本质上是操作系统当中多了一个进程.而创建进程
我们也需要通过系统调用.
我们先简单介绍下这个系统调用.先使用以下,然后再介绍下它的原理

再Linux中,操作系统给我提供的系统调用是fork,这个函数不需要我们去传参数.
但是它的返回值是有很大的说道的.
我们下面演示以下



我们可以看到我们在最开始执行程序的时候最开始只有一个执行流104370
再经过fork之后有了两个执行流,这就是为了一个代码执行了两遍而两边的结果却是不同的.
在这里面我们能够得出一个结论.在进程fork之后,父进程与子进程是共享的fork之后代码的.
但是我们创建子进程的时候,创建它的目的就是为了完成任务.而父进程去做其他的东西.
这个时候我们就需要通过fork之后的返回值进行父子分流.
我们可以通过man手册去查看fork的返回值详细说明,有时间的可以看以下,下面我们直接演示,看文字过于晦涩.


我先不解释我们直接看结果

fork的返回值一共有三种情况
当子进程创建成功的时候fork的返回值分为两种
它会将子进程的pid返回给父进程
把0给子进程
当子进程创建失败的情况下
它会给父进程返回-1
在这里就引出了三个问题
1.为什么要给子进程返回0,给父进程返回子进程的pid
2.fork,它是一个函数,它是如何做到一次调用,返回两次的.
3.一个id 它是如何接受两个不同的返回值,而且不冲突的.

1.为什么要给子进程返回0,给父进程返回子进程的pid

关于这个问题,我们要先拿现实世界中的例子进行举例
在现实世界中我们父亲与孩子的比例是1比多,对于孩子来说,它只需要管父亲叫爹,而父亲为了区分孩子就需要通过他们的名字来进行区分
回到我们技术上.
子进程只需要知道父亲是谁就行,所以给个0
父进程为了将子进程进行区分需要知道每一个子进程是谁,也就是需要将子进程的pid给父进程,pid是一个进程的唯一标识.获得了pid也就能够将子进程进行区分了

2.fork,它是一个函数,它是如何做到一次调用,返回两次的.

关于这个问题,我们同样先引出一个问题.
在一个函数内部,再它的return 之前,它的核心功能一般来说就已经实现完了.
同样的回到我们fork函数,它的目的是为了创建子进程,再进行将pid进行返回前,它的父子分流也就做好,在前面我也提到过,对于父子进程来说,它们的代码时共享的,着就是时说明这个return,会被父子执行流执行两次.着也就说说明fork一个函数,通过一次系统调用,返回两次的原因

3.一个id 它是如何接受两个不同的返回值,而且不冲突的.

这个问题,对于现在我们的知识储备来说,可能不够,我先简单叙述下,有关于这其中的细节会在后面的进程地址空间的章节中详解
在我们之前实现stl容器中的string的时候提到了一种技术叫做引用计数的写实拷贝
在stirng只是浅拷贝或者时只读的情况,我们让两个不同的容器对象指向同一块空间
在一个对象进行修改的时候,我们再对他重新开辟空间,进行深拷贝
回到我们现在的流程
我在这篇文章中反复提及到在Linux中创造一个进程,是通过父进程创建子进程的方式实现的本质上在操作系统当中多出了一个进程
而子进程创建的时候是以父进程为蓝本的.fork会对它重新创建一个pcb或者叫task_struct,大部分属性都继承自父进程,但有些属性仍然需要进行修改pid或者ppid
我们今天简单理解将这一块认为只是简单的代码与数据构成的


因为是继承下来的子进程应该指向和父进程相同的代码与数据.
因为id是一个变量,它会在接受fork返回值的时候进行修改.
这个时候操作系统就会子进程重新在内存中开辟一块空间.
让它修改的地方指向新开辟的空间.被他修改的id也就保存在这块区域了
大白话说就是数据块被分开了,id被分别的保存到两个不同的内存块当中.
这样也就说明了一个id,它是如和接受两个不同的返回值,而且不冲突.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 9:27:38

谷歌浏览器插件打包和加载

1.去插件管理页面 谷歌浏览器插件管理 edge插件管理,查看插件id 2.复制id ,查找文件所在位置(注意替换插件id) find ~/Library -type d -name "bhghoamapcdpbohphigoooaddinpkbai" 2>/dev/null 3.复制插件所在位置,在插件管理…

作者头像 李华
网站建设 2026/3/12 23:23:51

Dify智能体平台的版本发布机制是如何运作的?

Dify智能体平台的版本发布机制是如何运作的? 在AI应用从实验原型迈向生产系统的今天,一个常被忽视但至关重要的问题浮出水面:我们如何确保今天调好的提示词,明天上线后依然有效? 这个问题背后,是传统AI开…

作者头像 李华
网站建设 2026/3/14 9:18:59

Stable Diffusion WebUI:DeepDanbooru动漫标签自动生成指南

Stable Diffusion WebUI 中的 DeepDanbooru 动漫标签自动化实践 在 AI 绘画领域,精准描述一幅复杂动漫画面始终是创作中的一大痛点。即便经验丰富的用户,也常因遗漏细节或表达模糊而影响出图质量。更别提批量生成时手动撰写 Prompt 的重复劳动——这不仅…

作者头像 李华
网站建设 2026/3/12 19:04:32

反汇编变量

反汇编变量 全局变量 全局变量和常量有着相似的性质&#xff0c;都是在程序执行之前就存在了。常量在PE的不可写数据节中&#xff0c;全局变量和局部变量在PE的可读可写数据节中。 下面来看一个简单的例子&#xff1a; #include <stdio.h>int g_num 0x12345678;int main…

作者头像 李华
网站建设 2026/3/5 11:08:10

30分钟上手动漫生成模型Counterfeit-V2.5

30分钟上手动漫生成模型Counterfeit-V2.5 在AI图像生成的浪潮中&#xff0c;二次元风格内容正以前所未有的速度占领创作者的视野。从独立画师到游戏美术团队&#xff0c;越来越多的人希望借助深度学习技术快速产出高质量、风格统一的动漫角色图。然而现实往往是&#xff1a;环…

作者头像 李华
网站建设 2026/3/11 2:06:09

BioSIM 人TNK-tPA(SIM0359):保证最终产物的高纯度与高活性

在现代生物医药研究中&#xff0c;生物类似药&#xff08;Biosimilars&#xff09;正逐渐成为创新药物的重要补充。它们不仅在成本控制上具有显著优势&#xff0c;同时在药效和安全性方面也展现出与原研药相当的潜力。作为这一领域的前沿探索者&#xff0c;InvivoCrown 推出的 …

作者头像 李华