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

Linux复习——基础IO,认识文件描述符、软硬件链接

1.复习C文件接口

1.1 fopen

FILE *fopen(const char *path, const char *mode);
 

path:带路径的文件名称(待打开的文件)
 
mode:
 
        r:以可读方式打开,不可写,文件不存在,则报错
 
        r+:以读写方式打开,文件不存在,则报错
 
        w:以可写方式打开,但是不能读。文件不存在,则创建。文件存在,则截断(清空文件内容)文件。
 
        w+:以读写方式打开。文件不存在,则创建。文件存在,则截断(清空文件内容)文件
 
        a:追加写,不能读。在文件末尾进行追加写,文件不存在则创建文件。文件存在,则在文件末尾开始写
 
        a+:可读追加写,在文件末尾进行追加写,文件不存在则创建文件。文件存在,则在文件的末尾进行追加写
 
返回值:文件流指针 FILE

1.2 fclose

int fclose(FILE *fp);
 
关闭一个文件流指针

1.3 fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
 

ptr:要将读到的保存到哪里去,ptr保存用户准备的一个空间(缓冲区)的地址
 
size:块的大小,单位是字节
 
nmemb:块的个数
 
eg:size = 2 nmemb = 5 ==> 10
 
常见的用法:size = 1,nmemb可以指定任意块,读到的字节数量也就可以用nmemb表示
 
stream:文件流指针,表示要从哪里进行读
 
返回值:返回读到的块的个数

1.4 fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
 

ptr:要写入到文件当中的内容
 
size:块的大小,单位字节
 
nmemb:块的个数
 
总写入的字节数量 = 块的大小 * 块的个数
 
stream:文件流指针,表示要写到哪里
 
返回值:写入块的个数

1.5 fseek

int fseek(FILE *stream, long offset, int whence);
 

stream:文件流指针
 
offset:偏移量,单位字节。相对于whence而言的偏移量
 
whence:
 
        SEEK_SET:文件的头部
 
        SEEK_CUR:当前文件流指针的位置
 
        SEEK_END:文件的尾部

注意:我们向文件写入内容以后文件流指针会发生偏移,此时如果我们要从文件里读取内容,就需要通过fseek来设置流指针的位置不然从当前流指针的位置将读不到任何内容

2.系统文件I/O接口

2.1 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 flag,mode_t mode);

pathname :要打开的文件

flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags

参数:

        O_RDONLY:只读打开

        O_WRONLY:只写打开

        O_RDWR:读,写打开

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

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

        O_APPEND:追加写

返回值:成功:新打开的文件描述符      失败:-1

2.2 close

int close(int fd); 这里的fd就是open的返回值

2.3 read

ssize_t read(int fd, void *buf, size_t count);
 

fd:文件描述符
 
buf:将读到的内容放到buf这个缓冲区当中
 
count:表示最大能够读多少字节,和buf的大小有关,需要在buf当中预留一个‘\0’的位置
 
返回值:
 
 >0:读到的字节数量
 
 -1:读失败

2.4 write

ssize_t write(int fd, const void *buf, size_t count);

  • fd:文件描述符
     
  • buf:写到文件当中的内容
     
  • count:写入的字节数量
     
  • 返回值
     
     >0:表示写入文件真实的字节数量
     
      -1:写入失败

2.5 lseek

off_t lseek(int fd, off_t offset, int whence);
 

  • fd:文件描述符
     
  • offset:偏移量
     
  • whence
     
    SEEK_SET:文件的头部
     
    SEEK_CUR:当前文件流指针的位置
     
    SEEK_END:文件的尾部

3.文件描述符

3.1 open函数返回值

        open的返回值其实就是这里要介绍的文件描述符,但是在正式认识他之前我们先来认识两个概念:系统调用和库函数

        上面的 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)。

        而, open close read write lseek 都属于系统提供的接口,称之为系统调用接口

        回忆一下我们讲操作系统概念时,画的一张图

        通过上图我们可以清晰的看到其实f#系列函数,都是对系统调用的封装,方便二次开发

3.2 文件描述符fd

        文件描述符其实就是一个小整数

        linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2

        0,1,2对应的物理设备一般是:键盘、显示器、显示器,所以输入输出还可以采用如下方式

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>int main()
{char buf[1024];ssize_t s = read(0, buf, sizeof(buf));if (s > 0){buf[s] = 0;write(1, buf, strlen(buf));write(2, buf, strlen(buf));}return 0;
}

        现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是有了file结构体,其表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来,每一个进程都有一个指针*file,指向一张file_struct,该表最重要的部分就是包含一个指针数组,每个元素都是一个指向打开文件的指针!所以本质上,文件描述符就是数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件。

3.3 文件描述符分配规则

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.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>
#include <unistd.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可见,文件描述符的分配规则;在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

3.4 重定向

        在3.3中我们了解了文件描述符的分配规则,如果我们将标准输出1关闭,那么printf还会打印在屏幕吗?下面进行测试

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>int main()
{close(1);int fd = open("myfile", O_WRONLY | O_CREAT, 00644);if (fd < 0){perror("open");return 1;}printf("fd: %d\n", fd);fflush(stdout);close(fd);exit(0);
}

        此时我们发现,本来应该输出在显示器的内容,输出到了文件myfile当中,其中,fd=1,这种现象叫做输出重定向。常见的重定向有 >,>>,<

3.5 使用dup2系统调用

#include <unistd.h>
int dup2(int oldfd, int newfd);     //将原来写到newfd的内容写到oldfd
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{int fd = open("./log", O_CREAT | O_RDWR);if (fd < 0){perror("open");return 1;}close(1);dup2(fd, 1);for (;;){char buf[1024] = {0};ssize_t read_size = read(0, buf, sizeof(buf) - 1);if (read_size < 0){perror("read");break;}printf("%s", buf);fflush(stdout);}return 0;
}

3.6 FILE

        因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的。

        所以C库中的FILE结构体内部,必然封装了fd。

来段代码研究一下

#include <stdio.h>
#include <string.h>
#include <unistd.h>int main()
{const char *msg0 = "hello printf\n";const char *msg1 = "hello fwrite\n";const char *msg2 = "hello write\n";printf("%s", msg0);fwrite(msg1, strlen(msg0), 1, stdout);write(1, msg2, strlen(msg2));fork();return 0;
}

        我们正常运行的结果和我们的预期一样,但是当我们对进程实现输出重定向后发现printf和fwrite(库函数)都输出了两次,而write(系统调用)只输出了一次,这显然和fork有关系

        一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲的

        printf和fwrite库函数会自带缓冲区,当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。而我们放在缓冲区中的数据,就不会被立即刷新,甚至fork之后

        但是进程退出之后,会统一刷新,写入文件当中

        但是fork的时候,父子进程会发生写实拷贝,所以当你的父进程准备刷新的时候,子进程也有同样的一份数据也准备刷新,所以产生了两份数据

        write没有变化,说明write没有所谓的缓冲。

        综上:printf和fwrite库函数会自带缓冲区,而write系统调用没有缓冲区。另外,我们这里所说的缓冲区都是用户级缓冲区。其实为了提升整机性能,OS也会提供相关内核级缓冲区,不过不在我们讨论范围之内。

        那这个用户级缓冲区谁提供呢? printf fwrite 是库函数, write 是系统调用,库函数在系统调用的上层, 是对系统调用的“封装,但是 write 没有缓冲区,而 printf fwrite 有,足以说明,该缓冲区是二次加上的,又因为是C,所以由C标准库提供。

4.理解文件系统

        我们使用ls -l的时候看到的除了文件名,还有文件元数据

        每行7列:模式、硬链接数、文件拥有者、组、大小、最后修改时间、文件名

 

        其实这个信息除了通过这种方式来读取,还有一个stat 命令能够看到更多信息
上面的执行结果有几个信息需要解释清楚
(1)inode
为了能解释清楚inode我们需要先简单了解一下文件系统
         
        Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block 。一个 block 的大小是由格式化的时候确定的,并且不可以更改。例如 mke2fs -b 选项可以设定block 大小为 1024 2048 4096 字节。而上图中启动块( Boot Block )的大小是确定的
Block Group ext2 文件系统会根据分区的大小划分为数个 Block Group 。而每个 Block Group 都有着相同的结构组成。政府管理各区的例子
超级块( Super Block ):存放文件系统本身的结构信息。记录的信息主要有: bolck inode 的总量,未使用的block inode 的数量,一个 block inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了
GDT Group Descriptor Table :块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下
块位图( Block Bitmap ): Block Bitmap 中记录着 Data Block 中哪个数据块已经被占用,哪个数据块没有被占用
inode 位图( inode Bitmap ):每个 bit 表示一个 inode 是否空闲可用。
i 节点表 : 存放文件属性 如 文件大小,所有者,最近修改时间等
数据区:存放文件内容

        将属性和数据分开的想法看起来很简单,但实际上是如何工作的,这里我们通过touch一个新文件来看看如何工作

 

        为了说明问题,我们将上图简化

        创建一个新文件主要有以下4个操作

                1.存储属性:内核先找到一个空闲节点(这里是263466)。内核把文件信息记录到其中

                2.存储数据:该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800.将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推

                3.记录分配情况:文件内容按顺序300,500,800存放。内核在inode上的磁盘分区记录了上述块列表

                4.添加文件名到目录:新的文件名abc,内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

        注意:通过4我们应该明白内核中其实存储的不是文件名而是inode,怎么说可能不准确应该是内核里的文件名是inode可能对些

        理解硬链接:我们真正找到磁盘上的文件并不是文件名,而是inode。其实在linux中可以让多个文件名对应于同一个inode看下图。

        abc和def的链接方式完全相同,他们被称为指向文件的硬链接。内核记录了这个链接数,inode 54850的硬链接数为2

        我们在磁盘中删除文件时干了两件事:1.在目录中将对应的记录删除   2.将硬链接数-1,如果为0,则将对应的磁盘释放

        连接软连接:硬链接是通过inode引用另一个文件,软连接是通过名字引用另一个文件,在shell中的做法

下面解释一下文件的三个时间:
        Access 最后访问时间
        Modify 文件内容最后修改时间
        Change 属性最后修改时间

相关文章:

Linux复习——基础IO,认识文件描述符、软硬件链接

1.复习C文件接口 1.1 fopen FILE *fopen(const char *path, const char *mode); path&#xff1a;带路径的文件名称(待打开的文件) mode&#xff1a; r&#xff1a;以可读方式打开&#xff0c;不可写&#xff0c;文件不存在&#xff0c;则报错 r&…...

【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计

欢迎来到Java集合框架系列的第一篇文章&#xff01;&#x1f339; 本系列文章将以通俗易懂的语言&#xff0c;结合实际开发经验&#xff0c;带您深入理解Java集合框架的设计智慧。&#x1f339; 若文章中有任何不准确或需要改进的地方&#xff0c;欢迎大家指出&#xff0c;让我…...

Prometheus使用

介绍&#xff1a;Prometheus 是一个开源的 监控与告警系统&#xff0c;主要用于采集和存储时间序列数据&#xff08;Time Series Data&#xff09; Prometheus的自定义查询语言PromQL Metric类型 为了能够帮助用户理解和区分这些不同监控指标之间的差异&#xff0c;Prometheu…...

Java学习打卡-Day19-Set、HashSet、LinkedHashSet

Set 接口 无序&#xff08;添加和取出顺序不一致&#xff09;&#xff08;但取出顺序固定&#xff09;。没有索引。不允许重复&#xff0c;所以最多一个null。遍历方式 迭代器增强for循环不能使用普通for循环索引方式。 HashSet 实现了Set接口&#xff0c;具有相应特征。底…...

冯・诺依曼架构深度解析

一、历史溯源&#xff1a;计算机科学的革命性突破 1.1 前冯・诺依曼时代 在 1940 年代之前&#xff0c;计算机领域呈现 "百家争鸣" 的格局&#xff1a; 哈佛 Mark I&#xff08;1944&#xff09;&#xff1a;采用分离的指令存储与数据存储ENIAC&#xff08;1946&a…...

单片机学完开发板,如何继续提升自己的技能?

很多人学完开发板后都会卡在一个尴尬的阶段&#xff1a;觉得自己会的东西不少&#xff0c;但又不知道下一步该干啥。会点C语言&#xff0c;能烧录程序&#xff0c;能点亮LED&#xff0c;玩转按键&#xff0c;搞定串口等等&#xff0c;能用开发板做点小玩意儿&#xff0c;但面对…...

Nginx 日志格式

默认日志格式配置 log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for";该格式记录了客户端IP、用户、时间、请求、状态…...

Spring Boot 整合 Elasticsearch 实践:从入门到上手

引言 Elasticsearch 是一个开源的分布式搜索引擎&#xff0c;广泛用于日志分析、搜索引擎、数据分析等场景。本文将带你通过一步步的教程&#xff0c;在 Spring Boot 项目中整合 Elasticsearch&#xff0c;轻松实现数据存储与查询。 1. 创建 Spring Boot 项目 首先&#xff…...

STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构

目录 一、嵌入式系统的概念 二、通用计算机系统与嵌入式系统的比较 用途 硬件 软件 性能与功耗 开发与维护 三、嵌入式系统与物联网的关系 四、物联网的三层架构 1. 感知层&#xff08;Perception Layer&#xff09; 2. 网络层&#xff08;Network Layer&#xff09; …...

SARAD 解读

出处&#xff1a;NIPS 2024 代码链接&#xff1a;https://github.com/daidahao/SARAD/ 一 文章动机 ① 时间建模&#xff08;Temporal Modeling&#xff09;的局限性&#xff1a; a. 时间维度上 感受野极小&#xff1b;b. 变量间时间戳错位 (时间建模、空间建模不统一) →…...

【愚公系列】《高效使用DeepSeek》017-知识点思维导图生成

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

【linux】scp和rsync

scp 和 rsync 都是 Linux 系统中用于文件传输的命令行工具&#xff0c;它们都可以通过网络在本地和远程主机之间传输文件。 scp 命令 定义 scp 是 “secure copy” 的缩写&#xff0c;它是一个基于 SSH 协议的文件传输工具&#xff0c;用于在本地和远程主机之间安全地复制文…...

软件需求分类、需求获取(高软46)

系列文章目录 软件需求分类&#xff0c;需求获取 文章目录 系列文章目录前言一、软件需求二、获取需求三、真题总结 前言 本节讲明软件需求分类、需求获取的相关知识。 一、软件需求 二、获取需求 三、真题 总结 就是高软笔记&#xff0c;大佬请略过&#xff01;...

蓝桥杯单片机之AT24C02(基于自己对AT24C02的学习和理解)

一、先用抽象法说明原理&#xff0c;让原理变得简单易懂&#xff1a; 1、向AT24C02写入数据&#xff1a; 有个关系户&#xff0c;他想安排自己的儿子进某个大厦里某个楼层的公司&#xff0c;那么他就要先找到这个公司的地址&#xff0c;然后再找到该公司是第几楼&#xff0c;最…...

【Qt】Qt + Modbus 服务端学习笔记

《Qt Modbus 服务端学习笔记》 1.因为项目的需要&#xff0c;要写一个modbus通信&#xff0c;csdn上感觉有些回答&#xff0c;代码是人工智能生成的&#xff0c;有些细节不对。我这个经过实测&#xff0c;是可以直接用的。 首先要包含Qt 的相关模块 Qt Modbus 模块主要包含以…...

抖音用户视频批量下载工具开发全解析

一、逆向工程原理剖析 1.1 抖音Web端防护体系 抖音采用五层防御机制保护数据接口: graph LRA[浏览器指纹检测] --> B[请求参数签名]B --> C[Cookie动态验证]C --> D[请求频率限制]D --> E[IP信誉评级] 1.2 核心参数解密 参数名称作用原理生成方式有效期x-bogu…...

DeepSeek写打台球手机小游戏

DeepSeek写打台球手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端打台球小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 有白球和其他颜色的球&am…...

清晰易懂的 Swift 安装与配置教程

初学者也能看懂的 Swift 安装与配置教程 本教程将手把手教你如何在 macOS 系统上安装 Swift&#xff0c;配置依赖包缓存位置&#xff0c;并指出新手容易踩坑的细节。即使你是零基础小白&#xff0c;也能快速上手&#xff01; 一、安装 Swift&#xff08;macOS 环境&#xff09…...

Post-Training Quantization, PTQ

Post-Training Quantization&#xff08;PTQ&#xff09; 是 模型训练完成后&#xff0c;对其参数&#xff08;权重 & 激活值&#xff09;进行量化 的方法&#xff0c;目的是 减少存储占用 & 提高推理速度&#xff0c;同时尽可能保持模型精度。 相比于 量化感知训练&a…...

linux Redhat9.5采用DNS主从实现跨网段解析

文章目录 主从服务器DNS实现跨网段解析一、服务器规划二、主服务器配置1、安装bind2、修改主配置文件3、配置区域配置文件4、配置正向解析文件5、配置反向解析文件6、检查并启动服务 三、从服务器配置1、安装bind2、配置主配置文件3、修改区域配置文件4、检查并启动服务 四、路…...

Python个人学习笔记(18):模块(异常处理、traceback、日志记录)

七、异常处理 语法错误不属于异常&#xff0c;处理的是程序运行时的一些意外情况 代码&#xff1a; a int(input(>>>&#xff1a;)) b int(input(>>>&#xff1a;)) print(a / b) # 在运行的时候由于数据不对&#xff0c;导致出错 # 此时程序会中断 prin…...

记一次MyBatis分页莫名其妙的失效,首次执行合适,后续执行分页失效且异常

代码几乎一样&#xff0c;为啥这个xml配置的就会出现莫名其妙的问题呢 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{propertymybatis_plus_first, modeI…...

Claude是什么?适合哪些场景?

Claude 是由人工智能公司 Anthropic 开发的一款 大型语言模型&#xff08;LLM&#xff09;&#xff0c;旨在通过自然语言交互帮助用户完成复杂任务。以下是关于 Claude 的核心信息&#xff1a; 1. 核心定位 • 安全可靠&#xff1a; 采用 Constitutional AI&#xff08;宪法AI…...

基于yolov11的持刀检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的持刀检测系统 随着公共安全问题的日益突出&#xff0c;特别是在公共场所如机场、车站、学校等地&#xff0c;持刀等危险行为频发&#xff0c;对人们的生命财产安全构成严重威胁。传统的监控手段往往依赖于人工观察&#xff0c;但这种方式不仅效率低…...

openEuler24.03 LTS下安装Hive3

目录 前提条件 安装MySQL 卸载原有mysql及mariadb 下载mysql 解压mysql 安装mysql 启动mysql服务 开机自启动mysql服务 登录mysql 修改mysql密码 远程连接mysql 安装Hive 下载安装包 解压 设置环境变量 解决日志包冲突 将mysql驱动拷贝到lib目录 配置Hive 创…...

13-动态规划-最长公共子序列

题目 来源 24. 最长公共子序列 思路 不想打字&#xff0c;援引自最长公共子序列 (LCS) 详解例题模板&#xff08;全&#xff09;-CSDN博客 图示举例&#xff1a; 其余详见代码 代码 #include<bits/stdc.h> using namespace std; const int N110; int f[N][N]; int m…...

golang 生成单元测试报告

在 Go 语言中&#xff0c;你可以使用 go test 生成单元测试报告。以下是几种方法&#xff1a; 1. 生成基本测试报告&#xff08;文本格式&#xff09; go test -v ./... > test_report.txt-v&#xff1a;显示详细的测试信息./...&#xff1a;递归测试所有子目录> test_r…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

设备健康管理系统是什么,设备健康管理系统多少钱?

想象一下&#xff0c;你的汽车在仪表盘报警前 3 天&#xff0c;手机就收到 “发动机轴承剩余寿命 1500 公里” 的提醒 —— 这就是 ** 设备健康管理系统&#xff08;EHM&#xff09;** 的日常。在制造业&#xff0c;设备故障每年造成全球 3.4 万亿美元损失&#xff0c;而 80% 的…...

设计模式(创建型)-抽象工厂模式

摘要 在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定…...

docker 部署elk 设置账号密码

1. 先把 kibana 停掉 2.进入es 容器 docker exec -it 75895a078cbc /bin/bash 找到 bin 目录 执行 ./elasticsearch-setup-passwords interactive 全部设置一样的密码 ,不一样自己要记住&#xff0c;设置成功会输出如下内容 Changed password for user [apm_system] Chang…...

<table>内有两行<tr>,第一行设定高度为60,剩余第二行,和右侧元素高度补齐。

实现 <table> 内第一行高度设定为 60px&#xff0c;第二行和右侧元素高度补齐的效果&#xff0c;你可以通过 CSS 样式来控制。示例&#xff1a; 为第一行 <tr> 设置固定高度 60px。对于右侧元素&#xff0c;假设它是一个 <div> 或者其他容器&#xff0c;将其…...

QT5.15.2加载pdf为QGraphicsScene的背景

5.15.2使用pdf 必须要安装QT源码&#xff0c;可以看到编译器lib目录已经有pdf相关的lib文件&#xff0c;d是debug 1.找到源码目录&#xff1a;D:\soft\QT\5.15.2\Src\qtwebengine\include 复制这两个文件夹到编译器的包含目录中:D:\soft\QT\5.15.2\msvc2019_64\include 2.找…...

常见的工具和技术

Mockito Mockito 是一个流行的 Java Mocking 框架&#xff0c;用于创建和配置模拟对象&#xff08;Mock Objects&#xff09;&#xff0c;以便在单元测试中模拟复杂依赖关系的行为 使用场景&#xff1a;单元测试、隔离测试 EclipseEclipse 是一个开源的集成开发环境&#xff08…...

Linux怎样源码安装Nginx

1. 安装必要的依赖 在编译 Nginx 之前&#xff0c;你需要安装一些必要的依赖包&#xff0c;像编译工具和库文件等。以 CentOS 系统为例&#xff0c;可借助yum命令来安装&#xff1a; bash sudo yum install -y gcc pcre-devel zlib-devel openssl-devel要是使用的是 Ubuntu 系…...

汇编指令(20250319)

SOC常用总线 AHB&#xff08;Advanced High-performance Bus&#xff09;&#xff1a;先进高性能总线&#xff0c;连接RAM&#xff0c;ROM等高速设备APB&#xff08;Advanced Peripheral Bus&#xff09;&#xff1a;先进外设总线&#xff0c;连接外设等一些低速设备 CISC和R…...

PlainUSR|LIA: 追求更快的卷积网络实现高效的超分辨率重建

PlainUSR|LIA: 追求更快的卷积网络实现高效的超分辨率重建 引言 在深度学习领域&#xff0c;图像处理始终是一个热门话题。而超分辨率重建&#xff08;Super-Resolution Reconstruction, SR&#xff09;作为其中一个重要的研究方向&#xff0c;旨在通过算法将低分辨率图像恢复…...

神经网络基础之正则化

引言&#xff1a;正则化 &#xff08;Regularization&#xff09; 是机器学习中一种用于防止模型过拟合技术。核心思想是通过在模型损失函数中添加一个惩罚项 &#xff08;Penalty Term&#xff09;&#xff0c;对模型的复杂度进行约束&#xff0c;从而提升模型在新数据上的泛化…...

JAVA序列化与反序列化URLDNS链CC1链

1、序列化的实现 java序列化的是对象属性的&#xff0c;只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。&#xff08;不是则会抛出异常&#xff09;&#xff0c;静态成员变量是属于类的&#xff0c;所以静态成员变量是不能被序列化的&#x…...

孤儿进程和僵尸进程

本文讲述了什么是孤儿进程和僵尸进程&#xff0c;会带来怎样的问题以及如何处理 一、孤儿进程 1&#xff09;什么是孤儿进程 孤儿进程&#xff0c;顾名思义&#xff0c;就是父进程提前终止&#xff0c;但是子进程还在运行中&#xff0c;父进程无法对子进程进行监管&#…...

用ASCII字符转化图片

代码 from PIL import Image# 定义 ASCII 字符集&#xff0c;从最暗到最亮 ASCII_CHARS "%#*-:. "def resize_image(image, new_width100):width, height image.sizeratio height / widthnew_height int(new_width * ratio)resized_image image.resize((new_wi…...

从WebRTC到嵌入式:EasyRTC如何借助大模型提升音视频通信体验

随着人工智能技术的快速发展&#xff0c;WebRTC与大模型的结合正在为音视频通信领域带来革命性的变革。WebRTC作为一种开源实时通信技术&#xff0c;以其低延迟、跨平台兼容性和强大的音视频处理能力&#xff0c;成为智能硬件和物联网设备的重要技术支撑。 而EasyRTC作为基于W…...

自动化测试工具-Playwright介绍和快速实例

Playwright 是什么 Playwright 是由 Microsoft 开发的开源自动化测试工具,专为现代 Web 应用设计。它支持 Chromium、Firefox 和 WebKit 内核的浏览器,能够跨平台(Windows、macOS、Linux)运行,提供强大的浏览器自动化能力,适用于测试、爬虫和监控等场景。 Playwright的…...

Java:Apache HttpClient中HttpRoute用法的介绍

当使用Apache HttpClient组件时&#xff0c;经常会用到它的连接池组件。典型的代码如下&#xff1a; PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(httpConfig.getMaxPoolTotal());connect…...

万字长文详解|蚂蚁数据湖深度探索与业务应用实践

作者介绍&#xff1a;黄超傑&#xff0c;蚂蚁数据智能部实时数据团队数据研发工程师&#xff0c;致力于数据湖技术在蚂蚁落地应用、蚂蚁广告实时数仓建设、蚂蚁数据成本治理等工作。 在开始之前 如果&#xff1a; 你想要提升数据时效&#xff0c;能够接受分钟级延迟你好奇准实…...

rk3568 以太网eth1 , 定制板 phy调试问题。

问题: 客户定制底板的 phy 网络不通。 解决逻辑: phy 问题, 就是 照着 公司底板对硬件就行,完全是硬件问题,不用改 软件。 原理图如下:...

React相关面试题

以下是150道React面试题及其详细回答&#xff0c;涵盖了React的基础知识、组件、状态管理、路由、性能优化等多个方面&#xff0c;每道题目都尽量详细且简单易懂&#xff1a; React基础概念类 1. 什么是React&#xff1f; React是一个用于构建用户界面的JavaScript库&#xff…...

IT工具 | node.js 进程管理工具 PM2 大升级!支持 Bun.js

P(rocess)M(anager)2 是一个 node.js 下的进程管理器&#xff0c;内置负载均衡&#xff0c;支持应用自动重启&#xff0c;常用于生产环境运行 node.js 应用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2发布最新版本v6.0.5&#xff0c;这…...

php 高性能,高并发,有哪些框架,扩展,推荐一下,或者技术的实现有哪些

以下是针对PHP高性能、高并发场景的框架、扩展及技术实现推荐&#xff0c;结合最新技术趋势和行业实践进行总结&#xff1a; 一、高性能框架推荐 1. C扩展类框架 YAF (Yet Another Framework) 特点&#xff1a;由C语言编写&#xff0c;直接嵌入PHP内核&#xff0c;仅提供核心M…...

golang单机锁实现

1、锁的概念引入 首先&#xff0c;为什么需要锁&#xff1f; 在并发编程中&#xff0c;多个线程或进程可能同时访问和修改同一个共享资源&#xff08;例如变量、数据结构、文件&#xff09;等&#xff0c;若不引入合适的同步机制&#xff0c;会引发以下问题&#xff1a; 数据竞…...