---从今天开始,新一轮的学习开始了。这段时间会写文件属性的文章,预计下周周末会写到进程的文章(这过程中也会写一些c语言进阶以及数据结构的文章),欢迎大家一起来“搞事情”。原本之前我做这个公众号是还想分享有关pcb设计和物联网方面的学习分享,现在想想估计是要以后才能写了(主要是自己现在太菜了 ,也没有那么时间弄了,主要是现在自己集中精力在学Linux),所以往后文章方向主要是核心内容方面是linux应用编程和驱动编程。 一、文件类型的简称辨别: 1、在聊Linux系统中的各种文件类型之前,我们先从平时我们在Linux系统下用命令ls -l 查看到的一些文件信息,不知道你有没有注意下面的图片中的细节: 注意画红线的地方,不知道你有没有注意,这是表示什么意思呢?在以前的学习过程中我一直都没弄明白,所以今天刚好讲到这个,就拿出来讲。这里的“-”表示的意思是一个普通文件,下面我就总结一下各个文件表示符,下次你在Linux系统看到这个最前面的标识就知道是什么文件了: 第一:“-”表示普通文件(regular file) 第二:“d”表示目录文件(directory) 第三:“l”表示链接文件(link)(说到这里你肯定会有印象关于软链接和硬链接的区别吧:硬连接:ln+源文件名+连接文件名(两个文件互相独立,删除哪个,都不会影响自身);而软连接(符号连接):等同于windows里面的快捷键方式创建一个软连接(也就是我们在Windows系统下安装了一个软件,经常会创建一个快捷键在桌面上):ln -s +源文件+快捷文件(自己命名的文件名) (各自不独立,删除源文件,会对快捷文件有影响)) 第四:“s”表示套接字文件(socket) 第五:“c”表示字符设备文件(character) 第六:“b”表示设备块文件(block) 第七:“p”表示管道文件(pipe) 二、详细介绍各种文件类型(记住一句话:在Linux系统下一切皆是文件): 1、普通文件(“-”,regular file):它分为两种类型:第一是文本文件;第二是二进制文件。那么什么是文本文件,印象最深的是我们平时都会在Windows系统下建一个以后缀名为".txt"的文本文件,这个是见得最多 了,哈哈哈,我们还是专业术语来讲------文件中的内容是由文本构成的,文本指的是ASCII码字符。文件里的内容本质上都是数字(不管什么文件内容本质上都是数字,因为计算机中本身就只有1和0),而文本文件中的数字本身应该被理解为这个数字对应的ASCII码。常见的.c文件, .h文件 .txt文件等都是文本文件。文本文件的好处就是可以被人轻松读懂和编写。所以说文本文件天生就是为人类发明的。什么是二进制文件呢?想必这个你比我还懂吧 (二进制文件中存储的本质上也是数字,只不过这些数字并不是文字的编码数字,而是就是真正的数字。常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译连接生成的.bin,以及C8051芯片,编译生成文件.bin)都是二进制文件)。 ----小结:从本质上来看(就是刨除文件属性和内容的理解)文本文件和二进制文件并没有任何区别。都是一个文件里面存放了数字。区别是理解方式不同,如果把这些数字就当作数字处理则就是二进制文件,如果把这些数字按照某种编码格式去解码成文本字符,则就是文本文件。 2、目录文件(“d”, directory):目录就是文件夹(在Linux系统可以mkdir来创建一个文件夹),文件夹在linux中也是一种文件,不过是特殊文件。用ls打开一个文件夹就能看到,文件夹其实也是一种特殊文件,里面存的内容包括这个文件的路径,还有文件夹里面的文件列表。那么文件目录与目录文件有啥区别呢?------这里举个例子:比如你有1 2 3三个图片文件存放在E:\psd里。“1”“2”“3”这三个文件就是“E:\psd”这个目录里的文件,“目录文件”指的是“1 2 3”这三件。“E:\psd”是“1 2 3”这三个文件所在的目录,“文件目录”指的是“E:\psd”这个目录。 不同的就是“目录文件”指的是某些“文件”,“目录”只是定义这些文件存放的位置。“文件目录”指的是某个目录“文件”只是定义这个目录里具有哪些文件。 前者定义的是“文件”后者定义的是“目录” 3、链接文件(“l”, link):类似于Windows中的快捷方式,包括硬链接、软连接等等,详细可以看我在网上找的一篇博客: https://blog.csdn.net/yangxjsun/article/details/79681229 4、管道文件(“p”,pipe):管道分为匿名管道和命名管道。管道都是一端写入、另一端读取,它们是单方向数据传输的,它们的数据都是直接在内存中传输的,管道是进程间通信的一种方式,例如父进程写,子进程读。在shell中匿名管道就是一个管道符号"|",例如 ls | grep xxx ,其中ls对应的进程是这个独立进程组中的父进程,grep对应的进程是子进程,父进程写子进程读。在编程语言中,匿名管道是通过创建两个文件句柄或文件描述符(例如A、B)来实现的,一个文件句柄用于写数据(例如A写入端,数据写入A将自动推入B中),另一个文件句柄用于读数据(即B)。对于命名管道,即有名称的管道,命名管道将文件保留在文件系统中,它也称为FIFO,也就是first in first out。虽然命名管道文件保留在文件系统中,但是这个文件只是使用命名管道的一个入口,在使用命名管道传输数据的时候,仍然是在内存中进行的,也就是说并不会因为保留在文件系统上命名管道的效率就低了。在shell中,可以使用mknod 命令或mkfifo 命令创建命名管道,在写某些特殊需求的shell脚本时,命名管道非常有用。实际上,在Bash 4(它是一种shell解释器,所谓解释器就是给用户做翻译,让用户能够明白它的意思)之后就支持协程(协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用),但是协程的需求都能通过命名管道来实现。一般的管道都是单向通信的,无法实现双向通信的功能,也就是只能一边写一边读,不能两边都能读、写。如果要实现双向通信,可以创建两根管道(这样就有4个文件句柄,两个读端,两个写端),或者使用更方便的套接字。详细可以参考这篇博客:https://blog.csdn.net/tiramisu_L/article/details/801763505、套接字文件(“s”,socket):这里我感觉自己写的不是很好,所以也在网上找一篇博客分享给大家(后期也会写套接字的编程文章): https://blog.csdn.net/gatieme/article/details/46241975 6、设备块文件(“b”,block):设备文件对应的是硬件设备,也就是说这个文件虽然在文件系统中存在,但是并不是真正存在于硬盘上的一个文件,而是文件系统虚拟制造出来的(叫虚拟文件系统,如/dev /sys /proc等)。这里也可以了解一下块设备https://blog.csdn.net/lyq_csdn/article/details/80518308 7、字符设备文件(“c”,character):这个详细可以看这篇博客:https://blog.csdn.net/ypluo/article/details/74895278 三、总结: 今天主要是介绍了一些文件类型,明天会讲解文件属性以及如何查看文件属性,欢迎大家持续关注! ---欢迎关注公众,可以查看往期的文章: 加我个人微信,然后拉进交流群(因为之前有加入群里的经常发广告,所以只能这样,还望理解。群里只能讨论技术方面的,发广告,立刻飞机): ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:txp学嵌入式,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |