stat 和 fstat 查阅的是符号链接文件指向的文必发365官网件的属性

当前位置:必发365 > 必发365官网 > stat 和 fstat 查阅的是符号链接文件指向的文必发365官网件的属性
作者: 必发365|来源: http://www.joelheffner.net|栏目:必发365官网

文章关键词:必发365,文件属性

  文件属性详解_电脑基础知识_IT/计算机_专业资料。linux 中各种文件类型 普通文件(regular file) (1)文本文件。文件中的内容是由文本构成的,文本指的是 ASCII 码字符。文件里的内容本质上都是数字(不管什么文件内容本 质上都是

  linux 中各种文件类型 普通文件(regular file) (1)文本文件。文件中的内容是由文本构成的,文本指的是 ASCII 码字符。文件里的内容本质上都是数字(不管什么文件内容本 质上都是数字,因为计算机中本身就只有 1 和 0) ,而文本文件中的数字本身应该被理解为这个数字对应的 ASCII 码。常见的.c 文件, .h 文件 明的。 (2)二进制文件。二进制文件中存储的本质上也是数字,只不过这些数字并不是文字的编码数字,而是就是真正的数字。常见的 可执行程序文件(gcc 编译生成的 a.out,arm-linux-gcc 编译连接生成的.bin)都是二进制文件。 (3)对比:从本质上来看(就是刨除文件属性和内容的理解)文本文件和二进制文件并没有任何区别。都是一个文件里面存放了 数字。区别是理解方式不同,如果把这些数字就当作数字处理则就是二进制文件,如果把这些数字按照某种编码格式去解码成 文本字符,则就是文本文件。 (4)我们如何知道一个文件是文件文件还是二进制文件?在 linux 系统层面是不区分这两个的(譬如之前学过的 open、read、 write 等方法操作文件文件和二进制文件时一点区别都没有) ,所以我们无法从文件本身准确知道文件属于哪种,我们只能本来 就知道这个文件的类型然后用这种类型的用法去用他。有时候会用一些后缀名来人为的标记文件的类型。 (5)使用文本文件时, 常规用法就是用文本文件编辑器去打开它、 编辑它。 常见的文本文件编辑器如 vim、 gedit、 notepad++、 SourceInsight 等,我们用这些文本文件编辑器去打开文件的时候,编辑器会 read 读出文件二进制数字内容,然后按照编码 格式去解码将其还原成文字展现给我们。如果用文本文件编辑器去打开一个二进制文件会如何?这时候编辑器就以为这个二进 制文件还是文本文件然后试图去将其解码成文字,但是解码过程很多数字并不对应有意义的文字所以成了乱码。 (6)反过来用二进制阅读工具去读取文本文件会怎么样?得出的就是文本文字所对应的二进制的编码。 目录文件(d directory) .txt 文件等都是文本文件。文本文件的好处就是可以被人轻松读懂和编写。必发365官网所以说文本文件天生就是为人类发 (1)目录就是文件夹,文件夹在 linux 中也是一种文件,不过是特殊文件。用 vi 打开一个文件夹就能看到,文件夹其实也是一 种特殊文件,里面存的内容包括这个文件的路径,还有文件夹里面的文件列表。 (2)但是文件夹这种文件比较特殊,本身并不适合用普通的方式来读写。linux 中是使用特殊的一些 API 来专门读写文件夹的。 字符设备文件(c character) 块设备文件(b block) (1)设备文件对应的是硬件设备,也就是说这个文件虽然在文件系统中存在,但是并不是真正存在于硬盘上的一个文件,而是文 件系统虚拟制造出来的(叫虚拟文件系统,如/dev /sys /proc 等) (2)虚拟文件系统中的文件大多数不能或者说不用直接读写的, 而是用一些特殊的 API 产生或者使用的, 具体在驱动阶段会详解。 管道文件(p pipe) 套接字文件(s socket) 符号链接文件(l link) 常用文件属性获取 stat、fstat、lstat 函数简介 (1)每个文件中都附带了这个文件的一些属性(属性信息是存在于文件本身中的,但是它不像文件的内容一样可以被 vi 打开看 到,属性信息只能被专用的 API 打开看到) (2)文件属性信息查看的 API 有三个:stat、fstat、lstat,三个作用一样,参数不同,细节略有不同。 (3)linux 命令行下还可以去用 stat 命令去查看文件属性信息,实际上 stat 命令内部就是使用 stat 系统调用来实现的。 (4)stat 这个 API 的作用就是让内核将我们要查找属性的文件的属性信息结构体的值放入我们传递给 stat 函数的 buf 中, 当 stat 这个 API 调用从内核返回的时候 buf 中就被填充了文件的正确的属性信息,然后我们通过查看 buf 这种结构体变量的元素就 可以得知这个文件的各种属性了。 (5)fstat 和 stat 的区别是:stat 是从文件名出发得到文件属性信息结构体,而 fstat 是从一个已经打开的文件 fd 出发得到一 个文件的属性信息。所以用的时候如果文件没有打开(我们并不想打开文件操作而只是希望得到文件属性)那就用 stat,如果 文件已经被打开了然后要属性那就用 fstat 效率会更高(stat 是从磁盘去读取文件的,而 fstat 是从内存读取动态文件的) 。 (6)lstat 和 stat/fstat 的差别在于:对于符号链接文件,stat 和 fstat 查阅的是符号链接文件指向的文件的属性,而 lstat 查 阅的是符号链接文件本身的属性。 struct stat 结构体简介 (1)struct stat 是内核定义的一个结构体,在sys/stat.h中声明,所以我们可以用。这个结构体中的所有元素加起来就是我 们的文件属性信息。 stat 函数的应用案例 用代码判断文件类型 (1)文件类型就是-、d、l· (2)文件属性中的文件类型标志在 struct stat 结构体的 mode_tst_mode 元素中, 这个元素其实是一个按位来定义的一个位标 志(有点类似于 ARM CPU 的 CPSR 寄存器的模式位定义) 。这个东西有很多个标志位共同构成,记录了很多信息,如果要查 找时按位&操作就知道结果了, 但是因为这些位定义不容易记住, 因此 linux 系统给大家事先定义好了很多宏来进行相应操作。 (3)譬如 S_ISREG 宏返回值是 1 表示这个文件是一个普通文件,如果文件不是普通文件则返回值是 0. 用代码判断文件权限设置 (1)st_mode 中除了记录了文件类型之外,还记录了一个重要信息:文件权限。 (2)linux 并没有给文件权限测试提供宏操作,而只是提供了位掩码,所以我们只能用位掩码来自己判断是否具有相应权限。 st_mode 中记录的文件权限位 (1)st_mode 本质上是一个 32 位的数(类型就是 unsinged int) ,这个数里的每一个位表示一个含义。 (2)文件类型和文件的权限都记录在 st_mode 中。我们用的时候使用专门的掩码去取出相应的位即可得知相应的信息。 ls -l 打印出的权限列表 (1)123456789 一共 9 位,3 个一组。第一组三个表示文件的属主(owner、user)对该文件的可读、可写、可执行权限;第 2 组 3 个位表示文件的属主所在的组(group)对该文件的权限;第 3 组 3 个位表示其他用户(others)对该文件的权限。 (2)属主就是这个文件属于谁,一般来说文件创建时属主就是创建这个文件的那个用户。但是我们一个文件创建之后还可以用 chown 命令去修改一个文件的属主,还可以用 chgrp 命令去修改一个文件所在的组。 文件操作时的权限检查规则 (1)一个程序 a.out 被执行, a.out 中试图去操作一个文件 1.txt, 这时候如何判定 a.out 是否具有对 1.txt 的某种操作权限呢? (2)判定方法是:首先 1.txt 具有 9 个权限位,规定了 3 种人(user、group、必发365官网others)对该文件的操作权限。所以我们判定 1.txt 是否能被 a.out 来操作, 关键先搞清楚 a.out 对 1.txt 到底算哪种人。 准确的说是看 a.out 被谁执行, 也就是当前程序 (进 程)是哪个用户的进程。 (3)刚才上面说的是我的分析,到底对不对还得验证。 access 函数检查权限设置 (1)文本权限管控其实蛮复杂,一般很难很容易的确定对一个文件是否具有某种权限。设计优秀的软件应该是:在操作某个文件 之前先判断当前是否有权限做这个操作,如果有再做如果没有则提供错误信息给用户。 (2)access 函数可以测试得到当前执行程序的那个用户在当前那个环境下对目标文件是否具有某种操作权限。 chmod/fchmod 与权限修改 (1)chmod 是一个 linux 命令,用来修改文件的各种权限属性。chmod 命令只有 root 用户才有权利去执行修改。 (2)chmod 命令其实内部是用 linux 的一个叫 chmod 的 API 实现的。 chown/fchown/lchown 与属主修改 (1)linux 中有个 chown 命令来修改文件属主 (2)chown 命令是用 chown API 实现的 umask 与文件权限掩码 (1)文件掩码是 linux 系统中维护的一个全局设置,umask 的作用是用来设定我们系统中新创建的文件的默认权限的。必发365官网 (2)umask 命令就是用 umask API 实现的 opendir 与 readdir 函数 (1)opendir 打开一个目录后得到一个 DIR 类型的指针给 readdir 使用 (2)readdir 函数调用一次就会返回一个 structdirent 类型的指针,这个指针指向一个结构体变量,这个结构体变量里面记录 了一个目录项(所谓目录项就是目录中的一个子文件) 。 (3)readdir 调用一次只能读出一个目录项,要想读出目录中所有的目录项必须多次调用 readdir 函数。readdir 函数内部户记 住哪个目录项已经被读过了哪个还没读,所以多次调用后不会重复返回已经返回过的目录项。当 readdir 函数返回 NULL 时就 表示目录中所有的目录项已经读完了。 可重入函数介绍 (1)有些函数是可重入的有些是不可重入的,具体概念可以去百度。 (2)readdir 函数和我们前面接触的一些函数是不同的,首先 readdir 函数直接返回了一个结构体变量指针,因为 readdir 内部 申请了内存并且给我们返回了地址。多次调用 readdir 其实 readir 内部并不会重复申请内存而是使用第一次调用 readdir 时 分配的那个内存。这个设计方法是 readdir 不可重入的关键。 (3)readdir 在多次调用时是有关联的,这个关联也标明 readdir 函数是不可重入的。 (4)库函数中有一些函数当年刚开始提供时都是不可重入的,后来意识到这种方式不安全,所以重新封装了 C 库,提供了对应的 可重复版本(一般是不可重入版本函数名_r)

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!