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

【Linux】系统文件IO·文件描述符fd

前言

 C语言文件接口

 C 语言读写文件

1.C语言写入文件

2.C语言读取文件

stdin/stdout/stderr

系统文件IO

文件描述符fd:

文件描述符分配规则:

文件描述符fd:

前言

我们早在C语言中学习关于如何用代码来管理文件,比如文件的输入和文件的输出,一些文件的接口,如何深入学习文件的知识,在Linux下一切皆文件,今天我们探讨Linux的基础I/O。

1>文件=内容+属性

2>访问文件之前,都需要先打开文件,并且对文件的修改都是通过执行代码的方式完成的,文件必须加载到内存中

文件被访问被修改必须得在内存中完成,因为CPU只能访问内存,所以文件必须加载到内存中。 打开文件->文件被加载到内存中

3>文件由谁打开? ->  由进程打开文件

4> 一个进程可以打开多个文件,由操作系统管理多个被打开的文件,那么这些文件是怎样被管理的:  先描述,再组织,内核中一定要有描述被打开文件的结构体,使用其定义对象

5>系统中不是所有的文件都被进程打开了, 没有被打开的文件就在磁盘中

 C语言文件接口

 C 语言读写文件

🗡文件操作:

    首先要打开文件:打开成功,返回文件指针;打开失败,返回NULL
    最后要关闭文件

🗡代码操作:

    FILE *fopen(const char *path, const char *mode);
    int fclose(FILE *fp);

fwritesize_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )
fcloseint fclose ( FILE * stream );

1.C语言写入文件

int fputs(const char *s, FILE *stream); 
int fprintf(FILE *stream, const char *format, ...);

1. 如下,我们以"w"的方式打开文件,以"w"方式打开文件会先清空文件的内容然后再向文件写入内容。

#include <stdio.h>int main()
{FILE *fp=fopen("./log.txt","w");if(fp==NULL){perror("fopen");return 1;}fclose(fp);    return 0;
}

 

2. 我们使用"a"方式(append) 打开文件  "a"方式 是向文件的末尾追加内容

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{FILE *fp = fopen("log.txt","a");if(fp == NULL){perror("fopen");return 1;}const char* s = "hello linux\n";fwrite(s,strlen(s),1,fp);return 0;	
}

2.C语言读取文件

char *fgets(char *s, int size, FILE *stream); 
int fscanf(FILE *stream, const char *format, ...);
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{FILE *fp = fopen("./log.txt","r");if(fp == NULL){perror("fopen");return 1;}char buffer[64];while(fgets(buffer,sizeof(buffer),fp)){printf("%s",buffer);}return 0;	
}

stdin/stdout/stderr

C默认会打开三个输入输出流,分别是

stdin       标准输入  键盘设备

stdout     标准输出  显示器设备

stderr      标准错误  显示器设备

仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针

 stdin、stdout、stderr 都可以直接使用,例如:

系统文件IO

上面的 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)。而, open close read write lseek 都属于系统提供的接口,称之为系统调用接口

访问文件不仅仅要有C语言上的文件接口,OS必须提供对应的访问文件的系统调用

man 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: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:

O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开

这三个常量,必须指定一个且只能指定一个

O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写

 返回值:

返回值:

成功:新打开的文件描述符

失败:-1

来看下面的例子

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd = open("./log.txt",O_WRONLY | O_CREAT);if(fd < 0){printf("open error\n");// return 1;}close(fd);return 0;	
}

 

此时我们可以观察到 创建出来的文件的权限是乱的

这是因为,没有这个文件,要创建它,系统层面就必须指定权限是多少!我们采用权限设置的八进制方案

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{int fd = open("./log.txt",O_WRONLY | O_CREAT,0644);if(fd < 0){printf("open error\n");return 1;}close(fd);return 0;	
}

 此时的权限就正常了。

其中我们发现,我们传入的flag为 O_WRONLY|O_CREAT,中间为什么要用|连接起来呢:

这是一种用户层给内核传递标志位的常用做法。int有32个bit位,一个bit代表一个标志,就可以传递多个标志位且位运算效率较高。这些O_RDONLY、O_WRONLY、O_RDWR 都是只有一个比特位是1的数据,并且相互不重复,这样 |在一起,就能传递多个标志位。

看看下面这个例子

#include <stdio.h>
#include <unistd.h>
#include <string.h>#define ONE 1
#define TWO (1<<1)
#define THREE (1<<2)
#define FOUR (1<<3)
#define FIVE (1<<4)void Print(int flag)
{if(flag & ONE ) printf("1\n");if(flag & TWO) printf("2\n");if(flag & THREE) printf("3\n");if(flag & FOUR) printf("4\n");if(flag & FIVE) printf("5\n");
}int main()
{Print(ONE);printf("------------\n");Print(TWO);printf("------------\n");Print(ONE|TWO);printf("------------\n");Print(THREE|FOUR|FIVE);printf("------------\n");Print(ONE|TWO|THREE|FOUR|FIVE);printf("------------\n");return 0;
}

 

文件描述符fd:

open函数的返回值是就是文件描述符,类型为int,下面我们来看看fd的值

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int fd1 = open("./log1.txt",O_WRONLY | O_CREAT, 0644);int fd2 = open("./log2.txt",O_WRONLY | O_CREAT, 0644);int fd3 = open("./log3.txt",O_WRONLY | O_CREAT, 0644);int fd4 = open("./log4.txt",O_WRONLY | O_CREAT, 0644);printf("fd:%d\n",fd1);printf("fd:%d\n",fd2);printf("fd:%d\n",fd3);printf("fd:%d\n",fd4);close(fd1);close(fd2);close(fd3);close(fd4);return 0;	
}

我们可以看到fd的值是从3开始的,一次打印出了3、4、5、6 那么前面的0,1,2去了哪里?

这时候我们想到了stdin,stdout,strerr ,当我们的程序运行起来变成进程,默认情况下,OS会帮助我们打开三个标准输入输出,012其实分别对应的就是标准输入stdin、标准输出stdout、标准错误stderr。对应硬件设备也是键盘、显示器、显示器。

0代表标准输入

1代表标准输出

2代表标准错误

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd = open("myfile", O_RDONLY);
if(fd < 0){
perror("open");
return 1;
}
printf("fd: %d\n", fd);
close(fd);
return 0
}

此时输出结果为 fd:3

再关闭0或者2

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
close(0);
//close(2);
int fd = open("myfile", O_RDONLY);
if(fd < 0){
perror("open");
return 1;
}
printf("fd: %d\n", fd);
close(fd);
return 0;
}

得到的结果会是fd:0 或者fd:2

文件描述符分配规则:

这样文件描述符被分配为01234678… 这样从0开始,连续的整数。 并且会优先分配 最小的,未被使用过的。每次给新文件分配的fd,是从fd_array[]中找一个最小的、未被使用的作为新的fd。

    所有的文件操作都是进程执行对应的函数,即本质上是进程对文件的操作。

    如果一个文件没有被打开,这个文件是在磁盘上。如果我创建一个空文件,该文件也是要占用磁盘空间的,因为文件的属性早就存在了(包括名称、时间、类型、大小、权限、用户名所属组等等),属性也是数据,所谓“空文件”是指文件内容为空。

即磁盘文件 = 文件内容 + 文件属性。事实上,我们之前所学的所有文件操作都可以分为两类:对文件内容的操作 + 对文件属性的操作(fseek、ftell、rewind、chmod、chgrp等等).

    要操作文件,必须打开文件(C语言fopen、C++打开流、系统上open),本质上,就是文件相关的属性信息从磁盘加载到内存。

操作系统中存在大量进程,进程可以打开多个文件,即进程 : 文件 = 1 : n ,系统中可能存在着更多的打开的文件(暂时不考虑一个文件被多个进程打开的特殊情况)。那么,OS要不要把打开的文件在内存中(系统中)管理起来呢?那么就要上管理的六字真言:先描述,再组织!

    打开的这么多文件,怎么知道哪些是我们进程的呢?操作系统为了让进程和文件之间产生关联,进程在内核创建struct files_struct 的结构,这个结构包含了一个数组 struct file* fd_array[] ,也就是一个指针数组,把表述文件的结构体地址填入到特定下标中。

文件描述符fd:

此时我们cat命令查看log.txt文件,内容为空

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main()
{close(1);int fd=open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);printf("fd:%d\n",fd);return 0;
}

我们这段代码旨在打开log.txt文件,并且向显示器上打印fd的值。

但是我们执行程序之后,显示器上并没有出现我们期望的fd的值

反而我们cat 一下log.txt,发现fd的值竟然打印在了log.txt文件中

 首先分析一下fd的值, 我们关闭了"1" 此时1 就是最小的且未被使用的,所以此时open的返回值是1;

对于本应打印在显示器上的值打印在文件中这件事情,printf底层封装了一些write,stdout等

此时传给printf的fd为1,那么将 文件描述符1 传递给进程后,进程就开始向log.txt文件中打印信息

同时我们也知道了 printf底层是在向标准输出(stdout)打印

int fprintf(FILE *stream, const char *format, ...);
stdout -> FIEL{fileno = 1} -> log.txt// stdout只认识1,只对1输入输出

extern  :  dup2

#include <unistd.h>
int dup2(int oldfd, int newfd); //oldfd->newfd
dup2() makes newfd be the copy of oldfd, closing newfd first if necessary, but note the following:
*  If oldfd is not a valid file descriptor, then the call fails, and newfd is not closed.
*  If oldfd is a valid file descriptor, and newfd has the same value as oldfd, then dup2() does nothing, and returns newfd.

拷贝的是fd对应内容,最终相当于全部变成old

相关文章:

【Linux】系统文件IO·文件描述符fd

前言 C语言文件接口 C 语言读写文件 1.C语言写入文件 2.C语言读取文件 stdin/stdout/stderr 系统文件IO 文件描述符fd&#xff1a; 文件描述符分配规则&#xff1a; 文件描述符fd&#xff1a; 前言 我们早在C语言中学习关于如何用代码来管理文件&#xff0c;比如文件的…...

【计算机网络篇】数据链路层(6)共享式以太网_网络适配器_MAC地址

文章目录 &#x1f354;网络适配器&#x1f354;MAC地址&#x1f5d2;️IEEE 802局域网的MAC地址格式&#x1f4d2;IEEE 802局域网的MAC地址发送顺序&#x1f95a;单播MAC地址&#x1f95a;广播MAC地址&#x1f95a;多播MAC地址&#x1f50e;小结 &#x1f354;网络适配器 要将…...

导入别人的net文件报红问题sdk

1. 使用cmd命令 dotnet --info 查看自己使用的SDK版本 2.直接找到项目中的 global.json 文件&#xff0c;右键打开&#xff0c;直接修改版本为本机的SDK版本&#xff0c;就可以用了...

LangChain 介绍

In recent times, you would probably have heard of many AI applications, one of them being chatpdf.com. 在最近&#xff0c;你可能听说过很多的AI应用&#xff0c;chatpdf.com就是其中的一个。 On this website, you can upload your own PDF. After uploading, you ca…...

【区分vue2和vue3下的element UI Avatar 头像组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 的 Element UI 和 Vue 3 的 Element Plus 中&#xff0c;Avatar 头像组件可能并没有直接作为官方组件库的一部分。然而&#xff0c;为了回答你的问题&#xff0c;我将假设 Element UI 和 Element Plus 在未来的版本中可能添加了 Avatar 组件&#xff0c;或者我们将使用…...

数据分析必备:一步步教你如何用matplotlib做数据可视化(10)

1、Matplotlib 二维箭头图 箭头图将速度矢量显示为箭头&#xff0c;其中分量(u&#xff0c;v)位于点(x&#xff0c;y)。 quiver(x,y,u,v)上述命令将矢量绘制为在x和y中每个对应元素对中指定的坐标处的箭头。 参数 下表列出了quiver()函数的参数 - x - 1D或2D阵列&#xff0c;…...

Stable Diffusion部署教程,开启你的AI绘图之路

本文环境 系统&#xff1a;Ubuntu 20.04 64位 内存&#xff1a;32G 环境安装 2.1 安装GPU驱动 在英伟达官网根据显卡型号、操作系统、CUDA等查询驱动版本。官网查询链接https://www.nvidia.com/Download/index.aspx?langen-us 注意这里的CUDA版本&#xff0c;如未安装CUD…...

三生随记——诡异的牙线

在小镇的角落&#xff0c;坐落着一间古老的牙医诊所。这所诊所早已荒废多年&#xff0c;窗户上爬满了藤蔓&#xff0c;门板上的油漆斑驳脱落&#xff0c;仿佛诉说着无尽的沉寂与孤独。然而&#xff0c;在午夜时分&#xff0c;偶尔会有低沉的呻吟声从紧闭的诊所里传出&#xff0…...

批量重命名神器揭秘:一键实现文件夹随机命名,自定义长度轻松搞定!

在数字化时代&#xff0c;我们经常需要管理大量的文件夹&#xff0c;尤其是对于那些需要频繁更改或整理的文件来说&#xff0c;给它们进行批量重命名可以大大提高工作效率。然而&#xff0c;传统的重命名方法既繁琐又耗时&#xff0c;无法满足高效工作的需求。今天&#xff0c;…...

学习笔记——路由网络基础——路由转发

六、路由转发 1、最长匹配原则 最长匹配原则 是支持IP路由的设备默认的路由查找方式(事实上几乎所有支持IP路由的设备都是这种查找方式)。当路由器收到一个IP数据包时&#xff0c;会将数据包的目的IP地址与自己本地路由表中的表项进行逐位(Bit-By-Bit)的逐位查找&#xff0c;…...

Python网络安全项目开发实战,如何防命令注入

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_防命令注入_编程案例解析实例详解课程教程.pdf 在Python网络安全项目开发中,防止命令注入(Command Injection)是一项…...

程序员如何高效读代码?

程序员高效读代码的技巧包括以下几点&#xff1a; 明确阅读目的&#xff1a;在开始阅读代码之前&#xff0c;先明确你的阅读目的。是为了理解整个系统的架构&#xff1f;还是为了修复一个具体的bug&#xff1f;或者是为了了解某个功能是如何实现的&#xff1f;明确目的可以帮助…...

全面分析一下前端框架Angular的来龙去脉,分析angular的技术要点和难点,以及详细的语法和使用规则,底层原理-小白进阶之路

Angular 前端框架全面分析 Angular 是一个由 Google 维护的开源前端框架。它最早在 2010 年发布&#xff0c;最初版本称为 AngularJS。2016 年&#xff0c;团队发布了一个完全重写的版本&#xff0c;称为 Angular 2&#xff0c;之后的版本&#xff08;如 Angular 4、Angular 5…...

VACUUM 剖析

VACUUM 剖析 为什么需要 Vacuum MVCC MVCC&#xff1a;Multi-Version Concurrency Control&#xff0c;即多版本并发控制。 PostgreSQL 使用多版本并发控制&#xff08;MVCC&#xff09;来支持高并发的事务处理&#xff0c;同时保持数据的一致性和隔离性。MVCC 是一种用于管…...

基于LangChain框架搭建知识库

基于LangChain框架搭建知识库 说明流程1.数据加载2.数据清洗3.数据切分4.获取向量5.向量库保存到本地6.向量搜索7.汇总调用 说明 本文使用openai提供的embedding模型作为框架基础模型&#xff0c;知识库的搭建目的就是为了让大模型减少幻觉出现&#xff0c;实现起来也很简单&a…...

LeetCode 1789, 6, 138

目录 1789. 员工的直属部门题目链接表要求知识点思路代码 6. Z 字形变换题目链接标签思路代码 138. 随机链表的复制题目链接标签思路代码 1789. 员工的直属部门 题目链接 1789. 员工的直属部门 表 表Employee的字段为employee_id&#xff0c;department_id和primary_flag。…...

Redis部署模式全解析:单点、主从、哨兵与集群

Redis是一个高性能的键值存储系统&#xff0c;以其丰富的数据结构和优异的读写性能而闻名。在实际应用中&#xff0c;根据业务需求的不同&#xff0c;Redis可以部署在多种模式下。本文将详细介绍Redis的四种主要部署模式&#xff1a;单点模式、主从复制模式、哨兵模式以及集群模…...

python-docx顺序读取word内容

来源How to use Python iteration to read paragraphs, tables and pictures in word&#xff1f; Issue #650 python-openxml/python-docx (github.com) from docx import Document from docx.oxml.ns import qndef iter_block_items(parent):"""生成 paren…...

kafka 集群原理设计和实现概述(一)

kafka 集群原理设计和实现概述(一) Kafka 集群的设计原理是为了实现高可用性、高吞吐量、容错性和可扩展性。以下是 Kafka 集群的设计原 理及其实现方法: 1. 分布式架构设计 Kafka 采用分布式架构,集群中的多个 Broker 共同工作,负责接收、存储和传递消息。通过将数据分布…...

three.js 第十一节 - uv坐标

// ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js // 导入tween import * as T…...

git从master分支创建分支

1. 切换到主分支或你想从哪里创建新分支 git checkout master 2. 创建并切换到新的本地分支 develop git checkout -b develop 3. 将新分支推送到远程存储库 git push origin develop 4. 设置本地 develop 分支跟踪远程 develop 分支 git branch --set-upstream-toorigi…...

Chromium 调试指南2024 Mac篇 - 准备工作 (一)

1.引言 Chromium是一个由Google主导开发的开源浏览器项目&#xff0c;它为Google Chrome浏览器提供了基础框架。Chromium不仅是研究和开发现代浏览器技术的重要平台&#xff0c;还为众多其他基于Chromium的浏览器&#xff08;如Microsoft Edge、Brave等&#xff09;提供了基础…...

vue登陆密码加密,java后端解密

前端 安装crypto-js npm install crypto-js加密 //引入crypto-js import CryptoJS from crypto-js;/** ---密码加密 start--- */ const SECRET_KEY CryptoJS.enc.Utf8.parse("a15q8f6s5s1a2v3s"); const SECRET_IV CryptoJS.enc.Utf8.parse("a3c6g5h4v9sss…...

npm 安装踩坑

1 网络正常&#xff0c;但是以前的老项目安装依赖一直卡住无法安装&#xff1f;哪怕切换成淘宝镜像 解决办法&#xff1a;切换成yarn (1) npm i yarn -g(2) yarn init(3) yarn install在安装的过程中发现&#xff1a; [2/4] Fetching packages... error marked11.1.0:…...

内容安全复习 6 - 白帽子安全漏洞挖掘披露的法律风险

文章目录 安全漏洞的法律概念界定安全漏洞特征白帽子安全漏洞挖掘面临的法律风险“白帽子”安全漏洞挖掘的风险根源“白帽子”的主体边界授权行为边界关键结论 安全漏洞的法律概念界定 可以被利用来破坏所在系统的网络或信息安全的缺陷或错误&#xff1b;被利用的网络缺陷、错…...

dp经典问题:爬楼梯

dp经典问题&#xff1a;爬楼梯 爬楼梯 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模1000000007。 Step1: 识别问题 这…...

示例:推荐一个基于第三方QRCoder.Xaml封装的二维码显示控件

一、目的&#xff1a;基于第三方QRCoder.Xaml封装的二维码控件&#xff0c;为了方便WPF调用 二、效果如下 功能包括&#xff1a;背景色&#xff0c;前景色&#xff0c;中心图片设置和修改大小&#xff0c;二维码设置等 三、环境 VS2022 四、使用方式 1、安装nuget包&#xf…...

阿里云服务器618没想到这么便宜,买早了!

2年前&#xff0c;我买了个服务器&#xff0c;租用服务器&#xff08;ECS5&#xff09;和网络宽带&#xff08;1M&#xff09;&#xff0c;可以说是非常非常低的配置了。 当时5年的折扣力度最大&#xff0c;但是打完折后&#xff0c;价格依然要近3000多元。 最近看到阿里云618活…...

提升Python技能的七个函数式编程技巧

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 递归📝 结构化模式匹配📝 不变性📝 纯函数📝 高阶函数📝 函数组合📝 惰性求值⚓️ 相关链接 ⚓️📖 介绍 📖 在现代编程中,虽然Python并不是一门纯粹的函数式编程语言,但函数式编程(Funct…...

微型操作系统内核源码详解系列五(五):cm3下Pendsv切换任务上篇

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…...

Django测试平台搭建学习笔记1

一安装 pip离线安装requests2.32.0所需要的依赖&#xff1a; : charset-normalizer<4,>2 (3.0.0b1) : idna<4,>2.5 (3.7) : urllib3<3,>1.21.1 (2.2.0) : certifi>2017.4.17 (2024.6.2) pip离线安装pytest8.2.0所需要的依赖&#xff1a; : iniconfig (2…...

本地离线模型搭建指南-RAG架构实现

搭建一个本地中文大语言模型&#xff08;LLM&#xff09;涉及多个关键步骤&#xff0c;从选择模型底座&#xff0c;到运行机器和框架&#xff0c;再到具体的架构实现和训练方式。以下是一个详细的指南&#xff0c;帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭…...

【IPython 使用技巧整理】

IPython 使用技巧整理 IPython 是一个交互式 Python 解释器&#xff0c;比标准 Python 解释器提供了更加强大的功能和更友好的使用体验。它为数据科学、机器学习和科学计算提供了强大的工具&#xff0c;是 Python 开发人员不可或缺的工具之一。本文将深入探讨 IPython 的各种使…...

什么是孪生素数猜想

什么是孪生素数猜想 素数p与素数p2有无穷多对 孪生素数的公式&#xff08;详见百度百科&#xff1a;孪生素数公式&#xff09; 利用素数的判定法则&#xff0c;可以得到以下的结论&#xff1a;“若自然数q与q2都不能被任何不大于的素数 整除&#xff0c;则q与q 2都是素数”…...

Python学习笔记16:进阶篇(五)异常处理

异常 在编程中&#xff0c;异常是指程序运行过程中发生的意外事件&#xff0c;这些事件通常中断了正常的指令流程。它们可能是由于错误的输入数据、资源不足、非法操作或其他未预料到的情况引起的。Python中&#xff0c;当遇到这类情况时&#xff0c;会抛出一个异常对象&#…...

Mac 安装依赖后依旧报错 ModuleNotFoundError: No module named ‘Crypto‘

ModuleNotFoundError: No module named ‘Crypto’ 解决办法 pip uninstall pycryptodome pip uninstall pycrypto pip uninstall crypto pip install pycrypto...

【07】持久化-数据库选择和设计

1. 数据库选择 在比特币原始论文中,并没有提到要使用哪一个具体的数据库,它完全取决于开发者如何选择。Bitcoin Core ,最初由中本聪发布,现在是比特币的一个参考实现,它使用的是 LevelDB。 我们将要使用的是BoltDB。Bolt DB是一个纯键值存储的 Go 数据库。没有具体的数据…...

压力测试

1.什么是压力测试 压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力和稳定性维持在一个标准范围内&#xff0c;做到心中有数 使用压力测试&#xff0c;我们有希望找到很多种用其他测试方法更难发现的错误&#…...

C语言| 数组元素的删除

同数组元素的插入差不多。 数组元素的插入&#xff0c;是先移动要插入元素位置后面的所有元素&#xff0c;再插入新元素&#xff0c;长度1。 C语言| 数组的插入-CSDN博客 数组元素的删除&#xff0c;是先删除元素&#xff0c;再把后面的元素往前移动一位&#xff0c;而本程序…...

QListView、QTableView或QTreeView截取滚动区域(截长图)

本文以QTreeView为例,理论上继承自QAbstractScrollArea的类都支持本文所述的方法。 一.效果 一共5个文件夹,每个文件文件夹下有5个文件,先把文件夹展开,然后截图。将滚动条拖到居中位置,是为了证明截图对滚动条无影响 下面是截的图 二.原理 将滚动区域的viewport设置为…...

论文《Tree Decomposed Graph Neural Network》笔记

【TDGNN】本文提出了一种树分解方法来解决不同层邻域之间的特征平滑问题&#xff0c;增加了网络层配置的灵活性。通过图扩散过程表征了多跳依赖性&#xff08;multi-hop dependency&#xff09;&#xff0c;构建了TDGNN模型&#xff0c;该模型可以灵活地结合大感受场的信息&…...

控制下属很简单,用好这3大管人绝招,再跳的刺头也不敢造次

控制下属很简单&#xff0c;用好这3大管人绝招&#xff0c;再跳的刺头也不敢造次 第一招&#xff1a;给压力 很多团队中的员工都是自己不带脑子工作&#xff0c;遇事就喜欢请示领导&#xff0c;让领导拿方案、拿决策。 还有一些人&#xff0c;推一下&#xff0c;他才动一下&a…...

2.APP测试-安卓adb抓取日志

1.打开手机的开发者模式&#xff0c;打开USB调试 &#xff08;1&#xff09;小米手机打开开发者模式&#xff1a; 【设置】-【我的设备】-【全部参数信息】-快速多次点击【OS版本】-进入开发者模式 &#xff08;2&#xff09;连接手机和电脑&#xff0c;手机打开USB调试 【设置…...

高考填报志愿选专业,要善于发掘自身优势

每年的高考季&#xff0c;如何填报志愿又再成为困扰家长以及学生的难题&#xff0c;可能在面对大量的专业时&#xff0c;无论是考生还是家长都不知道应该如何选择&#xff0c;好的专业孩子不一定有优势&#xff0c;感兴趣的冷门专业又担心日后找工作难。 实际上&#xff0c;专业…...

如何在 Ubuntu 14.04 上使用 HAProxy 实现 SSL 终止

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 HAProxy&#xff0c;全称高可用代理&#xff0c;是一款流行的开源软件 TCP/HTTP 负载均衡器和代理解决方案&#xff0c;可在 Linu…...

dockercompose

安装dockerconpose #上传docker-compose安装包 chmod x docker-compose mv docker-compose /usr/bin/ [rootlocalhost ~]# docker-compose --version docker-compose version 1.24.1, build 4667896b文件格式以及编写注意事项 YAML 是一种标记语言&#xff0c;它可以很直观的…...

「51媒体」活动会议,展览展会,直播曝光的一种方法

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 我们在做活动会议&#xff0c;或者参加展览展会&#xff0c;需要进行直播的时候&#xff0c;可以通过一键同步多个媒体平台的方法&#xff0c;来扩大曝光&#xff0c;比如一场直播我们可…...

Go WebSocket入门+千万级别弹幕系统架构设计

Go实现WebSocket&#xff08;千万级别弹幕系统架构设计&#xff09; 1 websocket简介(基于HTTP协议的长连接) 使用WebSocket可以轻松的维持服务器端长连接&#xff0c;其次WebSocket是架构在HTTP协议之上的&#xff0c;并且也可以使用HTTPS方式&#xff0c;因此WebSocket是可靠…...

uniapp使用伪元素实现气泡

uniapp使用伪元素实现气泡 背景实现思路代码实现尾巴 背景 气泡效果在开发中使用是非常常见的&#xff0c;使用场景有提示框&#xff0c;对话框等等&#xff0c;今天我们使用css来实现气泡效果。老规矩&#xff0c;先看下效果图&#xff1a; 实现思路 其实实现这个气泡框的…...

字节跳动:从梦想之芽到参天大树

字节跳动掌舵人&#xff1a;张一鸣 2012年&#xff1a;梦想的起点&#xff1a;在一个阳光明媚的早晨&#xff0c;北京的一座普通公寓里&#xff0c;一位名叫张一鸣的年轻人坐在电脑前&#xff0c;眼中闪烁着坚定的光芒。他的心中有一个梦想——通过技术改变世界&#xff0c;让…...

MATLAB使用系统辨识工具箱建立PID水温的传递函数系数

概述 利用PID控制水温&#xff0c;由于实际在工程项目中&#xff0c;手动调节PID参数比较耗费时间&#xff0c;所以可以先利用MATLAB中的Simulink软件建立模型&#xff0c;先在仿真软件上调节大概的PID参数&#xff0c;再利用此PID参数为基础在实际的工程项目中手动调节PID参数…...

安装ubuntu过程中,出现“执行‘grub-install/dev/sda’失败,这是一个致命错误”问题,解决办法!软碟通制作U盘启动盘!

背景 U盘安装ubuntu系统过程中&#xff0c;出现类似如下问题&#xff0c;/dev/sda7内容可能不一样&#xff0c;但问题类似。 可能原因 1.U盘启动盘制作失败 2.U盘启动盘UEFI格式与Ubuntu引导分区有冲突 解决办法 1.用UltraISO&#xff08;软碟通&#xff09;重新制作U盘启…...

如何以智能方式安装 Python

Python易于使用&#xff0c;对初学者友好&#xff0c;功能强大&#xff0c;几乎可以为任何应用程序创建强大的软件。 但与任何其他软件一样&#xff0c;Python 的设置和管理可能很复杂。 在本文中&#xff0c;我们将介绍如何正确设置 Python。 您将学习如何选择合适的版本、…...

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…...

镜头下的光学

说实话&#xff0c;当我看到几何光学的内容全是初中的解析几何的时候&#xff0c;我就觉得讲的方式太原始了&#xff0c;而且太过复杂也看不懂。所以我尝试做了数学建模&#xff0c;发现建模之后模型可以解释一些物理现象&#xff0c;也不会有矛盾的地方&#xff0c;那就算过得…...

微信小程序-自定义组件checkbox

一.自定义Coponent组件 公共组件&#xff1a;将页面内公共的模块抽取为自定义组件&#xff0c;在不同页面复用。 页面组件&#xff1a;将复杂页面进行拆分&#xff0c;降低耦合度&#xff0c;有利于代码维护。 可以新建文件夹component放组件&#xff1a; 组件名为custom-che…...

计算机三级 网络技术

一、边界网关协议BGP BGP是边界网关协议&#xff0c;是外部而不是内部网关协议&#xff08;是不同自治系统的路由器之间使用的协议&#xff09;一个BGP发言人使用TCP&#xff08;不是UDP&#xff09;与其自治系统的BGP发言人交换路由信息。BGP协议交换路由由信息的节点数是以自…...

gif帧数修改怎么操作?一键掌握GIF帧数修改技巧!

gif帧数修改怎么操作&#xff1f;在数字化信息爆炸的时代&#xff0c;GIF动图因其生动有趣的特性而备受广大网友喜爱。然而&#xff0c;很多时候我们可能会遇到GIF动图帧数过多或过少&#xff0c;导致动画效果不尽如人意的情况。那么&#xff0c;如何对GIF动图的帧数进行修改呢…...

Day26

Day26 注解 什么是注解 java.annotation包Annotation是从JDK1.5开始引入的新技术&#xff0c;注解即可以对程序员解释又可以对程序解释 注解与注释的区别 注释&#xff1a;对程序员解释代码信息注解&#xff1a;对程序和程序员解释代码信息 注解的所用 不是程序本身&#xff0…...

【Numpy】NumPy基础入门:创建和管理多维数组

NumPy基础入门&#xff1a;创建和管理多维数组 简介 NumPy&#xff08;Numerical Python的简称&#xff09;是Python语言的一个基础科学计算库&#xff0c;广泛应用于数据分析、机器学习、科学计算和工程领域。NumPy的核心是其强大的N维数组对象ndarray&#xff0c;它为Pytho…...

Vue 父组件使用refs来直接访问和修改子组件的属性或调用子组件的方法

步骤 1: 在子组件中定义要被修改的属性或方法 首先&#xff0c;在子组件中定义你想要父组件能够修改或调用的属性或方法。例如&#xff0c;我们有一个名为MyChildComponent的子组件&#xff0c;它有一个名为childData的数据属性和一个名为updateData的方法。 // 子组件 MyChi…...

【sass插值语句 #{}简介以及使用方法】

Sass 中的插值&#xff08;Interpolation&#xff09;是一种强大的特性&#xff0c;它允许你在 Sass 代码中嵌入变量、选择器、属性名或任何其他 Sass 表达式&#xff0c;并动态地生成 CSS 代码。插值通过 #{} 语法来实现。 Sass 插值简介 Sass 插值允许你创建可动态生成内容…...