1、什么是文件重定向?
简单来说,文件重定向可以理解为文件描述符重新选定自己的指向。
2号文件描述符和3号文件描述符原本的指向如下。2号文件描述符之所以指向了stderr,是因为数组下标为2的元素填充的是stderr结构体的地址

现在我们要把2号文件描述符重定向到 log.txt 文件,此时 2号文件描述符和stderr之间的联系就会断开。其本质就是把原本下标为 3 中保存的地址拷贝到下标为 2 的数组位置。

2、文件重定向函数 dup2
dup2函数可以修改文件描述符的指向,让一个文件描述符指向其他文件描述符原本指向的内容。函数声明如下:

从上面可以了解到,让2号文件描述符重定向到 log.txt,其实就是把原本3号描述符保存的地址拷贝到2号描述符的位置。
因此, 3号描述符是曾经保存log.txt地址的位置,2号描述符是现在保存log.txt地址的位置,这里的oldfd = 3,newfd = 2
dup2(3, 2);
3、文件重定向的使用及验证
下面我们要向同时向1号文件描述符和 log.txt 写入内容,以此验证发生重定向以后,有两个文件描述符都指向了 log.txt 文件。
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main(){
int fd = open("log.txt", O_CREAT | O_RDWR, 0644);
if(fd < 0)
{
perror("open");
}
dup2(fd, 1); // 文件重定向
printf("newfd: hello, world\n"); // 向1号文件描述符写入内容
const char* buf = "oldfd: hello, world\n";
write(fd, buf, strlen(buf)); // 向原本的log.txt对应的文件描述符写入内容
return 0;
}

本文介绍了文件重定向的概念,通过示例解释了如何使用dup2函数改变文件描述符的指向,使得多个文件描述符可以指向同一文件。通过一个C语言程序展示了如何将标准输出重定向到log.txt,并同时向log.txt和标准输出写入内容,验证了文件重定向的效果。
2073

被折叠的 条评论
为什么被折叠?



