文件描述符
进程就是通过struct file结构体来描述打开的文件,使用struct file* fd_array[]来存储我们的文件。那什么是文件描述符呢?
- 什么是文件描述符:
文件描述符就是struct file* array[]数组的下标,用户打开文件,操作系统通过file结构体描述文件,并且将指针添加到array中去管理,,想用户返回这个文件描述信息,在数组位置(下标),用户操作文件的时候,将这个下标传递给操作系统,操作系统通过下标找到文件描述信息,进而操作文件
-
进程中的文件描述符
当我们打开一个进程的时候,我们就会默认打开三个文件描述符, -
0:标准输入:STDIN_FILENO
-
1:标准输出:STDOUT_FILENO
-
2:标准错误:STDERR_FILENO
当我们打开文件的时候就会使用一个新的文件描述符,但是文件描述符有自己的分配规则:最小未使用原则。当我们在前面有未使用的最小的文件描述符的时候,我们在打开新的文件描述符时我们就使用这个最小的文件描述符。
-
库函数和系统调用接口中的操作句柄
在库函数中我们的操作句柄是文件流指针
- stdin
- stdout
- stderr
在系统调用接口中我们的操作句柄就是文件描述符
系统调用接口和库函数本来就是上下级的关系,所有操作句柄同样是有包含关系的,文件流指针就包含了我们的文件描述符就是说,在文件流指针的结构体中就有一个成员变量是文件描述符
重定向
改变数据流向,将写入制定文件数据改变之后写到另一个文件
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
参数:
- oldfd:原指向的文件描述符。
- newfd:改变的文件描述符。
让newfd也指向oldfd指向的文件,如果newfd已经打开了一个文件的话,就关闭以前的文件
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include <unistd.h>
4 #include <sys/stat.h>
5 #include <string.h>
6 #include <sys/types.h>
7 int main(){
8 int fd = open("te.txt",O_RDWR|O_APPEND);
9 char buf[1024] = "你好啊!!";
10 dup2(1,fd);
11 write(fd,buf,strlen(buf));
12 return 0;
13 }
~
实现向文件中写入内容进行数据重定向,将数据输出到显示器中,并不写到文件中去。这就是我们的重定向