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

哪个免费的网站建设好wordpress模板里写php

哪个免费的网站建设好,wordpress模板里写php,遵义最新新冠病情况,晋江市住房和城乡建设局网站是多少fd和缓冲区 1. 文件描述符fd1.1. 概念与本质1.2. 打开文件的管理1.3. 一切皆文件的理解1.4. 分配规则1.5. 重定向的本质1.5.1. dup2 2. FILE中的缓冲区2.1. 概念2.2. 存在的原因2.3. 类型(刷新方案)2.4. 存放的位置2.4.1. 代码证明、现象解释 2.5. 模拟C标准库中的方法 1. 文件… fd和缓冲区 1. 文件描述符fd1.1. 概念与本质1.2. 打开文件的管理1.3. 一切皆文件的理解1.4. 分配规则1.5. 重定向的本质1.5.1. dup2 2. FILE中的缓冲区2.1. 概念2.2. 存在的原因2.3. 类型(刷新方案)2.4. 存放的位置2.4.1. 代码证明、现象解释 2.5. 模拟C标准库中的方法 1. 文件描述符fd 1.1. 概念与本质 定义是用于标识打开文件的非负整数。 文件描述符的本质就是数组下标。 1.2. 打开文件的管理 问为什么访问文件的系统调用接口都必需使用文件描述符fd 当我们打开一个文件时OS会在内存中创建一个file结构体用来描述被打开的文件这个结构体包含了文件的当前读写位置、文件描述符、文件路径等相关信息。 struct file {struct path f_path; // 文件路径struct file_operations *f_op; // 文件操作指针int _fileno; //文件描述符loff_t f_pos; // 当前文件读写位置... };struct file_operations {int (*open)(struct inode *, struct file *);int (*release)(struct inode *, struct file *);ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);loff_t (*llseek)(struct file *, loff_t, int);... };因为open函数是由进程来执行的所以必须让进程和文件关联起来。在每一个task_struct结构体中都包含了一个struct file_struct*类型的指针它指向了一个包含文件描述符表的file_struct结构体。 struct task_struct {...files_struct *files; // 文件描述符表... };文件描述符表是一个file*类型的指针数组每个元素都指向一个打开的文件而文件描述符就是此数组的下标所以只要拿到了文件描述符表就可以索引到对应的文件。 struct files_struct {...struct file *fd[FD_SETSIZE]; // 文件描述符数组... };打开文件本质在内核中把文件在磁盘上找到、内容和属性加载在内存中创建file结构体属性、方法、缓冲区都初始化然后把结构体链入到系统管理文件的链表中并且在指针数组中找到一个数据下标再把它的地址填充进来最后把数组下标(fd)返回给上层用户应用层得到fd值。 a. 把数据写到文件中write 因为write是由进程通过系统调用来执行的而系统能够识别出是哪个进程在请求服务即OS可以找到进程(task_struct); 因为write需要访问文件所以通过fd直接在数组中进行索引从而找到文件。再把用户空间中的缓冲区buf中的数据拷贝到内核空间中的文件结构体对象的缓冲区中最后让OS把缓冲区的刷新到磁盘文件中。 b. 从文件中读取数据read 因为read是由进程通过系统调用来执行的而系统能够识别出是哪个进程在请求服务即OS可以找到进程(task_struct); 因为read需要访问文件所以通过fd直接在数组中进行索引从而找到文件。如果文件结构体对象的缓冲区中有内容就直接读取到用户空间的缓冲区buf中反之就让OS把磁盘文件中的数据导入到内存中。 c. 关闭文件close 因为close是由进程通过系统调用来执行的而系统能够识别出是哪个进程在请求服务即OS可以找到进程(task_struct); 因为close需要访问文件所以通过fd直接在数组中进行索引从而找到文件。OS再将文件结构体对象进行释放。 1.3. 一切皆文件的理解 一、文件系统的抽象和VFS VFS(Virtual File System)虚拟文件系统是Linux内核的一个软件层它提供了一套统一的接口来访问各种类型的文件系统和硬件设备。 这种设计使得用户和应用程序能够通过调用相同的系统调用如open、write、read等来操作不同的文件系统而无需关心底层文件系统的具体实现细节。 文件操作结构体file_operations在linux内核中每个打开的文件都有一个指向file_operations结构体的指针它包含一系列函数指针即它定义了文件的各种操作(如读、写、打开、关闭)其内包含的函数指针指向具体的实现方法。 不同的文件系统或硬件的驱动程序会提供这些函数的具体实现但这些函数的参数类、返回值类型、函数名必须与定义在file_operations结构体中的函数指针相匹配。 struct file {struct inode *f_inode; // 文件的inodestruct file_operations *f_op; // 文件操作函数指针unsigned long f_flags; // 文件标志loff_t f_pos; // 当前文件位置// 其他信息... };struct file_operations { //文件操作函数int (*open)(struct inode *, struct file *);int (*release)(struct inode *, struct file *);ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);loff_t (*llseek)(struct file *, loff_t, int);// 其他操作... };VFS的核心思想是通过抽象和封装来屏蔽底层硬件的差异。 二、面向对象编程的类比 多态性在面向对象编程中多态性允许我们使用统一的接口来调用不同的实现。在VFS中是通过函数指针来实现多态性不同的文件系统的具体实现方法不同但上层应用程序只使用统一的函数指针接口。 封装VFS屏蔽了文件系统和硬件设备的差异即隐藏了底层的细节使得上层应用程序可以使用统一的函数指针接口来访问文件。 上层代码无需关心底层操作的实现只需按照统一接口的规范进行操作。 不能从显示器读数据平时在显示器输入的东西显示器也显示了不是通过显示器把数据交给了你的程序而是从键盘中输入数据你的程序先从键盘中读到的为了让用户看到你输入的数据程序就把数据同步的给显示器拷贝了一份。 1.4. 分配规则 fd分配规则最小未被使用的数组下标会被分配给最新打开的文件。 #includestdio.h #includesys/types.h #includefcntl.h #includeunistd.h #includesys/stat.h #includestring.hint main() {close(1);//关闭标准输出流int fd1 open(log.txt, O_WRONLY|O_CREAT|O_TRUNC, 0666);printf(fd1: %d\n, fd1); //printf默认向stdin—fd 1打印printf(hello world\n); //输出重定向本来应该把内容向显示器文件进行写入更改为向磁盘文件进行写入return 0; }#includestdio.h #includesys/types.h #includefcntl.h #includeunistd.h #includesys/stat.h #includestring.hint main() {close(0); //关闭标入输出流 int fd2 open(data.txt, O_RDWR);printf(fd2: %d\n, fd2); char buff[64]; fgets(buff, 64, stdin); //输入重定向本来应该从键盘文件中读取的内容更改为从磁盘文件中读取printf(%s\n, buff); return 0;}1.5. 重定向的本质 重定向的本质更改文件描述符表的内容即更改文件描述符(stdin、stdou、stderr)的指向使得原本要写入到标准输出的数据被重定向到其他文件、或者原本要从标准输入中读取的数据重定向到来自于其他文件。 1.5.1. dup2 int dup2int oldfdint newfd) 功能将stdin、stdout、stderr重定向到文件或其他设备。 参数oldfd要被复制的文件描述符newfd目标文件的描述符。 返回值成功返回新的文件描述符(即newfd)。出错时返回 -1并设置 errno以指示错误。 #includestdio.h #includesys/types.h #includefcntl.h #includeunistd.h #includesys/stat.hint main() {int fd open(log.txt, O_WRONLY|O_CREAT|O_TRUNC, 0666);dup2(fd, 1);printf(hello zzx\n);return 0; }2. FILE中的缓冲区 2.1. 概念 概念本质是一块内存区域用于暂时存放数据以便更高效地处理输入、输出操作。 此处的缓冲区(如进度条中的缓冲区等)不是内存中的缓冲区它是语言层面的缓冲区即C语言自带的缓冲区由C语言标准库提供。 缓冲区也会为格式化输入、输出操作提高场所。 printf函数工作原理它会将其他类型的数据如整数、浮点数等转换为字符数据即字符串)转化后的数据会被写入到FILE结构体维护的缓冲区中根据条件刷新缓冲区。 scanf函数工作原理scanf会从输入流中读取字符数据将读取的数据转化为相应的格式化数据格式化的数据会被存放到FILE结构体维护的缓冲区中最终被存放到变量中。 2.2. 存在的原因 提高使用者的效率 减少了C接口的使用时间从而减少了用户的等待时间提高了使用者的效率调用C接口时只要将数据交给了缓冲区就可立即返回无需等待实际的写入操作完成意味这用户可以更快地继续执行其他任务。 提高计算机整体的拷贝效率。 调用系统调用接口都是有成本的有时间和空间的开销。 减少调用系统调用的次数提高了计算机整体的拷贝效率缓冲区可以聚集大量数据直到缓冲区满了再调用一次系统调用进行实际的数据写入即进行一次拷贝。 故事理解张三给李四送生日礼物只需要将礼物交给附近的菜鸟驿站就可立即其他活动无需亲自送到的李四那即提高了使用者的效率。菜鸟驿站不是每次只处理一个包裹而是收集多个包裹直到它们填满整个运输车辆然后再一次性运送到目的地即聚集数据一次拷贝提高了计算机的整体效率。—— 菜鸟驿站就相当于缓冲区。 2.3. 类型(刷新方案) 一、无缓冲、无刷新 无缓冲无刷新意味着数据不会暂存在缓冲区中而是立即被写入到目标设备中。 适用场景需要立即看到结果、实时性要求很高的场景如实时系统、设备驱动程序。 优点保证了数据的即时可见性。 缺点性能下降频繁的使用系统调用会增加开销。 二、全缓冲、全刷新 全缓冲全刷新缓冲区满了或者关闭文件时缓冲区的数据才会被刷新到目的设备中。 适用场景文件的读写操作尤其是大文件。 优点减少了系统调用的次数提高了性能。 缺点可能会丢失数据如在缓冲区的数据未被刷新前发生崩溃则这部分的数据就会丢失。 三、行缓冲、行刷新 行缓冲行刷新意味着遇到换行符\n缓冲区的数据就会被立即刷新到目的设备中。 适用场景标准输入输出(显示器)。 当调用c语言接口fflush()进行强制刷新 进程退出时或文件关闭时自动刷新。 2.4. 存放的位置 缓冲区存放在FILE结构体中即缓冲区是被FILE结构来维护的。 每个通过标准C库函数打开的文件都拥有自己的缓冲区。 fwrite等标准库函数会先将数据拷贝到缓冲区中然后根据一定的条件调用系统调用接口进行刷新。 文件操作的系统调用接口其实是个拷贝函数它将数据从语言层的缓冲区拷贝到内存的缓冲区。 typedef struct _IO_FILE FILE;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 putbackget 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 its too small. */#define __HAVE_COLUMN /* temporary *//* 1column 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 };2.4.1. 代码证明、现象解释 #includestdio.h #includeunistd.h #includestring.hint main() {const char* s1 hello write\n;write(1, s1, strlen(s1)); //调用系统调用直接将数据写入到内核中//fprintf、fwrite为库函数向显示器进行写入行刷新(遇到换行符)const char* s2 hello fprintf\n;fprintf(stdout, %s, s2); const char* s3 hello fwrite\n;fwrite(s3, strlen(s3), 1, stdout); fork(); //在创建子进程之前缓冲区中的数据全部被刷新到内核中了return 0; }现象1解释write()为系统调用接口直接将数据写入到内核中fprintf、fwrite为库函数先将数据写入到缓冲区中因为它们都是向显示器进行写入而写入显示器是行刷新(遇到换行符\n进行刷新)所以fork创建子进程前缓冲区中的数据全部被刷新到内核中了。 Tips刷新到内核的数据不属于进程的数据存放在缓冲区中的数据属于进程的数据。 现象2解释重定向到普通文件时数据刷新缓冲区的方式由行缓存变为全缓冲C语言接口自带缓冲区所以它会将数据写入到缓冲区中就不会立即刷新。fork创建子进程父子共享缓冲区的数据但是进程退出后统一进行刷新。刷新缓冲区是清空缓冲区是修改数据的一种方式所以父子进程的数据会发生写时拷贝父子进程分别刷新各自的缓冲区随即产生两份数据。write是系统调用接口直接将数据写入到内核中不存在所谓的缓冲区。 一般C库函数写入文件时是全缓冲 写入到显示器时是行缓冲。 重定向到普通文件时数据刷新缓冲区的方式由行缓存变为全缓冲。 刷新缓冲区是清空缓冲区是修改数据的一种方式。 2.5. 模拟C标准库中的方法 #pragma once //防止头文件重复包含#includestdio.h #includeunistd.h #includesys/types.h #includesys/stat.h #includefcntl.h #includestring.h #includestdlib.h#define SIZE 4094//定义缓冲区的类型 #define None_Flush 1 #define Full_Flush (11) #define Line_Flush (12)//自定义file结构体 typedef struct myfile{int fileno; //文件描述符int pos; //当前读写位置int cap; //缓冲区容量int flush_mode; //缓冲区类型char buff[SIZE]; //输出缓冲区 }myfile;myfile* my_fopen(const char* path, const char* mode); //打开文件 void my_fclose(myfile* fp); //关闭文件 int my_fwrite(myfile* fp, const char* str, int size); //读文件 void my_fflush(myfile* fp); //刷新缓冲区 void print_buff(myfile* fp); //打印file结构体的内容便于测试#includemystdio.h const char* To_string(int flush_mode) //将整形转化为字符串 {if(flush_mode None_Flush) return Nono Flush;else if(flush_mode Line_Flush)return Line_Flush;else if(flush_mode Full_Flush)return Full_Flush; }void print_buff(myfile* fp) //打印file结构体的内容 {printf(fd: %d\n, fp-fileno);printf(fd: %d\n, fp-pos);printf(buff: %s\n, fp-buff);printf(flush_mode: %s\n, To_string(fp-flush_mode)); }myfile* my_fopen(const char* path, const char* mode) //打开文件 {int flag -1; //确认它是以何种方式打开文件if(strcmp(mode, r) 0)flag O_RDONLY; else if(strcmp(mode, w) 0)flag O_WRONLY|O_CREAT|O_TRUNC; else if(strcmp(mode, a) 0)flag O_WRONLY|O_CREAT|O_APPEND;else return NULL;//底层调用系统调用接口open打开文件int fd -1; if(flag O_RDONLY) //读不需要创建新的文件fd open(path, flag); else //写、追加都需要创建新的文件并且需要设置文件权限{ umask(0); fd open(path, flag, 0666);}if(fd 0) //调用open失败return NULL;//为打开的文件创建一个file类型的结构体用来记录描述打开文件的信息myfile* fp (myfile*)malloc(sizeof(myfile));if(fp NULL) //malloc调用1失败return NULL;//file结构体对象构建成功进行初始化fp-fileno fd;fp-pos 0;fp-cap SIZE;fp-flush_mode Line_Flush;return fp; }void my_fflush(myfile* fp) //刷新缓冲区 {if(fp-pos 0) return ;//底层调用系统调用接口writewrite(fp-fileno, fp-buff, fp-pos);//清空缓冲区的内容fp-pos 0; } void my_fclose(myfile* fp) //关闭文件 {my_fflush(fp); //文件关闭自动刷新缓冲区close(fp-fileno);free(fp); }int my_fwrite(myfile* fp, const char* str, int size) //向文件写内容 {//将数据先拷贝到用户层的缓冲区内memcpy(fp-buff fp-pos, str, size); fp-pos size; //判断是否需要刷新if(fp-flush_mode Line_Flush fp-buff[fp-pos - 1] \n) //行刷新my_fflush(fp);else if(fp-flush_mode Full_Flush fp-pos fp-cap) //全刷新my_fflush(fp);return 0; }int main() { myfile* fp my_fopen(data.txt, w); if(fp NULL) return 1; char buf[SIZE]; int cnt 5; while(cnt--) { snprintf(buf, SIZE, helloworld: %d :, cnt); //字符串的拼接my_fwrite(fp, buf, strlen(buf)); print_buff(fp); sleep(1); } my_fclose(fp); return 0; }
http://www.sczhlp.com/news/236256/

相关文章:

  • 大兴高端网站建设如何查看百度指数
  • 0基础做网站wordpress添加中文语言
  • 刷题日记—链表—快慢指针的应用
  • newDay16
  • 【SHADER系列】(四)UGUI 渐变/平滑遮罩 SoftMask
  • 刷题日记——链表—二进制转十进制,虚拟头结点
  • 广州比较好的网站建设郑州做网站报价
  • 国内做外贸网站的有哪些资料wordpress栏目更改无法显示
  • 济南网站开发xywlcn施工企业成本管理的方法与手段
  • ps网站制作教程如何做网络营销直播
  • 建立个网站哪些公司做网站好
  • 江门论坛建站模板网页版我的世界
  • 企业申报网站wordpress吃内存cpu
  • 建设直播网站软件戴尔的网站建设有哪些主要特色
  • 成都旅游的网站建设风中有朵雨做的云在线网站
  • 网站icp备案流程机电设备网站模板
  • 杭州最好的网站设计公司怎样在浏览器上找网站
  • 建设网站的服务端口设计自己的网站
  • 网站公司哪家最专业wordpress管理页面地址
  • 深圳市建设局工程交易中心网站公司展示网站模板
  • 网站的后期维护自己怎么做引流推广推广微信hyhyk1效果好
  • hexo建设网站深圳建网站哪个公
  • 东莞建设公司网站如何使用wordpress
  • 合肥水运建设工程监理网站揭阳智能模板建站
  • 个人主题网站设计东莞营销型网站
  • 武陟住房和城乡建设局网站cnzz统计代码放在后台网站为什么没显示
  • 网站建设公司网站模板做效果图去哪个网站接活
  • 哪个网站做x展架比较好 知乎龙岩网红街在哪里
  • 网页网站设计用什么软件刷推广软件
  • 网站开发和网站运营北京网站策划公司