Linux:重定向

  在IO操作时,经常需要将原本要写入到A文件的数据写入到B文件中,这就是重定向。本文来简单看一看重定向的概念,这里需要对文件描述符有一个清晰的认识,因此需要先去学习文件描述符和文件流指针。

一、3个标准文件

 当一个程序运行之后,系统会默认打开三个文件:

  • 标准输入:stdin
  • 标准输出:stdout
  • 标准错误:stderr

  打开了这三个文件,自然就会在 fd_arr 数组中存储这三个文件的文件描述符地址。因为数组下标的分配原则是最小未使用,也就是说,如果给数组中添加元素,这个元素会放在所有没有使用的下标中最小的一个下标的空间。

  因此打开这三个文件后,这三个文件的描述信息会存储到fd_arr[]数组中,根据最小未使用原则,三个文件的描述信息依次占据了0、1、2这前三个下标,下标就是它们对应的文件描述符。

默认打开文件
  我们如果要往标准输出写入数据,就是通过文件流指针找到数组的0下标,然后通过0下标里面的地址找到stdin这个文件的描述信息,把数据写入stdin文件。

二、理解重定向

  • 输出重定向:将原本要写入到A文件的数据写入到B文件。
  • 输入重定向:原本要从A文件读取数据,现在从B文件中读取。

 那么重定向是如何实现的?

  此时,我们首先打开了一个a.txt文件,如图,根据最小未使用的原则,a.txt文件的描述信息占据的下标就是3。

a文件

  然后我们想把打印到标准输出的数据重定向到a.txt文件,怎么做呢?我们首先关闭1下标对应的文件,然后直接把3下标中的信息,拷贝一份,然后放到1下标中。这样1下标对应的文件描述信息就变成了a.txt的描述信息。

  当系统根据1号文件描述符往标准输出写入数据时,就会将数据写入到a.txt文件。(因为此时的1下标中的文件描述信息是a.txt文件的描述信息)

重定向

  但这样是很不可靠的,因为在实际使用中,不可能只有这么一点文件,如果要操作的文件很多,我们刚把1下标对应的文件关闭,如果此时又打开了另一个文件,按照最小未使用原则,1下标不就被另一个文件占用了吗?所以这样手动进行是很不可靠的。

三、重定向函数

 为了解决上文中的问题,我们可以使用专门的重定向函数来进行重定向。

int dup2(int oldfd,int newfd)

 作用:oldfd和newfd都是文件描述符,也就是fd_arr[]数组的下标,该函数的作用就是把oldfd下标对应的数组元素拷贝一份放到newfd下标对应的空间中。也就是用oldfd的文件描述信息覆盖newfd的文件描述信息。

  • int oldfd:这个文件描述符是将要被拷贝的文件描述信息的下标
  • int newfd:这个文件描述符将要存储拷贝来的文件描述信息的下标

 dup2具体的功能:

 (1)将原本要写入newfd描述符对应的文件的数据,写入到oldfd描述符对应的文件。将原本要从newfd描述符对应的文件中读取的信息,从oldfd描述符对应的文件中读取。

 (2)当newfd描述符还没有打开文件,也就是说这个文件描述符还是空白的,就会把oldfd描述符的信息拷贝到newfd里面,然后他们都去操作oldfd对应的文件。

 (3)当newfd描述符已经打开了文件,就先把newfd描述符打开的文件关闭,然后就和上面的步骤一样了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值