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

php精品网站建设连云港市建设工程安全监督站网站

php精品网站建设,连云港市建设工程安全监督站网站,网络公司除了做网站,wordpress a 登录目录 1 什么是文件#xff1f;什么是文件操作#xff1f;认识系统接口open 什么是文件描述符认识Linux底层进程如何打开的文件映射关系重定向的本质理解软硬链接扩展问题 1 什么是文件#xff1f;什么是文件操作#xff1f; 文件 文件内容 文件属性#xff08;文件属性… 目录 1 什么是文件什么是文件操作认识系统接口open 什么是文件描述符认识Linux底层进程如何打开的文件映射关系重定向的本质理解软硬链接扩展问题 1 什么是文件什么是文件操作 文件 文件内容 文件属性文件属性也是数据即使你创建一个空文件也要占据空间 文件操作 文件内容操作 文件属性操作有可能在操作文件的过程中既改变内容又改变属性 不管是学习语言还是学习操作系统IO流是我们学习过程中不可获取的一个阶段在这一部分我们会学习打开文件、读写文件等操作。 那所谓的“打开文件”究竟是在干什么呢其实就是将文件的属性或内容加载到内容中。 我相信大多数人的入门语言都是c语言那我们就以c语言的文件操作进行举例 如何理解printf为什么调用printf就能往显示屏中打印内容呢 其实printf是封装了系统的接口然后由系统接口调用显示屏的驱动方法然后进行打印 其实不管是C语言也好Java也好其他语言也罢大多数的文件操作都是封装了系统接口。 封装的原因 原生系统接口使用成本比较高语言不具备跨平台性每个操作系统的接口可能不一样写的代码可能只能在一个平台上跑 封装是如何解决跨平台的问题的呢 以c/c方式举例穷举所有底层接口 条件编译 在Linux系统调用接口中我们打开文件使用open、关闭文件close、写入write、读取read。那这些接口和C中库函数接口有什么联系呢我们可以这样理解C中调用得这些库函数底层一定封装了系统调用接口可以认为fopen底层调用openfclose底层调用closefread底层调用readfwrite底层调用write。我们在windows中打开文件windows底层也有一套自己的windows相关的api系统接口当我们在windows使用C的库函数时C调用的就是windows下的系统接口。这样在语言层面上就实现了跨平台性。 认识系统接口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_CREAT : 若文件不存在则创建它。需要使用mode选项来指明新文件的访问权限 O_APPEND: 追加写 返回值 成功新打开的文件描述符 失败-1 int main() {umask(0);int fda open(loga.txt,O_WRONLY | O_CREAT | O_TRUNC,0666);int fdb open(logb.txt,O_WRONLY | O_CREAT | O_TRUNC,0666);printf(fda:%d\n,fda);printf(fdb:%d\n,fdb);close(fda);close(fdb);return 0; }运行结果 fda:3 fdb:4什么是文件描述符 OK那前面描述怎么多到底什么是文件描述符呢其实系统接口open的返回值就是文件描述符。 Linux系统中把一切都看做是文件当进程打开现有文件或创建新文件时OS向进程返回一个文件描述符文件描述符就是OS为了高效管理已被打开的文件所创建的索引用来指向被打开的文件基本上所有执行I/O操作的系统调用都会通过文件描述符。简单来说文件描述符可以唯一标识一个新打开的文件类似学号身份证号可以唯一标识一个人。 OK引出概念后我们来解决下面几个问题 上面那个例子中为什么运行结果是3,4或者说为什么是从3开始 因为操作系统默认已经打开0,1,2号文件 0表示标准输入键盘 1表示标准输出显示器 2表示标准错误显示器 认识Linux底层进程如何打开的文件映射关系 ** 为什么文件描述符是像0,1,2,3,4,5…你见过什么样的数据是这样子的** 当然是数组的下标就是这样子的啦 首先在一个进程可以打开多个文件就像我们写代码可以打开多个文件一样那这么多文件我们的OS要怎么管理呢 一个文件被打开在内核中要创建该打开的文件的内核数据结构叫做struct file struct file {//包含了我想看到的文件大部分内容属性struct file *next;struct file *prev; }再讲这个结构体file用类似链表的数据结构给串起来所以对被打开的文件的管理转化为对链表的增删改查 ** 那进程如何和打开的文件建立映射关系呢?** 看下图 首先task_struct进程控制块PCB里面有一个字段是struct files_struct* filesfiles_struct里面有一个文件描述符表其实就是一个array[]数组里面存着结构体file的地址当我们用户要打开一个文件时先给你创建struct file这个结构体初始化file内部属性还有函数指针指向的对应的方法并且在当前进程的文件描述符表里分配一个没有被使用的下标将新文件的地址也就是结构体file的地址给文件描述符表然后会将这个新文件对应的文件描述符表的下标返回给用户后面用户在调用read,write一定传入了对应的文件描述符(fd)根据这个文件描述符就能找到对应的文件对它做相应的操作。 那肯定有人问了0,1,2 对应stdin,stdout,stderr 对应 键盘显示器显示器这些都是硬件啊也用你上面的struct file 来标识吗 是的在Linux下一下皆文件 在Linux下一切皆文件结构体struct file里面有函数指针指向的就是对应的IO方法read,write),像磁盘啊显示器啊键盘啊这些硬件调用他们要调用对应设备的驱动方法所以struct file的函数指针指向这些对应设备的驱动方法。比如说标椎输出2号文件结构体的函数指针就是指向显示器的驱动方法将数据写到2号文件也就是显示到显示屏上。 所以一切皆文件举个例子把显示屏看做文件我们往显示屏打印数据不就是往文件里写东西而已。 你可以验证一下上面的理论先把标准输出1号文件关闭了再打开log.txt文件根据fd的分配规则新的fd值一定是1;所以此时调用printf()本来printf是打印到1号文件也就是显示屏但是现在打印到log.txt文件里取了当然这个过程也叫做重定向 文件描述符的分配规则从头遍历数组fd_array[]找到一个最小的没有被使用的下标分配给新的文件 int main() {close(1);//根据fd的分配规则新的fd值一定是1int fd open(log.txt,O_WRONLY | O_CREAT | O_TRUNC,0666);if(fd 0){perror(oppen);return 1;}//printf-》stdout-1-虽然不在指向对应的显示器了但是已经指向了log.txt的底层struct file 对象//本来应该要往显示器打印最终却变成了向指定文件打印 - 重定向printf(fd:%d\n,fd);//为什么必须要fflush一下fflush(stdout);close(fd); }重定向的本质 修改文件描述符fd下标 对应的struct file * 的内容 (将其换成目标文件的地址)。 重定向具体操作 int dup2(int oldfd,int newfd);//duplicate重定向int main()int fd open(log.txt,O_WRONLY | O_CREAT | O_TRUNC,0666); if(fd 0) {perror(open);return 0; } dup2(fd,1)0 //本来应该要往显示器打印最终却变成了向指定文件打印 - 重定向 fprintf(stdout,打开文件:%d,fd); fflush(stdout); close(fd); return 0; }理解软硬链接 在讲软硬链接之前我们得先了解一下什么是inode。 我们刚才说的打开的文件是内存级别的实际上大量的文件还在磁盘上这些文件和多很杂我们的文件系统就要对这些进行管理。 那么一个硬件磁盘怎么跟我们的OS产生联系呢 把磁盘想象成为线性结构当做500GB大小的数组然后对磁盘的管理转化为了对数组空间的管理。但是一次性管理500GB大小的数组不太可能所以就对500GB的数组进行分区一个区100GB一个区还是太大在对区进行分组一个组10G组内在细分成块然后内核对这些块进行描述比如有什么属性属于哪个组然后就转为对这些块的管理。 Linux 系统中就有一个名为 superblock 的 “硬盘地图”。 Linux 并不是把文件内容直接写入到 superblock 中而是在里面记录着整个文件系统的信息。superblock里面就有一个叫inode的。 文件 内容 属性——都是数据——都要存储 Linux采用的是将内容和属性数据分开存储的方案 内容一般放在一块块block中4kb)属性数据一般放在inode中inode说人话就是磁盘上的另一份空间一般这份空间是128字节 Linux 把每个文件的权限与属性记录在 inode(索引节点index node ) 中而且每个文件占用一个独立的 inode 表格该表格的默认大小为 128 字节。 里面记录着如下信息 文件的访问权限(read、write、execute) 该文件的所有者与所属组(owner、group) 该文件的大小(size) 该文件的创建或内容修改时间(ctime) 该文件的最后一次访问时间(atime) 该文件的修改时间(mtime) 文件的特殊权限(SUID、SGID、SBIT) 该文件的真实数据地址(point)。 在 Linux 系统中 inode 号才是文件的唯一标识而非文件名。文件名只是为了方便人们的记忆和适用 那我现在知道了,inode就是文件的唯一标识用来存储文件的属性的那软硬链接到底是什么呢 硬链接(hard link) 可以将它理解为一个 “指向原始文件 inode 的指针”系统不为它分配独立的 inode 和 文件。所以硬链接文件与原始文件其实是同一个文件只是名字不同。我们每添加一个硬链接该文件的 innode 连接数就会增加 1 而且只有当该文件的 inode 连接数为 0 时才算彻底被将它删除。因此即便删除原始文件依然可以通过硬链接文件来访问。需要注意的是我们不能跨分区对文件进行链接。所以硬链接可以用来防止误删。 软链接(symbolic link) 等同于 Windows 系统下的快捷方式。仅仅包括所含链接文件的路径名字。因此能链接目录也能跨文件系统链接。但是当删除原始文件后链接文件也将失效。 软硬链接的区别软链接是一个独立文件有自己独立的inode和inode编号硬链接不是一个独立的文件它和目标文件使用同一个inode 扩展问题 什么是硬链接数 此时的inode编号不是就一个“指针”的概念吗硬链接数本质就是给文件inode属性中的一个计数器count标识有几个文件名和我的inode建立了映射关系。简而言之就是有几个文件名指向我的inode文件本身 既然软链接是一个独立的文件那它的文件内容是什么呢 保存的是指向文件的所在路径 为什么创建普通文件默认硬链接数是1而创建目录默认硬链接数是2呢 普通文件的文件名本身就和自己的inode具有映射关系所以是1 默认的空目录有两个默认文件.和….表示当前目录也指向这个目录所以目录自己指向自己的inode.也指向目录的inode所以是2而…指向的是上级目录的inode
http://www.yayakq.cn/news/2449/

相关文章:

  • 泰州营销型网站工程造价信息网官网信息价
  • 全国水利建设市场信用信息平台门户网站比较有设计感的网站
  • 寺庙网站开发建设方案安徽智能网站建设制作
  • 石家庄网站推广专业鑫菲互动网站建设公司
  • 网站名称写什么网易邮箱163登录入口
  • 成都网站排名app开发多少钱?
  • 网站导航插件wordpress第三方账号
  • 动画做a视频在线观看网站太原市手机微网站建设
  • 广告网站制作多少钱卓博人才网手机版
  • 网站开发技术有哪些网站推广具体内容
  • 不用买服务器可以做网站wordpress 不同侧边栏
  • 网站主视觉网站开发岗位群
  • 网上做任务挣钱的网站北大青鸟网站建设
  • 如何优化网站代码梁平网站建设
  • 如何做网站不容易被攻击企业招聘
  • 网站开发例子网络黄页推广软件下载
  • 自己做优惠劵网站赚钱吗wix做的网站能扒下来
  • 汕头建站服务张裕网站建设的目标
  • o2o网站建设好么深圳网站公司招聘
  • 做网站能用的字体如何搭建一个企业子账号网站
  • 做网站用框架么网站备案必须在公司注册地
  • 电子商务网站设计的基本要求管理系统门户网站开发路线
  • 做网站软件有哪些东莞市建设网
  • 苏州比较大的网站公司网站建设项目管理
  • 厦门网站设计制作购物网站服务中心
  • 有没有做卡商的网站wordpress 好慢哪
  • 网站开发实战网络课建一网站要多少钱
  • 网站域名到期后不续费会怎样小学生小发明小制作大全
  • 大理建设工程招聘信息网站做pc端网站平台
  • wordpress 网站同步外贸企业 访问国外网站