导读 在 Unix 和它衍生的比如 Linux 系统中,一切都可以看做文件。虽然它仅仅只是一个泛泛的概念,但这是事实。如果有不是文件的,那它一定是正运行的进程。

要理解这点,可以举个例子,您的根目录(/)的空间充斥着不同类型的 Linux 文件。当您创建一个文件或向系统传输一个文件时,它会在物理磁盘上占据的一些空间,而且是一个特定的格式(文件类型)。

虽然 Linux 系统中文件和目录没有什么不同,但目录还有一个重要的功能,那就是有结构性的分组存储其它文件,以方便查找访问。所有的硬件组件都表示为文件,系统使用这些文件来与硬件通信。

这些思想是对 Linux 中的各种事物的重要阐述,因此像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都是定义在文件系统空间下的字节流。

一切都可看作是文件,其最显著的好处是对于上面所列出的输入/输出资源,只需要相同的一套 Linux 工具、实用程序和 API。

虽然在 Linux 中一切都可看作是文件,但也有一些特殊的文件,比如套接字和命令管道。

Linux 系统中有三种基本的文件类型:

  • 普通/常规文件
  • 特殊文件
  • 目录文件
普通/常规文件

它们是包含文本、数据、程序指令等数据的文件,其在 Linux 系统中是最常见的一种。包括如下:

  • 可读文件
  • 二进制文件
  • 图像文件
  • 压缩文件等等
特殊文件

特殊文件包括以下几种:

块文件(block)

块文件(block):设备文件,对访问系统硬件部件提供了缓存接口。它们提供了一种通过文件系统与设备驱动通信的方法。

有关于块文件一个重要的性能就是它们能在指定时间内传输大块的数据和信息。

列出某目录下的块文件:

# ls -l /dev | grep "^b"

输出例子

brw-rw----  1 root disk        7,   0 May 18 10:26 loop0
brw-rw---- 1 root disk 7, 1 May 18 10:26 loop1
brw-rw---- 1 root disk 7, 2 May 18 10:26 loop2
brw-rw---- 1 root disk 7, 3 May 18 10:26 loop3
brw-rw---- 1 root disk 7, 4 May 18 10:26 loop4
brw-rw---- 1 root disk 7, 5 May 18 10:26 loop5
brw-rw---- 1 root disk 7, 6 May 18 10:26 loop6
brw-rw---- 1 root disk 7, 7 May 18 10:26 loop7
brw-rw---- 1 root disk 1, 0 May 18 10:26 ram0
brw-rw---- 1 root disk 1, 1 May 18 10:26 ram1
brw-rw---- 1 root disk 1, 10 May 18 10:26 ram10
brw-rw---- 1 root disk 1, 11 May 18 10:26 ram11
brw-rw---- 1 root disk 1, 12 May 18 10:26 ram12
brw-rw---- 1 root disk 1, 13 May 18 10:26 ram13
brw-rw---- 1 root disk 1, 14 May 18 10:26 ram14
brw-rw---- 1 root disk 1, 15 May 18 10:26 ram15
brw-rw---- 1 root disk 1, 2 May 18 10:26 ram2
brw-rw---- 1 root disk 1, 3 May 18 10:26 ram3
brw-rw---- 1 root disk 1, 4 May 18 10:26 ram4
brw-rw---- 1 root disk 1, 5 May 18 10:26 ram5
...
字符文件(Character)

字符文件(Character): 也是设备文件,对访问系统硬件组件提供了非缓冲串行接口。它们与设备的通信工作方式是一次只传输一个字符的数据。

列出某目录下的字符文件:

# ls -l /dev | grep "^c"

输出例子

crw-------  1 root root       10, 235 May 18 15:54 autofs
crw------- 1 root root 10, 234 May 18 15:54 btrfs-control
crw------- 1 root root 5, 1 May 18 10:26 console
crw------- 1 root root 10, 60 May 18 10:26 cpu_dma_latency
crw------- 1 root root 10, 203 May 18 15:54 cuse
crw------- 1 root root 10, 61 May 18 10:26 ecryptfs
crw-rw---- 1 root video 29, 0 May 18 10:26 fb0
crw-rw-rw- 1 root root 1, 7 May 18 10:26 full
crw-rw-rw- 1 root root 10, 229 May 18 10:26 fuse
crw------- 1 root root 251, 0 May 18 10:27 hidraw0
crw------- 1 root root 10, 228 May 18 10:26 hpet
crw-r--r-- 1 root root 1, 11 May 18 10:26 kmsg
crw-rw----+ 1 root root 10, 232 May 18 10:26 kvm
crw------- 1 root root 10, 237 May 18 10:26 loop-control
crw------- 1 root root 10, 227 May 18 10:26 mcelog
crw------- 1 root root 249, 0 May 18 10:27 media0
crw------- 1 root root 250, 0 May 18 10:26 mei0
crw-r----- 1 root kmem 1, 1 May 18 10:26 mem
crw------- 1 root root 10, 57 May 18 10:26 memory_bandwidth
crw------- 1 root root 10, 59 May 18 10:26 network_latency
crw------- 1 root root 10, 58 May 18 10:26 network_throughput
crw-rw-rw- 1 root root 1, 3 May 18 10:26 null
crw-r----- 1 root kmem 1, 4 May 18 10:26 port
crw------- 1 root root 108, 0 May 18 10:26 ppp
crw------- 1 root root 10, 1 May 18 10:26 psaux
crw-rw-rw- 1 root tty 5, 2 May 18 17:40 ptmx
crw-rw-rw- 1 root root 1, 8 May 18 10:26 random
符号链接文件(Symbolic link)

符号链接文件(Symbolic link) : 符号链接是指向系统上其他文件的引用。因此,符号链接文件是指向其它文件的文件,那些文件可以是目录或常规文件。

列出某目录下的符号链接文件:

# ls -l /dev/ | grep "^l"

输出例子

lrwxrwxrwx  1 root root             3 May 18 10:26 cdrom -> sr0
lrwxrwxrwx 1 root root 11 May 18 15:54 core -> /proc/kcore
lrwxrwxrwx 1 root root 13 May 18 15:54 fd -> /proc/self/fd
lrwxrwxrwx 1 root root 4 May 18 10:26 rtc -> rtc0
lrwxrwxrwx 1 root root 8 May 18 10:26 shm -> /run/shm
lrwxrwxrwx 1 root root 15 May 18 15:54 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 May 18 15:54 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 May 18 15:54 stdout -> /proc/self/fd/1

Linux 中使用 ln 工具就可以创建一个符号链接文件,如下所示:

# touch file1.txt
# ln -s file1.txt /home/tecmint/file1.txt [创建符号链接文件]
# ls -l /home/tecmint/ | grep "^l" [列出符号链接文件]

在上面的例子中,首先我们在 /tmp 目录创建了一个名叫 file1.txt 的文件,然后创建符号链接文件,将 /home/tecmint/file1.txt 指向 /tmp/file1.txt 文件。

管道(Pipe)和命令管道(Named pipe)

管道(Pipe)和命令管道(Named pipe) : 将一个进程的输出连接到另一个进程的输入,从而允许进程间通信(IPC)的文件。

命名管道实际上是一个文件,用来使两个进程彼此通信,就像一个 Linux 管道一样。

列出某目录下的管道文件:

# ls -l | grep "^p"

输出例子:

prw-rw-r-- 1 tecmint tecmint    0 May 18 17:47 pipe1
prw-rw-r-- 1 tecmint tecmint 0 May 18 17:47 pipe2
prw-rw-r-- 1 tecmint tecmint 0 May 18 17:47 pipe3
prw-rw-r-- 1 tecmint tecmint 0 May 18 17:47 pipe4
prw-rw-r-- 1 tecmint tecmint 0 May 18 17:47 pipe5

在 Linux 中可以使用 mkfifo 工具来创建一个命名管道,如下所示:

# mkfifo pipe1
# echo "This is named pipe1" > pipe1

在上的例子中,我们创建了一个名叫 pipe1 的命名管道,然后使用 echo 命令 加入一些数据,这之后在处理输入的数据时 shell 就变成非交互式的了(LCTT 译注:被管道占住了)。

然后,我们打开另外一个 shell 终端,运行另外的命令来打印出刚加入管道的数据。

# while read line ;do echo "This was passed-'$line' "; done<pipe1
套接字文件(socket)

套接字文件(socket) : 提供进程间通信方法的文件,它们能在运行在不同环境中的进程之间传输数据和信息。

这就是说,套接字可以为运行网络上不同机器中的进程提供数据和信息传输。

一个 socket 运行的例子就是网页浏览器连接到网站服务器的过程。

# ls -l /dev/ | grep "^s"

输出例子:

srw-rw-rw-  1 root root             0 May 18 10:26 log

下面是使用 C 语言编写的调用 socket() 系统调用的例子。

int socket_desc= socket(AF_INET, SOCK_STREAM, 0 );

上例中:

  • AF_INET 指的是地址域(IPv4)
  • SOCK_STREAM 指的是类型(默认使用 TCP 协议连接)
  • 0 指协议(IP 协议)

使用 socket_desc 来引用管道文件,它跟文件描述符是一样的,然后再使用系统函数 read() 和 write() 来分别从这个管道文件读写数据。

目录文件

这是一些特殊的文件,既可以包含普通文件又可包含其它的特殊文件,它们在 Linux 文件系统中是以根(/)目录为起点分层组织存在的。

列出某目录下的目录文件:

# ls -l / | grep "^d"

输出例子:

drwxr-xr-x   2 root root  4096 May  5 15:49 bin
drwxr-xr-x 4 root root 4096 May 5 15:58 boot
drwxr-xr-x 2 root root 4096 Apr 11 2015 cdrom
drwxr-xr-x 17 root root 4400 May 18 10:27 dev
drwxr-xr-x 168 root root 12288 May 18 10:28 etc
drwxr-xr-x 3 root root 4096 Apr 11 2015 home
drwxr-xr-x 25 root root 4096 May 5 15:44 lib
drwxr-xr-x 2 root root 4096 May 5 15:44 lib64
drwx------ 2 root root 16384 Apr 11 2015 lost+found
drwxr-xr-x 3 root root 4096 Apr 10 2015 media
drwxr-xr-x 3 root root 4096 Feb 23 17:54 mnt
drwxr-xr-x 16 root root 4096 Apr 30 16:01 opt
dr-xr-xr-x 223 root root 0 May 18 15:54 proc
drwx------ 19 root root 4096 Apr 9 11:12 root
drwxr-xr-x 27 root root 920 May 18 10:54 run
drwxr-xr-x 2 root root 12288 May 5 15:57 sbin
drwxr-xr-x 2 root root 4096 Dec 1 2014 srv
dr-xr-xr-x 13 root root 0 May 18 15:54 sys
drwxrwxrwt 13 root root 4096 May 18 17:55 tmp
drwxr-xr-x 11 root root 4096 Mar 31 16:00 usr
drwxr-xr-x 12 root root 4096 Nov 12 2015 var

您可以使用 mkdir 命令来创建一个目录。

# mkdir -m 1666 tecmint.com
# mkdir -m 1666 news.tecmint.com
# mkdir -m 1775 linuxsay.com
结论

现在应该对为什么 Linux 系统中一切都是文件以及 Linux 系统中可以存在哪些类型的文件有一个清楚的认识了。

您可以通过阅读更多有关各个文件类型的文章和对应的创建过程等来增加更多知识。我希望这篇教程对您有所帮助。有任何疑问或有补充的知识,请留下评论,一起来讨论。

诠释Linux中『一切都是文件』概念和相应的文件类型的更多相关文章

  1. Linux中tty、pty、pts的概念区别

    转自Linux中tty.pty.pts的概念区别 基本概念: 1> tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过 ...

  2. Linux中tty、pty、pts的概念区别 转载

    基本概念: > tty(终端设备的统称): tty一词源于Teletypes,或teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西 ...

  3. linux中编译git时提示找不到ssl.h头文件

    在centos中的解决方案是安装一个叫 openssl-devel 的包.

  4. linux中安装nginx时查看修改80端口时没有iptables文件的内容?? 求解

  5. Linux中的硬链接和软链接的概念、区别及用法

    概念: 硬链接(hard link): A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指 ...

  6. 如何在Linux中自动删除或清理/tmp文件夹内容?

    每个Linux系统都有一个名为的目录/tmp,该目录已挂载了单独的文件系统. 它具有称为tmpfs的特殊文件系统.这是一个虚拟文件系统,操作系统将在系统引导时自动挂载/tmp挂载点. 如果要根据应用程 ...

  7. Linux中一切皆文件

    谈一谈Linux中一切皆文件 1. Linux中所有内容都是以文件的形式保存和管理,即:一切皆文件. 普通文件是文件. 目录(在win下称为文件夹)是文件. 硬件设备(键盘.硬盘.打印机)是文件. 套 ...

  8. 【Linux】windows下编写的脚本文件,放到Linux中无法识别格式

    注意:我启动的时候遇到脚本错误 » sh startup.sh -m standalone tanghuang@bogon : command not found : command not foun ...

  9. Linux中目录结构以及VI编辑器常见的命令操作

    1.每个目录的详细介绍,先放一张目录的整体结构在这里 /bin:是Binary的缩写,用于存放经常使用的命令 /sbin:s代表Super User,用于存放系统管理员使用的命令 /home:存放普通 ...

随机推荐

  1. 风清杨之Oracle的安装与说明

    1.Oracle官网与下载地址 Oracle中文官网:http://www.oracle.com/cn/index.html Oracle中文官网下载:http://www.oracle.com/te ...

  2. 8个免费实用的C++GUI库(转载)

      C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库.实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都是C++擅长的地方.C++ ...

  3. sql 随机函数newid()

    newid()返回的是uniqueidentifier类型的唯一值.newid()每次产生的值都不一样 从表中随机获取前N条记录 select top N *  from table_name ord ...

  4. [USACO2005][poj2229]Sumsets(递推)

    http://poj.org/problem?id=2229 分析: 显然的递推 若n为奇数,那么肯定是在n-1的基础上前面每个数+1,即f[n]=f[n-1] 若n为偶数 当第一位数字是1的时候,等 ...

  5. bootstrap 多个 modal 相互遮挡

    当一个页面有多个modal时,他们的z-index都是相同的,会产生一个模态框被另一个挡住,失去焦点 此时在模态框的div上加入style="display: none;"就可以.

  6. HTTP协议强化理解

    一:第一波 1.  是什么? 答:是一种定义超文本在网络中如何进行传输的协议!   所有的WWW上的文件都必须遵循! 是基于TCP/IP. 传输路径:  客户端<——>服务端  (全双工) ...

  7. ansible 配置运行环境

    P34 2.3.1 配置ansible的环境 ansible的配置文件是以ini格式存储配置数据的,在ansible中几乎所有的配置都可以通过playbook或者环境变量来重新赋值 运行ansible ...

  8. hive 使用笔记(partition; HDFS乱码)

    6.  insert 语句 1) 因为目标表有partition, 所以刚开始我使用的语句是 insert overwrite table sa_r_item_sales_day_week_month ...

  9. 42.Android之ListView中ArrayAdapter简单学习

    今天学习下Android中ListView关于ArrayAdapter数据绑定, 废话少说直接上代码. 改下布局文件: <?xml version="1.0" encodin ...

  10. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...