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

国外设计网站怎么登陆网站关键词是什么意思

国外设计网站怎么登陆,网站关键词是什么意思,程序员培训要多长时间,wordpress/woocommerce爆笑教程《看表情包学Linux》#x1f448; 猛戳订阅#xff01;​​​​​ #x1f4ad; 写在前面#xff1a;通过上一章节的讲解#xff0c;想必大家已对文件系统基本的接口有一个简单的了解#xff0c;本章我们将继续深入讲解#xff0c;继续学习系统传递标志位…爆笑教程《看表情包学Linux》 猛戳订阅​​​​​ 写在前面通过上一章节的讲解想必大家已对文件系统基本的接口有一个简单的了解本章我们将继续深入讲解继续学习系统传递标志位介绍 O_WRONLY, O_TRUNC, O_APPEND 和 O_RDONLY。之后我们就正是打开文件描述符 fd 的大门了之前我们所探讨讲解的系统文件操作都是为了给文件描述符做铺垫的可见这这一块知识点是相当的重要。话不多说让我们正式开始本章的学习 本章目录 Ⅰ. 系统传递标记位 0x00 引入O_WRONLY 没有像 w 那样完全覆盖 0x01 O_TRUNC 截断清空对标 w 0x02  O_APPEND 追加对标 a 0x03 O_REONLY 读取 Ⅱ. 文件描述符fd 0x00 引入open 参数的返回值 0x01 文件描述符的底层理解 0x02 理解Linux 下一切皆文件 0x03 初识 VFS虚拟文件系统 0x04 回头看问题fd 的 0,1,2,3...  本篇博客全站热榜排名未上榜 Ⅰ. 系统传递标记位 0x00 引入O_WRONLY 没有像 w 那样完全覆盖 语言在  模式打开文件时文件内容是会被清空的但是 O_WRONLY 好像并非如此 代码演示当前我们的 log.txt 内有 5 行数据现在我们执行下面的代码 int main(void) {umask(0);// 当我们只有 O_WRONLY 和 O_CREAT 时int fd open(log.txt, O_WRONLY | O_CREAT, 0666);if (fd 0) {perror(open); return 1;}printf(fd: %d\n, fd); // 修改向文件写入 2 行信息int cnt 0;const char* str 666\n; // 修改内容改成666方便辨识while (cnt 2) {write(fd, str, strlen(str));cnt;}close(fd);return 0; } 运行结果如下 ❓ 疑点O_WRONLY 怎么没有像 w 那样完全覆盖 我们以前在  语言中w 会覆盖把全部数据覆盖每次执行代码可都是会清空文件内容的。  而我们的 O_WRONLY 似乎没有全部覆盖曾经的数据被保留了下来并没有清空 其实没有清空根本就不是读写的问题而是取决于有没有加 O_TRUNC 选项 因此只有 O_WRONLY 和 O_CREAT 选项是不够的 如果想要达到 w 的效果还需要增添 O_TRUNC如果想到达到 a 的效果还需要 O_APPEND 下面我们就来介绍一下这两个选项 0x01 O_TRUNC 截断清空对标 w 在我们打开文件时如果带上 O_TRUNC 选项那么它将会清空原始文件。 如果文件存在并且打开是为了写入O_TRUNC 会将该文件长度缩短 (truncated) 为 0。 也就是所谓的 截断清空 (Truncate Empty) 我们默认情况下文件系统调用接口不会清空文件的 但如果你想清空就需要给 open() 接口 带上 O_TRUNC 选项 代码演示让 open() 达到 fopen 中 w 模式的效果 int main(void) {umask(0);int fd open(log.txt, O_WRONLY | O_CREAT | O_TRUNC, 0666);if (fd 0) {perror(open); return 1;}printf(fd: %d\n, fd); // 向文件写入 2 行信息int cnt 0;const char* str 666\n;while (cnt 2) {write(fd, str, strlen(str));cnt;}close(fd);return 0; } 运行结果如下 然而  语言的 fopen 函数只需要浅浅地标上一个 w 就能搞定了 fopen(log.txt, w); 调一个 w 就以写的方式打开了不存在会自动创建并且会完全覆盖原始内容是如此的简单 它对应的底层 open 调用调用接口所传入的选项就是 O_WRONLY, O_CREAT, O_TRUNC。 由此可见 的 fopen 是多么的好用open 不仅要传这么多选项而且属性也要设置 open(log.txt, O_WRONLY | O_CREAT | O_TRUNC, 0666); fopen(log.txt, w);0x02  O_APPEND 追加对标 a 上一章我们复习了 a 模式 语言中我们以 a 模式打开文件做到追加的效果。 现在我们用 open追加是不清空原始内容的所以我们不能加 O_TRUNC得加 O_APPEND int fd open(log.txt, O_WRONLY | O_CREATE | O_APPEND, 0666); 代码演示让 open() 达到 fopen 中 a 模式的效果 #include stdio.h #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include string.hint main(void) {umask(0);int fd open(log.txt, O_WRONLY | O_CREAT | O_APPEND, 0666);if (fd 0) {perror(open); return 1;}printf(fd: %d\n, fd); // 向文件写入 2 行信息int cnt 0;const char* str 666\n;while (cnt 2) {write(fd, str, strlen(str));cnt;}close(fd);return 0; } 运行结果如下 我们再来对照  语言的 fopen想做到这样的效果只需要一个 a open(log.txt, O_WRONLY | O_CREAT | O_APPEND, 0666); fopen(log.txt, a); 实际上系统级别的接口本来就是被文件接口封装的fopen 是系统级文件接口的底层实现。 我们的 a, w, r... 在底层上实际上就是这些 O_ 组合而成的使用系统接口麻烦吗 当然麻烦要记这么多东西当然还是 C 语言用的更爽了一个字母标明文件模式就行了。 0x03 O_REONLY 读取 如果我们想读取一个文件那么这个文件肯定是存在的我们传 O_RDONLY 选项 int main() {umask(0);int fd open(log.txt, O_RDONLY);if (fd 0) {perror(open);return 1;}printf(fd: %d\n, fd);char buffer[128];ssize_t s read(fd, buffer, sizeof(buffer) - 1);if (s 0) {buffer[s] \0; // 最后字符串序列设置为 \0 printf(%s, buffer);}close(fd); return 0; } 运行结果如下 Ⅱ. 文件描述符fd 0x00 引入open 参数的返回值 int fd open(log.txt, O_WRONLY | O_CREAT, 0666); 我们使用 open 函数举的例子中一直是用一个叫做 fd 的变量去接收的。 fopen 中我们习惯使用 fp / pf 接收返回值那是因为是 fopen 的返回值  FILE* 是文件指针 file pointer 的缩写即是 fp所以我们就习惯将这个接收 fopen 返回值的变量取名为 fp / pf。 那为什么接收 open 的返回值的变量要叫 fd 呢 这个 fd 究竟是何方神圣我们现在就揭开其神秘面纱一睹芳容它就是…… open 如果调用成功会返回一个新的 文件描述符 (file descriptor) 如果失败会返回 -1 。 失败 (success) 成功 (failed) 代码演示我们现在多打开几个文件观察 fd 的返回值 int main(void) {int fd_1 open(log1.txt, O_WRONLY | O_CREAT, 0666);int fd_2 open(log2.txt, O_WRONLY | O_CREAT, 0666);int fd_3 open(log3.txt, O_WRONLY | O_CREAT, 0666);int fd_4 open(log4.txt, O_WRONLY | O_CREAT, 0666);int fd_5 open(log5.txt, O_WRONLY | O_CREAT, 0666);printf(fd_1: %d\n, fd_1); printf(fd_2: %d\n, fd_2); printf(fd_3: %d\n, fd_3); printf(fd_4: %d\n, fd_4); printf(fd_5: %d\n, fd_5); close(fd_1);close(fd_2);close(fd_3);close(fd_4);close(fd_5);return 0; } 运行结果如下 我们发现这 open 的 5 个文件的  (返回值) 分别是  那么问题了来了 ① 为什么从 3 开始而不是从 0 开始0, 1, 2 去哪了 0标准输入键盘stdin1标准输出显示器stdout2标准错误显示器stderr 系统接口认的是外设而  标准库函数认的是 #include stdio.hextern FILE* stdin; extern FILE* stdout; extern FILE* stderr; 系统调用接口那么 stdin, stdout, stderr 和上面的 0,1,2 又有什么关系呢 想解决这个问题我们得先说说 我们知道FILE* 是文件指针那么  是什么呢它是  库提供的结构体。 只要是结构体它内部一定封装了多个成员 虽然  用的是 FILE*但是系统的底层文件接口只认 也就是说 标准库调用的系统接口对文件操作而言系统接口只认文件描述符。 文件操作的系统接口属于是六亲不认只认 fd 因此 内部必定封装了文件操作符   下面我们来验证一下先验证 0,1,2 就是标准 代码验证0 是标准输入 (stdin) int main(void) {// 验证 0,1,2 就是标准 I/Ochar buffer[1024];ssize_t s read(0, buffer, sizeof(buffer) - 1);if (s 0) {buffer[s] \0;printf(echo: %s, buffer);} }运行结果如下 代码验证stdout 标准写入(1) 和 stderr 错误写入(2) int main(void) {const char* s Hello, write something\n;write(1, s, strlen(s)); // 1向标准输入写入write(2, s, strlen(s)); // 2向标准错误写入 } 运行结果如下 1 和 2 的区别我们放到后面再讲 至此我们证明了 —— 每次我们打开文件虽然打开的是 3但是可以像 3,4,5,6…… 去写默认系统就会帮我们打开 0 (标准输入, stdin) 1 (标准输出, stdout)2 (错误输出, stderr)  下面我们要做的是验证一下 0,1,2 和 stdin, stdout 和 stderr 的对应关系。 根据我们目前的分析 本来就是一个结构体 因为系统只认  所以  语言本身调用的一定是系统结构这就直接决定了不管怎么封装底层必须有  代码验证下面我们就来证明  的存在证明 stdin, stdout 和 stderr 的对应关系 int main(void) {printf(stdin: %d\n, stdin-_fileno);printf(stdout: %d\n, stdout-_fileno);printf(stderr: %d\n, stderr-_fileno); }运行结果如下 这……就是透过现象看本质 函数接口的对应fopen / fclose / fread / fwrite    open / close / read / write 数据类型的对应(FILE* → FILE) →  结论我们用的  语言接口一定封装了系统调用接口 ②  这个 0, 1, 2, 3, 4, 5……是不是有点像数组下标 咳咳……不是有点像它就是数组下标 刚才返回  的用的都是系统接口是操作系统提供的返回值。 既然操作系统能给你那说明操作系统内部是有的。 文件描述符的值为什么是 1,2,3,4,5... 为了理解这个问题我们需要做大量的铺垫 0x01 文件描述符的底层理解 逻辑推导进程内存文件的关系 → 内存 → 被打开的文件实在内存里面的 一个进程可以打开多个文件所以在内核中进程与打开的文件之比为 所以系统在运行中有可能会存在大量的被打开的文件 → OS 要对这些被打开的文件进行管理 OS 如何管理这些被打开的文件呢还是我们老生常谈的那句话 先描述再组织 所以对我们来说一个文件被打开不要片面的认为只是对文件内容动动手脚 它还要 在内核中创建被打开文件的内核数据结构 —— 先描述 struct file {// 包含了你想看到的文件的所有大部分 内容 属性struct file* next;struct file* prev; }; * 注上面的代码是便于理解的可不是内核真正的代码真的可远比这复杂得多 如果你在内核中打开了多个的文件那么系统会在内核中为文件创建一个 struct file 结构。 可以通过 next 和 prev 将其前后关联起来内核的链表结构有它自己的设计这里我们不关注。 既然你打开了一个文件就会创建一个 struct file那么你打开多个文件 系统中必然会存在大量的 struct file并且该结构我们用链表的形式链接起来 如此一来对被打开的文件的管理就转化成为了对链表的增删改查 这一幕怎么有些似曾相识我们之前讲进程好像就是这么讲的task_struct 进程与打开的文件之比为 进程能打开这么多文件那么 进程如何和打开的文件建立映射关系打开的文件哪一个属于我的进程呢 在内核中task_struct 在自己的数据结构中包含了一个 struct files_struct *files (结构体指针) struct files_struct *files; 而我们刚才提到的 数组 就在这个 file_struct 里面该数组是在该结构体内部的一个数组。 struct file* fd_array[]; 该数组类型为 struct file* 是一个 指针数组里面存放的都是指向 struct file 的指针 指向 struct file 的指针是不是恍然大悟这不就是文件的 stuct file 结构么没错 数组元素映射到各个被打开的文件直接指向对应的文件结构若没有指向就设为 NULL。 此时我们就建立起了 进程 和 文件 之间映射关系的桥梁。 看图理解在内核中实现的映射关系 如此一来进程想访问某一个文件只需要知道该文件在这张映射表中的数组下标。 上面这些就是在内核中去实现的映射关系了这个下标 0,1,2,3,4 就是对应的文件描述符   我们调用的 open / read / write / close 接口都需要  可以理解为买彩票由于关系复杂就不给大家讲故事了自行理解 ① 选号当我们 open 打开一个新的文件时先创建 struct file然后在当前的文件描述表中分配一个没有被使用的下标把 stuct file 结构体的地址填入 struct file* 中然后通过 open 将对应的  返回给用户比如 3此时我们的  变量接收的 open 的返回值就是 3 了。 ② 兑奖后续用户再调用 read, write 这样的接口一定传入了对应的 找到了特定进程的 files在根据对应的  索引到指针数组通过 sturct file* 中存储的 struct file 结构体地址找到文件对象之后就可以对相关的操作了。 总结其本质是因为它是一个数组下标系统中使用指针数组的方式建立进程和文件之间的关系。将  返回给上层用户上层用户就可以调用后续接口 (read, write...) 来索引对应的指针数组找到对应文件这就是  为什么是 0,1,2... 的原因了 0x02 理解Linux 下一切皆文件 我们上面说的 0,1,2 → stdin, stdout, stderr → 键盘, 显示器, 显示器这些都是硬件啊 也用你上面讲的 struct file 来标识对应的文件吗在解答这个问题之前我们需要讲清楚 Linux 下一切皆文件 一切皆文件这个话题在之前的章节我们已经提过了但是当时由于知识点尚未展开没法讲解。 现在我们到了去讲解这个概念的时侯了希望大家可以尝试去理解 Linux 下一切皆文件 。 在这之前我们先说个题外话其实  语言也是可以模拟面向对象的 代码演示在  中用 struct 模拟面向对象 struct file {// 对象的是属性// 函数指针void *(readp)(struct file* filep, int fd ...);void *(writep)(struct file* filep, int fd...); };void read(struct file* filep, int fd...) {// 逻辑代码 }void write(struct file* filep, int fd...) {// 代码 } C 本身就是从 C 语言衍生出来的并不是 万丈高楼平地起 的。 是大量工程实战后不断积累的产物所以 C 的面向对象实际上在 C 中也能实现。 我们举个例子我们在计算机中有各种硬件键盘、显示器、磁盘、网卡、其他硬件... 对我们现阶段而言这些设备我们统一称之为 外设下面我们来看图。 看图理解注意下图的 上层 是刚才演示的 映射关系图  深灰色层对应的设备和对应的读写方法一定是不一样的。 黑色层看见的都是 struct file 文件包含文件属性, 文件方法OS 内的内存文件系统。 红色箭头再往上就是进程如果想指向磁盘通过  找到对应的 struct file根据对应的 file 结构调用读写方法就可以对磁盘进行操作了。如果想指向对应的显示器通过 fd 找到 struct file……最后调用读写就可以对显示器操作了…… 以此类推。 虽然指针指向的是差异化的代码但是在 深灰色层我们看到的都是 struct file 文件对象 在这一层我们 以统一的视角看待所有的设备往上我们就看作 一切皆文件 也就是说如果想打开一个文件打开之后把读写方法属性交给 OS 在内核里给该硬件创建 stuct file初始化时把对应的函数指针指向具体的设备 在内核中存在的永远都是 struct file然后将 struct file 互相之间用链表关联起来。 站在用户的角度看一个进程看待所有的文件都是以统一的视角看待的 所以当我们访问一个 file 的时候这个 file 具体指向底层的哪个文件或设备 这完全取决于其底层对应的读写方法指向的是什么方法 这操作是不是感觉很熟悉 多态C 中运行时多态用的虚表和虚函数指针那不就是函数指针么 上层使用同一对象指针指向不同的对象最终就可以调用不同的方法 这令人拍手叫绝的操作你可以理解为多态的前身 补充上面画的图在往上走就回到了内核的映射关系了 这里的 struct file 指向的硬件设备是谁就取决于底层的硬件是怎么设计的了。 通过操作系统层做了一层软件封装达到了这样的效果。 底层叫硬件而 具体的硬件读写方法是驱动干的具体的硬件读写是驱动程序要做的 OS 只管跟外设要求其提供读写方法最终 OS 在内核中给它们抽象成 struct file 把它们都看作文件然后通过函数指针指向具体的文件对应的设备就完成了 一切皆文件 0x03 初识 VFS虚拟文件系统 上面说的这种设置一套 struct file 来表示文件的内存文件系统的操作 我们称之为  (virtual file system) 即 虚拟文件系统 。  虚拟文件系统VFS是 Linux 内核中非常有用的一个方面因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。 0x04 回头看问题fd 的 0,1,2,3...  至此我们梳理完了。现在我们再回过头看 fd 的 1,2,3,4... 就能有一个清楚的认识了。 现在我们再我们最开始的问题想必大家已经做到 知其然知其所以然 了 ① 为什么从 3 开始而不是从 0 开始0, 1, 2 去哪了 stdin,stdout,stderr 和 0,1,2 是对应关系因为 open 时默认就打开了这也是为什么我们默认打开一个新的文件fd 是从 3 开始的而不是 0 开始的真正原因 突然茅塞顿开上一章打印出 fd 是 3 的疑惑终于解决了 ②  0, 1, 2, 3, 4……是不是有点像数组下标 不是有点像它其实上就是数组下标fd 0,1,2,3,4...  在内核中属于进程和文件的对应关系是用数组来完成映射的这些数字就是数组的下标。read, write, close 这些接口都必须用 0,1,2,3,4 来找到底层对应的 struct file 结构进而访问到底层对应的读写方法 (包括相关的属性,缓冲区等) 。 [ 笔者 ]   王亦优[ 更新 ]   2023.3.24 ❌ [ 勘误 ]   /* 暂无 */[ 声明 ]   由于作者水平有限本文有错误和不准确之处在所难免本人也很想知道这些错误恳望读者批评指正 参考资料  Creference[EB/OL]. []. http://www.cplusplus.com/reference/. Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . 百度百科[EB/OL]. []. https://baike.baidu.com/.
http://www.dnsts.com.cn/news/83724.html

相关文章:

  • 大气的企业网站源码北京比较好的网站公司
  • 安徽建筑大学城市建设学院网站鼎豪网站建设
  • 广州好蜘蛛网站建设seo托管服务
  • 免费seo网站自动推广软件企业网站搜索引擎拓客
  • 移动互联网开发招人南昌搜索引擎优化
  • 广州市官网网站建设报价wordpress企业外贸主题
  • 推荐10个网站计算机网站设计
  • 手机怎么注册自己的网站wordpress 整站转移
  • 交友类网站功能建设思路讯美智能网站建设
  • 外贸型网站建设公司亿度网络网站建设
  • 17一起做网站广州无锡高端网站建设咨询
  • 个体户可以做企业网站鲜花网站建设论文百度文库
  • 汕头 网站建设电脑做网站服务器视频教程
  • 企业网站seo分析邯郸网站建设fkop
  • 免费wap网站推荐做网站的没有进项票怎么办
  • 在国外做盗版网站吗网站建设与实训
  • 云服务器开网站医院网站php源码
  • 网站开发 设计文档有wordpress模板安装教程视频教程
  • 一个虚拟主机多个网站神华集团两学一做网站
  • 外包做网站不满意机关网站建设 方案
  • 网站做优化按点击收费科凡全屋定制
  • 网站建设-部署与发布平谷网站建设
  • 静安网站建设北京哪家公司做网站好
  • 国外做二手服装网站有哪些贵阳百度seo点击软件
  • 小企业做网站有没有用怎么写网站文案
  • 做起点说网站的服务器多少钱做外贸自己公司的网站一定要吗
  • 做网站代码编辑工具网站后台编辑框不显示
  • 找工作哪个网站好智联招聘公司网站程序
  • 元氏县城有做网站广告的吗深圳模板网站建设公司
  • 河南工程招标网站站点建设网站