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

Linux:文件描述符fd、系统调用open

目录

一、文件基础认识

二、C语言操作文件的接口

1.> 和 >>

2.理解“当前路径”

三、相关系统调用

1.open

2.文件描述符

3.一切皆文件

4.再次理解重定向


一、文件基础认识

  • 文件 = 内容 + 属性。换句话说,如果在电脑上新建了一个空白文档,它虽然没有内容,但也是占据磁盘空间的。
  • 想要修改一个文件的内容,比如用WPS这样的软件操作文件内容,本质上都需要CPU完成相关的指令,而CPU又只与内存交互,所以,打开文件的含义其实就是把文件加载到内存中
  • 在我们眼里,我们双击了一个文件就是打开了文件,但是在操作系统看来,并不是我们打开了文件,而是某一个正在运行的进程,文件是由进程打开的
  • 一个进程可以打开多个文件。
  • 操作系统管理多个被打开文件,必然也会像操作系统管理多个进程一样,利用面向对象和数据结构,因此,内核中必然定义了结构体来描述被打开的文件。
  • 从操作系统管理文件的角度看,文件被区分为被打开的文件(在内存中)和没有打开的文件(在磁盘中)。

二、C语言操作文件的接口

        fopen"w"方法打开一个文件。

#include <stdio.h>
#include <stdlib.h>
int main()
{FILE* pf = fopen("aaa.txt","w");if(pf == NULL){perror("fopen:");return 1;}const char* str = "aaaaaaaaaaaaaaaaaaaaaa\n";fputs(str,pf);fclose(pf);return 0;
}
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ ./a.out 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt 
aaaaaaaaaaaaaaaaaaaaaa
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ 

        结果显示,文件aaa.txt中已经写入了一段字符串。修改源代码,将写入字符串的代码删除后,再执行编译运行一次。

#include <stdio.h>
#include <stdlib.h>
int main()
{FILE* pf = fopen("aaa.txt","w");if(pf == NULL){perror("fopen:");return 1;}
//	const char* str = "aaaaaaaaaaaaaaaaaaaaaa\n";
//	fputs(str,pf);fclose(pf);return 0;
}
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt 
aaaaaaaaaaaaaaaaaaaaaa
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ gcc file.c 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ ./a.out 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ 

        结果表明,aaa.txt文件中的内容都消失了。原因在于fopen打开文件的方式"w",使用man手册查看fopen打开文件方式的说明。

        "w"方式打开文件时,会先清空文件中的所有内容。如果想保留文件中原来的内容做写入操作,就应该使用"a"的方式打开文件。


1.> 和 >>

utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ echo aaaaaaaaaaaa > aaa.txt 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt
aaaaaaaaaaaa
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ echo bbbbbbbbb > aaa.txt 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt
bbbbbbbbb
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ 

        通过echo做重定向操作向aaa.txt文件中先后写入两次,最终效果并不是有两段字符串,说明重定向操作符">"打开文件的方式本质上也是"w"的方式。(需要一提的是,echo重定向到文件中,本质上也要修改文件的内容,所以一定会打开文件)。


utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ echo aaaaaaaaaaaaaaaa >> aaa.txt 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt 
aaaaaaaaaaaaaaaa
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ echo bbbbbbbbbbbbbbbb >> aaa.txt 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ cat aaa.txt 
aaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbb
utocoo@utocoo-virtual-machine:~/Desktop/linux/241121$ 

        而追加重定向操作符" >> "先后向aaa.txt文件写入两次后,最终效果是两段字符串都被保留了下来,说明 " >> "其实和"a"方式类似,是一种追加的形式。


2.理解“当前路径”

        在使用C接口操作文件的时候,经常会听到说,“如果没有这个文件,则在当前路径下新建这个文件”,如何理解这个“当前路径”

        最简单直接的理解,就是我们当前程序的路径

//file.c
#include <stdio.h>
#include <stdlib.h>
int main()
{FILE* pf = fopen("aaa.txt","w");if(pf == NULL){perror("fopen:");return 1;}fclose(pf);return 0;
}

        当前路径就是file.c文件所在路径,编译运行前,该路径下没有aaa.txt文件,编译运行后,该路径下存在名为aaa.txt的文件。

utocoo@utocoo-virtual-machine:~/Desktop/linux/241122$ ll
总计 16
drwxrwxr-x  2 utocoo utocoo 4096 11月 22 12:22 ./
drwxrwxr-x 16 utocoo utocoo 4096 11月 22 12:19 ../
-rw-rw-r--  1 utocoo utocoo  233 11月 22 12:19 file.c
-rw-rw-r--  1 utocoo utocoo   64 11月 22 12:21 Makefile
utocoo@utocoo-virtual-machine:~/Desktop/linux/241122$ make
gcc -o file file.c
utocoo@utocoo-virtual-machine:~/Desktop/linux/241122$ ./file 
utocoo@utocoo-virtual-machine:~/Desktop/linux/241122$ ll
总计 32
drwxrwxr-x  2 utocoo utocoo  4096 11月 22 12:23 ./
drwxrwxr-x 16 utocoo utocoo  4096 11月 22 12:19 ../
-rw-rw-r--  1 utocoo utocoo     0 11月 22 12:23 aaa.txt
-rwxrwxr-x  1 utocoo utocoo 16048 11月 22 12:23 file*
-rw-rw-r--  1 utocoo utocoo   233 11月 22 12:19 file.c
-rw-rw-r--  1 utocoo utocoo    64 11月 22 12:21 Makefile

         在文件基础认识部分,已经提到过,文件是由进程打开的,那么新建一个文件也是由进程完成,进程是如何知道在哪条路径下新建一个文件呢。

        在源代码中打印出进程的PID,运行后,再在/proc路径下找到对应进程的所在目录。

while(1)
{printf("PID:%d\n",getpid());sleep(2);
}
PID:2930
PID:2930
PID:2930
PID:2930
PID:2930
PID:2930
PID:2930

        当前路径在进程的属性中其实已经保存好了,是cwd这条信息。因此新建一个文件要被存放到哪里也是确定的。但是进程的工作路径是可以修改的,虽然进程的前身是一个可执行程序,可执行程序的路径是确定,但是当可执行程序被操作系统管理起来后变成进程,进程的工作路径是可以通过chdir指令修改的,那么修改路径后,再新建一个文件,这个文件的所在路径不再是修改前的路径了,而是修改后的路径。

        这就表明,所谓的当前路径,其实是进程在运行的时候的工作路径,这个路径是由进程自己记录的,就是那条cwd信息。

三、相关系统调用

        系统默认打开三个流,stdin,stdout,stderr,这三个流对应的外设分别为键盘、显示器显示器。而Linux管理外设,是以文件的方式,即必然存在系统调用system call。因此,C语言的fopen、fclose、fwrite等函数本质是调用了system call

        下面就来认识Linux下文件相关的system call。

1.open

 

  • pathname就是路径,传参方法和C语言的fopen的参数差不多。
  • flags类型为int,传参的可选项如下所示

        这些值都是C语言定义的宏,目的是为了实现,只定义一个函数,却可以同时“传两个参数”。比如

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


        如果使用两个形参的open接口,一般是操作已经存在了的文件,比如bbb.txt文件必须存在,否则会报错。

int main()
{int fd = open("bbb.txt",O_WRONLY);if(fd == -1){perror("open\n");return 1;}close(fd);return 0;
}
由于bbb.txt不存在,则fd=-1

         用open接口实现fopen的"w"方式,文件如果不存在,则新建。而新建一个文件会有权限的初始化,一般普通用户新建一个文件的权限是0666(-rw-rw-rw-),而普通用户的权限掩码umask为0002,实际权限等于初始化权限减去权限掩码,即(-rw-rw-r--)

        mode即初始化权限码,一般传0666,只有flags带O_CREAT时,mode传参才有效。

        一般新建一个文件,在open的第二个参数上,应该传新建、可写、写入时清零,等同于fopen的"w"方式。

int main()
{int fd = open("bbb.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd == -1){perror("open\n");return 1;}const char* msg = "this is open to w\n";write(fd,msg,strlen(msg));close(fd);return 0;
}

        原来不存在的文件bbb.txt被创建了出来,并且o的权限少了w,符合预期。


2.文件描述符

        再来理解open的返回值——文件描述符(int fd)——Linux用整型值描述被打开的文件。

        这些整型值其实是数组下标,我们知道系统默认打开三个流,其实是三个文件,stdin、stdout、stderr,它们的下标对应为0、1、2,如果先后有序的打开1.txt、2.txt、3.txt,则它们的下标也是有序的为3、4、5。

        这段话似乎让你很懵,不过我马上就要阐述具体的内容。

        在此之前,要明确,操作文件只能由操作系统来做,因此有C语言的fopen封装open接口,有C语言定义的FILE指针的流封装文件描述符fd。

        实际上,FILE类型是结构体类型,也是封装了文件描述符int fd。


         对int fd的理解。

        文件描述符的本质,就是数组下标。

  • OS管理进程,这一板块叫做进程管理,有PCB,Linux下被定义为task_struct。
  • OS管理文件,这一板块叫做文件管理,在之前介绍了,文件区分为内存中的文件和磁盘中的文件,被加载到内存中的文件,OS要对它们做管理,就必然做“面向对象”和“数据结构”的工作,“面向对象”就是定义结构体,“数据结构”就是把对象存储到链表或者其他数据结构里面。Linux下把这个结构体类型定义为file,结构体内容大致有属性、方法集、缓冲区、mode(权限码)、flag、pos以及指向下一个结点的next等。
  • 进程管理和文件管理是两个独立的板块,但是又有关联。进程可以打开多个文件,那么一个进程打开了哪些文件,该进程必然要做记录。于是Linux下,task_struct结构体中有一个结构体指针,指向的结构体类型为files_struct,而这个结构体中,有一个数组,数组的每个元素类型为结构体指针,指针指向的结构体类型为file,这个数组被称为文件描述符表

        一个进程打开文件后,进程在这个数组中保存指向这个文件的指针,默认这个数组的前三个位置已经被stdin、stdout、stderr这三个文件占用了。 

        而数组下标,就是文件描述符,为什么close、write等这些接口都用int类型的文件描述符来操作文件,原因很简单,数组下标式访问,仅仅是O(1)复杂度

3.一切皆文件

        硬件一层,由于各种原因,设备的操作方法各不相同,因此每台计算机都需要装载相应的驱动。而对于每台设备的操作函数,它们的函数类型相同,函数内容各不相同。

        file结构体定义了方法集,本质就是函数指针

  • 每一台设备被视为一个结构体,方法集指向了该设备的操作方法。
  • 当系统调用read读取某个外设的内容,实际上就是函数回调的形式,用函数指针调用外设的读函数。

4.再次理解重定向

        文件描述符的分配规则:一定会把最小的数组下标利用起来,如果存在没有被利用的较小下标,则会分配给最新打开的文件,比如打开b文件前,将已经打开的a文件关闭,则打开b文件后,a文件的较小fd会分配给b文件。

        上面这段话,其实就是重定向的实现原理。


        输出重定向:本该输出到屏幕的语句却输出到了bbb.txt。 

int main()
{close(1);int fd = open("bbb.txt",O_WRONLY);printf("这段话本该输出到屏幕\n");return 0;
}

        原因就是在执行完close(1)语句后,当前进程的文件描述符表中数组下标为1的位置不再是指向屏幕文件的指针,而又打开了bbb.txt文件,则1号下标的指针指向了bbb.txt文件printf底层封装的write传参的fd值还是1,因此,这句字符串被写进了1位置指向的bbb.txt文件的缓冲区。

        所以,重定向的本质,就是文件指针在文件描述符表中的位置发生了变化,文件描述符表是一个数组,即数组下标发生了改变,比如原来4号下标指向A.txt文件,通过重定向让1号下标指向了A.txt,这样一来,上层向显示器打印的内容其实都被输出到了A.txt。


         有一个专门用来拷贝文件描述符的系统调用——dup

         想把打印到屏幕的内容重定向到bbb.txt,可以用dup2来实现。

        大致意思是用oldfd的值覆盖到newfd

int main()
{int fd = open("bbb.txt",O_WRONLY);dup2(fd,1);printf("----\n");return 0;
}

相关文章:

Linux:文件描述符fd、系统调用open

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…...

ToDesk设置临时密码和安全密码都可以当做连接密码使用

ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码&#xff0c;想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码&#xff0c;安全性确实很强 和定时Tokey一样&#xff0c;固定时间切换。 但是 如果我们要经常连接这个电脑&a…...

C#防止重复提交

C#防止重复提交 文章目录 C#防止重复提交前言防止重复提交的思路Web API 防止重复提交代码实现代码讲解使用方法 MVC防止重复提交总结 前言 当用户在前端进行提交数据时&#xff0c;如果网络出现卡顿和前端没有给出响应的话顾客通常都会狂点提交按钮&#xff0c;这样就很容易导…...

递归算法学习v2.2

46. 全排列 class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permute(int[] nums) {ret new ArrayList<>();path new ArrayList<>();check new boolean[nums.length…...

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类&#xff1a;DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…...

manim(manimgl)安装教学-win11(2024-08)

manim 目前的两种版本&#xff1a;★★ 稍微捋一捋【项目中的 readme.md 十分重要】 manimgl 是 Grant Sanderson&#xff08;YouTube频道 3Blue1Brown的作者&#xff09;等人开发。 现在为 manimgl&#xff0c;在维护中。 manimCE 是2020年后的 manim 分支 manim community e…...

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…...

脚本工具:PYTHON

Python 是一种高级编程语言&#xff0c;以其简洁清晰的语法和强大的功能被广泛应用于各种领域&#xff0c;包括自动化脚本编写、数据分析、机器学习、Web开发等。以下是一些关于使用 Python 编写脚本工具的基本介绍、常用库以及一些实用技巧总结。 这里写目录标题 基础知识安装…...

一文讲解Redis常见使用方式

1. 单机模式部署 适用场景&#xff1a; • 开发和测试环境&#xff0c;或者对高可用性要求不高的小型项目。 部署步骤&#xff1a; 1. 拉取 Redis 镜像&#xff1a; docker pull redis:latest 2. 运行 Redis 容器&#xff1a; docker run -d --name redis-single -p 637…...

Gin 源码概览 - 路由

本文基于gin 1.1 源码解读 https://github.com/gin-gonic/gin/archive/refs/tags/v1.1.zip 1. 注册路由 我们先来看一段gin代码&#xff0c;来看看最终得到的一颗路由树长啥样 func TestGinDocExp(t *testing.T) {engine : gin.Default()engine.GET("/api/user", f…...

【计算机网络】传输层协议TCP与UDP

传输层 传输层位于OSI七层网络模型的第四层&#xff0c;主要负责端到端通信&#xff0c;可靠性保障&#xff08;TCP&#xff09;&#xff0c;流量控制(TCP)&#xff0c;拥塞控制(TCP)&#xff0c;数据分段与分组&#xff0c;多路复用与解复用等&#xff0c;通过TCP与UDP协议实现…...

iOS UIScrollView的一个特性

1如果UIScrollView 的contentSize.height > scrollView.bounds.size.height - scrollView.contentInset.top - scrollView.contentInset.bottom &#xff0c; 则scrollView就可以滚动&#xff0c;否则无法滚动 并且最大的滚动范围就是 contentSize.height - &#xff08; s…...

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…...

python爬虫入门(实践)

python爬虫入门&#xff08;实践&#xff09; 一、对目标网站进行分析 二、博客爬取 获取博客所有h2标题的路由 确定目标&#xff0c;查看源码 代码实现 """ 获取博客所有h2标题的路由 """url "http://www.crazyant.net"import re…...

通过Ukey或者OTP动态口令实现windows安全登录

通过 安当SLA&#xff08;System Login Agent&#xff09;实现Windows安全登录认证&#xff0c;是一种基于双因素认证&#xff08;2FA&#xff09;的解决方案&#xff0c;旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤&#xff1a; 1. 安当SLA的核心功能 安…...

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…...

【Linux系统编程】—— 进程替换及其在操作系统中的应用与实现

文章目录 什么是进程替换&#xff1f;进程替换当中的接口单进程替换多进程的替换详解exec接口execlexeclpexecv 前言&#xff1a; 本篇博客将深入探讨进程替换的概念及其在操作系统中的作用。我们将介绍进程替换的基本原理&#xff0c;探讨操作系统如何通过进程的切换来实现任务…...

“裸奔”时代下该如何保护网络隐私

网络隐私的保护之道 引言 在这个信息爆炸的时代&#xff0c;网络已经深入到我们生活的每一个角落。你是否曾想过&#xff0c;在享受这些便利时&#xff0c;你的个人隐私正面临着严峻的挑战&#xff1f;网络隐私的现状警示着我们&#xff0c;信息泄露的事件屡见不鲜&#xff0…...

分类问题(二元,多元逻辑回归,费歇尔判别分析)spss实操

分类模型&#xff1a; 二分类和多分类&#xff1a; 对于二分类模型 &#xff0c;我们将介绍逻辑回归和Fisher线性判别分析两种分类算法; 对于多分类模型&#xff0c;我们将简单介绍Spss中的多分类线性判别分析和多分类逻辑回归的操作步骤 二分类: 基于广义线性模型&#x…...

推荐一个开源的轻量级任务调度器!TaskScheduler!

大家好&#xff0c;我是麦鸽。 这次推荐一款轻量级的嵌入式任务调度器&#xff0c;目前已经有1.4K的star&#xff0c;这个项目比较轻量化&#xff0c;只有5个源文件&#xff0c;可以作为学习的一个开源项目。 核心文件 项目概述&#xff1a; 这是一个轻量级的协作式多任务处理&…...

Spring 核心技术解析【纯干货版】- IV:Spring 切面编程模块 Spring-Aop 模块精讲

随着软件开发技术的不断进步&#xff0c;面向切面编程&#xff08;AOP&#xff09;作为一种重要的编程思想&#xff0c;已经在现代开发中占据了重要地位。它通过将横切逻辑从业务逻辑中分离出来&#xff0c;使得代码更加清晰、易于维护。Spring AOP 作为 Spring 框架的核心模块…...

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos&#xff08;十九&#xff09; 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理简介 2.功能介绍 1.任务调度 2.任务管理 3.中断管理 4.消息队列 3.特点说明 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是…...

2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?

模型假设仅仅是简单陈述吗&#xff1f;允许AI的使用是否降低了比赛难度&#xff1f;还在依赖机器学习的模型吗&#xff1f;处理题目的方法有哪些&#xff1f;O奖论文的优点在哪里&#xff1f; 本文调研了当年赛题的评委文章和O奖论文&#xff0c;这些问题都会在文章中一一解答…...

第14篇:从入门到精通:掌握python上下文管理器

第14篇&#xff1a;上下文管理器 内容简介 本篇文章将深入探讨Python中的上下文管理器&#xff08;Context Manager&#xff09;。您将了解上下文管理器的概念与用途&#xff0c;学习如何实现自定义的上下文管理器&#xff0c;以及如何使用contextlib模块来简化上下文管理器的…...

cuda从零开始手搓PB神经网络

cuda实现PB神经网络 基于上一篇的矩阵点乘&#xff0c;实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下&#xff1a; #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…...

Java 大视界 -- Java 大数据物联网应用:数据处理与设备管理(八)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

大模型之三十三- 开源Melo 语音合成

大模型之三十三- 开源Melo 语音合成 文本到语音(TTS)系统从基于基础音素的模型演变成复杂的端到端神经方法,这种方法可以直接将文本转换为语音。这一变革得益于深度学习的进步和计算能力的提升,已经在语音的自然度、韵律控制和跨语言能力方面取得了重大进展 。现代TTS系统…...

全同态加密理论、生态现状与未来展望(上)

《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布&#xff0c;分为上中下三个系列&#xff1a; 全同态加密理论、生态现状与未来展望&#xff08;上&#xff09;&#xff1a;专注于介绍全同态加密理论知识。全同态加密…...

cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…...

提升大语言模型的三大策略

1.概述 随着大语言模型&#xff08;LLMs&#xff09;在技术和应用上的不断发展&#xff0c;它们已经深刻地改变了我们与计算机的互动方式。从文本生成到语言理解&#xff0c;LLMs的应用几乎涵盖了各个行业。然而&#xff0c;尽管这些模型已展现出令人印象深刻的能力&#xff0c…...

Ubuntu 24.04 LTS 安装 Docker Desktop

Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版&#xff08;1h速通&#xff09; Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…...

mysql查看binlog日志

mysql 配置、查看binlog日志&#xff1a; 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启&#xff0c;修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin&#xff08;开启日志并指定日志前缀&#xff…...

2. Flink分区策略

一. Flink分区策略概述 Flink任务在执行过程中&#xff0c;一个流(stream)包含一个或多个分区(Stream partition)&#xff0c;TaskManager中的一个slot的SubTask就是一个stream partition(流分区)。 Flink分区之间进行数据传递模式有两种。 1. one-to-one模式 数据不需要重新…...

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…...

微信小程序中实现背景图片完全覆盖显示,可以通过设置CSS样式来实现

wxml页面代码 <view class"beijing"></view>wxss样式代码 /* pages/beiJing/beiJing.wxss */ .beijing {background-image: url("https://www.qipa250.com/qipa.jpg");/* 定位&#xff1a;绝对定位 */position: absolute;/* 上下左右都定位到…...

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…...

中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39061 在全球算力因数字化技术发展而竞争加剧&#xff0c;我国积极推进算力发展并将综合算力作为数字经济核心驱动力的背景下&#xff0c;该报告对我国综合算力进行研究。 中国算力大会发布的《中国综合算力指数&#xff08;2024年…...

51c~ONNX~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11608027 一、使用Pytorch进行简单的自定义图像分类 ~ONNX 推理 图像分类是计算机视觉中的一项基本任务&#xff0c;涉及训练模型将图像分类为预定义类别。本文中&#xff0c;我们将探讨如何使用 PyTorch 构建一个简单的自定…...

线下陪玩系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…...

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…...

SAP POC 项目完工进度 - 收入确认方式【工程制造行业】【新准则下工程项目收入确认】

1. SAP POC收入确认基础概念 1.1 定义与原则 SAP POC&#xff08;Percentage of Completion&#xff09;收入确认方式是一种基于项目完工进度来确认收入的方法。其核心原则是根据项目实际完成的工作量或成本投入占预计总工作量或总成本的比例&#xff0c;来确定当期应确认的收…...

【Elasticsearch 】 聚合分析:聚合概述

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【算法】二分

二分 1.二分查找1.在排序数组中查找元素的第一个和最后一个位置2.牛可乐和魔法封印3.A-B 数对4.烦恼的高考志愿 2.二分答案1.木材加工2.砍树3.跳石头 1.二分查找 当我们的解具有二段性&#xff08;根据最终答案所在的位置判断是否具有二段性&#xff09;时&#xff0c;就可以使…...

如何将自己本地项目开源到github上?

环境&#xff1a; LLMB项目 问题描述&#xff1a; 如何将自己本地项目开源到github上&#xff1f; 解决方案&#xff1a; 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置&#xff0c;并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…...

编辑器Vim基本模式和指令 --【Linux基础开发工具】

文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…...

Scade 表达式 - 使用索引的迭代器

Scade 表达式中的 map, fold, mapfold&#xff0c;会对输入数组参数中的元素逐个作处理&#xff0c;不需要数组元素的索引信息。若在处理数组元素时&#xff0c;需要数组元素相应的索引信息&#xff0c;则可使用迭代器算子 mapi, foldi, mapfoldi。 mapi 算子 mapi 算子的行为…...

K8s学习

Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xf…...

面试--你的数据库中密码是如何存储的?

文章目录 三种分类使用 MD5 加密存储加盐存储Base64 编码:常见的对称加密算法常见的非对称加密算法https 传输加密 在开发中需要存储用户的密码&#xff0c;这个密码一定是加密存储的&#xff0c;如果是明文存储那么如果数据库被攻击了&#xff0c;密码就泄露了。 我们要对数据…...

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …...

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…...