[Linux]重定向

一、struct file内核对象

struct file是在内核中创建,专门用来管理被打开文件的结构体。struct file中包含了打开文件的所有属性,文件的操作方法集以及文件缓冲区(无论读写,我们都需要先将数据加载到文件缓冲区中。等等。

我们在应用层进行数据的读写,本质是将内核缓冲区中的数据,进行来回拷贝。

二、文件描述符fd分配规则

1、进程默认打开0、1、2

我们可以直接使用0,1,2进行数据访问。

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>int main()
{char buf[1024];ssize_t s = read(0, buf, 1024);if(s > 0){buf[s-1] = 0;//这样我们最后输入的那个回车(换行)就不会被打印write(1,buf,strlen(buf));// printf("%s\n",buf);}return 0;
}

运行程序后,程序等待我们输入:

 

随意输入字符:

 

按下回车:

 

程序执行完毕。

 2、寻找最小&&未被使用的数据的位置,分配给指定的打开文件

验证:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>int main()
{close(0);int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);printf("fd:%d\n",fd);close(fd);return 0;
}

此时我们打开的这个test.txt文件,其fd就成了0:

  

三、重定向

1、输出重定向:

那么,如果我们close(1)呢?

(1)close(1)

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>int main()
{close(1);int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if(fd < 0){perror("open");return 1;}printf("fd:%d\n",fd);close(fd);return 0;
}

可以看到,屏幕未输出任何东西,log.txt文件中也没有内容:

(2)fflush(stdout)

当我们刷新fflush(stdout)时:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>int main()
{close(1);int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if(fd < 0){perror("open");return 1;}printf("fd:%d\n",fd);printf("stdout->%d\n",stdout->_fileno);fflush(stdout);close(fd);return 0;
}

运行程序:

我们将其称为:输出重定向。 

(3)总结:

上层并不知道我们将1号文件描述符的指向改变了,printf()打印的本质是向1号文件描述符里面打印,具体1号文件描述符指向的是显示器,就向显示器打印,指向的是文件,就向文件里打印。所以这里,printf()就向log.txt里面打印了。

重定向的 本质就是修改 文件描述符表 特定数组下标 里面的内容。

2、输入重定向:

我们首先向log.txt文件中写入数据:

 我们首先close(0),然后再打开log.txt,这样log.txt的文件描述符fd就是0。

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>int main()
{close(0);char buf[1024];int fd = open("log.txt",O_RDONLY);if(fd < 0){perror("open");return 1;}fread(buf,1,sizeof buf,stdin);buf[strlen(buf)-1] = 0;//将"\n"符号改为0printf("%s\n",buf);return 0;
}

 运行程序,我们可以看到,log.txt文件中的内容被打印出来了:

3、原理:

上层的fd不变,底层fd指向的内容在改变。 

4、使用

 我们这里使用dup2:

将oldfd的数组内容拷贝到newfd的数组内容中。

需要注意的是,这样就会导致有多个fd指向一个打开的文件,为了避免一个fd把文件关闭的时候,影响到其余的fd,在struct file中,存在一个f_count用来计数,有几个指针指向该文件,f_count就为几。

我们首先查看log.txt中的内容:

 

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>int main()
{int fd = open("log.txt",O_APPEND | O_WRONLY);if(fd < 0){perror("open");return 1;}dup2(fd,1);printf("haha\n");fprintf(stdout,"yeye\n");close(fd);return 0;
}

然后执行程序:

可以看出文件内新增了内容。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于JSP的高校二手交易平台

开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;浏览器&#xff08;如360浏览器、谷歌浏览器、QQ浏览器等&#xff09;、MySQL数据库 系统展示 系统功能界面 用户注册与登录界面 个人中心界面 商品信息界面 摘要 本文研究了高…

为何懂行的人都在选海信Mini LED?

今年的618大促比往年来得要更早一些。纵览各电商平台的电视产品&#xff0c;能发现Mini LED电视的出镜率很高&#xff0c;成了各大品牌的主推产品。 对于什么样的Mini LED更值得买&#xff0c;各品牌都有自己的说辞。因为缺乏科学系统的选购标准&#xff0c;消费者容易在各方说…

【Qt】【模型-视图架构】代理模型示例

文章目录 1. 基本排序/过滤模型Basic Sort/Filter Model Example2. 自定义排序/过滤模型Custom Sort/Filter Model ExampleFilterLineEdit类定义及实现MySortFilterProxyModel类定义及实现 1. 基本排序/过滤模型Basic Sort/Filter Model Example 官方提供的基本排序/过滤模型示…

docker镜像体积优化攻略参考—— 筑梦之路

简单介绍 镜像的本质是镜像层和运行配置文件组成的压缩包&#xff0c;构建镜像是通过运行 Dockerfile 中的 RUN 、COPY 和 ADD 等指令生成镜像层和配置文件的过程。 和镜像体积大小有关的关键点&#xff1a; RUN、COPY 和 ADD 指令会在已有镜像层的基础上创建一个新的镜像层&…

【数据结构】详解二叉树

文章目录 1.树的结构及概念1.1树的概念1.2树的相关结构概念1.3树的表示1.4树在实际中的应用 2.二叉树的结构及概念2.1二叉树的概念2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树 2.3 二叉树的性质2.4二叉树的存储结构2.4.1顺序结构2.4.2链表结构 1.树的结构及概念 1.1树的概念…

基于SSM的车辆租赁管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的车辆租赁管理系统1拥有两种角色 管理员&#xff1a;用户管理、用户租车、用户换车和车辆入库、添加汽车、添加客户、生成出租单、客户选车、出租单管理、查询出租单、角色权限管…

登录校验及全局异常处理器

登录校验 会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话请求间共享数据会话跟踪方案 客户端…

关于MD5

首先还是介绍一下关于md5的基本信息&#xff1a; MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数&#xff0c;用于产生128位&#xff08;16字节&#xff09;的哈希值&#xff0c;通常以32个十六进制数字表示。MD5广泛用于计算文件或文本数据的校…

分享一个 ASP.NET Web Api 上传和读取 Excel的方案

前言 许多业务场景下需要处理和分析大量的数据&#xff0c;而 Excel 是业务人员常用的数据表格工具&#xff0c;因此&#xff0c;将 Excel 表格中内容上传并读取到网站&#xff0c;是一个很常见的功能&#xff0c;目前有许多成熟的开源或者商业的第三方库&#xff0c;比如 NPO…

香港电讯荣获经济通「金融科技大奖」专业认可

香港电讯非常荣幸在《经济通》举办的「2023金融科技大奖」中脱颖而出&#xff0c;获「杰出跨境数码方案」、「杰出网络安全方案&#xff08;商用&#xff09;」和「杰出ESG解决方案」三个重要奖项。 香港电讯拥有丰富的经验及庞大的专业技术团队&#xff0c;一直致力为客户提供…

Spring Security3.0版本

前言&#xff1a; 核心&#xff1a; A >> &#xff1f; >> B &#xff1f;代表判断层&#xff0c;由Security实现 这是之前的版本浓缩&#xff0c;现在3.0版本添加了更匹配的内容描写&#xff0c;匹配了mvc模式 非mvc模式 核心&#xff1a;client&#x…

scp:Linux系统本地与远程文件传输命令

scp 是Linux系统中用于在本地主机和远程主机之间进行文件传输的命令。 详细说明&#xff1a; scp 命令用于安全地将文件从一个主机传输到另一个主机&#xff0c;所有传输数据都是加密的。语法&#xff1a; scp [参数] [源文件路径] [目标主机:目标路径] 参数说明&#xff1a…

2024-05-31 blue-VH-driver-问题分析-有状态的服务-状态的处理

摘要: VH的driver对上层提供的接口&#xff0c;是会保持状态。这个状态&#xff0c;可以分为&#xff0c;查询的数据的状态&#xff0c;主要是为了提供翻页查询的功能。另一种状态&#xff0c;就是订阅。 有状态的服务: 状态是什么? 其实从调用方的角度更好的理解&#xff0c…

【仿真设计】基于STM32的畜牧动物定位及行为检测设计的Proteus仿真

基于STM32的畜牧动物定位及行为检测设计的Proteus仿真 所需器件&#xff1a; Proteus版本&#xff1a;8.15 整体功能&#xff1a; STM32为主控芯片。温度采集并显示到OLED屏幕上进行监测&#xff08;DS18B20传感器&#xff09;。 判定条件&#xff1a;默认为上限为40度&…

数据结构:堆的保姆级教学指南

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 小新的主页&#xff1a;编程版小新-CSDN博客 1.堆的概念 堆是一种特殊的树结构&#xff0c;通常用…

【爱空间_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

C#【进阶】排序进阶

排序进阶 文章目录 插入排序希尔排序归并排序快速排序堆排序 插入排序 #region 知识点一 插入排序的基本原理 // 8 7 1 5 4 2 6 3 9 // 两个区域 // 排序区 // 未排序区 // 用一个索引值做分水岭// 未排序区元素 // 与排序区元素比较 // 插入到合适位置 // 直到未排序区清空 #e…

git使用流程与规范

原文网址&#xff1a;git代码提交流程与规范-CSDN博客 简介 本文git提交流程与规范是宝贵靠谱的经验&#xff0c;它能解决如下问题&#xff1a; 分支差距过大&#xff0c;导致合代码无数的冲突合完代码后发现代码丢失分支不清晰&#xff0c;无法追溯问题合代码耗时很长&…

数据结构的快速排序(c语言版)

一.快速排序的概念 1.快排的基本概念 快速排序是一种常用的排序算法,它是基于分治策略的一种高效排序算法。它的基本思想如下: 从数列中挑出一个元素作为基准(pivot)。将所有小于基准值的元素放在基准前面,所有大于基准值的元素放在基准后面。这个过程称为分区(partition)操作…

Redis 和 Mysql 如何保证两者数据一致性

文章目录 概述解决方案消息队列异步重试 基于 RocketMQ 的可靠性消息通信&#xff0c;来实现最终一致Canal 组件&#xff0c;监控 Mysql 中 binlog 的日志&#xff0c;把更新后的数据同步到 Redis 里面延时双删弱一致性和强一致性Canal详解 概述 在分布式系统中&#xff0c;保…