1. Linux文件系统基础概念
在Linux系统中,一切皆文件的设计哲学决定了IO操作的核心地位。当我们谈论基础IO时,实际上是在讨论程序与各种设备、存储介质之间的数据交换机制。与Windows系统不同,Linux将所有硬件设备都抽象为文件,这种统一接口的设计极大简化了系统编程的复杂度。
文件描述符(File Descriptor)是理解Linux IO的关键概念。它是一个非负整数,本质上是内核为每个进程维护的打开文件表的索引。当程序打开一个文件时,内核会返回一个文件描述符,后续所有操作都通过这个数字来引用对应的文件。标准输入(stdin)、标准输出(stdout)和标准错误(stderr)分别对应着文件描述符0、1和2,这也是为什么新打开的文件通常从3开始编号。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件操作的系统调用
2.1 打开和关闭文件
open()系统调用是文件操作的起点,其原型如下:
c复制#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
flags参数决定了文件的打开方式,常见组合包括:
- O_RDONLY:只读模式
- O_WRONLY:只写模式
- O_RDWR:读写模式
- O_CREAT:文件不存在时创建
- O_APPEND:追加模式
- O_TRUNC:清空文件
mode参数指定了文件权限,通常用八进制表示,如0644表示所有者可读写,组用户和其他用户只读。实际操作中需要注意umask的影响,它会导致实际权限比指定的要严格。
close()用于关闭文件描述符,释放系统资源。忘记关闭文件描述符是常见的资源泄漏原因,特别是在长时间运行的服务程序中。
2.2 读写操作
read()和write()是最基本的IO函数:
c复制ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
这两个函数都返回实际读写的字节数,可能小于请求的count值。对于普通文件,这通常意味着到达了文件末尾;而对于网络套接字等非可靠传输,则需要循环读写直到完成所有数据传输。
重要提
