admin管理员组

文章数量:1487745

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

※.重定向的原理总结

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

一.文件描述符基础知识

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

二.dup2函数介绍

  • 我们先了解这个dup2函数,功能是改变 底层fd的指向
代码语言:javascript代码运行次数:0运行复制
#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代码运行次数:0运行复制
#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 删除文件系统原理重定向linux函数

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