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

【Linux系统】从 C 语言文件操作到系统调用的核心原理

在这里插入图片描述

文章目录

  • 前言
  • lesson 15_基础IO
    • 一、共识原理
    • 二、回顾C语言接口
      • 2.1 文件的打开操作
      • 2.2 文件的读取与写入操作
      • 2.3 三个标准输入输出流
    • 三、过渡到系统,认识文件系统调用
      • 3.1 `open` 系统调用
        • 1. 比特位标志位示例
      • 3.2 `write` 系统调用
        • 1. 模拟实现 `w` 选项
        • 2. 模拟实现 `a` 选项
      • 3.3 `read` 系统调用
    • 四、访问文件的本质
  • 结语


前言

本文将从文件的基本概念出发,先回顾 C 语言中文件操作的常用接口,再逐步过渡到 Linux 系统调用,解析文件描述符、文件打开对象、进程与文件的关系等关键概念。通过代码示例和原理分析,带你揭开 Linux 基础 IO 的神秘面纱,理解操作系统如何管理文件、进程如何与文件交互的底层逻辑。


lesson 15_基础IO

一、共识原理

  • 文件 = 内容 + 属性。

  • 文件分为 打开的文件没打开的文件

  • 打开的文件:谁打开的?进程!—— 本质是研究进程和文件的关系。

  • 没打开的文件:在哪里放着呢?在磁盘上。我们最关注的问题?没有被打开的文件非常多,文件如何被分门别类的放置好(如何存储) —— 我们要快速的进行增删查改 —— 快速找到文件。

  • 文件被打开,必须先被加载到内存!

  • 进程:打开的文件 = 1:n。

小结:操作系统内部,一定存在大量的别打开的文件!—— OS 要不要管理这些被打开的文件呢? —— 怎么管理???—— 先描述,在组织。—— 在内核中,一个被打开的文件都必须有自己的文件打开对象,包含文件的很多属性。struct XXX{文件属性;struct XXX *next};

二、回顾C语言接口

2.1 文件的打开操作

  • fopen 函数用于打开文件,格式为

    • FILE *fopen(const char *path, const char *mode);
      
    • path: 文件路径或文件名。如果只有文件名,操作系统会在当前工作目录(cwd)下查找该文件。

    • mode: 文件打开模式。常见模式有:

      • w: 如果文件已存在,先清空文件再写入。如果文件不存在,创建新文件。
      • a: 以追加模式打开文件,在文件末尾添加内容。
  • 当前路径 (cwd): 每个进程维护一个当前工作目录,操作系统会根据该目录来查找文件。如果路径没有指定,fopen 会使用进程的当前工作路径。

  • 2.2 文件的读取与写入操作

    • fwrite 用于向文件写入数据。其函数声明为:

      size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
      
      • ptr: 指向要写入数据的指针。
      • size: 每个写入对象的大小。
      • nmemb: 要写入的对象个数。
      • stream:文件流指针
    • 举例使用:

      int main()
      {FILE *fp = fopen("log.txt", "w");if (fp == NULL){perror("fopen");return errno;}char* str = "Hello Linux!";fwrite(str, strlen(str), 1, fp);fclose(fp);return 0;
      }
      
      • fwrite的第二个参数是指每个写入对象的大小,strlen函数返回的值是不包含字符串结束标识符,那么我们传参是加一还是不加一呢?加一就代表把\0写入到文件中,那么我们是应该怎么选择呢?这里不妨试一试加一的结果:

        注意 log.txt 文件中,字符串的末尾有一个^@,是什么意思呢?实际上这个字符组合是表示\0的ASCII码,所以写入字符串时,使用 strlen 计算字符串长度时,不包括结束符 \0。通常不需要将 \0 写入文件,因为它是 C 语言中的结束标志,而在其它语言中读取文件时,可能不希望看到这些无关的字符。

    2.3 三个标准输入输出流

    C 程序启动时,会自动打开以下三个标准流:

    • stdin: 标准输入流(通常与键盘连接)。
    • stdout: 标准输出流(通常与显示器连接)。
    • stderr: 标准错误流(通常与显示器连接)。

    这三个流都由操作系统和 C 标准库提供,并用于处理程序与外部交互的基本输入输出。

三、过渡到系统,认识文件系统调用

文件其实是在磁盘上的,磁盘是外部设备,访问磁盘文件其实是访问硬件!几乎所有的库只要是访问硬件设备,必定要封装系统调用。

3.1 open 系统调用

open 是一个用于打开文件或创建文件的系统调用,其原型为:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • 参数说明
    • pathname: 文件路径。
    • flags: 打开文件时的标志,例如:
      • O_RDONLY:只读打开。
      • O_WRONLY:只写打开。
      • O_RDWR:读写打开。
      • O_CREAT:文件不存在时创建文件。
      • O_TRUNC:打开文件时清空文件内容。
      • O_APPEND:以追加模式打开文件。
    • mode: 在使用 O_CREAT 时,需要指定新文件的访问权限。
  • 返回值:成功返回文件描述符,失败返回 -1。
1. 比特位标志位示例

通过按位或(|)传递多个标志位,可以在同一次调用中同时指定多个选项。

代码示例:

#define ONE (1<<0) // 1
#define TWO (1<<1) // 2
#define FOUR (1<<2) // 4
#define EIGHT (1<<3) // 8void show(int flags)
{if(flags & ONE) printf("function1\n");if(flags & TWO) printf("function2\n");if(flags & FOUR) printf("function3\n");if(flags & EIGHT) printf("function4\n");return;
}int main()
{printf("--------------------------------------\n");show(ONE);printf("--------------------------------------\n");show(ONE | TWO);printf("--------------------------------------\n");show(ONE | TWO | FOUR );printf("--------------------------------------\n");show(ONE | TWO | FOUR | EIGHT);printf("--------------------------------------\n");return 0;
}

输出示例:

3.2 write 系统调用

write 用于将数据写入文件,其原型为:

ssize_t write(int fd, const void *buf, size_t count);
  • 参数说明:
    • fd: 文件描述符。
    • buf: 指向数据缓冲区的指针。
    • count: 要写入的数据字节数。
  • 返回值:实际写入的字节数。
1. 模拟实现 w 选项

模拟 fopenw 模式(清空文件后写入):

int main()
{umask(0); // 将权限掩码设置成0000int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); if(fd < 0){printf("open file error\n");return 1;}const char* str = "bbb";ssize_t ret = write(fd, str, strlen(str));close(fd);return 0;
}
2. 模拟实现 a 选项

模拟 fopena 模式(追加写):

int main()
{umask(0); int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666); if(fd < 0){printf("open file error\n");return errno;}const char* str = "bbb";ssize_t ret = write(fd, str, strlen(str));close(fd);return 0;
}

3.3 read 系统调用

read 用于从文件中读取数据,其原型为:

ssize_t read(int fd, void *buf, size_t count);
  • 参数说明
    • fd: 文件描述符。
    • buf: 存储读取数据的缓冲区。
    • count: 缓冲区的大小。
  • 返回值:实际读取的字节数。

四、访问文件的本质

  1. struct file 结构体的作用
  • 当文件被打开时,操作系统为该文件创建一个 struct file 结构体对象,负责管理该文件的元数据和访问信息。
  • 操作系统对文件的管理本质上就是对这些 struct file 结构体对象的管理,它们被组织成一个双链表,保存所有当前打开的文件。
  1. 文件描述符表(files_struct
  • 每个进程都有一个 struct files_struct 类型的对象,它记录了该进程所打开的所有文件的信息。
  • struct files_struct 中有一个文件描述符表,维护了一个 struct file* 类型的数组。数组的下标就是文件描述符,指向进程打开的文件的 struct file 结构体对象。
  1. 文件描述符的分配规则
  • 操作系统会为进程打开的新文件分配一个文件描述符,分配从 3 开始(因为标准输入、输出、错误流占用文件描述符 0、1、2)。
  • 新打开的文件将从进程的文件描述符表中找到最小的未使用下标,作为文件描述符。
  1. FILE 类型在 C 语言中的作用
  • FILE 是 C 语言库中的封装类型,用于描述文件,它提供了更高层次的文件操作接口。

  • FILE 类型内部封装了文件描述符,_fileno 字段就是对应的文件描述符,可以通过它来访问底层的文件描述符。

    int main()
    {umask(0); int fd1 = open("log1.txt", O_WRONLY | O_CREAT | O_APPEND, 0666); int fd2 = open("log2.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);int fd3 = open("log3.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);int fd4 = open("log4.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);printf("fd1: %d\n", fd1);printf("fd2: %d\n", fd2);printf("fd3: %d\n", fd3);printf("fd4: %d\n", fd4);return 0;
    }
    
  1. 文件的引用计数与关闭
  • 文件可以被多个进程同时打开,struct file 中有一个 f_count 字段来记录文件的引用计数。
  • 当进程关闭文件时,close 系统调用会将文件描述符表中对应位置的内容置为 NULL,减少文件的引用计数。如果引用计数为 0,操作系统会回收该文件对应的资源。
  1. 标准输入、输出和错误流(文件描述符 0, 1, 2)
  • 操作系统会在程序启动时自动打开标准输入(文件描述符 0)、标准输出(文件描述符 1)和标准错误(文件描述符 2)。

  • 这三个文件描述符是预留的,程序中打开的新文件会从文件描述符 3 开始。

  1. 文件描述符的关闭与输出
  • 通过 close 系统调用关闭文件描述符后,进程无法再通过该文件描述符进行文件操作。例如,关闭标准输出(close(1))会导致后续的 printf 输出无法显示,但其他流如标准错误仍然有效。

    int main()
    {close(1); // 将 stdout 关闭int ret = printf("stdin->fd: %d\n", stdin->_fileno);printf("stdout->fd: %d\n", stdout->_fileno);printf("stderr->fd: %d\n", stderr->_fileno);fprintf(stderr, "printf ret: %d\n", ret);return 0;
    }
    

结语

IO 操作是操作系统的 “血脉”,理解其底层原理不仅能帮助我们写出更健壮的代码,还能为深入学习进程通信、网络编程等高级主题奠定基础。希望本文能成为你探索 Linux 系统编程的一块基石,在后续的学习中,你可以尝试结合实际项目,对比不同 IO 接口的性能差异,或深入分析内核源码中的文件管理逻辑,进一步提升技术深度。

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,17的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是17前进的动力!

在这里插入图片描述

相关文章:

【Linux系统】从 C 语言文件操作到系统调用的核心原理

文章目录 前言lesson 15_基础IO一、共识原理二、回顾C语言接口2.1 文件的打开操作2.2 文件的读取与写入操作2.3 三个标准输入输出流 三、过渡到系统&#xff0c;认识文件系统调用3.1 open 系统调用1. 比特位标志位示例 3.2 write 系统调用1. 模拟实现 w 选项2. 模拟实现 a 选项…...

俄罗斯方块算法

俄罗斯方块是一款风靡全球 38 年的经典益智游戏&#xff0c;凭借其简单易学但难于精通的特点&#xff0c;成为游戏史上的不朽之作。 游戏界面与规则 游戏界面为 20 行10 列的可视区域。横向 X 轴区间为 [0&#xff0c;9]&#xff0c;共 10 列&#xff1b;纵向 Y 轴区间为 [0&a…...

Node.js 循环依赖问题详解:原理、案例与解决方案

文章目录 一、什么是循环依赖&#xff1f;二、循环依赖的典型表现三、解决方案四、如何检测循环依赖五、循环依赖的隐藏危害 一、什么是循环依赖&#xff1f; 当两个或者多个模块互相直接或者间接引用时&#xff0c;就会形成循环依赖。例如&#xff1a; A.js → 依赖 → B.js…...

Linux系统编程——vfork函数的使用方法以及与fork函数的区别

vfork() 是 Linux 系统编程中与 fork() 类似的系统调用&#xff0c;用于创建一个新的子进程。它们都能创建子进程&#xff0c;但在实现机制和使用场景上有明显区别。 以下是对 vfork() 的详细介绍&#xff0c;包括&#xff1a; 使用方法 注意事项 与 fork() 的联系与区别 使…...

.NET 无侵入自动化探针原理与主流实现详解

目录 引言 一、.NET 无侵入自动化探针的原理 1.1 CLR Profiling API 核心机制 示例代码 1.2 CLR Instrumentation 核心机制 示例代码 1.3 反射和动态代理 核心机制 示例代码 1.4 DiagnosticSource 核心机制 示例代码 二、主流实现与工具 2.1 AppDynamics 实现原…...

大数据:新能源汽车宇宙的未来曲率引擎

** 发布日期&#xff1a;2025-05-14** 关键词&#xff1a;大数据、新能源、机器学习、碳中和、CSDN爆款 1. 大数据科普&#xff1a;定义、特征与技术核心 1.1 什么是大数据&#xff1f; 大数据&#xff08;Big Data&#xff09;指规模巨大、类型多样、生成速度快且价值密度低…...

创建你的第一个MCP服务

创建你的第一个MCP服务 Model Context Protocol (MCP) 中国天气查询服务创建教程 什么是 Model Context Protocol (MCP) Model Context Protocol (MCP) 是一种开放标准协议&#xff0c;允许大型语言模型&#xff08;LLM&#xff09;如 Claude 与外部系统和数据源进行交互。通…...

说一说Node.js高性能开发中的I/O操作

众所周知&#xff0c;在软件开发的领域中&#xff0c;输入输出&#xff08;I/O&#xff09;操作是程序与外部世界交互的重要环节&#xff0c;比如从文件读取数据、向网络发送请求等。这段时间&#xff0c;也指导项目中一些项目的开发工作&#xff0c;发现在Node.js运用中&#…...

小白入门:GitHub 远程仓库使用全攻略

一、Git 核心概念 1. 三个工作区域 工作区&#xff08;Working Directory&#xff09;&#xff1a;实际编辑文件的地方。 暂存区&#xff08;Staging Area&#xff09;&#xff1a;准备提交的文件集合&#xff08;使用git add操作&#xff09;。 本地仓库&#xff08;Local…...

Protobuf3协议关键字详解与应用实例

一、核心语法与基础关键字 syntax 声明协议版本&#xff0c;必须为文件的第一行非空、非注释内容。 syntax "proto3"; // 显式指定proto3语法&#xff0c;否则编译器默认使用proto2message 定义消息类型&#xff0c;包含一组结构化字段。支持嵌套消息定义&#xff…...

阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)

上一篇文章介绍了如何通过topic操作命令实现与机器人的交互&#xff0c;本篇我们介绍如何通过Message&#xff08;即topic的下一级&#xff09;实现与机器人的交互。 和topic一样&#xff0c;首先在一个终端通过ssh命令登录机器人、启动机器人&#xff0c;然后打开另外一个终端…...

Leetcode刷题 | Day63_图论08_拓扑排序

一、学习任务 拓扑排序代码随想录 二、具体题目 1.拓扑排序117. 软件构建 【题目描述】 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依…...

[Harmony]获取资源文件中.txt文件中的字符串

txt文件 src/main/resources/rawfile/userInfo.txt {"Code": 200,"Msg": "登录成功","RetData": {"Name": "shq","Phone": "18511111111","PostName": "按摩技师",&qu…...

matlab多项式

1. 多项式表示 多项式用行向量表示&#xff0c;按降幂排列系数。例如&#xff0c;多项式 3x22x1 表示为 [3 2 1]。 2. 创建多项式 直接输入系数&#xff1a;如 p [1 -3 3 -1] 表示 x3−3x23x−1。由根创建&#xff1a;使用 poly 函数。例如&#xff0c;根为 [1, 1, 1]&…...

手搓传染病模型(SEI - SEIAR )

在传染病防控的前沿研究中&#xff0c;构建精准的数学模型对于理解疾病传播机制、预测疫情走势以及制定有效干预策略至关重要。SEI - SEIAR 模型&#xff08;易感媒介 \(S_m\) - 潜伏媒介 \(E_m\) - 感染媒介 \(I_m\) - 易感人群 S - 潜伏人群 E - 有症状感染者 I - 无症状感染…...

Ubuntu 安装 Redis

1. 下载 redis 下载地址&#xff1a;https://github.com/redis/redis 2. 解压 redis 把下载的软件包&#xff0c;上传到服务器的 /usr/local 目录中&#xff0c;执行解压命令 tar -zxvf redis-8.0.1.tar.gz 3. 安装 redis 安装依赖 sudo apt-get updatesudo apt-get ins…...

【QGIS二次开发】地图显示与交互-03

系列目录&#xff1a; 【QGIS二次开发】地图显示与交互-01_qgis二次开发加载地图案例-CSDN博客 【QGIS二次开发】地图显示与交互-02_setlayerlabeling-CSDN博客 3. 地图符号与色表 3.1 矢量图层符号设置 任务要求&#xff1a;双击图层树节点&#xff0c;实现图层中图元的符…...

28、动画魔法圣典:Framer Motion 时空奥义全解——React 19 交互动效

"在数字世界的夹缝中&#xff0c;存在着连接现实与虚拟的魔法纽带——这便是 Framer Motion 的时空秘术。" ——《前端魔法师手札卷七》 一、时空裂隙动画 - FLIP量子跃迁术 1. FLIP时空扭曲原理 <motion.divlayout // 开启时空裂隙transition{{type: "spr…...

Ken Thompson 和 Dennis Ritchie

Ken Thompson&#xff08;肯汤普逊&#xff09;和Dennis Ritchie&#xff08;丹尼斯里奇&#xff09;是计算机科学领域的两位传奇人物&#xff0c;他们对现代计算机技术的发展产生了深远影响。以下是关于他们的详细介绍&#xff1a; 1. ​​Ken Thompson​​ ​​出生​​&am…...

SQL:MySQL函数:条件函数(Conditional Functions)

目录 什么是条件函数&#xff1f; 常用 MySQL 条件函数总览表 1️⃣ IF() – 条件判断函数&#xff08;If Statement&#xff09; 2️⃣ IFNULL() – 空值判断与替代函数&#xff08;If Null&#xff09; 3️⃣ NULLIF() – 相等返回 NULL&#xff08;Null If Equal&#…...

初识Linux · IP分片

目录 前言&#xff1a; IP分片 分片vs不分片 如何分片 分片举例 三个字段 前言&#xff1a; 前文IP协议上和IP协议下我们已经把IP协议的报头的大多数字段介绍了&#xff0c;唯独有三个字段现在还有介绍&#xff0c;即16位标识&#xff0c;8位协议&#xff0c;13位片偏移…...

TCP 粘包

一、粘包问题详解 1. 粘包的概念 定义&#xff1a; 指在 TCP 通信中&#xff0c;由于发送方和接收方的读写速度、数据量不一致&#xff0c;导致多个数据包被错误地合并成一个数据包处理的现象。产生原因&#xff1a; TCP 是流式协议&#xff08;无边界&#xff09;&#xff0…...

第一个优化

agent项目 tool 调用外部服务时 选择了指数回避的重试机制 优化点&#xff1a;延迟时间那 加了一个随机的时间抖动 指数回避 我第一眼看到 这不就是 tcp重连机制吗 其实就是 如果当时网络波动 网况不好 || 服务正忙 &#xff0c;可以不急着在这个时候选择多次重试&#xff0c…...

LabVIEW的CAN通讯测试程序

该程序是基于 NI LabVIEW 平台开发的 CAN&#xff08;Controller Area Network&#xff0c;控制器局域网&#xff09;通讯测试程序。主要功能是对 CAN 通讯过程进行模拟、数据传输与验证&#xff0c;确保 CAN 通讯的正常运行和数据的准确传输。 程序详细说明 接口选择&#xff…...

视频质量分析时,遇到不同分辨率的对照视频和源视频,分辨率对齐的正确顺序。

背景 我们平时在做视频转码后&#xff0c;会用VMAF/PSNR得评分工具进行视频对比的评分&#xff0c;但是这几种客观评分方式都有一个要求就是分辨率要一模一样&#xff0c;因为这样才对像素点做数学运算。 但是分辨率对齐其实有两种选择&#xff0c;例如源视频是1080P&#xf…...

Kotlin并发请求的一些知识记录

private suspend fun fetchDataConcurrently(list: MutableList<MyType>,onRequestResult: (Int, List<MyType>?) -> Unit //高阶函数回调) {val deferredList mutableListOf<Deferred<MyType?>>()// 设定任务超时时间为12秒&#xff0c;并使用 …...

Ubuntu 编译SRS和ZLMediaKit用于视频推拉流

SRS实现视频的rtmp webrtc推流 ZLMediaKit编译生成MediaServer实现rtsp推流 SRS指定某个固定网卡&#xff0c;修改程序后重新编译 打开SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp&#xff0c;在 232 行后面添加&#xff1a; ZLMediaKit编译后文件存放在ZLMediakit/rele…...

typora免费获取序列号

这个方法不是唯一&#xff0c;但是所需要的时长很短。废话不多说 1.下载网盘文件 通过网盘分享的文件&#xff1a;typora破解 链接: https://pan.baidu.com/s/1KQnSUV3V0uBGpLc_iz2UFQ?pwdetc4 提取码: etc4 2.把解压下来的文件放到装软件的文件夹 3. 打开cmd&#xff0c;…...

C++23 新增的查找算法详解:ranges::find_last 系列函数

文章目录 引言C Ranges 库简介ranges::find_last、ranges::find_last_if 和 ranges::find_last_if_not 概述ranges::find_last示例代码代码解释 ranges::find_last_if函数签名参数解释示例代码代码解释 ranges::find_last_if_not示例代码代码解释 使用场景总结 引言 在 C 的发…...

11.基础IO(上)

一、文件概念 对文件归类认知&#xff1a; 对于 0KB 的空文件是占用磁盘空间的 文件是文件属性&#xff08;元数据&#xff09;和文件内容的集合&#xff08;文件 属性&#xff08;元数据&#xff09; 内容&#xff09; 所有的文件操作本质是文件内容操作和文件属性操作。 …...

本地部署Firecrawl+Dify调用踩坑记录

最近自己研究Dify&#xff0c;使用到Firecrawl这个比较好用的工具。用Firecrawl官网的不知道为什么总是卡住得不到结果&#xff0c;于是我打算自己去本地部署一个。好家伙真给我人搞麻了&#xff0c;太多问题了。 我是在京东云上面租的一台服务器。 首先就是docker的安装&…...

硬盘坏了电脑会出现哪些明显现象?机械和固态可不一样

机械硬盘&#xff08;HDD&#xff09;损坏的常见表现 >启动异常&#xff1a;如果是启动盘&#xff0c;可能会遭遇系统无法启动&#xff0c;提示“No Bootable Device”“Operating System not found”或“Sector not found”等错误&#xff1b;以及BIOS无法识别硬盘&#x…...

数据驱动下的具身智能进化范式

数据驱动技术与挑战...

使用Python与正则表达式高效提取Excel中的票号数据

使用Python与正则表达式高效提取Excel中的票号数据 一、需求 本文将介绍如何利用Python的Pandas库和正则表达式&#xff0c;快速实现票号这一数据清洗任务&#xff0c;并将结果整理为规范的表格结构。 在数据处理场景中&#xff0c;从非结构化文本里提取特定格式的信息是常见…...

MySQL 迁移至 Doris 最佳实践方案

在数据架构不断演进的背景下&#xff0c;从 MySQL 迁移至 Doris 成为许多企业提升数据处理效率的关键选择。本文将深入剖析三种经过实践验证的 MySQL 迁移至 Doris 的最佳方案&#xff0c;涵盖全量迁移、增量同步、混合迁移以及基于 CDC&#xff08;Change Data Capture&#x…...

2025长三角杯数学建模A题思路模型代码:智能手机产品设计优化与定价问题

2025长三角杯数学建模A题思路模型代码&#xff0c;详细内容见文末名片 一、问题背景 在 2025 年第五届长三角高校数学建模竞赛中&#xff0c;赛题 A 聚焦于智能手机产品设计优化与定价这一极具现实意义的问题。如今的智能手机市场&#xff0c;可谓是一片硝烟弥漫的“战场”&a…...

【hadoop】Kafka 安装部署

一、Kafka安装与配置 步骤&#xff1a; 1、使用XFTP将Kafka安装包kafka_2.12-2.8.1.tgz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/kafka_2.12-2.8.1.tgz 3、修改文件夹的名字&#xff0c;将其改为kafka&#xff0c;或者创建软连接也可&#xff1…...

网络安全EN18031-1,EN18031-2,EN18031-3三个标准对应的测试项目

EN18031-1,EN18031-2,EN18031-3三个标准有什么区别 ‌EN18031-1、EN18031-2和EN18031-3三个标准分别针对不同的安全要求和应用场景&#xff0c;具体区别如下‌&#xff1a; ‌EN18031-1‌&#xff1a;主要关注网络安全防护&#xff0c;特别是防止DDoS攻击和确保安全通信协议的…...

React与Docker中的MySQL进行交互

完整结构 1. 项目结构设置 首先创建项目&#xff1a; npm create vitelatest . --template react cd . npm install2. 设置Docker中的MySQL 创建docker-compose.yml文件&#xff08;与之前相同&#xff09;&#xff1a; version: 3.8 services:mysql:image: mysql:8.0conta…...

量子隧穿:PROFINET到Ethernet ip的无损耗协议转换方案转

在本季度的生产工作中&#xff0c;我们成功实现了仓储物流自动化分拣系统中的关键技术突破。我们面临的主要挑战是将采用EtherNet/IP协议的输送带控制器与PROFINET协议的上位系统进行有效通信。通过引入ethernet IP转PROFINET网关倍讯科技BX-606-EIP&#xff0c;我们实现了输送…...

W1R3S: 1.0.1靶场

W1R3S: 1.0.1 来自 <W1R3S: 1.0.1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.249 3&#xff0c;对靶机进行端口…...

pycharm中qthread中的run函数debug不上的问题

先说结论 在风和日丽的一天&#xff0c;我尝试把我mac上的代码拿到windows修改。突然遇到了个bug&#xff0c;然后想着对几个线程内部的run函数逐一debug。 结果一开线程&#xff0c;整个线程仍然继续报错&#xff0c;run函数的第一行都不停断点。甚至&#xff0c;我加了个pr…...

深度解析IP静态的工作原理,IP静态的应用场景又哪些?

一、什么是IP静态&#xff1f; 当我们谈到“IP静态”时&#xff0c;大家可能首先想到的是与“动态IP”相对的概念。确实如此&#xff0c;静态IP是一种固定分配的IP地址&#xff0c;也就是说&#xff0c;在特定时间内&#xff0c;分配给你的IP地址不会有所更改——无论你完成多…...

Electron 应用的升级机制详解

在产品分发给用户之后,进入迭代周期是不可避免的过程。开发者需要为产品增加新功能、修复Bug,并推出新版本。如何将这些更新有效地分发给用户,是产品经理和开发人员共同关注的问题。本节将从开发者的角度出发,详细介绍Electron应用的两种常见升级方式:全量升级与增量升级。…...

Java 开源报表系统全解析:免费工具、企业案例与集成实践

在企业级数据可视化与报表开发中&#xff0c;选择一款功能强大且完全免费的开源报表系统至关重要。本文深度剖析 5 款经过权威验证的免费开源 Java 报表工具&#xff0c;涵盖图表展示、定制化及第三方集成能力&#xff0c;附企业级案例与技术实践&#xff0c;助您高效选型。 一…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 注意“回车换行“的跨平台使用.

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现

分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现 目录 分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现ABC-…...

Java中的设计模式

一、工厂方法模式 1.1 简单工厂模式 1.1.1 案例引入 比方说我们要设计一个披萨店的点单程序&#xff0c;披萨店有水果披萨&#xff0c;有芝士披萨&#xff0c;两种类型&#xff0c;选择哪个披萨&#xff0c;只需要创建那个类型的披萨对象即可。 package org.example;import…...

NSSCTF [GFCTF 2021]where_is_shell

889.[GFCTF 2021]where_is_shell(system($0)64位) [GFCTF 2021]where_is_shell (1) 1.准备 motalymotaly-VMware-Virtual-Platform:~$ file shell shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.s…...

有关知名分析品牌默克Supelco®的前世今生

因在仪器设备和实验室产品方面的卓越贡献&#xff0c;Supelco品牌的创立者Nicholas Pelick与Walter Supina获颁2019年匹兹堡文化遗产奖&#xff08;2019 Heritage Award&#xff09;&#xff0c;入选匹兹堡名人堂&#xff08;Pittcon Hall of Fame&#xff09;。 目前&#xff…...