Linux基础I/O(二)——重定向

本文探讨了文件描述符的使用,特别是当关闭一个描述符后,新打开的文件如何继承其描述符。重点介绍了dup2系统调用,用于复制文件描述符并控制输出重定向,以及如何通过引用计数管理多个指向同一文件的描述符的关闭问题。
摘要由CSDN通过智能技术生成

重定向

根据上一篇的文章我们知道,文件描述符是什么。
0->stdin;
1->stdout;
2->stderr;
如果我们新打开一个文件的话,该文件描述符为3,如下图:
在这里插入图片描述::“
在这里插入图片描述

如果我先close(1),再打开一个文件,根据之前的知识我们会知道它的描述符就是1,这时会发生什么呢?
在这里插入图片描述
在这里插入图片描述

确实像上面说到的close(1)后,新打开的文件文件描述符为1,并且printf也不会输出到显示器中,而是输出到文件中使用fprintfstdout也不会输出到屏幕而是输出到文件log.txt中
说明stdout只认识1,不管1对于的是不是标准输出
重定向的本质就是在操作系统内部修改特性文件fd的下标内容

在这里插入图片描述

凡是往1号描述符中写的内容,都写到了log.txt当中,而写不到标准输出!

使用 dup2 系统调用

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
我们发现这样即使我们不close(1),那么我们也可以将内容写到log.txt当中,而不是输出到显示器当中;

int dup2(int oldfd, int newfd)

将oldfd的内容拷贝到,newfd上
如果向打印到三号文件描述符(log.txt)当中,而不是一号文件描述符(标准输出)当中;那么就dup2(3, 1);

一号文件描述符本来指向显示器的,现在将它将指向log.txt,所以要将三号文件描述符的内容拷贝到一号描述符,最后一号描述符和三号一样,那么就有两个都指向oldfd的内容,那么如何关闭又是一个问题

对此使用一个引用计数即可,如果有一个指向该文件的文件描述符关闭了,那么就减减,直到减到0就关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值