一、文件类型
正如现实世界有各种各样的生物,而每个生物又有很多的分类。其实,在计算机的管理中,也可以把很多数据集合和资源进行分类,从而划分成各种类型。不过,这里面又可以从两个角度来看什么是文件类型。一个是上层用户的应用角度来看,所谓的文件类型其实就是“格式”。比如在Windows上的什么视频文件类型、文本文件类型等。另外一个是从底层即内核或更低的层次来看,文件格式是数据处理的标准(包括交互和存储)。
二、Linux系统中的文件类型
为什么很多人从Windows平台转到Linux平台时会感到很难受,一个重要原因就是,在Linux平台上,一切皆文件。这导致很多普通用户和初学者的直觉与应用匹配不上,这才是重点。不过,思想始终还是要转变的,除非不想在Linux平台上进行开发。所以,就要先明白在Linux平台上有哪些常见的文件类型。这样,就可以把所谓的“一切皆文件”与实际的应用映射起来,便于理解和掌握。在Linux平台中,常见的文件类型包括以下几类,并且每类会有相应的标识符:
- 普通文件普通文件就是大家平常接触到的文件,如文本文件、各种数据文件、配置文件以及二进制文件等。它包括常见的各种图片类型文件、视频文件等。其标识符为“-”
- 目录文件这个在前面分析过,在Linux平台上,目录也是一种文件。这也是从Windows平台上转过来的让人不适应的方法。因为一般认为目录类型于文件的“容器”,结果在Linux平台“容器”也成为了文件。其标识符为“d”
- 符号链接文件符号链接文件有点类似于Windows平台上的快捷方式,但又有所不同。Linux中的符号链接包括软、硬两类。可以理解为一种指针。其标识符为“l”
- 设备文件设备文件是指外接设备形成的文件(设备也是文件),它分为两类,块设备和字符设备。如果有驱动或内核开发经验的开发者可以很容易明白。这两种设备文件一个是描述串行按字符操作数据的设备而另外一个是随机按块操作数据的设备。字符设备包括常见的键盘、鼠标等,而块设备包括硬盘、光驱等等。它们通常在系统的/dev目录下。字符设备文件的标识符为“c”而块设备文件的标识符是“b”
- 管道文件管道文件其实就是名字一样,它是连接不同场景的一种手段。在Linux平台上,管道广泛应用于进程通信(IPC)。就和水管一样,数据从管道一头流向另外一头(即一端写一端读),它是单向的,通常划分为匿名和命名管道两类。比如写脚本时常见的“|”,其实就代表者管道。其标识符为“p”
- 套接字文件套接字文件更好理解,Socket,槽。这里不展开,网络通信现在太普遍了。它属于双向通信,应用相对复杂。一般用来在跨进程或网络通信。其标识符为“s”
在Linux不必死记硬背这些文件类型标识,可以使用file命令来查看相关的文件类型。它的结果显示比使用ls -l命令更详细和清楚。需要说明的是,在Linux中不是严格按照后缀来区分文件类型的,这也是与Windows区别的重要一点。
三、几个特殊文件类型
除了上面的常见的文件类型外,在Linux系统中还有其它几种比较特殊的文件类型。它们是:
- 空设备文件/dev/null,字符设备文件。可以理解为一个“黑洞”,输入的数据都会丢弃;而如果想从此设备读取数据则会得到一个EOF标记,也就是啥也读取不到
- 零设备文件/dev/zero,零设备不支持写入或写入的数据抛弃;但如果想从此设备读取,则会得到N多的空字符(0数据流)。可以这样区别空和零设备。空是只写不读,零是只读不写。前者用于处理不用的数据而后者用来创建指定大小的空文件
- 随机数文件/dev/random和/dev/urandom,也就是生成随机数的设备文件。前者生成“真”随机数,后者生成“伪”随机数。二者的区别在于
- 共享内存文件/dev/shm,共享内存是多个进程可以访问同一块内在的机制。也是跨进程通信的一种机制,很多框架都使用其实现具体的功能如Android系统。
- 信号量文件/dev/sem,是一种同步的机制。但它一般不会以常见的形式显示。而是以内核对象的形式进行表现出来
四、应用
在实际的应用中,不同的文件类型都有相应的操作API,常见的包括(C或C++接口):
- 常见文件操作典型的就是普通文件、块和字符设备文件,使用fopen, fclose等API进行操作。当然在上层的C++封装中不同的平台或库也提供了更丰富的接口API
- 目录文件操作对于目录文件来说,可以使用opendir, closedir等API进行操作。C++新标准中filesystem提供了更丰富的操作接口
- 套接字这个也比较常见如socket, bind, listen, accept,写过网络编程的一定是用过
- 管道管道使用pipe、pipe2(匿名)和mkfifo与mkfifoat(命名)两种接口
- 链接文件链接文件则提供了symlink等接口提供了相关的操作管理,在前面的文章中分析过
上面仅仅是对一些常见的操作API进行简单的说明,如果想更进一步理解,可以查看相关的帮助文档或资料。具体的例子就不再给出了,其它相关的文章中太多了。
五、总结
不少人在Windows上都吃过亏,换个后缀就把非法的文件运行了起来。但这在Linux上就很难实现。所以,看上去两个平台上的文件有些类似,但本质还是有很多不一样的。这也可以从另外一角度看Linux平台上为什么病毒木马较少的原因。