1. 前情提要:回顾知识,无缝衔接:
在上一篇文章中已经谈论了系统的函数接口。今天我们更要深入理解 Linux 的底层:重定向的原理和虚拟文件系统。
回顾上文的知识点:
- Linux 一切皆是文件。(只是简单的理解,并没有深入)
- C 语言提供的 printf,fprintf,fgets,fread,fwrite,这几种接口
- C 语言提供的几种打开文件的模式:只读,只写,追加等等
- open 函数的参数解析(位图)
- 什么是 fd(文件描述符)
- 如何使用 write/read/close
本文目标:
- fd 究竟代表什么
- 详细了解 dup2 函数,里面的参数究竟怎么用
- 完善 shell,加入 shell 的重定向功能
2. fd 的底层:一个数组的下标:
在上一篇文章中我们已经理解了三个已经打开的文件:stdout,stdin,stderr 以及他们的文件描述符 0,1,2;是不是感到一阵熟悉感。每次就是数组的下标。 那么这个数组在哪里呢? 我们的 Linux 的 pcb(struct_task):它内部包含一个指针 *files,指向 struct files_struct。这表示'这个进程打开了哪些文件'。而其中 struct files_struct 里面包含一个指针数组 fd_array.里面存放了不同的打开的文件。已经打开的就放在前面的位置。按顺序排放。而 FD 就是这个数组的下标。
2-1 fd 的特性,总是分配最小的:
我们先来看一个程序:
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main() {
close(1);
int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
if(fd == -1) {
perror("open error");
}
printf("fd = %d\n", fd);
char* msg = ;
write(fd, msg, (msg));
write(, msg, (msg));
;
}


