1、文件如何在Linux中存储
Linux中任何事物都可以用一个文件来表示,或者通过特殊的文件提供。
一个文件由目录项、inode和数据块组成。
硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件的内容数据块存储在若干个“块”中。
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);