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

【Linux】进程概念III --fork函数解析

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

本篇导航

  • 0. 创建进程
  • 1. 认识fork函数
  • 2.使用Fork函数
  • 3.关于fork的为什么
    • 3.1 一个函数如何返回两次?fork究竟在干什么?
    • 3.2 为什么要给子进程返回0,父进程返回子进程的PID呢?
    • 3.3 一个变量为什么会有两个不同的内容
  • 4. Bash与子进程

在这里插入图片描述

0. 创建进程

我们介绍了每一个在内存中运行的任务都称为一个进程.那么我们如何自己去创建一个进程呢?

在之前我们可以通过./xxx来运行一段程序,这样这段程序就被加载到内存当中成为了一个进程.这是在指令层面上的创建进程.

例如:

创建了一个名为proce的程序,将其运行.之后输入

ps -ajx | grep proce

image-20231103152448136

就可以查看到当前进程的相关信息.可以看到其PID为58014,PPID为57120

我们在代码中可以通过

getpid() getppid()来获取当前进程的PID和PPID,被包含在 **<unistd.h> <sys/types.h>**中,返回值为:pid_t 类型

在man二号手册中可以看到对其的相关介绍,说明其为一个系统调用接口

常见的节号包括:

  • 1:用户命令
  • 2:系统调用
  • 3:C库函数
  • 4:设备和特殊文件
  • 5:文件格式和约定
  • 6:游戏和演示
  • 7:杂项
  • 8:系统管理命令

屏幕截图 2023-11-03 213748

image-20231103213847667

那么我们在代码中如何去创建一个进程呢?

1. 认识fork函数

在代码层面中,我们可以使用fork去创建我们的子进程.

我们先来简单看下这个函数的接口说明,在man二号手册中可以看到对其的相关介绍.说明fork是一个系统调用接口

常见的节号包括:

  • 1:用户命令
  • 2:系统调用
  • 3:C库函数
  • 4:设备和特殊文件
  • 5:文件格式和约定
  • 6:游戏和演示
  • 7:杂项
  • 8:系统管理命令
man fork

屏幕截图 2023-11-03 210854

image-20231103210919090

函数接口:

pid_t fork(void)

头文件:

#include <sys/types.h>
#include <unistd.h>

返回值:

若成功创建子进程则对父进程返回子进程ID,对子进程返回0

我们来试着使用一下fork函数

2.使用Fork函数

先直接写一个简单的代码

#include <stdio.h>
#include <unistd.h>
int main()
{printf("before:\n");pid_t id=fork();printf("after:\n");sleep(1);return 0;
}

编译运行,惊奇的发现:before被打印了一次,after被打印了两次.

image-20231103212759610

我们可以得出一个结论:代码段在fork之后的部分被执行了两次

我们再来看看这份代码:

#include <stdio.h>
#include <unistd.h>
int main()
{printf("pid: %d\n",getpid());pid_t id=fork();if(id>0){while(1){printf("my pid : %d , my parent :%d,id:%d\n, ",getpid(),getppid(),id);sleep(1);}}else if(id==0){while(1){printf("my pid : %d , my parent :%d,id:%d\n",getpid(),getppid(),id);sleep(1);}}return 0;
}

image-20231103221733998

  • 居然在一份代码中既执行了if,又执行了else.这意味着id既 >0 又 <=0

​ 这在我们过去的学习中是不可能出现的事情.

  • 根据之前所学,fork()对父进程返回子进程PID,对子进程返回0

    所以 249101是父进程,249102是子进程

现在肯定有以下疑问:

  1. 一个函数如何返回两次?
  2. 为什么要给子进程返回0,父进程返回子进程的PID呢?
  3. 一个变量为什么会有两个不同的内容
  4. fork究竟在干什么?

3.关于fork的为什么

在将之前,我们先来理解下这个概念:子进程 创建时会和父进程共享内存中的代码与数据

80d9fb610e3f18a4441e5584b71bb21

这里只是将他们分开来看了,实际中是使用同一个地址上的内容

3.1 一个函数如何返回两次?fork究竟在干什么?

我们这两个问题一起来看.

假设这是一份fork函数的伪代码

pid_t fork()
{创建子进程task_struct 填充PCB对应内容让父子进程指向相同的代码可以被CPU调度运行了子进程创建完成   return ret;
}

注意看最后的一步return ret,此时子进程已经被创建出来了.他共享到了return ret.所以父子进程都需要返回一个ret的值;

我们可以大胆假设:

  • **ret为一个被初始化为0的变量.在填充子进程对应PCB这一步中,ret被赋值为子进程对应的PID.**但此时ret还未被子进程共享.

    子进程共享时,仅共享到了未被赋值的ret,所以返回时因为都有return 所以返回两次

3.2 为什么要给子进程返回0,父进程返回子进程的PID呢?

这是为了方便我们对进程进行管理.

如同上面的代码,我们通常情况下,希望父进程和子进程做不同的事情.所以需要对其进行分流

3.3 一个变量为什么会有两个不同的内容

这里可以先简单的理解为发生了 写时拷贝

虽然父子进程共享代码中的数据,但当任何一个进程需要修改变量中的内容时,会拷贝一份新的数据供修改对象使用.

这里后面谈进程地址空间时会详细解释.

4. Bash与子进程

我们运行起刚刚的进程后,用ps查看发现父进程的PPID(父进程的父进程)为80738.这是什么呢?

image-20231103224811352

发现其为zsh(一个Bash)

image-20231103225006415

的数据供修改对象使用.

这里后面谈进程地址空间时会详细解释.

平常我们在命令行中输入一个指令,bash负责解释完这个指令会新起一个子进程去运行本条指令.
image-20230905164632777

相关文章:

【Linux】进程概念III --fork函数解析

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 创建进程1. 认识fork函数2.使用Fork函数3.关于fork的为什么3.1 一个函数如何返回两次?fork究竟在干什么?3.2 为什么要给子…...

关闭 Android SplashScreen(闪屏)

SplashScreen在Android 12上是强制的&#xff0c;如果你什么都不做&#xff0c;你的App在Android 12上就会自动拥有SplashScreen界面 但是这个SplashScreen界面太局限了能改的地方太少了 其实也没什么他主要作用是为了在App启动初始化的时候避免让用户在一个空白界面等待过长时…...

react_16

主页 import {DownCircleOutlined,MenuFoldOutlined,VerticalAlignTopOutlined, } from "ant-design/icons"; import { Button, Layout, Menu } from "antd"; import { ItemType } from "antd/es/menu/hooks/useItems"; import { Link, Navigat…...

前端性能分析工具

前段时间在工作中,需要判断模块bundle size缩减对页面的哪些性能产生了影响, 因此需要了解前端的性能指标如何定义的,以及前端有哪些性能分析工具, 于是顺便整理了一篇笔记, 以供前端小白对性能这块知识点做一个入门级的了解. 页面渲染 在了解性能指标和分析工具之前,有必要先…...

根据Aurora发送时序,造Aurora 数据包,从而进行AXIS接口数据位宽转换仿真

首先Aurora采用AXIS接口 由于后续需要进行AXIS接口 不同时钟域的数据位宽转换&#xff08;64bit和256bit之间的转换&#xff09;&#xff0c;因此分两次走。 第一种方法&#xff1a;采用AXIS数据位宽转换IP AXIS跨时钟域IP 第二种方法&#xff1a;逻辑完成 下面记录逻辑…...

java后端响应结果Result

目录 一、Result1-1、响应代码1-2、调用响应1-3、在前端vue页面使用方法 一、Result 1-1、响应代码 package com.aaa.common;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data AllArgsConstructor NoArgsConstructor public cla…...

react_11

MobX 介绍 需求&#xff0c;组件0 改变了数据&#xff0c;其它组件也想获得改变后的数据&#xff0c;如图所示 这种多个组件之间要共享状态数据&#xff0c;useState 就不够用了&#xff0c;useContext 也不好用了 能够和 react 配合使用的状态管理库有 MobX Redux 其中…...

AI:52-基于深度学习的垃圾分类

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

[shell,hive] 在shell脚本中将hiveSQL分离出去

将Hive SQL语句写在单独的.hql文件中&#xff0c; 然后在shell脚本中调用这些文件来执行Hive查询。 这样可以将SQL语句与shell脚本分离&#xff0c;使代码更加清晰和易于维护。 基本用法 以下是一个示例&#xff0c;展示如何在shell脚本中使用.hql文件执行Hive查询&#xf…...

求两个(法)向量之间的rpy夹角

主要使用Eigen库实现: 1. 四元素到欧拉角的转换 #include <array> #include <Eigen/Geometry>template <typename T> inline Eigen::Matrix<typename std::remove_reference<T>::type::Scalar, 3, 1> eulerAnglesZYX(T q_in) {typedef typenam…...

[100天算法】-每个元音包含偶数次的最长子字符串(day 53)

题目描述 给你一个字符串 s &#xff0c;请你返回满足以下条件的最长子字符串的长度&#xff1a;每个元音字母&#xff0c;即 a&#xff0c;e&#xff0c;i&#xff0c;o&#xff0c;u &#xff0c;在子字符串中都恰好出现了偶数次。示例 1&#xff1a;输入&#xff1a;s &qu…...

从科幻走向现实,LLM Agent 做到哪一步了?

LLM 洪流滚滚&#xff0c;AI 浪潮席卷全球&#xff0c;在这不断冲击行业认知的一年中&#xff0c;Agent 以冉冉新星之态引起开发者侧目。OpenAI 科学家 Andrej Karpathy 曾言“OpenAI 在大模型领域快人一步&#xff0c;但在 Agent 领域&#xff0c;却是和大家处在同一起跑线上。…...

[笔记] 数据类型

整形 一字节&#xff08;Byte&#xff0c;也就是平时KB、MB里面的B&#xff09;就是八个二进制位(bit) 整形——int——4B无符号整形——unsigned int——4B短整形——short——2B长整型——long——4B双长整型——long long——8B 浮点型 参考博客&#xff1a;C 语言的浮点类型…...

QT学习之QT概述

1.1 什么是QT&#xff1f; Qt是一个跨平台的C图形用户界面应用程序框架。 QT特点&#xff1a; 跨平台&#xff0c;几乎支持所有的平台接口简单&#xff0c;容易上手&#xff0c;学习QT框架对学习其他框架有参考意义。一定程度上简化了内存回收机制开发效率高&#xff0c;能够…...

编写shell脚本,利用mysqldump实现MySQL数据库分库分表备份

查看数据和数据表 mysql -uroot -p123456 -e show databases mysql -uroot -p123456 -e show tables from cb_d 删除头部Database和数据库自带的表 mysql -uroot -p123456 -e show databases -N | egrep -v "information_schema|mysql|performance_schema|sys"编写…...

本地部署Jellyfin影音服务器并实现远程访问影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…...

【数据结构】希尔排序

文章目录 前言一、希尔排序的演示图例二、希尔排序&#xff1a;插入排序的优化版本☆三、核心算法思路四、算法思路步骤&#xff08;一&#xff09;预排序 gap>1&#xff08;二&#xff09;gap1 插入排序 完成排序收尾 五、码源详解&#xff08;1&#xff09;ShellSort1 ——…...

使用VBA打印PDF文件

使用VBA打印工作表和工作簿文件都很容易实现&#xff0c;但是有时需要使用VBA打印已经保存在本机的其他文件&#xff0c;例如PDF文件格式的账单&#xff0c;如果这个PDF并非由Excel生成的那么就无法使用前述方法实现。 调用Windows的Shell命令可以实现打印PDF文件。 示例代码…...

分布式ID系统设计(2)

接上文 https://editor.csdn.net/md/?articleId=133988963 类snowFlake 方案 应用举例 mongoDB ObjectID 就是一个典型的实现。数据库生成 以MySQL举例 利用给字段设置AUTO-INCREMENT来保证ID自增,每次业务使用SQL拿到MySQL的ID 这种方案的优缺点: 优点 1 简单。利用数据库实…...

http和https的区别,以及https涉及到的加密过程

一.http与https的介绍 http:超文本传输协议&#xff0c;是互联网应用最广泛的一种网络协议。设计的最初目的是为了提供一种发布和接收HTML页面的方法。是以明文的形式来传输的&#xff0c;所以就会存在一定的安全隐患&#xff08;因为攻击者可以截取web服务器和网站相关的报文…...

Async1Wire异步1-Wire驱动库:DS18B20非阻塞温度采集方案

1. Async1Wire 库概述Async1Wire 是一个专为嵌入式系统设计的异步 1-Wire 总线驱动库&#xff0c;其核心目标是解耦 1-Wire 通信时序与主程序执行流&#xff0c;避免传统阻塞式实现中长达数百毫秒的delay()等待&#xff08;如 DS18B20 温度转换期间的 750ms 全局阻塞&#xff0…...

如何用Python处理杭州交通数据集?从roadnet.json到flow.json的完整解析指南

杭州交通数据实战&#xff1a;用Python解析roadnet.json与flow.json的进阶技巧 第一次接触杭州交通数据集时&#xff0c;我被roadnet.json里密密麻麻的交叉点坐标和flow.json中流动的车辆轨迹震撼到了——这哪是数据文件&#xff0c;分明是一座数字孪生城市的血管与血液。作为算…...

Homepage终极灾难恢复指南:保障业务连续性的完整策略

Homepage终极灾难恢复指南&#xff1a;保障业务连续性的完整策略 【免费下载链接】homepage 一个高度可定制的主页&#xff08;或起始页/应用程序仪表板&#xff09;&#xff0c;集成了Docker和服务API。 项目地址: https://gitcode.com/GitHub_Trending/ho/homepage Ho…...

深入解析IoU(Jaccard系数)在目标检测中的关键作用与高效实现

1. IoU究竟是什么&#xff1f;从基础概念到视觉理解 第一次接触目标检测时&#xff0c;我对着论文里满屏的"IoU"缩写发懵——这到底是个什么魔法指标&#xff1f;后来在调试YOLO模型时才发现&#xff0c;这个看似简单的比值&#xff0c;实际上是整个检测任务的基石性…...

如何评估企业的敏捷管理能力价值

如何评估企业的敏捷管理能力价值关键词&#xff1a;企业敏捷管理能力、评估价值、敏捷方法、绩效指标、价值驱动因素摘要&#xff1a;本文旨在深入探讨如何评估企业的敏捷管理能力价值。首先介绍了评估的背景&#xff0c;包括目的、预期读者、文档结构和相关术语。接着阐述了敏…...

OpenCore Legacy Patcher:3大突破让旧Mac重获新生的系统兼容性优化指南

OpenCore Legacy Patcher&#xff1a;3大突破让旧Mac重获新生的系统兼容性优化指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher&#xff08;O…...

避坑指南:用合成数据训练模型时最容易忽略的3个问题

避坑指南&#xff1a;用合成数据训练模型时最容易忽略的3个问题 在自动驾驶系统开发中&#xff0c;某团队曾用10万小时合成驾驶数据训练视觉模型&#xff0c;测试时准确率高达98%。但当模型首次接触真实道路时&#xff0c;却将夕阳下的刹车灯误识别为交通信号灯——这个价值24…...

快马AI一键生成链表可视化原型,交互演示助力算法设计

最近在复习数据结构时&#xff0c;发现链表这种基础但重要的结构&#xff0c;光看静态图示很难理解指针变化。正好尝试用InsCode(快马)平台快速搭建了一个可视化演示工具&#xff0c;整个过程比想象中简单很多&#xff0c;分享下实现思路&#xff1a; 需求拆解 首先明确需要实现…...

从DBC到CAPL全流程避坑指南:BusType设置对自动化测试的影响

从DBC到CAPL全流程避坑指南&#xff1a;BusType设置对自动化测试的影响 在汽车电子测试领域&#xff0c;DBC文件如同CAN网络的"基因图谱"&#xff0c;而CAPL脚本则是激活这些基因的"酶"。当两者配合出现问题时&#xff0c;往往不是基因突变&#xff0c;而是…...

BilibiliDown:专业B站Hi-Res音频下载工具全攻略

BilibiliDown&#xff1a;专业B站Hi-Res音频下载工具全攻略 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bili…...