Linux系统编程---文件I/O思想

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);

时间: 2024-07-30 11:19:56

Linux系统编程---文件I/O思想的相关文章

Linux系统编程-文件IO函数

一.ioctl 函数 ioctl用于向设备发控制和配置命令,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的,称为Out-of-band数据.也就是说,read/write读写的数据是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助的数据.例如,在串口线上收发数据通过read/write操作,而串口的波特率.校验位.停止位通过ioctl设置,A/D转换的结果通过read读取,而A/D转换的精度和工作频率通过ioctl设置. #in

linux 系统编程 文件IO

Fileio 1.open() 系统调用 头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 原型 int open(const char * name,int flags); int open(const char * name,int flags,mode_t mode); flags O_RDONLY O_WRONLY O_RDWR O_APPEND每次写操作都写入文件的末尾 O_

Linux系统编程--文件描述符的复制dup()和dup2()【转】

本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁.对比于 d

Linux系统编程——文件描述符的复制:dup()和dup2()

dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁.对比于 dup(), dup2() 也一样,通过原来的文件描述符复制出一个新的文件描述符,这样的话,原来的文件描述符和新的文件描述符都指向

Linux系统编程-文件打开关闭

一.文件描述符 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的.当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数).后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息(file结构体). 一个进程启动时,默认打开了3个文件,标准输入.标准输出.标准错误,对应文件描述符是0(STDIN_FILENO).1(STDOUT_FILENO).2(STDERR_FILENO),这些常量定义在unistd.h头文件中. 另外介绍下面两个函数: fil

Linux系统编程之访问文件夹及其文件属性

1. 文件夹操作:opendir, readdir, closedir 2. 文件属性:lstat 3. 实现功能:获取指定文件夹下所有的文件(使用递归),因此就能计算所有文件大小之类的啦... 代码示例如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <sys/stat

嵌入式 Linux系统编程(一)——文件IO

嵌入式 Linux系统编程(一)--文件IO 一.文件IO概念 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作为文件唯一性的判断依据.这种操作不是ASCI标准的,与系统有关,移植有一定的问题.而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准,称为标准IO库.不带缓存的方式频繁进行用户态 和内核

嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

嵌入式 Linux系统编程(二)--文件描述符控制函数fcntl 由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读.函数原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令

嵌入式 Linux系统编程(五)——目录文件函数

嵌入式 Linux系统编程(五)--目录文件函数 Linux中目录也是文件,目录操作函数为标准IO库函数.主要函数如下: #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); DIR *fdopendir(int fd); 成功返回一个指向目录流的指针,失败返回NULL,并且设置errno全局变量. #include <dirent.h> struct dirent *rea