文件重定向

目录

一、输出重定向(对应的符号:'>')

1、案例一:printf输出重定向

2、案例二:fprintf输出重定向

3、案例三:echo输出重定向

二、追加重定向(对应的符号:'>>')

三、输入重定向(对应的符号:'<')

四、实现重定向的系统函数dup2

1、dup2函数的声明

2、dup2参数解析

3、函数测试


重定向就是  fd = i 断开与之前文件的联系,指向一个新的文件

下面将通过代码介绍几种常见的重定向

一、输出重定向(对应的符号:'>')

这里的输出指的是向文件写入内容

假设下标1 一开始指向的是stdout,调用close(1)以后,断开了下标1 与 stdout之间的联系

同时让下标 1指向新打开的log.txt

    

这就是输出重定向,写入内容的文件由原本的stdout变成了log.txt

1、案例一:printf输出重定向

案例 详情可以参考下面这篇博客中的测试部分(内含代码)

printf函数打印的作用原理_abs(ln(1+NaN))的博客-CSDN博客printf函数是如何打印数据的?首先需要知道打印的基本流程,再通过例子了解,printf本该打印的内容被写到了哪个文件里https://blog.csdn.net/challenglistic/article/details/123946031?spm=1001.2014.3001.5501

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、函数测试

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值