admin管理员组文章数量:1487745
【Linux】重定向操作的原理:修改文件描述符fd底层指向 (文件系统角度理解)
※.重定向的原理总结
- 修改 特性文件fd 的 下标内容。
- 上层fd不变(read,fgets,scanf),底层fd指向的内容改变
一.文件描述符基础知识
- Linux进程默认情况下会有3个缺省打开的文件描述符,分别是 stdin标准输入0, stdout标准输出1, stderro标准错误2.
- 0,1,2对应的 物理设备 一般是: 键盘,显示器,显示器
二.dup2函数介绍
- 我们先了解这个dup2函数,功能是改变 底层fd的指向
#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,最后被保留下来
#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输入
本文标签: Linux重定向操作的原理修改文件描述符fd底层指向 (文件系统角度理解)
版权声明:本文标题:【Linux】重定向操作的原理:修改文件描述符fd底层指向 (文件系统角度理解) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/shuma/1754868584a3180605.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论