【Linux】重定向操作的原理:修改文件描述符fd底层指向 (文件系统角度理解)
※.重定向的原理总结
- 修改 特性文件fd 的 下标内容。
- 上层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函数
发布评论