1. Linux 文件描述符基础解析
1.1 文件描述符的本质
在Linux系统中,文件描述符(File Descriptor)是进程访问I/O资源的抽象句柄。每个进程启动时会默认打开三个文件描述符:
- 0号:标准输入(stdin)
- 1号:标准输出(stdout)
- 2号:标准错误(stderr)
内核通过文件描述符表维护打开的文件信息,这个表记录了:
- 文件指针偏移量
- 文件访问模式(读/写)
- 文件状态标志
- 指向实际文件对象的指针
重要提示:文件描述符本质上是数组索引,而非文件本身。同一个文件可以被多个描述符引用,而一个描述符在不同时刻可能指向不同文件。
1.2 文件描述符的生命周期
典型生命周期包括四个阶段:
- 创建(open/pipe/socket等系统调用)
- 复制(dup/dup2)
- 重定向(通过复制改变绑定关系)
- 关闭(close)
在C语言中,标准库函数如fopen最终也会转化为对文件描述符的操作。例如:
c复制FILE *fp = fopen("test.txt", "r");
// 底层实际执行:
// 1. 调用open()获取文件描述符
// 2. 包装成FILE结构体
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 重定向机制深度剖析
2.1 重定向的核心原理
重定向的本质是改变文件描述符与文件对象的绑定关系。主要实现方式有:
- dup2系统调用
c复制int dup2(int oldfd, int newfd);
这个调用会使newfd指向oldfd当前指向的文件,如果newfd已经打开则会先关闭。
- Shell重定向语法
bash复制# 输出重定向
command > file
# 输入重定向
command < file
# 错误重定向
command 2> file
2.2 重定向类型详解
| 类型 | 操作符 | 等效系统调用 | 典型场景 |
|---|---|---|---|
| 输出覆盖 | > | open+dup2 | 日志记录 |
| 输出追加 | >> | open(O_APPEND)+dup2 | 持续日志 |
| 输入重 |
