从原理叙述索引节点 索引节点号 文件描述符的区别
要理解索引节点(inode)是什么,要从文件的存储开始说起,文件存储在磁盘上是一块(块也称为物理记录)为单位的,每个块包括多个扇区,每个扇区大小为512字节,关于文件存储知识在扩充一下,其实是这样的:文件里面的数据先存在逻辑记录上,然后打包存在物理记录上(块)比如一个文件的数据大小为1949B通过一个字节一个字节的记录在逻辑记录上,那么文件就会分到4块(2048B)的磁盘容量,因为存储的最小单位为块,要容纳1949B就要2048B的大小,那么就有99B会浪费,浪费的部分称为内部碎片。若是不记录到逻辑记录上,而是按照文件的大小平均分配块的话浪费的会更多,比如有2字节的文件,若是按照1字节存入一个快,那么内部碎片就会更大!!!其实通过采用逻辑记录的方法,好比往杯中倒水,每一个空间尽量的用到,直到利用率最大化。好了,把数据存起来后,那怎么知道是哪个用户存的???所以就有了索引节点用来存储文件的信息:文件的权限、拥有者、大小、数据的位置等等,具体如下:1:文件的字节数
2:文件拥有者的User ID
3:文件的Group ID
4:文件的读、写、执行权限
5:文件的时间戳,共有三个:
ctime指inode上一次变动的时间
mtime指文件内容上一次变动的时间
atime指文件上一次打开的时间。
6:链接数,即有多少文件名指向这个inode
7:文件数据block的位置
可以输入:stat + 文件名查看:
对于索引节点号其实也就是索引节点的一个别名,操作系统通过这个索引节点号来识别文件,若是通过文件名来识别,那多麻烦啊!!!程序上可以通过这个方法(我自己想的,借鉴了win32句柄hwnd的方法,当然操作系统不是这么做的),因为每个文件都有一个索引节点,索引节点也要被存储下来,每个索引节点都有一个地址,关键是这个地址还不同,所以把地址强制转化为int型,并赋值给索引节点号,就能识别每一个文件了。所以嘛,多看高端人写的代码还是很有好处的->_->
对于文件描述符,先说说两个概念:系统范围内的打开文件表、单个进程的打开文件表,我们再来说说open()函数的机制:是这样的若是一个进程调用这个函数,那么首先系统范围内的打开文件表会记录该文件,也就是根据文件名搜索目录,并将目录条目复制到系统范围内的打开文件表中,同时对于进程的打开文件表也会记录同样的信息,并通过指针指向整个系统范围内的打开文件表,若是又有一个进程用同样的方法调用open()函数要打开该文件,只是在进程的打开文件表中添加一个条目,并指向整个系统范围内的打开文件表,由于系统的存在,所以没必要添加了,那么open()函数返回一个纸箱单个进程的打开文件表的指针,之后所有的操作都是通过该指针,那么这个指针就是所谓的文件描述符,描述符,描述符,描述了这样的一些信息:文件指针、文件打开计数器、文件磁盘的位置、访问权限等。对于文件打开计数器,我们可以进一步的深入理解关闭文件到底是个什么意思,就是因为文件打开计数器这个东东记录了,有多少个进程在访问该文件,每当一个进程调用close()函数时该值就会减少,单个进程的打开文件表就会删除相应的该文件信息,但是系统范围内的不会删除,只有文件打开计数器的值减少到0以后,系统范围内的打开文件表就会删除该文件相关的信息,这个时候才叫真正的关闭文件!!!其实还可以解释一个现象:当打开两个同一个记事本,有个记事本什么都没写,一个记事本记录了数据,当你关闭文件时会提示你保存数据否,若是保存,在关闭那个什么都没写的记事本后,再次打开时,这个记事本依然会有记录(原因就是多个单个进程打开文件表都指向了系统范围内的打开文件表),其实也算是一种共享的方式!!!若是理解有错误,还请指出来,以免误人子弟哈,大家一起进步!!!