目录
重定向就是 fd = i 断开与之前文件的联系,指向一个新的文件
下面将通过代码介绍几种常见的重定向
一、输出重定向(对应的符号:'>')
这里的输出指的是向文件写入内容
假设下标1 一开始指向的是stdout,调用close(1)以后,断开了下标1 与 stdout之间的联系
同时让下标 1指向新打开的log.txt
这就是输出重定向,写入内容的文件由原本的stdout变成了log.txt
1、案例一:printf输出重定向
案例 详情可以参考下面这篇博客中的测试部分(内含代码)
2、案例二:fprintf输出重定向
第一个参数是 向哪个文件流里写,即告诉fprintf 文件的地址
第二个参数是 向文件写入什么内容
将案例一中的printf替换成 fprintf
基本过程是这样,fprintf 要打印内容,但fprintf只知道向stdout打印,stdout包含的文件描述符fd =1,于是fprintf 就去找 下标为1 对应的文件,然后向里面写入内容
3、案例三:echo输出重定向
除了printf以外,我们也见过这么一种写法
echo原本要把hello,world写入到stdout,但是 ' > '断开了fd = 1和stdout之间的联系,并将fd = 1指向了新的文件 log.txt
所以log.txt中会出现 hello,world
二、追加重定向(对应的符号:'>>')
追加重定向和上面的输出重定向一样
区别在于 内容的写入方式不同
输出重定向 ——》清除原本的内容,覆盖写
追加重定向 ——》不清除原本的内容,新增的内容放在原本内容的后面
我们沿用上面echo测试时创建的log.txt文件,注意这里不要close(fd)
三、输入重定向(对应的符号:'<')
原本是从stdin 读取数据,但是变为了从log.txt读取数据
(1) 断开 进程和stdin之间的关系
(2) 打开文件 log.txt
由于 下标0没有指向任何文件,所以让下标 0 指向打开的 log.txt
(3) 从stdin流中读取
fgets 只知道stdin中读取数据 ——》 stdin 的fd = 0 ——》所以就找到fd = 0对应的文件,读取数据
(4) 打印读取的内容
四、实现重定向的系统函数dup2
通过close函数手动断开联系,然后通过open函数建立联系,这样未免太麻烦
Linux提供了 实现重定向的系统函数 dup2,我们可以通过这个函数轻松实现
1、dup2函数的声明
虽然有dup、dup2、dup3,但我们一般只用dup2
2、dup2参数解析
这里不需要像之前那样,先断开 下标1 和stdout的联系,然后再让下标1 指向log.txt
假设我们什么都不做,那么最开始的情况就会像下面这样
下标1 ——》 stdout ——》 文件描述符 1
下标3 ——》 log.txt ——》文件描述符 fd
int fd = open("./log.txt",O_CREAT|O_WRONLY,0664); //fd = 3
现在我们希望让 1 重定向指向 log.txt ——》把 下标3 存放的地址,赋值给 下标1 ——》 下标1就会指向原本下标3 指向的地址
所以 oldfd = fd 即 oldfd = 3, newfd = 1 ——》dup2(fd , 1);
意为,把 下标3的地址拷贝一份,赋值给 1——》下标1就会指向原本下标3 指向的地址
3、函数测试