1、文件如何在Linux中存储

 Linux中任何事物都可以用一个文件来表示,或者通过特殊的文件提供。 

 一个文件由目录项、inode和数据块组成。

 硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于0.5KB)。 

 操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

 文件的内容数据块存储在若干个“块”中。

wKiom1YY9XeRpYy0AAElAGXvN6g228.jpg

 

 inode是关于文件的元数据信息集合,包含大小,读写权限,文件块的位置,uid, guid等。

 目录文件的结构非常简单,就是一系列目录项的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

 文件名和inode的编号是--对应关系。

获取文件内容的流程:文件名+路径--->文件对应的inode--->文件的位置等元数据--->进行操作。

2、硬链接

 一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

 可以把文件名看成指针,inode看成指针指向的值。即有多个“指针”指向inode。

3、软连接

 文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

 可以理解为windows下的快捷方式。

4、API

4.1、打开文件、创建文件

  

int open(const char* name, int flags);
int open(const char* name, int flags, mode_t mode);

参数说明:

    name:文件的名称,可以绝对路径,也可以是相对路径。

    flags:

    

O_RDONLY、O_WRONLY、O_RDWR读、写、读写
O_APPEND向文件末尾进行追加
O_NOFOLLOW
如何name使符号连接,则打开失败。如果某个父目录是符号连接,则不失败
O_NOBLOCK以非阻塞方式打开,只能用于FIFO
O_SYNC当数据写到磁盘中,操作才算完成
O_TRUNC如果文件存在,且是常规文件,并且可读,则文件被截断为0
O_CREAT如果文件不存在,则创建。否则,忽略;除非指定O_EXCL
O_EXCL与O_CREATE使用,如果存在,则创建失败。

    mode:mode参数在创建文件的时候才有用,其他情况会被忽略。所以在使用O_CREATE是,必须使用mode参数。

创建文件时,文件的权限并不仅仅由该参数决定,还与umask有关。文件权限=mode&~umask

返回值:

    int 文件描述符。执行成功时,会返回-1并将errno设定为适当的错误值

btw:

 int open(name, O_WRONLY | O_CREAT | O_TRUNC, mode); === int creat(name, mode);