Chinaunix首页 | 论坛 | 博客
  • 博客访问: 915225
  • 博文数量: 380
  • 博客积分: 3495
  • 博客等级: 中校
  • 技术积分: 3996
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 09:35
文章分类

全部博文(380)

文章存档

2015年(2)

2014年(5)

2013年(9)

2012年(9)

2011年(67)

2010年(103)

2009年(182)

2008年(3)

我的朋友

分类: LINUX

2009-03-08 14:20:46

1.文件 Linux本身在实现上虽然与Unix完全不同。不过由于所遵循的规范基本上是相同的,再加上历史上也是以效仿Unix开始,所以在文件这一概念上是基本一样的。也就是在系统中,所有的一切都是文件。
Everything is file.
  不过文件却分成很多种类型。
 基本文件,目录文件,链接文件(硬,软),特殊文件(通常是设备文件)
基本文件:也就是我们通常操作计算机时所说的文件。比如文本,二进制文件。这些文件是以byte的形式,顺序存储的。所以在读取的时候通常是流(stream)读取方式。至于读取的内容嘛,除了应该存入的东西外,还有可能有metadata,以供操作系统使用。
不过我们通常的编程中使用的FILE确是下面这个结构体,跟metadata是没有什么在关系的。
---------stdio.h-------------------
typedef struct  {
       int             level;      /* fill/empty level of buffer */
       unsigned        flags;      /* File status flags          */
       char            fd;         /* File descriptor            */
       unsigned char   hold;       /* Ungetc char if no buffer   */
       int             bsize;      /* Buffer size                */
       unsigned char   *buffer;    /* Data transfer buffer       */
       unsigned char   *curp;      /* Current active pointer     */
       unsigned        istemp;     /* Temporary file indicator   */
       short           token;      /* Used for validity checking */
}       FILE;   
至于metadata嘛,是跟文件的实际存储方式相关联的。
所有的文件存储时,在linux系统中是用inode(可以认为是一个唯一的识别符)来标识的,这个inode又跟metadata相关联。通常是些什么创建,修改时间,属主,属性,类型,长度什么的。

目录文件:
按照实际的文件存储方式,我们是应该用inode去直接访问文件的,不过很显然,这个太不方便了。总不能所有机器里的文件都是些什么,010,10002.如此处理,恐怕真是天书一级了。所以呢,有了目录这个概念,虽然目录在存储上是跟文件一样的,以byte为单位存放,不过内容却只是inode与文件名关系对(pair)。所以对目录的操作是不能像正常文件那样读写的,只能通过内核提供的系统调用来进行。
内核初始时是只知道一个inode,"/"这个目录的,也就是root目录,通过各种操作,我们从/开始执行文件操作,内核就从/对应的inode找到各各目录文件,将其对应的inode,file对读到内存中,取得我们按名指定的文件对应的inode,随后我们就可以用inode对相应的文件进行操作了。
如/tmp/a/a.c 那就会是/->tmp->a->a.c
我想目录用hash来存储是应该比较好的。因为速度啊。
当然了,根据不同的文件系统实现,这个是不同的。
其实这种方式也可以解释为什么我们使用
"ls -la"命令时,总是能得到
.
..
这两个文件。因为正是这两个文件,才把文件结构中的上级目录与当前目录连接起来的。

链接文件:
链接分成两种类型,硬,软。

硬链接:Hard Link.
基本上现在大家知道了文件名跟inode的关系,那么多个文件名要是关联到同一个inode上会怎么样,出错?还是就这么着。
答案:就是这么着,Linux是充许多个文件名指向到同一个inode的。
说到这儿我就想起了unlink函数,最开始接触linux我一直想为什么不中delete,现在明白了,删除文件只是删除文件名与inode的link嘛,当然是unlink了。不过说到这个unlink,因为要维护多个文件名与inode的关系,所以metadata中通常会有一个link的计数器,当计数器为零时,就会直接删除inode对应的文件内容了。否则只是真的删除一个filename与inode的删除。
该给它做个总结了,硬链接就是文件名直接指到inode的文件指向方式。

软链接:其实应该叫符号链接。(symbolic link)
由于硬链接是文件名直指inode的,而LINUX是个多文件系统的OS,那么很明显,跨文件系统的硬链接是不可能实现的。于是就出现了符号链接,符号链接本身是一个正常的文件,它是有自己的inode的,在这个inode里记录了它要指向的文件的绝对路径。这样就能处理跨文件系统的链接问题了。当然,相应的副作用也出来了。符号链接的目的文件被删除后,相应的符号链接是不能被删除的。

特殊文件:
linux的所有的东西都是文件这可不是一句空话,具体的体现就看咱的特殊文件了。
特殊文件对应四种类型:
block device file, character device file,named pipe, socket
character device file:是字符设备文件,就是所有的操作都是一个一个的character,典型的就是键盘
block device file:是块设备文件,就是所有的操作是按块进行的,也就是多个字符可以一起操作
 比如硬盘,软盘,光驱什么的都是这种。
named pipe:就是FIFO,也叫命名管道,是用于进程间交互的。
socket:也是用于进程间交互的,不过它可以支持跨计算机的,如现在的internet就是以此为基础的。

好了,如果理解了上面的文件概念,可以说你对linux的文件是什么的理解可就到了相当的水平了。
当然了,抄成这样,我对linux的文件是什么也理解到了相当的水平了 :-<

阅读(538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~