网站制作费用贵不贵/国外网站搭建
目录
0.前言
1.C / C++ ->文件操作
1.1 C语言文件操作
1.1.1 C语言文件打开/关闭/写入
1.1.2 C语言文件的追加操作
1.1.3 C语言文件的读取
1.2 C++语言文件操作
1.2.1 C++文件打开 / 关闭 / 写入
1.2.2 C++文件读取
1.2.3 文件追加
2.三个默认输入输出流
2.1 C语言中的三个
2.2从三个流的操作引入一切皆文件
2.2.1主体操作
2.2.2标准输出和标准错误的小区别
2.2.3从文件操作体会一切皆文件
2.3从流文件操作看OS对底层的封装
3.系统调用接口(文件操作)
3.1 open接口
3.1.1 open参数与返回值
3.1.2 open的实践使用
3.2 write接口
3.3 read接口
3.4 write追加
0.前言
本文所有代码都以上传至gitee:
practice14 · onlookerzy123456qwq/Linuxtwo - 码云 - 开源中国 (gitee.com)
1.C / C++ ->文件操作
我们首先来复习一下,C语言,C++的对于文件操作提供的接口。
1.1 C语言文件操作
1.1.1 C语言文件打开/关闭/写入
//FILE *fopen(const char *path, const char *mode); FILE* f_test = fopen("./diary.txt","w"); //打开文件需要检查是否打开成功 if(f_test == NULL) { printf("file open error\n"); return 1; } //对文件进行写入操作(写入5个hello world\n) int k = 5; while(k--){ //int fputs(const char *s, FILE *stream); fputs("hello world\n",f_test); } //打开文件需要关闭文件 //int fclose(FILE *fp); fclose(f_test); return 0;
首先我们如何在C语言当中打开文件,使用的是fopen接口,返回的是一个FILE*指针,我们拿到这个FILE* 指针,就可以通过FILE指针对打开的相应文件操作。
fopen的第一个参数是path,指明这个文件所在的路径+文件名,我们例子中的"./diary.txt",指明的就是当前文件夹下的diary.txt文件进行打开。
fopen的第二个参数是mode,我们要填入的是打开这个文件的模式,例如你是以只读方式,或写方式,或追加方式等,对文件进行打开。
PS:我们打开文件之后,需要记住两件事,第一件事是检查文件打开是否成功,如果fopen失败返回的是NULL。第二件事是fclose关闭文件,不然会对后续文件的操作产生影响:此处如果没有fclose,数据留在缓冲区中,虽然可以成功写入,但是无法成功读取。
然后我们讲C语言的写入文件接口fputs,它的第一个参数s是要写入文件的字符串,写入到的目标文件是第二个参数FILE* stream,也就是fopen的返回值,指代要写入的文件是谁。
1.1.2 C语言文件的追加操作
这里我们要注意需要以追加append的方式打开这个文件,即fopen的第二个参数我们传入"a",然后我们调用C语言写入接口,就会默认在文件尾进行写入,完成对原来内容的追加。
//FILE *fopen(const char *path, const char *mode); FILE* f_test = fopen("./diary.txt","a"); //打开文件需要检查是否打开成功 if(f_test == NULL) { printf("file open error\n"); return 1; } //对文件append操作 int k = 5; while(k--){ fputs("hello world\n",f_test); } //打开文件需要关闭文件 fclose(f_test);
1.1.3 C语言文件的读取
这里读取我们使用的是fgets接口:
fgets接口是一次读取文件的一行内容到buffer接收缓冲区里面,第一个参数填buffer接口缓冲区,即把从文件中读取到的一行内容放在哪里。
第三个参数是FILE* stream,表征的是从哪个文件里面进行一行的读取。
第二个参数int size,它的意义是期待最多读取size-1个字符,最多读取size-1个字符,也可以读取不到这么多,所以只需要你填入buffer的size大小即可。fgets接口会在读取到的字符串的最后,自动添加\0。
//FILE *fopen(const char *path, const char *mode); FILE* f_test = fopen("./diary.txt","r"); //打开文件需要检查是否打开成功 if(f_test == NULL) { printf("file open error\n"); return 1; } //对文件read操作 //create buffer to receive the data of the file we readchar buffer[256];memset(buffer,0,sizeof(buffer));printf("We read file:\n");//char *fgets(char *s, int size, FILE *stream);//fgets从流上读取最多(size-1)个字符并将其存储到s指向的buffer中,当遇到新的一行或文件结束标志时结束while(fgets(buffer,sizeof(buffer),f_test) != NULL){//每次都读取一行到buffer里面,所以说每次读取一行,我们就要对这个打印这一行,否则就会一行一行覆盖前面读取的内容printf("%s\n",buffer);}//读取完毕文件之后需要检查是否读取完成成功if(!feof(f_test)){printf("file read not to end,file quit illegally!\n");}//打开文件需要关闭文件 fclose(f_test);
每次读取的是一行的内容到缓冲区当中,所以说每次读取一行,我们就要对这个打印这一行,否则就会被下一次fgets读取的下一行的内容覆盖buffer中前面读取的内容。
然后还要记得对读取之后进行检查,因为存在读取失败的问题,feof接口,检查此时文件是否已经到文件尾,即我们是否已经读取完毕。
1.2 C++语言文件操作
1.2.1 C++文件打开 / 关闭 / 写入
//explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);std::ofstream ofs("./diary2.txt",std::ios::out | std::ios::binary);//打开文件就要检查是否打开成功if(!ofs.is_open()){cout<<"file open error"<<endl;return 1;}//对文件进行写入string name = "张三";int age = 18;ofs << "姓名:"<<name<<" "<<"年龄:"<<age<<endl;//还可以调用ofs的write接口进行写入string message_temp = "Happy Everyday!~\n";for(int i = 0;i<3;++i){ofs.write(message_temp.c_str(),message_temp.size());}//即使我们不主动close,也会在析构的过程中自动关闭,但是我们提倡主动释放,减少资源占据ofs.close();return 0;
C++使用的ofstream类的对象,进行对目标文件的打开,ofstream构造函数的第一个参数是要打开的文件路径+文件名,第二个参数是打开的方式是什么,比如默认缺省不写是文本写入,我们上述代码块的第二行是二进制写入的方式打开文件。
打开文件之后我们有两件事,第一件事是查看文件是否被打开成功,我们调用的是ofstream对象的is_open()成员函数;第二件事是关闭文件,调用的是ofstream对象的close()成员函数。当然C++当中有析构函数,可以不用主动close,ofs对象生命周期结束的时候,可以自动调用close,但是能主动调就主动调,减少资源的占据。
1.2.2 C++文件读取
C++文件读取,我们使用的是ifstream类对象,构造函数第一个参数是要进行读取文件的路径+文件名,第二个参数是传入的打开文件的模式,默认是文本读取,下面代码我们设置的是二进制读取模式。
ifstream读取文件内容的方式可以调用对于int string类等自己封装的的operator>>函数,也可以调用ifstream类的成员方法read。
//explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);std::ifstream ifs("./diary2.txt",ios_base::in | ios_base::binary);//打开文件就要检查是否打开成功if(!ifs.is_open()){cout<<"file open error"<<endl;return 1;}//对文件进行读取string name;int age = 0;ifs >> name >> age;//打印读取到的信息cout<<"We Read:\n姓名:"<<name<<" "<<"年龄:"<<age<<endl;//还可以使用read语法char buffer[128];//读取到的内容放到buffer当中,期待读取的字节数是sizeof(buffer)ifs.read((char*)buffer,sizeof(buffer));cout<<"We Also Read:\n"<<buffer<<endl;//即使我们不主动close,也会在析构的过程中自动关闭,但是我们提倡主动释放,减少资源占据ifs.close();
如图看到我们的读取文件代码是成功的。
1.2.3 文件追加
C++的追加写入,我们只要在写入ofstream类构造函数基础上,设置app追加模式,然后进行对ofs的写入即可。
//explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);std::ofstream ofs("./diary2.txt",std::ios::app | std::ios::binary);//打开文件就要检查是否打开成功if(!ofs.is_open()){cout<<"file open error"<<endl;return 1;}//对文件进行追加写入string name = "李四";int age = 19;ofs << name <<" "<<age<<endl;//还可以调用ofs的write接口进行写入string message_temp = "Not Bad Everyday!~\n";for(int i = 0;i<3;++i){ofs.write(message_temp.c_str(),message_temp.size());} //即使我们不主动close,也会在析构的过程中自动关闭,但是我们提倡主动释放,减少资源占据ofs.close();
2.三个默认输入输出流
2.1 C语言中的三个
C程序,在加载到内存,成为一个进程的时候面,会默认打开三个输入输出流stdin,stdout,stderr。他们都是FILE*类型。这个FILE的本质是C语言提供的,一个结构体,可以通过这个结构体找到这个文件。
站在体系结构的角度理解,stdin对应的设备是键盘,stdout对应的硬件设备是显示器,stderr对应的硬件设备是显示器。它们的学名分别叫做标准输入,标准输出,标准错误。
同时C++当中,也会默认有三个对象:cout,cin,cerr,也分别对应标准输入,标准输出,标准错误,也分别对应键盘,显示器,显示器。
2.2从三个流的操作引入一切皆文件
2.2.1主体操作
刚刚我们接触的C语言的三个默认打开的文件流,stdin,stdout,stderr,都是FILE*类型,其实都是可以当做打开的文件FILE* f_stream直接去操作的。
//C语言会默认打开三个文件流stdin stdout stderr6 //我们可以直接使用这三个FILE* 文件流 7 const char* w_str = "hello fprintf stdout\n";8 fprintf(stdout,w_str,strlen(w_str));
我们看到fprintf stdout,就是往stdout这个文件,也就是显示器进行写入。效果是等同于这个printf的。
char buffer[128];
memset(buffer,0,sizeof(buffer));
fscanf(stdin,"%s",buffer);
printf("We Read From stdin:\n%s\n",buffer);
我们看到fsacnf stdin,就是往stdin这个文件,也就是键盘进行写入。效果是等同于scanf的。
const char* w_str = "hello fprintf stderr\n";
fprintf(stderr,w_str,strlen(w_str));
我们看到fprintf stderr,就是往stderr这个文件,也就是显示器进行写入。
2.2.2标准输出和标准错误的小区别
我们往stdout和stderr写入,本质都是往对应的显示器写入,他们对应的设备是一样的,使用写入接口如fprintf对这两个标准输出,标准输出,本质都是在显示器写入,那有什么小文件写入呢?
区别就在于输出重定向的时候,只有我们往标准输出sdtout写入的内容,才会被重定向,写入到目标文件当中,而向stderr标准错误写入的的内容是不会被重定向的,仍然被写入打印到了屏幕当中。
下面我们演示重定向操作:
2.2.3从文件操作体会一切皆文件
可是你是否有想过,这个stdout,stdin,stderr,都是FILE*类型,也可以被当做文件使用,可是他们本质代表的是显示器,键盘这些硬件啊!难道这些硬件都是一种文件file吗?
事实上,在LinuxOS看来,这些都是文件!刚刚我们做的实验,fputs向 一般文件 或者 硬件设备 都能进行写入,一般文件,都存储在磁盘上,所以其实这些文件的本质也是硬件,也可以证明硬件设备也是一种FILE。
在LinuxOS看来,所有的存储在磁盘上的file,这些是我们通常认识的一般文件,事实上,我们可以继续扩展,所有的硬件也是文件!
======》得出一个结论:Linux下一切皆文件!!!
2.3从流文件操作看OS对底层的封装
OS是软件和硬件的管理者,任何外部势力要访问,都要经由OS。所有的文件file,都是储存在磁盘当中的,或者说是磁盘的一部分,所以他们是硬件,所以我们刚刚的写入/读取文件(硬件)的操作都是经由OS之手的。
OS不相信任何人,任何用户想要访问只能通过OS对上提供的系统调用接口System Call,进行合法的访问。所以,我们对文件(软件 / 硬件)写入,本质都是通过System Call 即系统调用接口访问到的!
所以,我们可以大胆的得出一个结论:
几乎所有的语言,fopen fclose fread fwrite fgetsfputs fgetc fputc ,等这些对文件(硬件)进行读写接口的实现,这个过程一定是经由了System Call层,故这些上层语言的接口一定使用OS提供的系统调用接口封装实现的!
我们接下来演示系统调用接口,当然这里演示的是文件的系统调用接口,因为这个离着OS更近,我们可以用语言(OS System Call层)进行讲解。
万变不离其宗,所有语言的文件调用接口,都是对(文件操作的)System Call系统调用接口的封装。
我们把底层学好了,上层怎么学都可以,上面我们是从OS对软件硬件的管理的角度理解的系统调用与上层语言之间的关系。
3.系统调用接口(文件操作)
3.1 open接口
3.1.1 open参数与返回值
open接口是Linux中的系统调用接口,负责对文件的打开,第一个参数pathname,传入的是想要打开文件的路径+文件名;第二个参数int flags是打开文件的标志,即我们是以什么方式打开这个文件(只读,只写,还是追加);第三个参数是mode_t mode,这个是打开文件的权限设置。
open的返回值是int,这个int其实就是文件描述符fd(file descriptor)。如果打开文件失败返回-1,并设置全局错误码。
pathname好理解,就是路径+文件名。int flags也可以直接类比C语言fopen接口的打开方式"w","r",“a”,但是这里传入的实际上是一个int,但是我们不直接传入int,而是通过系统文件给我们提供的宏(如下图)进行传入。
int fd = open("./diary3.txt",O_WRONLY | O_CREAT,xxxxx);
举个上面代码片的例子,第一个参数指定打开的路径+文件名,第二个参数是两个宏的或运算,这个就是我们传入的int。
从感性的角度理解,O_WRONLY是以只写方式打开这个文件,O_CREAT是创建这个文件,所以我们是以如果这个文件不存在我们就创建,然后以只写的方式打开。这个O_WRONLY | O_CREAT其实就可以直接类比为C语言fopen的"w"打开方式!
从理性的角度理解,这两个宏可以进行或运算,成为一个int,说明这些宏本身就是一个数,然后这些宏或运算起来可以表征某种信息,open接口接收到这个整形信息,就知道你要以什么方式打开这个文件。现在有6个bit位,比如第一个bit位代表米饭,第二个bit位代表馒头,第三个bit位代表牛肉,第四个bit位代表羊肉,第五个bit位代表可乐,第六个bit位代表雪碧,我传入的是011001,然后open接口就知道你要吃的是馒头+牛肉+雪碧。
这里的每一个宏其实就代表了某一个特定bit位的数,在open当中就看int的32个bit位的有无情况,来设定你是在以什么方式在打开这个文件,如第一个bit标志位, 看看你是想创建这个文件 , 第二个bit位的有代表你是想写入这文件。所以此时O_WRONLY是0b1,O_CREAT是0b10,O_WRONLY | O_CREAT就是0b0000 0011。
本质上这些宏就是在代表不同的bit位。而且不同的宏代表不同的bit位。
我们的理解是这样的,我们紧接着看一下系统文件是怎么样的:
通过grep指令,我们看到#define的这些宏,就是bit位样式的定义!这验证了我们的想法。
理解完第二个参数,我们理解第三个参数,mode_t mode:任何一个文件,都有一个重要的属性,即文件权限,尤其是你没有文件的时候,你创建一个文件,肯定要设置这个文件的权限,所以这个mode其实就是传入对于owner,group,other的权限设置。我们采用八进制方案,传入0644,本质就是rw-r--r--。
int fd = open("./diary3.txt",O_WRONLY | O_CREAT,0644);
不是你的生活充满阳光,总有人替你负重前行!!!(C语言封装都替你搞好了mode权限管理)同时根据我们之前的理论,C语言上的打开文件接口fopen都是封装的系统调用open,这个mode参数fopen都已经帮我们搞好了!
你在C语言的接口对文件的权限(mode)都是漠不关心的,因为这些概念都是和OS强相关的。C语言给你做封装,你也就不用再关心权限这些细节了!
open系统调用接口的返回值int,是文件描述符,可以类比fopen的返回值FILE* fp,这个其实就是我们后续对特定文件进行写入读取的索引(如何知道你是在对哪个文件进行写入,C语言用的是fopen打开文件的返回值FILE* fp,系统调用这里用的是open打开文件的返回值int fd)。
3.1.2 open的实践使用
我们open一个文件之后,不管怎么样,一定要记得关闭一个这个文件,我们配套的系统调用关闭文件的接口是close(int fd)。
所以完整的打开一个文件的过程:
//int open(const char *pathname, int flags, mode_t mode);//int fd = open("./diary3.txt",O_WRONLY | O_CREAT);//这里的O_WRONLY,O_CREAT的本质都是代表一个bit为1的整形值,通过或出的值的方式,设计相应标志位//open接口就知道你是以什么方式打开的了//这里O_WRONLY代表写的方式打开接口,O_CREAT代表创建这个文件,这两个的组合就是C中的“w的意义//0644代表设置对于打开这个文件的权限管理模式设置(采用八进制表示法)int fd = open("./diary3.txt",O_WRONLY | O_CREAT,0644);//检查是否打开成功(依托的是返回值)if(fd<0){printf("file open error\n");return 1;}//关闭文件close(1);\
3.2 write接口
系统调用write,它的作用就是对特定文件进行写入操作,int fd表征你在具体往哪个文件写,buf表示的是你要写入的内容缓冲区,size_t count是你期待写入的字节数。返回值ssize_t是你实际向文件写入的字节数目,如果写入失败返回-1。(你想写入的字节数,不一定都写入,万一你的传的count过大了,那写入的数目就是错的,真正的写入的字节数还是看write的返回值)
直接结合open上写入文件的操作:
//1.打开/创建文件int fd = open("./diary3.txt",O_CREAT | O_WRONLY);//检查是否打开成功if(fd<0){perror("open");return 1;}//2.对文件进行写入char buffer[128] = "Never ever ever ever give up\n";//系统调用接口write://第三个参数是你期待写入的字节数,返回值是实际上写入成功的字节数//我们写入字符串不写入\0,因为这是仅仅只是C语言层面对字符串的标记而已ssize_t w_size = write(fd,buffer,strlen(buffer));//检查写入if(w_size<0){perror("write");return 2;}printf("We Write File Success:%s",buffer);//关闭文件close(fd);
3.3 read接口
系统调用read,它的作用就是对特定文件进行读取操作,int fd表征你在具体往哪个文件读,buf表示的是你要接收读取内容的缓冲区,size_t count是你期待读取的字节数量。返回值ssize_t是你实际向文件读取到的字节数目,如果读取失败返回-1。(你想读取到的字节数,不一定能读取这么多,万一你的传的count过大了,那实际读取的数目就是错的,真正的读取到的字节数还是看read的返回值)
write要注意的是不要写入字符串最后的\0这个字节,read要注意的是,你在读取的时候,要注意给buffer预留一个字节,自己主动填写\0,所以我们期待读取的count字节数,不要写成sizeof(buffer),而是要写sizeof(buffer)-1。
//1.打开/创建文件int fd = open("./diary3.txt",O_RDONLY);//检查是否打开成功if(fd<0){ perror("open"); return 1; } //2.对文件进行读取 char buffer[128] ;memset(buffer,0,sizeof(buffer));//系统调用接口read://第三个参数是你期待读到的字节数,返回值是实际上读取成功的字节数ssize_t r_size = read(fd,buffer,sizeof(buffer)-1);//检查写入 if(r_size<0){perror("read"); return 2; } //[0,r_size-1]是读取到的字节数据buffer[r_size] = '\0';printf("We Read File Success:%s\n",buffer);//关闭文件close(fd);
3.4 write追加
//1.打开/创建文件//ERROR:int fd = open("./diary3.txt",O_APPEND); 要追加首先要有WR写权限int fd = open("./diary3.txt",O_WRONLY | O_APPEND);
我们只要在打开open这个文件的时候,在O_WRONLY的基础上,再或上一个O_APPEND标志即可。然后就用相应的write写入系统调用,就是在文件尾进行写入,即追加。
相关文章:

[Linux入门篇]一篇博客解决C/C++/Linux System Call文件操作接口的使用
目录 0.前言 1.C / C ->文件操作 1.1 C语言文件操作 1.1.1 C语言文件打开/关闭/写入 1.1.2 C语言文件的追加操作 1.1.3 C语言文件的读取 1.2 C语言文件操作 1.2.1 C文件打开 / 关闭 / 写入 1.2.2 C文件读取 1.2.3 文件追加 2.三个默认输入输出流 2.1 C语言中的三…...

数据结构和算法学习记录——删除有序数组中的重复项、合并两个有序数组
去重删除有序数组中的重复项题目来自:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/题目描述给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数…...

FPGA实现模拟视频BT656解码 TW2867四路PAL采集拼接显示 提供工程源码和技术支持
目录1、前言2、模拟视频概述3、模拟视频颜色空间4、逐行与隔行5、BT656数据与解码BT656数据格式BT656数据解码6、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析7、设计思路与框架8、vivado工程详解9、上板调试验证10、福利:工程代码的获取1、前言…...

【建议收藏】超详细的Canal入门,看这篇就够了!!!
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。 背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部…...

KubeSphere 社区双周报 | OpenFunction v1.0.0-rc.0 发布
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.02.17-2023.…...

查漏补缺3月
SPI扩展序列化方式 分布式ID的相关问题 TCP的流量控制,避免浪费网络资源的滑动平均法也可以用在其他可能会出现资源浪费的情况等 讲一讲对自己这个 RPC 项目的想法,你是怎么设计这个项目的,想要实现那些功能? 你认为一个好的 RPC…...

如何使用Java实现类似Windows域登录
什么是域登录? 域登录是一种集中式身份验证和授权方法,用于访问企业内部网络和资源。在Windows环境中,域是一组计算机和用户帐户的集合,受到单个安全管理的控制。域登录允许用户在访问域资源时使用单个帐户名和密码进行身份验证&…...

生成模型与判别模型
生成模型与判别模型 一、决策函数Yf(X)或者条件概率分布P(Y|X) 监督学习的任务就是从数据中学习一个模型(也叫分类器),应用这一模型,对给定的输入X预测相应的输出Y。这个模型的一般形式为决策函数Yf(X)或者条件概率分布P(Y|X)。 …...

Kotlin lateinit 和 lazy 之间的区别 (翻译)
Kotlin 中的属性是使用var或val关键字声明的。Late init 和 lazy 都是用来初始化以后要用到的属性。 由于这两个关键字都用于声明稍后将要使用的属性,因此让我们看一下它们以及它们的区别。 Late Init 在下面的示例中,我们有一个变量 myClass࿰…...

Golang alpine Dockerfile 最小打包
最近在ubantu 上进行了 iris项目的alpine 版本打包,过程遇到了一些问题,记录一下。 golang版本 :1.18 系统:ubantu 代码结构 Dockfile内容 FROM alpine:latest MAINTAINER Si Wei<3320376695qq.com> ENV VERSION 1.1 ENV G…...

在NVIDIA JetBot Nano小车上更新WIFI驱动
前言:树莓派上的WIFI驱动类型比较多,经常有更好驱动的需求本文给出RealTek的无线WIFI模组,8821CU的驱动更新办法步骤第一 通过其他方式连接网络小车通过网线或者老的WIFI连接到网络上第二 构建驱动模块并下载驱动首先,我们需要打开一个ubuntu…...

2023年网络安全最应该看的书籍,弯道超车,拒绝看烂书
学习的方法有很多种,看书就是一种不错的方法,但为什么总有人说:“看书是学不会技术的”。 其实就是书籍没选对,看的书不好,你学不下去是很正常的。 一本好书其实不亚于一套好的视频教程,尤其是经典的好书…...

VSYNC研究
Vsync信号是SurfaceFlinger进程中核心的一块逻辑,我们主要从以下几个方面着手讲解。软件Vsync是怎么实现的,它是如何保持有效性的?systrace中看到的VSYNC信号如何解读,这些脉冲信号是在哪里打印的?为什么VSYNC-sf / VS…...

python gRPC:根据.protobuf文件生成py代码、grpc转换为http协议对外提供服务
文章目录python GRPC:根据.protobuf文件生成py代码grpcio-tools安装和使用python GRPC的官网示例grpc转换为http协议对外提供服务工作问题总结grpc-ecosystem/grpc-gateway/third_party/googleapis: warning: directory does not exist.python GRPC:根据…...

Allegro如何输出ODB文件操作指导
Allegro如何输出ODB文件操作指导 在PCB设计完成之后,需要输出生产文件用于生产加工,除了gerber文件可以用生产制造,ODB文件同样也可以用于生产,如下图 用Allegro如何输出ODB文件,具体操作如下 首先确保电脑上已经安装了ODB这个插件,版本不受限制点击File...

koa-vue的分页实现
1.引言 最近确实体会到了前端找工作的难处,不过大家还是要稳住心态,毕竟有一些前端大神说的有道理,前端发展了近20年,诞生了很多leader级别的大神,这些大神可能都没有合适的坑位,我们新手入坑自然难一些&am…...

安全开发基础 -- DAST,SAST,IAST简单介绍
安全开发基础-- DAST,SAST,IAST 简介 DAST 动态应用程序安全测试(Dynamic Application Security Testing)技术在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击,分析应用程序的反…...

网络安全之暴力破解介绍及暴力破解Tomcat
网络安全之暴力破解介绍及应用场景一、暴力破解介绍1.1 暴力破解介绍1.2 暴力破解应用场景一、暴力破解Tomcat一、暴力破解介绍 1.1 暴力破解介绍 暴力破解字典:https://github.com/k8gege/PasswordDic 1.2 暴力破解应用场景 一、暴力破解Tomcat 登录Tomcat后台&a…...

Elasticsearch:使用 Logstash 构建从 Kafka 到 Elasticsearch 的管道 - Nodejs
在我之前的文章 “Elastic:使用 Kafka 部署 Elastic Stack”,我构建了从 Beats > Kafka > Logstash > Elasticsearch 的管道。在今天的文章中,我将描述从 Nodejs > Kafka > Logstash > Elasticsearch 这样的一个数据流。在…...

记录一次es的性能调优
文章目录es性能调优启用g1垃圾回收器es性能调优 成都的es集群经常出现告警,查看日志发现 [gc][11534155] overhead, spent [38.3s] collecting in the last [38.6s]这是 JVM 垃圾回收过程中的一条日志,表示在最近 38.6 秒内,JVM 进行了一次…...

内核性能评估测试及具体修改操作步骤记录
步骤记录前言一、查看环境配置二、LRU缓存空间调整三、进程扫描时间间隔四、与其他内核对比的工作负载测试(另一个内核的编译)总结前言 记录的相关操作有:查看服务器硬件环境、LRU缓存大小修改、内核命名、内核编译以及进程执行周期的设置。…...

S7-200smart远程无线模拟量信号采集案例
本参考方案使用西门子PLCS7-200SMART 结合无线通讯终端DTD434MC和DTD433F实现 PLC对远端设备模拟量的远程无线输入输出查询控制。所使用到的设备:西门子S7-200smartPLC无线数据终端DTD434MC无线模拟量信号测控终端DTD433F所使用的协议:ModbusRTU协议方案…...

Blender Python材质处理入门
本文介绍在 Blender 中如何使用 Python API 获取材质及其属性。 推荐:用 NSDT场景设计器 快速搭建3D场景。 1、如何获取材质 方法1、 获取当前激活的材质 激活材质是当前在材质槽中选择的材料。 如果你选择一个面,则活动材料将更改为分配给选定面的材质…...

ChatGPT后劲很大,问题也是
ChatGPT亮相即封神,最初的访客是程序员、工程师、AI从业者、投资人,最后是无数懵懂又好奇的普通人:ChatGPT是什么?自己会被ChatGPT取代吗?看待ChatGPT的立场也是两个极端: 快乐,是因为ChatGPT太…...

世界那么大,你哪都别去了,来我带你了解CSS3 (二)
文章目录❤️🔥CSS文档流❤️🔥CSS浮动❤️🔥CSS定位❤️🔥CSS媒体查询❤️🔥CSS文档流 文档流是文档中可显示对象在排列时所占用的位置/空间。 例如:块元素自上而下摆放,内…...

2023年再不会Redis,就要被淘汰了
目录专栏导读一、同样是缓存,用map不行吗?二、Redis为什么是单线程的?三、Redis真的是单线程的吗?四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…...

Java SPI机制了解与应用
1. 了解SPI机制 我们在平时学习和工作中总是会听到Java SPI机制,特别是使用第三方框架的时候,那么什么是SP机制呢?SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的接口,它可以用来…...

vue实现输入框中输完后光标自动跳到下一个输入框中
前言 最近接到这么一个需求,做一个安全码的输入框,限制为6位数,但是每一个写入的值都是一个输入框,共计6个输入框,当前输入框写入值后,光标自动跳到下一个输入框中,删除当前输入框写入的值后再自…...

如何构建 C 语言编译环境?
C语言是一种通用的编程语言,它是由Dennis Ritchie于20世纪70年代初在贝尔实验室开发的。C语言的设计目标是提供一种结构化、高效、可移植的编程语言,以支持系统编程和应用程序开发。C语言广泛用于开发操作系统、网络设备、游戏、嵌入式系统、桌面应用程序…...

电子台账:模板制作之一——列过滤(水平过滤)
1 简介列过滤即水平过滤。一般情况下,企业数据源文件中有很多数据列,其中大部分数据列中的数据对电子台账来说是没有用的。列过滤就是确定企业数据文件的哪几列有用,以及有用的列分别对应到台账(模板)的哪一列。列过滤…...