当前位置: 首页 > article >正文

Linux C/C++编程-文件类型

【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客


《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)LinuxC\C++编程技术_夏天又到了的博客-CSDN博客

 

在Linux系统中,可以说一切皆文件。我们看到的目录和外设(如光驱、U盘、硬盘等)都是以文件的形式存在的。在Linux中有7种文件类型:普通文件、目录、块设备文件、字符设备文件、链接文件、管道文件、套接口文件。针对这7种文件类型,分别由相应的字符来表示。

  1. -:普通文件。
  2. d:目录。
  3. b:块设备文件(例如硬盘、光驱等)。
  4. c:字符设备文件(例如“猫”等串口设备)。
  5. l:链接文件。
  6. p:管道文件。
  7. s:套接口文件/数据接口文件(例如启动一个MySQL服务器时会产生一个mysql.sock文件)。

这里只需关注第一个字符(即文件类型)即可,其他属性暂不介绍。顺便介绍一下ll和ls-l的区别:ll会显示出当前目录下的隐藏文件,而ls -l不会。

4.4.1  普通文件

普通文件中包含的内容就是用户、系统或应用程序输入而生成的数据,在文件系统中不加任何内部修饰,把它们看作纯粹的字节流。我们可以用命令ls -l或ll来查看文件的属性信息,通过判断属性行的第一个字符来判断文件的类型,如果第一个字符是“-”,就表示是一个普通文件。比如我们在/root下运行ll命令:

[root@localhost ~]# ll
总用量 12
-rw-------. 1 root root 1659 12月 16 2016 anaconda-ks.cfg
-rw-------. 1 root root 1707 12月 15 2016 initial-setup-ks.cfg
-rwxr-xr-x  1 root root    0 1月  27 22:03 myfile.txt
drwxr-xr-x. 2 root root    6 12月 17 2016 perl5
drwxr-xr-x. 5 root root 4096 12月  9 06:49 soft
drwxr-xr-x. 2 root root   32 11月  3 22:11 zww
drwxr-xr-x. 2 root root    6 12月 17 2016 公共
drwxr-xr-x. 2 root root    6 12月 17 2016 模板
drwxr-xr-x. 2 root root    6 12月 17 2016 视频
drwxr-xr-x. 2 root root    6 12月 17 2016 图片
drwxr-xr-x. 2 root root    6 12月 17 2016 文档
drwxr-xr-x. 2 root root    6 12月 17 2016 下载
drwxr-xr-x. 2 root root    6 12月 17 2016 音乐
drwxr-xr-x. 2 root root    6 12月 17 2016 桌面

把“总用量12”看作第1行,ll输出的第2行到第4行的属性符号的第一个字符是“-”,因此文件anaconda-ks.cfg、initial-setup-ks.cfg和myfile.txt是普通文件。

文件和普通文件的所指范围不同,普通文件一定是文件,但文件不一定是普通文件,普通文件只是文件的一个子集。

4.4.2  目录

在Linux中,任何东西都被看成文件,目录也不例外。前面提到,目录保存了该目录下所有文件的文件名到i节点号的对应关系。每个文件的文件名和该文件的i节点构成一个目录项,所有的目录项连在一起就是一个目录(块),如图4-3所示。

图4-3

我们可以用命令ls -l或ll来查看某个文件的属性符号(类似drw-----),如果第一个字符是“d”,该文件就表示一个目录。这句话是不是感觉有点别扭?要注意这里说的是“该文件”,文件和普通文件所指的范围不同,普通文件只是文件的一个子集。慢慢习惯吧,Linux下一切皆文件。比如我们在/root下运行ls -l命令:

[root@localhost ~]# ls -l
总用量 12
-rw-------. 1 root root 1659 12月 16 2016 anaconda-ks.cfg
-rw-------. 1 root root 1707 12月 15 2016 initial-setup-ks.cfg
-rwxr-xr-x  1 root root    0 1月  27 22:03 myfile.txt
drwxr-xr-x. 2 root root    6 12月 17 2016 perl5
drwxr-xr-x. 5 root root 4096 12月  9 06:49 soft
drwxr-xr-x. 2 root root   32 11月  3 22:11 zww
drwxr-xr-x. 2 root root    6 12月 17 2016 公共
drwxr-xr-x. 2 root root    6 12月 17 2016 模板
drwxr-xr-x. 2 root root    6 12月 17 2016 视频
drwxr-xr-x. 2 root root    6 12月 17 2016 图片
drwxr-xr-x. 2 root root    6 12月 17 2016 文档
drwxr-xr-x. 2 root root    6 12月 17 2016 下载
drwxr-xr-x. 2 root root    6 12月 17 2016 音乐
drwxr-xr-x. 2 root root    6 12月 17 2016 桌面

把“总用量12”看作第1行,从第5行到结束,其属性符号的第一个字符都是“d”,因此从第5行开始都是目录。

当新建一个目录的时候,会默认分配一个“块”,就是我们看到的4096字节,目录中文件的文件名和inode信息要存放到这个“块”中。目录里面文件增长,要存储的元信息也会增多,一个“块”不够时,会再申请一个“块”,但是最小的单位就是“块”,所以大小总会是4096的整数倍。

4.4.3  块设备文件

块设备是具有一定结构的随机存取设备,对这种设备的读写是按块进行的,它使用缓冲区来存放暂时的数据,待条件成熟后,从缓存区一次性写入设备或者从设备一次性读到缓冲区。Linux秉承“一切都是文件”的设计思想,将所有的块设备也看成文件,当内核发现一个块设备时,会通知用户空间,用户空间的udevd后台进程接收到这些消息后,会按照用户指定的规则为它们创建块设备文件。块设备文件通常存放在/dev下,比如/dev/sg1。常见的块设备文件如下:

  1. /dev/hd[a-t]:IDE设备。
  2. /dev/sd[a-z]:SCSI设备和SATA设备。
  3. /dev/fd[0-7]:标准软驱。
  4. /dev/md[0-31]:软raid设备。
  5. /dev/loop[0-7]:本地回环设备。
  6. /dev/ram[0-15]:内存。

其中,[]里的字母表示第几块设备,数字代表分区。因此,/dev/sda3代表第一块SATA接口的硬盘的第3个分区。我们可以联合使用ll和grep来搜索出/dev下的sda设备文件,如下:

[root@localhost dev]# ll /dev|grep sd
brw-rw----  1 root disk      8,   0 11月 25 16:16 sda
brw-rw----  1 root disk      8,   1 11月 25 16:16 sda1
brw-rw----  1 root disk      8,   2 11月 25 16:16 sda2
brw-rw----  1 root disk      8,   3 11月 25 16:16 sda3

可以看到,块设备文件的属性符号的第一个字符是b,b就是block的简写,代表块设备文件。

4.4.4  字符设备文件

字符设备又称为裸设备。相对于块设备可以随机访问,字符设备只能被顺序读写。常见的字符设备有打印机、计算机显示器、键盘、鼠标、调试解调器、终端等。终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype或者Teletypewriters的缩写,Teletype是最早出现的一种终端设备,很像电传打字机,是由Teletype公司生产的。字符设备文件通常也是存放在/dev下。

我们用ll和grep联合搜索出/dev下的tty设备文件,如下:

[root@localhost dev]# ll /dev|grep tty
crw-rw-rw-  1 root tty       5,   2 2月  12 13:42 ptmx
crw-rw-rw-  1 root tty       5,   0 11月 25 16:16 tty
crw--w----  1 root tty       4,   0 11月 25 16:16 tty0
crw--w----  1 root tty       4,   1 11月 25 08:24 tty1
crw--w----  1 root tty       4,  10 11月 25 16:16 tty10
crw--w----  1 root tty       4,  11 11月 25 16:16 tty11
crw--w----  1 root tty       4,  12 11月 25 16:16 tty12
...

可以看到属性符号的第一个字符都是c,表示是一个字符设备。

4.4.5  链接文件

链接相当于给文件添加了另一条索引。

要理解Linux下链接文件的实质,首先需要理解索引节点和目录项两个基本概念。

合理地使用链接文件会为日常使用和系统管理带来一些便利,主要包括以下几方面:

1)保持软件的兼容性

例如,在很多Linux发行版中,/bin/sh文件其实是一个指向/bin/bash的符号链接。为什么要这样设计?因为几乎所有的Shell脚本的第一行都是“#!/bin/sh”,“#!”符号表示该行指定该脚本所用的解释器。“#!/bin/sh”表示使用Bourne Shell作为解释器,这是一个早期的Shell。在现代的Linux发行版中,通常采用Bourne Again Shell(即bash),bash是对Bourne Shell的改进和增强,而早期的Bourne Shell在系统中根本不存在。为了能够顺利地运行Shell脚本而不必修改,只需要创建一个软链接/bin/sh让其指向/bin/bash。如此一来,就可以让bash来解释原本针对Bourne Shell编写的脚本了。

2)方便软件的使用

比如安装了一个大型软件Matlab,它可能默认安装在/usr/opt/Matlab目录下,可执行文件位置在/usr/opt/Matlab/bin目录下。除非将这个路径加入PATH环境变量里,否则每次运行这个软件,都需要输入一长串的路径,很不方便。此时,可以在“~/bin”下创建一个符号链接,这样今后在命令行下就无须输入完整路径,只需输入matlab即可。

3)维持旧的操作习惯

比如在SuSE中,启动脚本的位置放在/etc/init.d目录下,而在RedHat的发行版中,启动脚本的位置放在/etc/init.d/rc.d目录下。为了避免因为从SuSE转换到RedHat系统而导致管理员找不到位置的情况,可以创建一个符号链接/etc/init.d,使其指向/etc/init.d/rc.d。事实上,RedHat发行版也正是这样做的。

4)方便系统管理

在/etc/rc.d/rcX.d(X为数字0~7)目录下的符号链接是一个非常典型的例子。在init.d/目录下有许多用于启动、停止系统服务的脚本,如sshd、crond等。这些脚本可以接收一个参数,代表要启动或停止服务。为了决定在某个运行级别运行哪些脚本及传递给这些脚本哪些参数,RedHat设计了一个额外的目录机制,即rc0.d~rc6.d的7个目录,每个目录对应一个运行级别。如果在某运行级别下需要启动某服务或者停止某服务,就在对应的rcX.d目录下建立一个符号链接,指向init.d/目录下的脚本。

Linux下的链接文件可以分为硬链接文件和软链接文件。

1. 硬链接文件

硬链接的实质是现有文件在目录树中的另一个入口。也就是说,硬链接相当于源文件的另一个目录项,它和源文件指向同一个索引节点,对应于相同的磁盘数据块,具有相同的访问权限、属性等。简而言之,硬链接其实就是给现有的文件起了一个别名。如果把文件系统比喻成一本书,硬链接就是在书本的目录中有两个目录项指向了同一页码的同一章节。硬链接的优点是几乎不占磁盘空间(因为仅仅是增加了一个目录项而已),但是这一优点相对于软链接其实并不明显(因为软链接占用的磁盘空间也很少)。另外,硬链接有以下一些局限:

(1)不能跨文件系统创建硬链接。原因很简单,i节点号只有在一个文件系统内才能保证是唯一的,如果跨越文件系统,i节点号就可能重复。

(2)不能对目录创建硬链接。

正因为硬链接的这些局限,加之软链接更加易于管理,所以软链接更加常用。

对硬链接文件进行读写时,系统会自动把读写操作转换为对源文件的操作,而在删除硬链接文件时,系统仅仅删除硬链接文件,而不删除源文件。但如果删除硬链接文件的源文件,硬链接文件依然存在,而且保留了原有的内容。此时,系统会把它当作一个普通文件。

建立硬链接有什么好处呢?除了方便外,它还有防止“误删”的作用。意思是,只要文件的索引节点号上有一个及以上的硬链接,该文件就不会删除(文件的数据块和目录链接不被释放)。

2. 软链接文件

软链接又称为符号链接(Symbolic Link,简写为symlink)。与硬链接仅仅是一个目录项不同,软连接实质上也是个文件,不过这个文件的内容是另一个文件名的指针。当Linux访问软链接时,它会循着指针找出含有实际数据的目标文件。同样用书本来打个比方,软链接是书本里的某一章节,不过这一章节什么内容都没有,只有一行字“转某某章某某页”。软链接可以跨越文件系统指向另一个分区的文件,甚至可以跨越主机指向远程主机的一个文件,也可以指向目录。当创建了一个软链接文件后,它的权限为777,即所有权限都是开放的,实际上我们也无法使用chmod命令修改其权限,但是实际文件的保护权限仍然起作用。软链接还可以指向不存在的文件(可能是原来指向的文件被删除了,或者指向的文件系统尚未挂载,或者最初建立该符号链接的时候就指向了一个不存在的文件,等等),此时称这种状态为“断裂”(Broken)。与之相对的是,硬链接是不能指向一个不存在的文件的。另外,在Linux上创建一个指向目录的软链接是允许的,但是却不能创建一个指向目录的硬链接。其实在UNIX操作系统的历史上,对目录创建硬链接曾经是允许的,但人们发现,这样做会出现很多问题,尤其是一些对目录树进行的遍历操作,如fsck、find等命令无法正确执行。在《UNIX环境高级编程》一书中提到,作者在自己的系统上做过实验,结果是创建目录硬链接后,文件系统变得错误百出。因为这样做会破坏文件系统的树形结构,可能会使目录之间出现环。

对软链接文件进行读写时,系统会自动把读写操作转换为对源文件的操作,而在删除软链接文件的时候,系统仅删除链接文件,而不删除源文件。

对于软链接文件,文件属性信息的第一个字符是“l”。比如我们进入目录/etc/httpd/,然后用ll来查看软链接文件,如下:

# cd /etc/httpd/
# ll
总用量 8
drwxr-xr-x. 2 root root   35 12月 16 2016 conf
drwxr-xr-x. 2 root root 4096 12月 16 2016 conf.d
drwxr-xr-x. 2 root root 4096 12月 16 2016 conf.modules.d
lrwxrwxrwx. 1 root root   19 12月 16 2016 logs -> ../../var/log/httpd
lrwxrwxrwx. 1 root root   29 12月 16 2016 modules -> ../../usr/lib64/httpd/modules
lrwxrwxrwx. 1 root root   10 12月 16 2016 run -> /run/httpd

可以看到,后3个文件都是软链接文件。


http://www.kler.cn/a/514256.html

相关文章:

  • ui文件转py程序的工具
  • 现代AI训练标准配方:从合成数据到人类偏好
  • C# 中使用 gRPC 通讯
  • linux配置bond学习
  • 2025年PHP面试宝典,技术总结。
  • HTML<bdo>标签
  • 迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-接口函数
  • RHCE实验详解
  • 电梯系统的UML文档07
  • centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐
  • react19新API之use()用法总结
  • 【深度学习入门】深度学习知识点总结
  • AutoDev Composer:您身边的 Intellij 平台 Cursor、WinSurf 平替方案(预览版)
  • 项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(八)
  • redis 分布式方案
  • 介绍下常用的前端框架及时优缺点
  • Assembly语言的物联网
  • Java设计模式 八 适配器模式 (Adapter Pattern)
  • ROS2测试仿真
  • 开源视频生成 Pyramid Flow 本地部署实测