当前位置: 首页 > news >正文

详解Linux的系统调用fork()函数

在Linux系统中,fork()是一个非常重要的系统调用,它的作用是创建一个新的进程。具体来说,fork()函数会在当前进程的地址空间中复制一份子进程,并且这个子进程几乎完全与父进程相同,包括进程代码、数据、堆栈以及打开的文件描述符等。因此,父进程和子进程之间的关系可以看作是一个“克隆”关系。

fork()函数的语法如下:

#include <unistd.h>  
pid_t fork(void);

其中,参数pid_t代表进程id,而fork()函数返回值则有以下两种情况:

  • 如果返回0,表示当前进程是子进程。
  • 如果返回一个正整数,表示当前进程是父进程,并且返回的整数就是新创建出来的子进程的进程ID。

此外,如果fork()返回值为-1,表示创建子进程失败。

fork()函数的本质是在内核中创建一个新的进程控制块(PCB),然后将原来进程的PCB中的大部分内容都复制到新的PCB中去,然后让两个进程同时运行。由于新的进程是从原来的进程所复制而来的,因此新进程会继承原来进程的所有资源和信息,包括内存、文件描述符、信号处理方式等。

需要注意的是,fork()函数并不保证父进程和子进程的执行顺序。在fork()之后,操作系统可能会先执行父进程,也可能会先执行子进程,这完全取决于系统的调度算法。

一般情况下,父进程和子进程之间是相互独立的,它们各自运行各自的代码,共享的只有一部分内存空间,而其他资源则是分别使用的。

#include<unistd.h>
#include<stdio.h>
int i=5;
int main() {if(fork()!=0)i++;elseprintf("%d\n",i);
}

此外,fork()函数还可以通过返回值来区分父进程和子进程,这使得父进程可以管理子进程的行为,例如等待子进程结束、获取子进程的状态等。

#include <stdio.h>
#include<unistd.h>
int main() {for(int i=0;i<3;i++){printf("%d\n",fork());}
}

需要注意的是,fork函数会返回两次,一次是在父进程中返回子进程的进程ID,一次是在子进程中返回0。

以下是七个fork例子

① Call once, return twice

void fork0() {if (fork() == 0) {printf("Hello from child\n");} else {printf("Hello from parent\n");}
}

创建一个子进程打印hello from child,父进程打印hello from parent

② Parent and child both run same code

void fork1() {int x = 1;pid_t pid = fork();if (pid == 0) {printf("Child has x = %d\n", ++x);} else {printf("Parent has x = %d\n", --x);}printf("Bye from process %d with x = %d\n", getpid(), x);
}

子进程会输出child has x=2和bye from process 子进程ID with x=2,父进程会输出parent has x=0和bye from process 父进程ID with x=0

③ Parent and child can continue forking

void fork2() {printf("L0\n");fork();printf("L1\n");fork();printf("Bye\n");
}

父进程输出一个L0、一个L1和一个Bye,一个子进程输出一个L1和一个Bye,一个子进程输出一个Bye,两个孙子进程输出两个Bye,一共一个L0、两个L1和四个Bye

④ Parent and child can continue forking

#define bork forkvoid borkfork() {bork();bork();bork();printf("borked\n");
}

父进程创建了一个子进程,然后二者又创建了两个子进程,然后四者又创建了四个子进程共八个进程输出八个borkfork

⑤ Parent and child can continue forking

void fork3() {printf("L0\n");fork();printf("L1\n");fork();printf("L2\n");fork();printf("Bye\n");
}

由③和④可知将会输出一个L0、两个L1、四个L2和八个Bye

⑥ Nested forks in parents

void fork4() {printf("L0\n");if (fork() != 0) {printf("L1\n");if (fork() != 0) {printf("L2\n");fork();}}printf("Bye\n");
}

由于只有在父进程中fork的返回值才会是进程ID,而子进程中fork的返回值永远是0,所以只有父进程会打印除L0、L1和L2并创建三个子进程,四个进程再打印出四个Bye

⑦ Nested forks in children

void fork5() {printf("L0\n");if (fork() == 0) {printf("L1\n");if (fork() == 0) {printf("L2\n");fork();}}printf("Bye\n");
}

父进程打印出L0,子进程打印出L1,子进程创建的子进程打印出L2并创建一个子进程,四个进程打印四个Bye

相关文章:

详解Linux的系统调用fork()函数

在Linux系统中&#xff0c;fork()是一个非常重要的系统调用&#xff0c;它的作用是创建一个新的进程。具体来说&#xff0c;fork()函数会在当前进程的地址空间中复制一份子进程&#xff0c;并且这个子进程几乎完全与父进程相同&#xff0c;包括进程代码、数据、堆栈以及打开的文…...

构建捡垃圾机器人的 ROS 2 项目

一、说明 本系列是关于学习如何使用 ROS2、Docker 和 Github 设计、设置和维护机器人项目。 先决条件 — ROS2 软件包的基本知识、实现发布者、订阅者、操作并连接它们。 我们之前在 ROS2 中了解了不同的部分。但是&#xff0c;在我们转向实际的基于硬件的项目之前&#xff0c;…...

Spring常用注解(2)

6、切面&#xff08;AOP&#xff09;相关注解 Spring AOP详细介绍 Spring支持AspectJ的注解式切面编程。 Aspect 声明一个切面 After 在方法执行之后执行&#xff08;方法上&#xff09; Before 在方法执行之前执行&#xff08;方法上&#xff09; Around 在方法执行之前与之后…...

upload-labs靶场通关

文章目录 Pass-01 前端检测&#xff08;JS检测&#xff09;1.1 原理分析1.2 实验 Pass-02 后端检测&#xff08;MIME检测&#xff09;2.1 原理分析2.2 实验 Pass-03 后端检测&#xff08;黑名单绕过&#xff0c;特殊后缀名&#xff09;3.1 原理分析3.2 实验 Pass-04 后端检测&a…...

git拉取代码过程

第一步&#xff1a;先在本地创建文件夹 &#xff0c;比如我这里的文件夹名称是 fengkgong_zntjfx 第二步&#xff1a;执行命令&#xff1a;git init 第三步&#xff1a;git clone 第四步&#xff1a;git fetch 第五步&#xff1a;git branch -a 第六步&#xff1a;cd 项目 【…...

Swift | 属性包装器

Swift | 属性包装器 1. 什么是 Swift Property Wrapper&#xff1f; Swift Property Wrapper 是一种特性&#xff0c;它允许我们在声明属性时添加自定义的包装逻辑。通过使用属性包装器&#xff0c;我们可以在不修改类或结构体定义的情况下&#xff0c;定制属性的访问和存储方…...

Android改造CardView为圆形View,Kotlin

Android改造CardView为圆形View&#xff0c;Kotlin 可以利用androidx.cardview.widget.CardView的cardCornerRadius特性&#xff0c;将CardView改造成一个圆形的View&#xff0c;技术实现的关键首先设定CardView为一个宽高相等的View&#xff08;正方形&#xff09;&#xff0c…...

Idea下面git的使用:变基、合并、优选、还原提交、重置、回滚、补丁

多分支和分支切换 变基和合并 变基是把本项目的所有提交都列出来按顺序一个个提交到目标分支上去 而合并是把两个分支合并起来&#xff0c;但是旧的分支还是可以启动其他分支&#xff0c;在旧的分支上继续开发 master: A -- B -- C -- M/ feature: D -- Emaster: A -…...

【数据结构】什么是算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.算法的定义 1.算法的概念 2.数据结构与算法的关系 二.算法的特性 输入 输出 有穷性 确定性 可行性 三.算法的设计要求 1.正确性 2.可读性 3.健壮性 4.效…...

复旦大学EMBA:揭秘科创企业,领略未来战略!

智能制造&#xff0c;国之重器。作为制造强国建设的主攻方向&#xff0c;智能制造的发展水平关系到我国未来制造业在全球的地位与影响力。发展智能制造&#xff0c;是加快建设现代化产业体系的重要手段&#xff0c;提升供给体系适配性的有力抓手&#xff0c;也是建设数字中国的…...

根据您的数据量定制的ChatGPT,改变客户服务的方式

在当今竞争激烈的商业环境中&#xff0c;提供优质的客户服务对于保持忠诚的客户群和推动业务增长至关重要。客户满意度已成为各行各企业的首要任务&#xff0c;因为它直接影响客户留存和品牌声誉。随着技术的进步&#xff0c;公司不断探索创新解决方案&#xff0c;以增强客户服…...

《Unity Shader 入门精要》笔记03

UnityShader的内置变量&#xff08;数学篇&#xff09; Unity内置的变换矩阵摄像机和屏幕参数float3 _WorldSpaceCameraPosfloat4 _ProjectionParamsfloat4 _ZBufferParamsfloat4 unity_OrthoParamsfloat4x4 unity_CameraProjectionfloat4x4 unity_CameraInvProjectionfloat4 u…...

LINUX系统使用软件异地同步数据(灾备)

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步&#xff0c;支持本地复制&#xff0c;或者与其他SSH、rsync主机同步 一、宝塔环境: 有宝塔软件商城支持&#xff0c;参考&#xff1a;https://www.bt.cn/bbs/thread-98022-1-1.html 二、…...

IDEA Rogstry中找不到compiler.automake.allow.when.app.running问题解决

网上大部分人教我们 先 File > Settings 然后 勾选 Build 下的 Compiler中的 Build project automatically 这些步骤都不会有问题 然后就会让我们 ctrl shift alt / 点 Rogstry 打开后 我人就麻了 根本没有什么 compiler.automake.allow.when.app.running 也不用慌 我们…...

c#设计模式-行为型模式 之 状态模式

&#x1f680;简介 状态模式是一种行为设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为&#xff0c;我们可以通过创建一个状态接口和一些实现了该接口的状态类来实现状态模式。然后&#xff0c;我们可以创建一个上下文类&#xff0c;它会根据其当前的状态对象来改…...

使用Docker安装JupyterHub

安装JupyterHub 拉取Jupyter镜像并运行容器 docker run -d -p 8000:8000 --name jupyterhub jupyterhub/jupyterhub jupyterhub # -d&#xff1a;后台运行 # -p 8000:8000&#xff1a;宿主机的8000端口映射容器中的8000端口 # --name jupyterhub&#xff1a;给运行的容器起名…...

SpringCloudGateway网关整合swagger3+Knife4j3,basePath丢失请求404问题

在集成 Spring Cloud Gateway 网关的时候&#xff0c;会出现没有 basePath 的情况&#xff0c;例如定义的 /jeeplus-auth、/jeeplus-system 等微服务前缀导致访问接口404&#xff1a; maven依赖&#xff1a; swagger2于17年停止维护&#xff0c;现在最新的版本为 Swagger3&am…...

html通过使用图像源的协议(protocol)相对 URL 来防止安全/不安全错误

有人知道使用 protocol relative URLs 是否有问题吗&#xff1f;用于图像源以防止混合内容安全警告。 例如链接一张图片: <img src"//domain.com/img.jpg" /> 代替: <img src"http://domain.com/img.jpg" /> or <img src"https…...

【SpringBoot】| Thymeleaf 模板引擎

目录 Thymeleaf 模板引擎 1. 第一个例子 2. 表达式 ①标准变量表达式 ②选择变量表达式&#xff08;星号变量表达式&#xff09; ③链接表达式&#xff08;URL表达式&#xff09; 3. Thymeleaf的属性 ①th:action ②th:method ③th:href ④th:src ⑤th:text ⑥th:…...

Vue Router的进阶

进阶 导航守卫 官方文档上面描述的会比较深奥&#xff0c;而守卫类型也比较多&#xff0c;其中包含了全局前置守卫、全局解析守卫、全局后置钩子、路由独享守卫、组件内守卫。每一种守卫的作用和用法都不相同。这会使得大家去学习的时候觉得比较困难&#xff0c;这边主要介绍…...

方案:快递站智能视频监控3大亮点汇总

快递站智能视频监控方案是一种利用先进的技术和设备&#xff0c;来提升快递站安全管理和快递流程监控的解决方案。具体包括哪些方面呢&#xff1f;今天小编就带大家来看看&#xff01; 1、视频监控系统 在快递站的关键区域安装旭帆科技高清摄像头&#xff0c;如快递仓库、操作…...

Direct3D网格

创建网格 我们可以用D3DXCreateMeshFVF函数创建一个"空"网格对象 &#xff0c;空网格对象是指我们指定了网格的面片总数和顶点总数&#xff0c;然后由该函数为顶点缓存、索引缓存和属性缓存分配大小合适的内存&#xff0c;之后即可手工填入网格数据。 HRESULT WINA…...

docker安装wiki

1.docker pull mediawiki 2.docker run -d --name mywiki -p 8666:80 mediawiki 访问ip:8666,就可以看到配置页面了 3.docker pull mysql docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD123456 -p 3307:3306 mysql 4.在配置页面链接ip:3307,连接数据库&#xff0c;接下…...

bigemap在林业勘测规划设计行业的一些应用

选择Bigemap的原因&#xff1a; 主要注重影像的时效性&#xff0c;软件的影像时效性比其他的更新快&#xff0c;更清晰。 使用场景&#xff1a; 1.林业督查&#xff0c;主要是根据国家下发的图斑&#xff0c;结合测绘局的影像以及bigemap的较新影像对比去年和今年的林地变化。…...

设计模式学习

文章目录 前言设计模式的七大原则单一职责原则开放封闭原则里氏替换原则依赖倒转原则接口隔离原则合成复用原则迪米特原则总结 GoF二十三种设计模式创建型模式&#xff08;五种&#xff09;结构型模式&#xff08;七种&#xff09;行为型模式&#xff08;十一种&#xff09; 游…...

Openfire身份认证绕过漏洞

漏洞详情&#xff1a; Openfire是采用Java编程语言开发的实时协作服务器&#xff0c;Openfire的管理控制台是一个基于Web的应用程序&#xff0c;被发现可以使用路径遍历的方式绕过权限校验。未经身份验证的用户可以访问Openfire管理控制台中的后台页面。同时由于Openfire管理控…...

类目体系设计总结

一、背景 公司窗帘产品在做分类调整&#xff0c;从原先二级类目调整为三级类目&#xff0c;相对于平台电商我们的类目层次结构要简单很多&#xff08;没有定义商品动态属性等&#xff09;&#xff0c;但对于也有上万款SKU的系统来讲,做好基础的分类对于采购、商品促销、数据报…...

gRPC之proto数据验证

1、proto数据验证 本篇将介绍grpc_validator&#xff0c;它可以对gRPC数据的输入和输出进行验证。 这里复用上一篇文章的代码。 1.1 创建proto文件&#xff0c;添加验证规则 这里使用第三方插件go-proto-validators 自动生成验证规则。 地址&#xff1a;https://github.co…...

计算机竞赛 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…...

css--踩坑

1. 子元素的宽高不生效问题 设置flex布局后&#xff0c;子元素的宽高不生效问题。 如果希望子元素的宽高生效&#xff0c;解决方法&#xff0c;给子元素添加如下属性&#xff1a; flex-shrink: 0; flex-shrink: 0;2. 横向滚动&#xff08;子元素宽度不固定&#xff09; /* tab…...

网站建设需要经历什么步骤/优秀的网络搜索引擎营销案例

Pod控制器类型: ReplicationController Replicaset Replicaset:维持用户期望的pod副本数 标签选择器&#xff1a;以便选定由自己选定管理的pod副本 pod资源模板&#xff1a;完成pod资源的新建 特点&#xff1a;管理无状态的pod资源&#xff0c;精确反映用户所定义的目标数量…...

原来做网站后来跑国外了/郴州网站seo

阅读目录Go 语言函数Go 语言函数章节目录Go 语言函数定义_声明_调用&#xff08;超详细&#xff09;一、定义一个普通函数1.1 函数名1.2 参数列表1.3 返回参数列表1.4 函数体二、参数列表简写三、函数返回值3.1 同一类型的返回值3.2 带有变量名的返回值四、调用函数Go 语言函数…...

柯林建站程序/网店推广方案策划书

鉴于object detection COCO数据集的论文经常出现 single-model 也就是说&#xff0c;这是一个对网络的分类&#xff0c;呢它是什么意思&#xff0c;有什么特点。相对应的另一类是什么。就是下面介绍的ensemble learning。 不过比如说网络初值是用别人的网络训练好的数值&#…...

永久免费手机网站建设/seo的最终是为了达到

解决方法:考虑在后面加一句&#xff1a;plt.show() 原理&#xff1a;plt.imshow()函数负责对图像进行处理&#xff0c;并显示其格式&#xff0c;而plt.show()则是将plt.imshow()处理后的函数显示出来。 转载于:https://www.cnblogs.com/w33-blog/p/9956252.html...

网站空间的地址/爱站工具包的主要功能

Have you seen this great new article on MSDN? Auditing Business Data in Microsoft CRMhttp://msdn.microsoft.com/library/en-us/dnmbscrm1_2/html/mbs_crmauditing.asp?frametrue转载于:https://blog.51cto.com/wjs9552/301536...

3d 网站设计/网络营销案例分析题及答案

1. 调优金字塔 架构调优&#xff1a;采用更适合业务场景的架构能最大程度地提升系统的扩展性和可用性。在设计中进行垂直拆分能尽量解耦应用的依赖&#xff0c;对读 压力比较大的业务进行读写分离能保证读性能线性扩展&#xff0c;而对于读写并发压力比较大的业务在 MySQL 上也…...