正确理解Linux下的文件属性
- 格式:doc
- 大小:26.50 KB
- 文档页数:3
Linux⽂件的属性(上半部分)第⼋节 Linux ⽂件的属性(上半部分)标签(空格分隔):Linux实战教学笔记第1章 Linux中的⽂件1.1 ⽂件属性概述(ls -lhi)linux⾥⼀切皆⽂件Linux系统中的⽂件或⽬录的属性主要包括:索引节点(inode),⽂件类型,权限属性,链接数,所归属的⽤户和⽤户组,最近修改时间等内容:⽂字解释:第⼀列:inode索引节点编号(相当于⼈的⾝份证,全国唯⼀)第⼆列:⽂件类型及权限第⼆列共11个字符:其中第⼀个字符为⽂件类型,随后的9个字符为⽂件的对应权限,最后⼀个字符点号“.”是和selinux有关的⼀个标识;第三列:硬链接个数(详细参看ln命令的讲解);相当于超市的多个⼊⼝,可以从不同的⽂件⼊⼝进⼊⽂件,还可以互为备份(消防通道)第四列:⽂件或⽬录所属的⽤户⽂件的所有者(属主);linux⾥⾯⽂件和程序的存在必须要有⽤户和组满⾜相应的存在需求。
第五咧:⽂件或⽬录所属的组第六列:⽂件或⽬录的⼤⼩;第七⼋九列:⽂件或⽬录的修改时间:默认⽉⽇时分第⼗列:实际的⽂件或⽬录名⽂件名不算⽂件的属性下⾯我们以chensiqi⽂件为例进⾏说明,具体列的内容参考下上⾯的图:1736707 -rwx-xr-x- 1 root root 35 Oct 28 11:29 chensiqiinode索引节点编号:1736707⽂件类型,⽂件类型是-,表⽰这是⼀个普通⽂件;⽂件权限:⽂件权限是rwxr-xr-x,表⽰⽂件属主可读,可写,可执⾏,⽂件归属的⽤户组可读可执⾏,其他⽤户可执⾏。
硬链接个数:表⽰chensiqi这个⽂件没有其它的硬链接,因为连接数是1,就是他本⾝;⽂件属主:这个⽂件所属的⽤户,这⾥意思是chensiqi⽂件被root⽤户拥有,注意,是第⼀个root;⽂件属组:这个⽂件所属的⽤户组,在这⾥是root⽤户组,是显⽰信息⾥的第⼆个root⽂件⼤⼩:⽂件⼤⼩是35个字节⽂件修改时间:这⾥的时间是该⽂件最后被更新(包括⽂件创建,内容更新,⽂件名更新等)的时间,可⽤如下命令查看⽂件的修改,访问,创建的时间1.2 索引节点inode1.2.1 inode 概述硬盘要存储数据,⾸先要分区,然后格式化创建⽂件系统,最后挂载,才能存数据。
Linux文件种类与副文件名一直强调一个概念,那就是:任何装置在Linux底下都是文件,不仅如此,连资料沟通的介面也有专属的文件在负责~所以,你会瞭解到,Linux的文件种类真的很多~除了前面提到的一般文件(-)与目录文件(d)之外,还有哪些种类的文件呢?* 文件种类:我们在刚刚提到使用‘ls -l’观察到第一栏那十个字元中,第一个字元为文件的类型。
除了常见的一般文件(-)与目录文件(d)之外,还有哪些种类的文件类型呢?* 正规文件(regular file ):就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字元为 [ - ],例如 [-rwxrwxrwx ]。
另外,依照文件的内容,又大略可以分为:o 纯文字文件(ASCII):这是Linux系统中最多的一种文件类型啰,称为纯文字文件是因为内容为我们人类可以直接读到的资料,例如数字、字母等等。
几乎只要我们可以用来做为设定的文件都属于这一种文件类型。
举例来说,你可以下达‘ cat ~/.bashrc ’就可以看到该文件的内容。
(cat 是将一个文件内容读出来的指令)o 二进位文件(binary):还记得我们在‘ 第零章、计算机概论 ’里面的软体程式的运作中提过,我们的系统其实仅认识且可以执行二进位文件(binary file)吧?没错~你的Linux当中的可执行文件(scripts, 文字型批次文件不算)就是这种格式的啦~举例来说,刚刚下达的指令cat就是一个binary file。
o 资料格式文件(data):有些程式在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为资料文件 (data file)。
举例来说,我们的Linux在使用者登入时,都会将登录的资料记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件。
linux中file命令的用法file命令是一个常用的Linux命令,用于确定给定文件的类型。
它通过读取文件的魔数(magic number)或文件头来判断文件的类型,并且可以识别并显示大多数常见文件类型的信息。
file命令在Linux系统中非常强大且使用方便,通过它我们可以轻松地获取文件的详细信息。
使用file命令非常简单,只需要在终端中输入"file"命令,后面跟上要分析的文件即可。
例如,要查看名为example.txt的文件的类型,只需运行以下命令:$ file example.txtfile命令会分析该文件,并将结果输出到终端。
输出的结果可能包含文件的类型、所属类别以及其他相关信息。
file命令可以识别并显示许多不同类型的文件,例如常见的文本文件、二进制文件、压缩文件、目录、各种脚本文件等。
下面是file命令可能返回的一些常见文件类型示例:1. ASCII text:表示文件是ASCII文本文件,只包含文本字符。
2. ISO-8859 text:表示文件是ISO-8859编码的文本文件,一种常见的字符编码格式。
3. UTF-8 Unicode text:表示文件是UTF-8编码的Unicode文本文件,一种常见的字符编码格式。
4. ELF 64-bit executable:表示文件是64位的可执行文件,通常是Linux上的二进制可执行文件。
5. PNG image data:表示文件是PNG格式的图像文件。
6. gzip compressed data:表示文件是经过gzip压缩的文件。
7. directory:表示文件是一个目录。
除了返回文件的类型外,file命令还可以提供其他一些有关文件的信息,例如文件的大小、修改时间、访问权限等。
该命令还可以对一组文件进行批量分析,只需将要分析的文件名以空格进行分隔即可。
另外,file命令还支持使用通配符来分析文件,例如使用"*"来表示所有文件,或者使用"*.txt"来表示所有以.txt结尾的文件。
Linux虚拟文件系统sysfs之属性文件attribute整理(一)sysfs接口函数到建立_DEVICE_ATTR架构图:最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作。
说道sysfs接口,就不得不提到函数宏 DEVICE_ATTR原型是#define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)函数宏DEVICE_ATTR内封装的是__ATTR(_name,_mode,_show,_stroe)方法,_show表示的是读方法,_stroe表示的是写方法。
当然_ATTR不是独生子女,他还有一系列的姊妹__ATTR_RO宏只有读方法,__ATTR_NULL等等如对设备的使用 DEVICE_ATTR ,对总线使用 BUS_ATTR ,对驱动使用 DRIVER_ATTR ,对类别 (class) 使用 CLASS_ATTR, 这四个高级的宏来自于<include/linux/device.h>DEVICE_ATTR 宏声明有四个参数,分别是名称、权限位、读函数、写函数。
其中读函数和写函数是读写功能函数的函数名。
如果你完成了DEVICE_ATTR函数宏的填充,下面就需要创建接口了例如:static DEVICE_ATTR(polling, S_IRUGO | S_IWUSR, show_polling, set_polling);static struct attribute *dev_attrs[] = {&dev_attr_polling.attr,NULL,};当你想要实现的接口名字是polling的时候,需要实现结构体struct attribute *dev_attrs[]其中成员变量的名字必须是&dev_attr_polling.attr然后再封装static struct attribute_group dev_attr_grp = {.attrs = dev_attrs,};在利用sysfs_create_group(&pdev->dev.kobj, &dev_attr_grp);创建接口通过以上简单的三个步骤,就可以在adb shell 终端查看到接口了。
linux文件后缀名解释
Linux系统中的文件后缀名通常不会像Windows系统那样直接显示在文件名中。
相反,Linux 系统中的文件后缀名是以隐藏属性的方式存在的。
可以使用ls命令的“-a”选项来查看文件的完整名称,包括隐藏的后缀名。
常见的Linux文件后缀名包括:
1..bin:二进制文件,包含可执行代码
2..c:C语言源代码文件
3..h:C语言头文件
4..cpp:C++语言源代码文件
5..hpp:C++语言头文件
6..sh:Shell脚本文件
7..txt:文本文件
8..conf:配置文件
9..xml:XML格式文件
10..json:JSON格式文件
11..log:日志文件
12..out:输出文件
13..err:错误输出文件
14..pdf:PDF格式文件
15..jpg:JPG格式图片文件
16..png:PNG格式图片文件
1
17..gif:GIF格式图片文件
18..odp:OpenDocument格式演示文稿文件
19..ods:OpenDocument格式电子表格文件
20..odt:OpenDocument格式文本文件
21..ttf:TrueType字体文件
22..desktop:桌面快捷方式文件
23..rpm:Red Hat Package Manager软件包文件
24..deb:Debian软件包文件
25..tar.gz:压缩的tar格式文件
26..zip:压缩的zip格式文件
27..rar:压缩的rar格式文件
28..7z:压缩的7z格式文件
2。
Linux中fd概念
在Linux中,fd代表文件描述符(File Descriptor)。
文件描述符是一个用于访问文件或输入/输出设备的整数值。
它是对打开文件或设备的引用,可以用于读取、写入或操作文件。
Linux中的文件描述符有以下几个重要的特点:
1.标准文件描述符:在Linux系统中,有三个标准文件描述符预先定义:
●0:标准输入(stdin),通常关联到键盘输入。
●1:标准输出(stdout),通常关联到屏幕输出。
●2:标准错误(stderr),通常关联到屏幕输出,用于打印错误消
息。
2.数值表示:文件描述符以非负整数形式表示,其中0、1和2是预留给标准文件描述符的。
其他的文件描述符从3开始递增。
3.文件描述符的用途:文件描述符用于访问各种类型的文件、设备或管道。
它可以用于读取、写入、关闭、复制、移动文件位置以及其他文件操作。
4.文件描述符的操作:在Linux中,可以使用系统调用函数(如open、read、write、close等)来创建、操作和关闭文件描述符。
5.文件描述符的重定向:可以通过重定向操作符将文件描述符重定向到其他文件或设备。
例如,将输出重定向到文件中:command > file.txt,将错误输出重定向到文件中:command 2> error.txt。
总而言之,文件描述符是Linux中用于访问文件和设备的引用,它提
供了对文件的读取、写入和操作的能力,并且可以通过重定向来改变文件描述符的输入和输出目标。
linux操作系统管理文件和权限的实训总结1. 引言1.1 概述Linux操作系统是一款广泛应用于服务器和个人计算机的开源操作系统。
其强大的文件管理和权限设置功能使得用户能够更好地控制和保护文件的安全性。
本篇长文将总结在实训中所学到的Linux操作系统管理文件和权限的相关知识和技巧。
1.2 文章结构本文分为四个部分:引言、Linux操作系统管理文件和权限的实训总结、实训心得与体会以及结论。
在本部分(引言)中,将对文章进行简要介绍,并概括说明后续内容。
1.3 目的本文旨在通过对Linux操作系统管理文件和权限的实际操作实训进行总结,加深对文件管理和权限设置的理解,提高对Linux命令行工具使用技巧的掌握,并探讨在实际应用中遇到的问题及其解决方案。
最终目标是能够提供有价值且实用性强的思考和建议,以便读者能够更好地理解和运用Linux操作系统中关于文件管理和权限设置方面的知识。
2. linux操作系统管理文件和权限的实训总结2.1 实训背景:在Linux操作系统中,文件的管理和权限设置是非常重要的操作。
正确地管理文件可以提高工作效率和数据安全性。
本次实训旨在通过学习Linux命令行工具,并运用所学知识进行实践来掌握文件管理和权限设置的方法和技巧。
2.2 文件管理:2.2.1 创建和删除文件:创建文件是日常工作中常见的任务。
我们可以使用touch命令来创建空白文件,例如:touch file.txt。
而删除文件则可以使用rm命令,如:rm file.txt。
- 在实践过程中,我学会了如何快速地创建空白文件,并且了解到rm命令可以搭配一些参数来批量删除不需要的文件。
2.2.2 复制和移动文件:复制或移动文件是进行整理与备份时常见的操作。
cp命令用于复制文件,例如:cp file.txt newfile.txt 将file.txt复制为newfile.txt。
而mv命令用于移动或重命名文件,例如:mv file.txt /path/to/newdirectory/ 或mv oldfile.txt newfile.txt。
青蛙学Linux—⽤户、组、权限和⽂件属性1、⽤户和组1.1、⽤户⾓⾊在Linux下有以下三种⾓⾊⽤户:1. 超级⽤户:拥有对系统的最⾼管理权限的⽤户,默认⽤户名为root。
需要注意的是,与Windows下的超级管理员Administrator不同,root⽤户在Linux下拥有最⾼的权限,你可以使⽤root⽤户运⾏rm –rf /*命令删除整个系统,⽽Administrator⽤户不允许删除系统⽂件(其实Windows下的最⾼权限⽤户为System,只是Windows限制了使⽤System⽤户登录的⾏为)。
2. 普通⽤户:只能操作⾃⼰⽬录下的⽂件或者经过授权的⽂件,能够登录操作系统。
3. 虚拟⽤户:也叫伪⽤户,⽆法登录操作系统。
这类⽤户的存在主要是为了系统管理的⽅便,满⾜相应的系统进程对于⽂件属主(即权限)的要求。
这类⽤户指向的shell为/sbin/nologin,使⽤该shell的⽤户⽆法登录系统且⽆法通过su命令切换到该⽤户。
1.2、⽤户和组之间的关系在Linux系统下,当⼀个⽤户被创建时,系统将创建⼀个与⽤户同名的组,该⽤户为该组中的唯⼀⽤户。
当然,⼀个⽤户也可以加⼊其他的组。
⽤户和组具有以下⼏种关系:⼀对⼀:即⼀个⽤户可以存在⼀个组中,同时也是该组中的唯⼀成员⼀对多:即⼀个⽤户可以存在多个⽤户组中,那么此⽤户具有多个组的共同权限多对⼀:多个⽤户可以存在⼀个组中,这些⽤户具有和组相同的权限多对多:多个⽤户可以存在多个组中,其实就是上⾯三个对应关系的扩展1.3、⽤户和组的相关配置⽂件1.3.1、/etc/passwd该⽂件是系统的⽤户配置⽂件,是⽤户管理中最重要的⼀个⽂件。
记录了系统中每个⽤户的基本属性,对所有⽤户可读,但只有root⽤户可写。
以下来分析下该⽂件的内容(仅截取⽂件的⼀部分):⽂件中的每⾏内容以冒号分隔,每个字段表⽰的具体含义如下:①:⽤户名②:密码,但是⽤户真正的密码不是保存在这⾥,⽽是在另外⼀个⽂件③:UID,⽤户ID④:GID,⽤户所属的组的ID⑤:⽤户注释⑥:⽤户家⽬录⑦:⽤户的默认shell1.3.2、/etc/shadow该⽂件可以称为/etc/passwd的影⼦⽂件,存储的就是经过加密的⽤户密码。
linux中各种文件类型普通文件(- regular file)(1)文本文件。
文件中的内容是由文本构成的,文本指的是ASCII码字符。
文件里的内容本质上都是数字(不管什么文件内容本质上都是数字,因为计算机中本身就只有1和0),而文本文件中的数字本身应该被理解为这个数字对应的ASCII码。
常见的.c 文件, .h文件 .txt文件等都是文本文件。
文本文件的好处就是可以被人轻松读懂和编写。
所以说文本文件天生就是为人类发明的。
(2)二进制文件。
二进制文件中存储的本质上也是数字,只不过这些数字并不是文字的编码数字,而是就是真正的数字。
常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译连接生成的.bin)都是二进制文件。
(3)对比:从本质上来看(就是刨除文件属性和内容的理解)文本文件和二进制文件并没有任何区别。
都是一个文件里面存放了数字。
区别是理解方式不同,如果把这些数字就当作数字处理则就是二进制文件,如果把这些数字按照某种编码格式去解码成文本字符,则就是文本文件。
(4)我们如何知道一个文件是文件文件还是二进制文件?在linux系统层面是不区分这两个的(譬如之前学过的open、read、write等方法操作文件文件和二进制文件时一点区别都没有),所以我们无法从文件本身准确知道文件属于哪种,我们只能本来就知道这个文件的类型然后用这种类型的用法去用他。
有时候会用一些后缀名来人为的标记文件的类型。
(5)使用文本文件时,常规用法就是用文本文件编辑器去打开它、编辑它。
常见的文本文件编辑器如vim、gedit、notepad++、SourceInsight等,我们用这些文本文件编辑器去打开文件的时候,编辑器会read读出文件二进制数字内容,然后按照编码格式去解码将其还原成文字展现给我们。
如果用文本文件编辑器去打开一个二进制文件会如何?这时候编辑器就以为这个二进制文件还是文本文件然后试图去将其解码成文字,但是解码过程很多数字并不对应有意义的文字所以成了乱码。
linux文件的基本属性
linux文件的基本属性主要包括:
1. 文件名:文件的名字,也可以称之为“标签”。
2. 文件类型:文件可以分为普通文件、目录文件和设备文件等不同类型。
3. 访问权限:每个文件都有三种访问权限,即读权限、写权限和执行权限,用户可以通过这三种权限来控制对文件的访问。
4. 文件大小:每个文件都有其自身的大小。
5. 创建时间:每个文件都有其创建时间,该时间是文件被创建的时间。
6. 修改时间:每个文件都有其修改时间,该时间是文件被最后一次修改的时间。
转文:正确理解Linux下的文件属性
linux是一个安全的操作系统,她是以文件为基础而设计的,其文件权限是比较复杂的,可以用stat命令以及lsattr命令来显示某个文件的详细信息:
$ stat file1
file: `file1'
size: 11904 blocks: 24 io block: 4096 regular file
device: 301h/769d inode: 355982 links: 1
access: (0755/-rwxr-xr-x) uid: ( 503/ jack) gid: ( 503/ general)
access: 2003-10-19 09:14:12.000000000 +0800
modify: 2003-10-14 20:41:21.000000000 +0800
change: 2003-10-19 18:56:25.000000000 +0800
$ lsattr file
----i--a----- file
可以看到,文件权限的含义是比较广的,先来看-rwxr-xr-x,第一位是文件的类型,它定义了用户只能某种方式来操作文件,后面九位是文件的存取控制信息,linux的文件许可机制将用户分为三类:文件属主u(user)、文件属组g(group)和其它用户o(other)。
三类不同的用户可以对文件拥有三种不同级别的权限:读r(read)、写w(write)和运行x(execute)。
于是形成了九位的权限信息,分为三组,分别对应u,g,o。
除此之外,用户还可以设置setuid 与setgid位来改变程序的执行身份。
用lsattr命令则可以看到文件的属性,控制位包括asacddiijsttu,这些也是能控制文件的存取的。
由于篇幅有限,不可能就这些一一进行分析,本文着力分析文件权限中w(write)的真正含义,挖出其背后隐藏的细节,力图使读者能正确用好这个关键的权限位,不至于在系统管理中出现差漏。
为了能更直观的说明问题,本文采用实验操作的方式,一步一步的进行分析。
为了简化操作,我们用o(other)这组权限来做实验。
实验中用到的权限位均属于o(other), 进行操作的用户均非root用户,属于o(other)。
在实验之前,必须澄清一个概念,目录也是一种文件,它主要包括了两方面的信息,该目录下文件的文件名称与文件inode编号,它们之间有一一对应的关系。
不过目录文件比较特殊,不能用常规的方法进行读写,必须用系统的专用命令来操作。
命令ls其实是对目录文件进行读操作,命令mv,rm则是对目录文件进行写操作。
好了,该说说w(write)的真正含义了,一句话,linux文件权限中的w是对该文件的*内容*进行限定。
下面的实验可以验证。
实验1, 目录文件: /test(rwx), 普通文件: /test/file(r--). 当前目录:/test
$ echo "abc">file
bash: file: permission denied
试图对file的内容进行改写, 但file的权限是只读,很显然,操作失败。
$ cat file
hello world!
没有问题, 可以读出file的内容。
$ mv file file2
$ ls
file2
这是怎么回事呢, file的权限明明是只读啊, 请注意, 前面提到了, 文件中的rw权限只是针对当前文件的内容进行限定, 文件名不属于当前文件的内容, 它是保存在上一级的目录文件的内容中。
而mv命令表面上是针对file的,其实是对/test的内容进行改写,再看看/test 的权限, 是可写的(rwx)。
许多用户为了保护文件,将其权限设成只读就不管了,这是非常危险的,诚然,可以达到保护文件内容的目的(其实也未必,补充内容中有论述),但你却不能保证文件是否会被更名或被删除,保险的方法是将文件父目录的权限也设为只读。
当然,也有其他的方法,比如用chattr +i命令或将文件系统用ro方式挂载等等,但这些不在本文论述范围。
$ rm -f file2
$ ls
$
同样的原因, 我们可以删除file2, 与上一次操作不同的是,我们不是改写/test的一条纪录,而是在删除/test的一条纪录。
实验2, 目录文件: /test(r-x), 普通文件: /test/file(rw-), 当前目录:/test
$ echo "abc">file
$ cat file
abc
/test的权限虽然是只读,但我们改写的是file的内容, 它的权限是可写,当然没有问题。
$ mv file file2
mv: cannot move 'file' to 'file2': permission denied
$ rm -f file
rm: cannot remove 'file': permission denied
我们已经知道, 这两条指令其实与file的权限无关, 而是在改写/test的内容, 当然操作失败。
通过前面几个操作,我们应该要分清楚指令真正的操作对象是谁,这样才能对文件权限作出正确的设定。
实验3, 目录文件: /test(rwx), 普通文件: /test/file(r--), 目录文件: /test/dir(r-x), 普通文件: /test/dir/file(rw-), 当前目录:/test
$ mv file file2
$ mv dir dir2
$ ls
dir2 file2
很顺利, 因为/test/file与/test/dir的父目录/test的权限给的太宽松了,是rwx。
$ rm -f file2
$ rm -rf dir2
rm: cannot remove 'dir2/file': permission denied
$ ls -r
.:
dir2
./dir2:
file
到这里, 我们已经丝毫不奇怪普通文件/test/file2被删除, 但具有同等地位的目录文件
/test/dir2却安然无恙。
当执行rm -rf dir2时, 由于存在普通文件/test/dir2/file, 系统便尝试先删除它, 也就相当于修改目录文件/test/dir2的内容, 但它的权限是只读, 不能进行修改,也就相当于不能删除/test/dir2/file, 又由于/test/dir2与/test/dir2/file有依存关系, /test/dir2也就自然会被保留下来。
回顾上一个操作(mv dir dir2),为什么目录文件/test/dir却可以被更名呢?由于更名操作并不涉及到自身的内容被修改,修改的只是父目录的内容,而进行删除操作时,父目录的内容固然要被修改,但也同时也要修改自身的内容(因为要删除该目录下的文件),这就不被允许了。
如果/test/dir2的权限是可写, 或者目录下没有子文件, 那么它的下场就和/test/file2一样, 被删除。
通过前面的几个操作,可以看到,文件有这么几个关键状态:被读、被改写、被改名、被删除、被执行。
然而系统只区分三种权限,即读、写、执行(rwx)。
那么改名与删除这两个操作是否系统就置之不理了呢?不是的,系统将这两个操作归入被操作文件的上一级目录来管理。
那么又是以何种方式来管理的呢?答案是目录将其下的所有文件看作是它的内容。
这样,当用户更名或删除某个文件时,执行的是对上一级目录的写操作,属于rwx三种权限之一的w操作,并没有逃出系统的管理范围。
我们的大脑总是活跃的, 能想象出各种各样的事情, 能把许多简单的东西组合成很复杂东西, 上面几个实验不正是这样吗, 象这样的实验我们还可以设计出许多, 但做的越多, 脑子似乎越乱(我已经有一点了), 你能记的住这么多吗? ok, 我们也许能将它想的简单一些,
只需注意两个方面, 一是要清楚目录的内容是什么;二是要明白文件权限中的w(write)的真正含义。
仔细想想, 不是吗?
补充:
在实验1中, 如果用vim对file进行编辑, 并且强制保存(w!), 是可以成功的。
这并不是说vim就可以绕开系统的安全机制,而是vim耍了一个小小的把戏,它是先删除这个文件,而后又生成一个同名的新文件。
但有一个情况例外,就是当这个文件有另外一个硬链接文件存在时,vim会拒绝强制保存,仔细想想,当进行删除操作后,文件还存在,并没有被真正删除,而这时再新建一个文件,虽然同名,但已经不是原来的那个文件了!笔者曾对此事也颇为疑惑,为了求证,仔细阅读了vim6.2的源代码,才找到答案。
有兴趣的读者也可看一看,具体内容在src/fileio.c中。