前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux】重定向操作的原理:修改文件描述符fd底层指向 (文件系统角度理解)

【Linux】重定向操作的原理:修改文件描述符fd底层指向 (文件系统角度理解)

作者头像
YY的秘密代码小屋
发布2024-10-14 08:40:03
1430
发布2024-10-14 08:40:03
举报
文章被收录于专栏:C++系列

※.重定向的原理总结

  1. 修改 特性文件fd 下标内容。
  2. 上层fd不变(read,fgets,scanf),底层fd指向的内容改变

一.文件描述符基础知识

  • Linux进程默认情况下会有3个缺省打开的文件描述符,分别是 stdin标准输入0, stdout标准输出1, stderro标准错误2.
  • 0,1,2对应的 物理设备 一般是: 键盘,显示器,显示器

二.dup2函数介绍

  • 我们先了解这个dup2函数,功能是改变 底层fd的指向
代码语言:javascript
复制
#include <unistd.h>

int dup2(int oldfd, int newfd);
参数:
  oldfd:这是你想要复制的文件描述符。(最后被保留下来的fd)
  newfd:这是你想要将oldfd复制到的文件描述符位置。
返回值:
  成功时,返回newfd(即复制后的文件描述符,通常与newfd参数相同,除非newfd之前已经打开并被关闭)。
  失败时,返回-1,并设置errno以指示错误类型。

三.重定向原理演示

1.输出重定向——原理图文演示

  • 此时,我们发现, 本来应该输出到显示器上的内容,输出到了文件 myfile中
  • 其中,fd=1。这种现象叫做输出重定向。
  • printf是C库当中的IO函数,一般往 stdout标准输出1 中输出,但是stdout底层访问文件的时候,找的还是fd:1, 但此时,fd:1下标所表示内容,已经变成了myfile的地址,不再是显示器文件的地址,所以,输出的任何消息都会往文件中写入,进而完成输出重定向
  • 底层等效于dup2(dp,1);
  • 底层fd指向的内容改变,实现的重定向功能改变
  • fd为4为oldfd,最后被保留下来
代码语言:javascript
复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
 close(1);
 int fd = open("myfile", O_WRONLY|O_CREAT, 00644);
        
 printf("fd: %d\n", fd);//输出结果为1
 fflush(stdout);
 
 close(fd);
 exit(0);
}

2.输出重定向原理同理

  • 把0对于的输出流,底层fd指向键盘改成由log.txt输入
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ※.重定向的原理总结
  • 一.文件描述符基础知识
  • 二.dup2函数介绍
  • 三.重定向原理演示
    • 1.输出重定向——原理图文演示
      • 2.输出重定向原理同理
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档