Linux文件I/O思维导图

Linux文件I/O知识结构树

Linux文件I/O知识结构树

Linux文件I/O
核心概念
文件描述符(fd):非负整数,内核标识打开文件的索引
分配规则:从最小未使用fd开始(0/1/2默认对应stdin/stdout/stderr)
常用操作:dup/dup2(复制fd)、fcntl(修改fd属性)
系统调用vs标准I/O库
系统调用:直接与内核交互(open/read/write),无缓冲,效率高
标准I/O:库函数封装(fopen/fread),带用户态缓冲,便携性好
文件类型:普通文件/目录/设备文件/管道/套接字等
核心系统调用
打开/创建文件:open()/creat()
参数:pathname(路径)、flags(标志)、mode(权限,八进制)
返回值:成功返回fd,失败返回-1(errno记录错误)
标志分类(<fcntl.h>)
访问模式标志(必选,三选一)
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:读写
创建标志(可选)
O_CREAT:文件不存在则创建(需配合mode)
O_EXCL:与O_CREAT联用,文件存在则报错(避免竞态)
O_TRUNC:文件存在则截断为0(只写/读写模式有效)
O_DIRECTORY:pathname非目录则报错
O_NOATIME:读取时不更新文件访问时间(需特权)
O_LARGEFILE:支持大文件(>2GB,64位偏移)
状态标志(可选)
O_APPEND:写操作始终追加到文件末尾
O_NONBLOCK:非阻塞模式(操作无数据时不阻塞)
O_CLOEXEC:exec时自动关闭fd(避免文件泄露)
O_SYNC:写操作等待数据+元数据刷到磁盘(同步I/O)
O_DSYNC:写操作仅等待数据刷到磁盘
O_ASYNC:I/O事件异步通知(需结合信号/epoll)
O_DIRECT:直接I/O(绕开内核页缓存,需内存对齐)
读取文件:read()
参数:fd、buf(数据缓冲区)、count(请求读取字节数)
返回值:成功返回实际读取字节数,0表示EOF,-1表示失败
注意:非阻塞模式下可能返回EAGAIN/EWOULDBLOCK
写入文件:write()
参数:fd、buf(待写入数据)、count(请求写入字节数)
返回值:成功返回实际写入字节数,-1表示失败
注意:O_APPEND会强制将文件偏移量移到末尾再写
关闭文件:close()
参数:fd
返回值:成功0,失败-1(如fd已关闭)
注意:关闭后fd失效,内核释放文件相关资源
文件偏移:lseek()
参数:fd、offset(偏移量)、whence(基准:SEEK_SET/SEEK_CUR/SEEK_END)
返回值:成功返回新偏移量,失败-1
用途:移动读写指针,支持空洞文件创建
辅助操作
文件属性:stat()/fstat()/lstat()(获取inode信息)
同步刷盘:fsync()(数据+元数据)/fdatasync()(仅数据)/sync()(全局刷盘)
文件权限:chmod()/fchmod()(修改权限)
文件所有权:chown()/fchown()(修改属主/属组)
高级I/O
非阻塞I/O:结合O_NONBLOCK+轮询/事件驱动
异步I/O:AIO(libaio)/epoll+ET模式
分散/聚集I/O:readv()/writev()(多缓冲区读写)
内存映射I/O:mmap()(将文件映射到进程地址空间)
错误处理
errno:全局变量,记录最近系统调用的错误码
错误解析:perror()(打印错误描述)/strerror()(获取错误字符串)
常见错误:EINTR(被信号中断)、EAGAIN(非阻塞无数据)、EBADF(无效fd)

关键代码示例:

// 打开文件示例
int fd = open("test.txt", O_RDONLY);
if (fd == -1) {
  perror("open");
  exit(EXIT_FAILURE);
}
// 读取文件示例
char buffer[1024];
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read == -1) {
  perror("read");
  exit(EXIT_FAILURE);
}
// 写入文件示例
const char *data = "Hello, World!";
ssize_t bytes_written = write(fd, data, strlen(data));
if (bytes_written == -1) {
  perror("write");
  exit(EXIT_FAILURE);
}
posted @ 2026-01-15 14:14  suiyuan129  阅读(1)  评论(0)    收藏  举报