Linux 文件描述符与重定向实战:从原理到 minishell 实现
文件描述符(fd)是 Linux IO 的核心概念,所有文件操作最终都通过文件描述符完成;而重定向则是基于文件描述符的经典应用,是 Shell 的核心功能之一。理解文件描述符的分配规则、重定向的底层原理,不仅能帮你搞懂 Linux IO 的本质,还能轻松实现自定义 Shell 的重定向功能。
一、文件描述符(fd):Linux IO 的'身份证'
1.1 什么是文件描述符?
文件描述符是 Linux 内核给打开的文件(广义文件,包括磁盘文件、键盘、显示器等)分配的非负整数,本质是进程 files_struct 结构体中文件指针数组的下标。通过这个下标,进程能快速找到对应的内核文件对象(struct file),从而完成 IO 操作。
1.2 默认文件描述符:0、1、2
Linux 进程启动时会默认打开 3 个文件描述符,对应 3 个标准流:
fd=0:标准输入(stdin),对应键盘;fd=1:标准输出(stdout),对应显示器;fd=2:标准错误(stderr),对应显示器。
验证代码:
#include <stdio.h>
int main() {
// 打印标准流对应的文件描述符
printf("stdin: %d\n", stdin->_fileno); // 输出:stdin: 0
printf("stdout: %d\n", stdout->_fileno); // 输出:stdout: 1
printf("stderr: %d\n", stderr->_fileno); // 输出:stderr: 2
return 0;
}
1.3 文件描述符的分配规则
- 核心规则:优先分配当前未使用的最小非负整数。
代码示例:
#include <stdio.h>
#include <unistd.h>
#include
{
(,
->_fileno, ->_fileno, ->_fileno);
fda = open(, O_CREAT | O_WRONLY | O_TRUNC, );
fdb = open(, O_CREAT | O_WRONLY | O_TRUNC, );
fdc = open(, O_CREAT | O_WRONLY | O_TRUNC, );
(, fda, fdb, fdc);
close(fda);
fdd = open(, O_CREAT | O_WRONLY | O_TRUNC, );
(, fdd);
close(fdb);
close(fdc);
close(fdd);
;
}


