Linux 基础 IO:深入理解文件描述符机制
在 Linux 系统编程中,文件操作是核心基础。我们常说'一切皆文件',但这不仅仅是个口号,它意味着键盘、显示器、网卡和磁盘在操作系统眼中都是统一管理的资源。
一、理解文件
从广义上讲,文件 = 文件内容 + 文件属性。无论是磁盘上的持久化数据,还是内存中被打开的临时对象,对文件的操作本质上是对内容和属性的读写。
1.1 系统视角的文件
- 进程与文件:文件操作本质上是进程对文件的操作。
- 内核管理:磁盘由操作系统管理,用户态程序通过系统调用接口访问,而非直接操作硬件。
- IO 本质:所有文件操作最终都归结为输入输出(IO)。
二、回顾 C 语言文件接口
在使用系统调用之前,我们先看看标准库 stdio.h 提供的接口。它们封装了底层细节,使用便捷但性能开销稍大。
2.1 打开文件
// 文件打开接口 FILE *fopen(const char* path, const char* mode);
path: 文件路径或文件名。若无路径则默认为当前工作目录。mode: 打开模式,如只读r、只写w、追加a等。
提示:Shell 重定向中的
>对应w模式,>>对应a模式。
2.2 写入文件示例
#include <stdio.h>
int main() {
FILE* fp = fopen("myfile.txt", "w");
if (fp == NULL) {
perror("fopen");
return 1;
}
// 实际业务逻辑...
fclose(fp);
return 0;
}
注意:文件默认创建在当前进程的工作目录下。可通过 ls /proc/[pid]/cwd -l 查看当前进程的 cwd(当前工作目录)。
2.3 标准流
C 语言默认打开三个流:
stdin: 标准输入stdout: 标准输出stderr: 标准错误
这些流的类型均为 。向屏幕打印本质上就是向 对应的文件写入数据。


