1、linux中各种文件类型
1.1、普通文件(-, regular file)
(1)文本文件
文件中的内容是由文本构成的,文本指的是ASCII码字符。文件里的内容实质上都是数字(不管什么文件内容本质上都是数字,因为计算机中本身就只有0和1),而文本文件中的数字本身应该被理解为这个数字对应的ASCII码。常见的.c文件,.h文件,.txt文件等都是文本文件。文本文件的好处就是可以被人轻松读懂和编写。
(2)二进制文件。
二进制文件中存储的本质上也是数字,只不过这些数字并不是文字的编码数字,而是就是真正的数字。
(3)对比:从本质上来看(就是刨除文件属性和内容的理解)文本文件和二进制文件并没有任何区别。都是一个文本里面存放了数字。区别是理解方式不同,如果把这些数字就当做数字处理则就是二进制文件,如果把这些数字按照某种编码格式去解码成文本字符,则就是文本文件。
(4)使用文本文件时,常规用法就是用文本文件编辑器去打开它、编辑它。常见的文本文件编辑器如vim、gedit、notepad++、SourceInsight、VSCode等,我们使用这些文本文件编辑器去打开文件的时候,编辑器会read读出文件二进制数字内容,然后按照编码格式去解码将其还原成文字展现给我们。
如果用文本文件编辑器去打开一个二进制文件会如何?
这时候编辑器就以为这个二进制文件还是文本文件然后试图去将其解码成文字,但是解码过程很多数字并不对应有意义的文字所以成了乱码。
(5)反过来用二进制阅读工具去读取文本文件会怎么样?
得出的就是文本文件所对应的二进制的编码。
1.2、目录文件(d, directory)
(1)目录就是文件夹,文件夹在linux中也是一种文件,不过是特殊文件。用vi打开一个文件夹就能看到,文件夹其实也是一种特殊文件,里面存放的内容包括这个文件的路径,还有文件夹里面的文件列表。
(2)但是文件夹这种文件比较特殊,本身并不适合用普通的方式来读写。linux中是使用特殊的一些API来专门读写文件夹的。
1.3、字符设备文件(c, character)
1.4、块设备文件(b, block)
(1)设备文件对应的是硬件设备,也就是说这个文件虽然在文件系统中存在,但是并不是真正存在于硬盘上的一个文件,而是文件系统虚拟制造出来的(叫虚拟文件系统,如/dev, /sys, /proc等)
(2)虚拟文件系统中的文件大多数不能或者说不用直接读写的,而是用一些特殊的API产生或者使用。
1.5、管道文件(p, pipe)
1.6、套接字文件(s,socket)
1.7、符号链接文件(l,link)
2、常见文件属性获取
2.1、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查阅的是符号链接文件本身的属性。
2.2、struct stat 结构体简介
struct stat是内核定义的一个结构体,在 <sys/stat.h>中声明,所以我们可以用。这个结构体中的所有元素加起来就是我们的文件属性信息。
3、文件权限管理
3.1、ls -l 打印出权限列表
(1)123456789一共9位,3个一组。第一组三个表示文件的属主(owner、user)对该文件的可读、可写、可执行权限;第2组3个位表示文件的属主所在组(group)对该文件的权限;第3组3个位表示其他用户(others)对该文件的权限。
(2)属主就是这个文件属于谁,一般来说文件创建时属主就是创建这个文件的那个用户。但是我们一个文件创建之后还可以用chown命令去修改一个文件的属主,还可以用chgrp命令去修改一个文件所在的组。
3.2、access函数检查权限设置
(1)文本权限管控其实蛮复杂,一般很难很容易的确定,对一个文件是否具有某种权限。设计优秀的软件应该是:在操作某个文件之前先判断当前是否有权限做这个操作,如果有再做,如果没有则提供错误信息给用户。
(2)access函数可以测试得到当前执行程序的那个用户在当前那个环境下对目标文件是否具有某种操作权限。
3.3、chmod/fchmod与权限修改
(1)chmod是一个linux命令,用来修改文件的各种权限属性。chmod命令只有root用户才有权利去执行修改。
(2)chmod命令与其内部是用linux的一个叫chmod的API实现的。
3.4、chown/fchown/lchown与属主修改
(1)linux中有个chown命令来修改文件属主
(2)chown命令是用chown API实现的
3.5、umask与文件权限掩码
(1)文件掩码是linux系统中维护的一个全局设置,umask的作用是用来设定我们系统中新创建的文件的默认权限的。
(2)umask命令就是用umask API实现的。
3.6、读取目录文件:opendir与readdir函数
(1)opendir打开一个目录后得到一个DIR类型的指针给readdir使用
(2)readdir函数调用一次就会返回一个struct dirent类型的指针。这个指针指向一个结构体变量,这个结构体变量里面记录了一个目录项(所谓目录项就是目录中的一个子文件)。
(3)readdir调用一次只能读出一个目录项,要想读出目录中所有的目录项必须多次调用readdir函数,readdir函数内部会记住哪个目录项已经被读过了哪个还没读过,所以多次调用后不会重复返回已经返回过的目录项。当readdir函数返回NULL时就表示目录中所有的目录项已经读完了。
注:笔记整理记录于——《朱老师物联网大讲堂》—文件属性-3.2linux应用编程和网络编程第2部分