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

怎么样免费做公司网站/管理课程培训

怎么样免费做公司网站,管理课程培训,python源码下载,黔南州建设局门户网站1 C语言文件操作的回顾 这块博主在讲解C语言时就已经做了很详细的讲解&#xff0c;这里就不详细讲了&#xff0c;直接给出代码。 写操作&#xff1a; #include<stdio.h> #include<stdlib.h> #include<errno.h> #define LOG "log.txt" …

1 C语言文件操作的回顾

这块博主在讲解C语言时就已经做了很详细的讲解,这里就不详细讲了,直接给出代码。

写操作:

#include<stdio.h>    
#include<stdlib.h>    
#include<errno.h>    #define LOG "log.txt"    
int main()    
{    FILE* fw=fopen("LOG","w");    if(fw==NULL)    {    perror("fopen:");    exit(1);                                                                                                                                }    const char* str="hello file\n";    fputs(str,fw);    fputs(str,fw);    fputs(str,fw);    fclose(fw);    return 0;    
}    

读操作:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<errno.h>4 5 #define LOG "log.txt"6 int main()7 {8   FILE* fr=fopen("LOG","r");9   if(fr==NULL)                                                                                                                          10   {11     perror("fopen:");12     exit(1);13   }14 15   char buffer[256];16   fgets(buffer,sizeof(buffer),fr);17   printf("%s\n",buffer);18   fclose(fr);19   return 0;20 }

除了用上面的方法外C语言我们还可以用fprintf/fscanf;fwrite/fread等等。输出到显示器有哪些方法呢?除了用printf外,我们还可以用fprintf参数给stdout,这是由于Linux下一切皆文件的准则,至于为啥我们在后面会给出解释。

在C语言我们知道C会默认打开三个流:标准输入(stdin),标准输出(stdout),标准错误(stderr),而这三个流的返回指针都是FILE*类型。

打开文件的方式:

r Open text file for reading.
The stream is positioned at the beginning of the file.

r+ Open for reading and writing.
The stream is positioned at the beginning of the file.

w Truncate(缩短) file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.

w+ Open for reading and writing.
The file is created if it does not exist, otherwise it is truncated.
The stream is positioned at the beginning of the file.

a Open for appending (writing at end of file).
The file is created if it does not exist.
The stream is positioned at the end of the file.

a+ Open for reading and appending (writing at end of file).
The file is created if it does not exist. The initial file position
for reading is at the beginning of the file,
but output is always appended to the end of the file

如上,是我们之前学的文件相关操作。还有 fseek ftell rewind 的函数,有兴趣的老哥可以取移步博主讲解文件操作那里。


2 系统文件I/O

上面我们介绍的是语言层面的文件操作,但是系统层面的该如何操作呢?
我们一个一个来介绍。

2.1 open

我们可以通过man手册查询:

我们来看看第一个参数:就是要打开文件的名字;第二个参数:这个要重点讲解。

我们翻到手册后面:

这里面出现了一堆宏,究竟是什么鬼呢?其实open的第二个参数是一个位图结构,里面每一个比特位对应这一个宏,如何通过比特位将宏联系起来可以参考这种方式:

#define ONE 0x1
#define TWO 0x2
#define THREE 0x4
#define FOUR 0x8
#define FIVE 0x10// 0000 0000 0000 0000 0000 0000 0000 0000
void Print(int flags)
{if(flags & ONE) printf("hello 1\n"); //充当不同的行为if(flags & TWO) printf("hello 2\n");if(flags & THREE) printf("hello 3\n");if(flags & FOUR) printf("hello 4\n");if(flags & FIVE) printf("hello 5\n");
}int main()
{printf("--------------------------\n");Print(ONE);printf("--------------------------\n");Print(TWO);printf("--------------------------\n");Print(FOUR);printf("--------------------------\n");Print(ONE|TWO);printf("--------------------------\n");Print(ONE|TWO|THREE);printf("--------------------------\n");Print(ONE|TWO|THREE|FOUR|FIVE);printf("--------------------------\n");return 0;
}

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_TRUNC:清空文件O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写
返回值:成功:新打开的文件描述符失败:-1

若要使用mode选项,这里文件的权限还要受umask的影响,如果想要自己在参数中设置的就是文件权限,可以直接用umask(0)来设置文件的默认掩码。

2.2 write

我们可以来试试:

//C库fprintf(stdout, "hello fprintf\n");//系统调用const char *msg = "hello write\n";write(1, msg, strlen(msg)); //+1?
这里问一下大家,这里strlen(msg)是否要+1?我们想想如果是要拷贝\0的话那的确是要加,但是别忘了现在我们是系统调用接口,我们并不想要\0进入到文件中,换一种说法就是在给文件中根本就不认识什么\0,因为\0是由C语言给我们提供的,系统根本就不认识,那上面还有个\n呢?\n文件系统是可以识别到的能够自动换行。所以这里就不要加上\0了。

2.3 read

我们可以来试试:

char buffer[1024];// 这里我们无法做到按行读取,我们是整体读取的。ssize_t n = read(fd, buffer, sizeof(buffer)-1); //使用系统接口来进行IO的时候,一定要注意\0问题if(n > 0){buffer[n] = '\0';printf("%s\n", buffer);}
这里还是有一样的问题,我们将文件中的内容读到字符串中由于文件中是没有\0的,所以需要我们自己手动增加\0.(当然你调用C语言的接口是不会出现这些问题的)

2.4 close

这个很简单,大家自己看看文档就懂了。

之前我们讲了C语言会默认打开3个文件流(stdin,stdout,stderr),那么我们是不是就可以合理猜测我们继续打开文件会与我们默认打开的文件之间有什么关系?

我们上手来验证验证:

  int fd1=open(LOG,O_WRONLY | O_CREAT ,0666);27   int fd2=open(LOG,O_WRONLY | O_CREAT ,0666);28   int fd3=open(LOG,O_WRONLY | O_CREAT ,0666);29   int fd4=open(LOG,O_WRONLY | O_CREAT ,0666);30   int fd5=open(LOG,O_WRONLY | O_CREAT ,0666);31 32   printf("%d %d %d %d %d\n",fd1,fd2,fd3,fd4,fd5);                                                                                       33   close(fd1);34   close(fd2);35   close(fd3);36   close(fd4);37   close(fd5);

运行结果:

我们发现打印的文件描述符是从3开始打印的,并没有从下标0开始打印,这也正好解释了系统默认给我们打开了三个文件,这三个文件的描述符恰好是0 1 2。

那如果在打开新的文件之前我们关闭标准输入和标准错误会发生什么呢?😝😝

    fclose(stdin);//close(0)fclose(stderr);//close(2)    int fd1=open(LOG,O_WRONLY | O_CREAT ,0666);int fd2=open(LOG,O_WRONLY | O_CREAT ,0666);                                                                                          int fd3=open(LOG,O_WRONLY | O_CREAT ,0666);int fd4=open(LOG,O_WRONLY | O_CREAT ,0666);                                                                                             int fd5=open(LOG,O_WRONLY | O_CREAT ,0666);printf("%d %d %d %d %d\n",fd1,fd2,fd3,fd4,fd5);close(fd1);close(fd2);close(fd3);close(fd4);close(fd5);

运行结果:

不难发现此时新打开的文件描述符已经从0开始了。

文件描述符的分配规则是:在文件描述符的表中最小的没有被使用的数组下标分配给新文件。

2.5文件描述符fd

通过对open函数的学习,我们知道了文件描述符就是一个小整数.

0 & 1 & 2

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

0,1,2对应的物理设备一般是:键盘,显示器,显示器

😝😝😝😝谈谈你对文件描述符的理解?

在进程中每打开一个文件,都会创建有相应的文件描述信息struct file,这个描述信息被添加在pcb的struct files_struct中,以数组的形式进行管理,随即向用户返回数组的下标作为文件描述符,用于操作文件

3 各种问题的引入

1 如何理解C语言文件操作和系统调用?

通过上面对C语言文件操作的回顾以及对系统文件调用方法的学习,我们不难知道其实C语言的文件操作必定是封装了系统调用的,还记得在给大家讲解进程时给大家看的这样一张图吗?

我们调用的库函数其实是对系统调用的封装,是为了方便用户使用而进行的二次开发。不仅仅是C语言包括C++/java/python等语言只要想在Linux平台下跑,进行文件操作时必定封装了系统调用。

2 文件操作时第一步是打开文件,为什么要打开文件呢?文件没有被操作时在什么位置?被操作时又在什么位置?文件load到内存load的是文件内容还是属性?

打开文件的目的是将文件load到内存,文件没有被操作时应该在磁盘,操作时应该在内存中,文件load到内存操作系统为了高效会将文件属性load到内存中。

3 是谁打开文件的?

很显然是OS打开文件的(OS是系统的管理者),那么问题来了是谁让OS打开文件的呢?

是不是因为我们创建了一个进程,让进程请求OS帮助我们打开文件,而进程打开文件很显然不只是打开一个文件,那么如何将这些文件管理起来呢?答案是先描述再组织。

操作系统管理所有文件时是通过file结构体来进行管理的,而进程为了管理文件是在进程的task_struck中又增加了一个files_struct来管理本进程中的文件,具体关系如下图所示:

其中files_struct结构体又指向了一个指针数组,指针数组中存放着进程所管理文件的地址,通过下标索引就能够轻易的找到文件,对文件进行操作。

而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来

描述目标文件。于是就有了file结构体表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进

程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数

组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件

描述符,就可以找到对应的文件。

所以此时我们就能够更加清晰的解释为啥在上面我们关闭标准输入和标准错误后文件描述符发生的改变,本质就是0下标映射的标准输入文件和2下标映射的标准错误文件指向发生了改变。

这样通过映射关系建立连接还有一个好处就是将进程管理和文件管理进行了解耦合,将进程管理与文件管理分别管理了起来。


4 重定向

大家来看下面这个代码:

  close(1);    int fd=open(LOG,O_WRONLY | O_CREAT | O_APPEND,0666);    if(fd<0)    {    perror("open:");    exit(1);    }    umask(0);    printf("printf:hello linux\n");    printf("printf:hello linux\n");    printf("printf:hello linux\n");    fprintf(stdout,"fprintf:hello linux\n");    fprintf(stdout,"fprintf:hello linux\n");    fprintf(stdout,"fprintf:hello linux\n");    fprintf(stderr,"stderr:hello linux\n");    fprintf(stderr,"stderr:hello linux\n");    fprintf(stderr,"stderr:hello linux\n");    

大家猜猜运行后结果是啥?

我们运行试试:

我们发现了屏幕中只输出打印了stderr的内容,却没有输出stdout以及用printf打印的内容。

我们查看log.txt中内容:

我们发现内容居然输出到了log.txt文件中,这种现象我们在讲解指令时已经说过了,叫做输出重定向(由于我们打开文件用的O_APPEND,所以叫做追加重定向更加合理)

那么这种重定向的原理是什么呢?

我们画个图来分析分析:

从图中我们清晰的看出由于我们先关闭了文件描述符为1的文件(也就是标准输出文件),当我们打开新文件时就将新文件的地址填充到下标为1的数组中,但是操作系统是不会关注下标为1的数组究竟指向的是谁,他只是负责执行。所以当我们使用printf以及fprintf的标准输出时并不会输出到标准输出文件(屏幕),而是重定向到了log.txt文件中。

同理当我们关闭了标准输入文件时,我们进行标准输入文件的读取时(也就是在键盘上读取)变成了从另外一个文件(此时文件下标为0指向的文件)中读取数据。

有了上面的理解,我们立即实操一下:要求将普通信息输出到nor.txt中,将错误信息输出到err.txt

参考代码:

    close(1); umask(0);      int fd1=open("nor.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);    close(2);                                                                                                                               int fd2=open("err.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);    printf("normal file\n");    printf("normal file\n");    printf("normal file\n");    fprintf(stderr,"err file\n");    fprintf(stderr,"err file\n");    fprintf(stderr,"err file\n");    fprintf(stderr,"err file\n");    

这样我们就将普通信息输出到nor.txt中,将错误信息输出到err.txt中了。

除了这种方式,我们还可以使用命令行的方式来操作:

在file.c中没有关闭标准输出和标准错误文件,我们通过命令行方式来进行分类:

通过这种方式也能够将文件信息正确的分类,那如果我们想要将错误信息也打印到log.txt中呢?

可以通过下面这种方式:

其实实际上这里是省略了一个1的,完整写法可以是这样:

在平时练习时我们无论使用命令行还是在代码中实现都是可以的。

但是我们想想在代码中关闭文件的写法是不是有点太挫了,明明只需要替换一下文件地址就可以了为啥还要整一个关闭文件的操作呢?所以系统又给我们提供了另外一个接口:dup2

一般我们经常使用dup2这个接口。

我们来看看它的参数:

int dup2(int oldfd, int newfd);

第一个参数是oldfd,第二个参数是newfd,那么假如我们将标准输出文件关闭(1)打开了一个新文件,新文件的文件描述符是fd,那么1和fd谁是oldfd?谁是newfd?

我相信很多人都会说1是oldfd,fd是newfd(也包括我自己刚分析也是这样的)

但是大家一定要认真读读官方文档:

官方文档中是这么说的:newfd是oldfd的一份拷贝,换句话说就是最后只剩下了oldfd,newfd被oldfd所覆盖了。那么我们在回归话题,被覆盖的是谁?很明显是1被覆盖了,所以1就是newfd,那么

fd就是oldfd。参数顺序可不能够写反,不然就达不到我们想要的效果。

所以此时我们可以这样写代码:

  //close(1); umask(0);    int fd1=open("nor.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);    dup2(fd1,1);    //close(2);  umask(0);   int fd2=open("err.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);    dup2(fd2,2);                                                                                                                              printf("normal file\n");    printf("normal file\n");    printf("normal file\n");    fprintf(stderr,"err file\n");    fprintf(stderr,"err file\n");    fprintf(stderr,"err file\n");    fprintf(stderr,"err file\n");    

这样也能够很方便的完成我们的需求。

😝😝😝😝谈谈重定向的实现原理?

每个文件描述符都是一个内核中文件描述信息数组的下标,对应有一个文件的描述信息用于操作文件,而重定向就是在不改变所操作的文件描述符的情况下,通过改变描述符对应的文件描述信息进而实现改变所操作的文件

5 缓冲区

在讲述struct file时还有一个小细节要提出,就是OS在维护的struct file时每一个struct都对应着一个缓冲区,可以理解为内核级别的缓冲区,那么这个缓冲区是有何作用?

这个其实是我们进行文件读写操作时将用户空间与内核空间的数据进行来回拷贝,至于何时刷新到用户磁盘中是由操作系统所决定的。

C语言提供的FILE与struct file有关吗?

因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的。所以C库当中的FILE结构体内部,必定封装了fd。这个我们之前都已经提及过。

FILE与struct file本质上是没啥关系的,非要扯一个关系的话就是一种上下层的关系。

来看这样的一段程序:
 close(1);    int fd= open(LOG,O_CREAT | O_APPEND | O_WRONLY,0666);    umask(0);    printf("hello file\n");    fprintf(stdout,"stdout,hello file\n");    close(fd);                       

当我们运行时:

这好像跟我们之前讲的不符合吧?我们关闭了标准输出,打开了新文件后应该将数据重定向到了log.txt中呀,为啥log.txt中还是没有数据?

原因其实就是我们代码在之前的基础上在最后一行写了一句close(fd)

写了这一句为啥会造成这样的结果呢?我们来分析分析。

我们用C语言进行文件操作,在语言层面上会给我们提供一个缓冲区,就像之前我们讲解一个进度条一样,语言会提供一个缓冲区给用户,当我们关闭该文件时缓冲区的内容还没有被刷新到文件中,至于为啥此时不刷新呢?是因为一个规定:显示器刷新采用的是行缓冲,而普通文件刷新采用的是全缓冲

,全缓冲表示必须将缓冲区填满才能够刷新,而显然我们刚才写入的那点儿字符是不足以将缓冲区填满的,所以此时我们在关闭文件前刷新一下缓冲区,数据就能够被正确写入了,我们可以来试试:

运行结果:

这样就得到了我们想要的结果了。

那么我们可能还会思考这个缓冲区是在哪儿的呢?其实该缓冲区是在FILE结构体中的,当我们用fopen打开文件时得到的FILE结构体,而缓冲区就在FILE结构体中。

我们可以看看FILE结构体的源码:

//在/usr/include/libio.h
struct _IO_FILE {int _flags; /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags//缓冲区相关/* The following pointers correspond to the C++ streambuf protocol. *//* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */char* _IO_read_ptr; /* Current read pointer */char* _IO_read_end; /* End of get area. */char* _IO_read_base; /* Start of putback+get area. */char* _IO_write_base; /* Start of put area. */char* _IO_write_ptr; /* Current put pointer. */char* _IO_write_end; /* End of put area. */char* _IO_buf_base; /* Start of reserve area. */char* _IO_buf_end; /* End of reserve area. *//* The following fields are used to support backing up and undo. */char *_IO_save_base; /* Pointer to start of non-current get area. */char *_IO_backup_base; /* Pointer to first valid character of backup area */char *_IO_save_end; /* Pointer to end of non-current get area. */struct _IO_marker *_markers;struct _IO_FILE *_chain;int _fileno; //封装的文件描述符
#if 0int _blksize;
#elseint _flags2;
#endif_IO_off_t _old_offset; /* This used to be _offset but it's too small. */
#define __HAVE_COLUMN /* temporary *//* 1+column number of pbase(); 0 is unknown. */unsigned short _cur_column;signed char _vtable_offset;char _shortbuf[1];/* char* _save_gptr; char* _save_egptr; */_IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

我们再来看一段有趣的代码:

 const char* str="hello write\n";    printf("hello printf\n");    fprintf(stdout,"hello fprintf\n");    write(1,str,strlen(str));    fork();    

当我们运行时:

可以当我们重定向到另外一个文件中时:

奇怪的现象发生了,为啥会比之前多打印两行?为啥hello write没有多打印一行呢?

我们结合上面的思考再来分析分析:我们调用printf和fprintf时是自带缓冲区的,但是当我们重定向到文件中时缓冲区的刷新方式由行缓冲变成了全缓冲,呢我们放在缓冲区的数据就不会被立即刷新,当我们进行fork之后,由于缓冲区的数据也是数据,所以缓冲区的数据也会发生写时拷贝,而当我们退出进程时缓冲区的数据就会被刷新出来,这也就很好的的解释了为啥会多打印两行hello printf和hell fprintf.

至于为啥没有多打印hello write,别忘了write可是系统调用接口,是不会存在什么缓冲区的,会直接将数据刷新到文件对应的缓冲区,所以fork之后就不会存在什么缓冲区数据拷贝的概念了。

综上: printf fprintf 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。另外,我们这里所说的缓冲区,
都是用户级缓冲区。其实为了提升整机性能,OS也会提供相关内核级缓冲区,不过不再我们讨论范围之内。
那这个缓冲区谁提供呢? printf fprint 是库函数, write 是系统调用,库函数在系统调用的“上层”, 是对系统
调用的“封装”,但是 write 没有缓冲区,而 printf fprintf 有,足以说明,该缓冲区是二次加上的,又因为是
C,所以由C标准库提供。

相关文章:

【文件描述符|重定向|缓冲区】

1 C语言文件操作的回顾 这块博主在讲解C语言时就已经做了很详细的讲解&#xff0c;这里就不详细讲了&#xff0c;直接给出代码。 写操作&#xff1a; #include<stdio.h> #include<stdlib.h> #include<errno.h> #define LOG "log.txt" …...

软件测试—进阶篇

软件测试—进阶篇 &#x1f50e;根据测试对象划分界面测试可靠性测试容错性测试文档测试兼容性测试易用性测试安装卸载测试安全性测试性能测试内存泄漏测试 &#x1f50e;根据是否查看代码划分黑盒测试白盒测试灰盒测试 &#x1f50e;根据开发阶段划分单元测试集成测试系统测试…...

设计模式:创建型设计模式、结构型设计模式

目录 前言如何学习设计模式&#xff1f;设计模式基础设计原则 一. 创建型设计模式1. 模板方法2. 观察者模式3. 策略模式 二. 结构型设计模式1. 单例模式2. 工厂模式3. 抽象工厂4. 责任链5. 装饰器6. 组合模式 前言 如何学习设计模式&#xff1f; 明确目的 在现有的设计模式上…...

如何选择多参数水质分析仪?

如何选择适合的多参数水质分析仪&#xff1f; 首先水质检测仪分为实验室&#xff08;台式&#xff09;和户外使用的便携式多参数水质检测仪。我们呢就要了解自己的需 求使用在什么领域&#xff0c;根据使用领域选择仪器&#xff1b;其次就是选择需要测定的指标&#xff0c;最好…...

明确自动化测试目的

明确自动化测试目的 1.提高测试人员的工作成就感和幸福感&#xff0c;减少手工测试中重复性的工作 目前&#xff0c;在大部分中小企业中&#xff0c;手工测试在日常测试工作占据的比例很大。测试人员必须跟随开发团队不断地进行选代式开发和测试。一个功能模块可能在整个测试周…...

DevExpress.XtraGrid.GridControl导出excel需要添加表头

string head ""; head "单号 \t" txtcCode.Text &#xff1b; string foot ""; foot "制单人 \t" "制单日期 \t" "审核人&#xff1a; \t" "审核日期 \t" "修改人 \t&q…...

守护进程Daemon

进程组、对话期和控制终端关系 每个会话有且只有一个前台进程组&#xff0c;但会有0个或者多个后台进程组。产生在控制终端上的输入&#xff08;Input&#xff09;和信号&#xff08;Signal&#xff09;将发送给会话的前台进程组中的所有进程。对于输出&#xff08;Output&…...

学生成绩管理系统 002

学生成绩管理系统 *****************学生成绩管理系统***************** 1、成绩添加 2、成绩输出 3、成绩查询 4、成绩统计 5、成绩排名 6、成绩删除 7、成绩修改 8、成绩按学号排序 0、退出系统 ************************************************** 请选择功能:1 **********…...

换个花样玩C++(4)细聊C++的引用精妙之处

引用是C++引入的新语言特性。而且在日常工作开发过程中,经常会使用到引用,对于一些做系统架构的架构师而言,这也是不可或缺的一门基本功,我在工作中发现,很多人并没有搞清楚引用。因此我在本篇中将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。…...

Linux安装helm

前言 运行环境&#xff1a;CentOS7.9 官方参考文档&#xff1a;官方文档 文章末尾附有一键安装脚本 下载安装包 github下载对应版本的安装包&#xff0c;下载地址 进入对应版本的下载页面&#xff0c;这里以v3.11.3为例 选择对应系统的安装包&#xff0c;这里以linux为例 …...

ATTCK v12版本战术介绍——防御规避(四)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…...

Orangepi Zero2 全志H616(DHT11温湿度检测)

最近在学习Linux应用和安卓开发过程中&#xff0c;打算把Linux实现的温湿度显示安卓app上&#xff0c;于是在此之前先基于Orangepi Zero2 全志H616下的wiringPi库对DHT11进行开发&#xff0c;本文主要记录开发过程的一些问题和细节&#xff0c;主要简单通过开启线程来接收温湿度…...

abbyy是什么软件

ABBYY&#xff0c;一款强大的OCR文字识别软件&#xff01; 在日常的工作中&#xff0c;我们常常需要提取PDF或图片上的大段文字&#xff0c;如果字数少的话&#xff0c;我们可以直接手打&#xff0c;但如果出现大篇幅的文字&#xff0c;那就有点头疼了。今天&#xff0c;我就向…...

软件测试技术(四)白盒测试

白盒测试 白盒测试&#xff08;White Box Testing&#xff09;又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程&#xff0c;而不测试软件产品的功能&#xff0c;用于纠正软件系统在描述、表示和规格上的错误&#xff0c…...

Java基础语法(十二):try-catch块

目录 前言 一、try-catch是什么&#xff1f; 二、其他异常处理机制 总结 前言 Java 异常处理机制是 Java 程序设计中至关重要的一部分。它允许程序员像处理普通数据一样处理异常&#xff0c;并根据异常类型采取合适的措施。其中一个非常基本的异常处理机制是 try-catch 块…...

尚融宝25-投资列表展示以及实现充值功能

目录 一、展示投资列表 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 二、充值功能 &#xff08;一&#xff09;需求 1、需求描述 2、流程 &#xff08;二&#xff09;充值 1、后端 2、前端 &#xff08;三&…...

QML基础模型(Basic Model)

最基本的分离数据与显示的方法是使用Repeater元素。它被用于实例化一组元素项&#xff0c;并且很容易与一个用于填充用户界面的定位器相结合。 最基本的实现举例&#xff0c;repeater元素用于实现子元素的标号。每个子元素都拥有一个可以访问的属性index&#xff0c;用于区分不…...

如果ChatGPT写作论文,保姆及教程以及问题答疑

上次发表“如何用ChatGPT完成论文”后&#xff0c;许多捧场看官评论讨论&#xff0c;也有不少同学实操成功&#xff0c;但更多人寻求帮助。所以今天再整理一篇&#xff0c;把大家的疑问进行说明。 1. ChatGPT写的论文能否被检查出&#xff1f; 有同学反映将一段ChatGPT…...

机器人中的数值优化(三)—— 无约束最优化方法基础、线搜索准则

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…...

vulnhub靶场之bluemoon

1.信息收集 存活主机进行探测&#xff0c;发现主机192.168.239.176存活。 对主机192.168.239.176进行端口扫描&#xff0c;发现21、22、80端口 访问http://192.168.239.176&#xff0c;并查看源码未发现可利用的行为。 进行目录扫描发现可疑路径/hidden_text 浏览器访问h…...

VTK 几何体连通区域分析 vtkPolyDataConnectivityFilter

前言&#xff1a; vtkPolyDataConnectivityFilter 使用过&#xff0c;但网上没有看到完事的教程&#xff1b;这里整理一下&#xff1b; 提取数据集中连通的多边形数据。 该类是一个滤波器&#xff0c;提取cell&#xff08;区域&#xff09; - 拥有公共点或者满足某个阈值 该类…...

scss、css样式中使用变量的方法;Vue动态改变css等样式文件中的变量

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.遇到一些样式 设置的值都是重复的不想重复写&#xff0c;想和js一样定义一个常量&#xff0c;然后直接引用这个常量。 2.想要在js中动态设置样式中的值&#xff0c;在 css、scss等样式表中直接使用。 二、原因及解…...

数据治理在学术上的发展史以及未来展望

数据治理是大数据领域中非常重要的一环&#xff0c;从早期的学术研究到如今的各大企业落地实践&#xff0c;经历了漫长的过程&#xff0c;数据治理的实践落地本身也是一场马拉松。 从百度学术通过精确关键词匹配&#xff0c;搜索中文期刊的“数据治理” 和外文期刊的“data gov…...

【搭建博客】宝塔面板部署Typecho博客,并发布上线访问

目录 前言 1.安装环境 2.下载Typecho 3.创建站点 4.访问Typecho 5.安装cpolar 6.远程访问Typecho 7.固定远程访问地址 8.配置typecho 前言 Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&…...

【Spring篇】IOC相关内容

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、bean基础配置 1.bean基础配置(id与class) 2.bean的name属性 3.bean作用范围scope配置 二、bean实例化 1.构造方法实例化 2.分析Spring的错误信息 3.静态工厂实例化 4.实例工厂 5.FactoryBean 三…...

Python超矩形

文章目录 距离函数矩形分割 Rectangle是 scipy.spatial中封装的类&#xff0c;其构造函数只需输入最小值和最大值的数组即可&#xff0c;并且可通过内置的 volume方法计算广义的体积。 from scipy.spatial import Rectanglerec Rectangle((0,0), (5,5)) print(rec.maxes) …...

【软考数据库】第五章 计算机网络

目录 5.1 网络功能和分类 5.2 OSI七层模型 5.3 TCP/IP协议 5.4 传输介质 5.5 通信方式和交换方式 5.6 IP地址 5.7 IPv6 5.8 网络规划和设计 5.9 其他考点补充 5.10 网络安全技术 5.11 网络安全协议 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff…...

深眸科技|深度学习、3D视觉融入机器视觉系统,实现生产数智化

随着“中国制造2025”战略加速落实&#xff0c;制造业生产线正在加紧向智能化、自动化和数字化转型之路迈进。而人工智能技术的兴起以及边缘算力持续提升的同时&#xff0c;机器视觉及其相关技术也在飞速发展&#xff0c;并不断渗透进工业领域&#xff0c;拓展应用场景的同时&a…...

DateFormat使用时需要注意:多线程下需要特殊处理

前言 工作或学习过程中难免会接触到时间&#xff08;Date&#xff09;相关的内容&#xff0c;比如String类型转为Date类型&#xff0c;或者Date类型转为String类型&#xff0c;jdk为我们提供了一套完善的日期格式化工具&#xff0c;DateFormat类&#xff0c;使用者可以使用该接…...

Packet Tracer - 研究直连路由

Packet Tracer - 研究直连路由 目标 第 1 部分&#xff1a;研究 IPv4 直连路由 第 2 部分&#xff1a;研究 IPv6 直连路由 拓扑图 背景信息 本活动中的网络已配置。 您将登录路由器并使用 show 命令发现并回答以下有关直连路由的问题。 注&#xff1a;用户 EXEC 密码是 c…...