重定向_缓冲区

news2025/1/12 12:23:28

目录

重定向

文件属性操作

 浅谈重定向​编辑

 深入重定向

dup2

缓冲区

缓冲区的理论理解

 代码分析


重定向

文件属性操作

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);

ssize_t read(int fd, void *buf, size_t count);文件内容操作
read() 函数用于从文件描述符 fd 指定的文件中读取数据,将读取的数据存储到buf指向的内存缓冲区中,最多读取count字节的数据。函数返回实际读取的字节数,如果返回值为0,则表示已到达文件末尾;如果返回值为-1,则表示出现错误,此时会设置errno变量以指示具体的错误类型。

 浅谈重定向

fileno是struct FILE 封装了fd

 那么重定向的本质就是在内核中改变文件描述符表特定下标的内容,和上层无关。接口调用只管1,不管指向谁。

说白了就是上层不变,底层改变

 当不加fflush(stdout)时数据出不来,而加fflush(stdout)数据就出来了


正常进程结束后会刷新缓冲区,但是这次不正常,在return之前要刷新的时候我close了,数据还在1号stdout那里,但是我无法通过1号写到os里,所以直接没了。把close注释掉就可以。

 深入重定向

dup2

那么每次都要fflush和close很麻烦,要没有简洁的方法?就是dup2()

      #include <unistd.h>

       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

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

 

最终不在显示屏输出数据,而是在log.txt中输出因为上层调用fd值1,但是fd值1指向了log.txt 

缓冲区

缓冲区的理论理解

缓冲区:用户缓冲区和内核缓冲区。
几乎所有的缓冲区都有两种好处:解耦和提高效率

提高效率:主要提高的是使用者的效率和提高刷新IO的效率

我们知道调用系统调用是有成本的(没有量化的标准),所以尽量少调用效率就提高了。

比如我们使用10次printf/fprintf把数据放到c语言提供的缓冲区,10次调用printf数据都在c语言提供的缓冲区,最后只需调用一次系统调用就可以把数据写到os缓冲区,效率提高了

缓冲区是什么?其实就是一段内存空间。由c语言维护就叫语言级缓冲区,由c++维护就叫语言级缓冲区,由os维护就叫内核级缓冲区。

 为什么要有缓冲区?要给上层提供良好的IO体验,(并且对大家都好,我os积攒一大批数据往硬件上刷新,我只需要硬件配合我一次。我语言层积攒一大批数据往os刷新只需os配合我一次),间接提高整体效率

 缓冲区怎么办?

a.刷新策略

1. 立即刷新(相当于这个缓冲区存在价值不大,相当于没缓冲而且多了次拷贝)--fflush/fsync

2. 行刷新。显示器(显示器是给用户看的,所以行刷新主要照看用户的习惯,不快不慢)

3. 全缓冲。缓冲区写满才刷新,对应普通文件

b. 特殊情况

1. 进程退出,强制退出

2. 强制

策略代表都适用,所以上述策略用户级能用,内核级也能用,但是我们不关心内核策略我们不关心,所以只关心用户级。

 代码分析

 #include<unistd.h>
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 int main(){
  6     printf("hello printf\n");
  7     fprintf(stdout,"hello fprintf\n");
  8     const char*ch="hello write\n";
  9     write(1,ch,strlen(ch));
 10   // fork();                                                             
 11     return 0;                    
 12 } 

vim /usr/include/libio.h 查看c语言提供的缓冲区,同时也可以看出条件编译

那么c++也得有,其他任何语言也得有

进程的程序替换不会影响进程关联的或者打开的文件。

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

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

相关文章

如何购买阿里云99计划的ECS云服务器?99元购买阿里云2核2G3M服务器教程

阿里云助力中小企业和开发者无忧上云的“99计划”中有两款性价比超高的ECS云服务器&#xff0c;2026年3月31日活动结束前新购和续费价格一样。 其中个人和企业新老用户同享的2核2G3M服务器仅需99元/年&#xff08;续费同价&#xff09;&#xff0c;企业新老用户同学的2核4G5M仅…

鸿蒙OpenHarmony开发板:【子系统配置规则】

子系统 子系统配置规则 通过build仓下的subsystem_config.json可以查看所有子系统的配置规则。 {"arkui": {"path": "foundation/arkui", # 路径"name": "arkui" # 子系统名},"ai": {&q…

单片机-点亮第一盏灯

原理图 需求&#xff1a;点亮或是熄灭LED 通过控制 P5.3引脚输出高电平时&#xff0c;LED灯就点亮&#xff0c;输出低电平时LED灯就熄灭 1.项目创建 新建项目 配置开发板信息 当前位STC芯片的开发板&#xff0c;选择STC MCU Database 搜素具体芯片型号&#xff0c;进行配置…

C# Web控件与数据感应之 TreeView 类

目录 关于 TreeView 一些区别 准备数据源 范例运行环境 一些实用方法 获取数据进行呈现 ​根据ID设置节点 获取所有结点的索引 小结 关于 TreeView 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍与…

【C++历练之路】STL中的哈希——手搓哈希底层逻辑

W...Y的主页 &#x1f495; 代码仓库分享 &#x1f60a; 前言&#xff1a; "hash"通常指的是哈希&#xff0c;它是一种将数据&#xff08;如字符串或者数字&#xff09;转换为一个固定长度的数值&#xff08;通常是整数&#xff09;的方法。哈希函数能够将任意长度…

背靠腾讯电商的视频号小店项目,怎么去操作呢?新手做店必看!

大家好&#xff0c;我是电商小V 视频号小店作为腾讯电商推出的电商项目&#xff0c;可以说现在就是处于爆火的状态&#xff0c;一直也是备受关注的&#xff0c;同时也是吸引了很多的玩家入驻&#xff0c;因为视频号小店就是一个新的平台&#xff0c;一个新的场地&#xff0c;现…

JAVA队列相关习题4

1. 用队列实现栈。 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 一个队列无法实现栈 尝试使用两个队列 1)push元素的时候应当放在那里&#xff1f;哪个队列不为空就放在哪里 2&#xff09;出栈的时候&#xff0c;出不为空的队列size-1元素&#xff0c;剩余元…

flask框架的初步认识

flask框架的初步认识 这是一个轻量级的网页框架&#xff0c;在运行后&#xff0c;就相当于服务器&#xff0c;当用户输入URL就会触发对应的事件调用方法&#xff0c;返回给用户一个网页文件&#xff0c;并通过自动识别html标签&#xff0c;来为用户呈现对应的样式和效果&#…

第四十节实现主人公的技能释放功能(二)实现技能按钮

看看我们今天要实现的效果是&#xff0c;当我们按下数字1快捷键&#xff0c;我们的技能按钮会进入倒计时&#xff0c;如下图演示&#xff1a; 一、新建场景和根节点设置 新建场景&#xff0c;选择TextureButton作为根节点&#xff0c;重名为SpellButton&#xff0c;保存场景…

鸿蒙开发接口Ability框架:【 (ServiceExtensionAbility)】

ServiceExtensionAbility ServiceExtensionAbility模块提供ServiceExtension服务扩展相关接口的能力。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下使用。 导入…

通讯录项目—顺序表实现

在上次我介绍顺序表后相信大家对顺序表有了一定的了解&#xff0c;现在就让我们来练练如何用它&#xff0c;这篇是在顺序表基础上新增的(建议看看线性表—顺序表实现-CSDN博客)。 目录 通讯录简介 创建用户信息 适配和理解通讯录 功能实现 初始化通讯录 销毁通讯录 增加…

【高阶数据结构】图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime

图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime 一、图的概述1、概述&#xff08;纯理论部分&#xff09;2、邻接矩阵&#xff08;实现一个添加边的图&#xff09;&#xff08;1&#xff09;思路介绍&#xff08;2&#xff09;代码部分&#xff08;3&#xff09;测试部分 3、…

系统如何做好安全加固?

一、Windows系统 Windows系统出厂时&#xff0c;微软为了兼容性&#xff0c;默认并未对系统安全做严格的限制&#xff0c;因此还需要做一些基本的安全加固&#xff0c;方可防止黑客入侵。 1、系统补丁更新 为什么要更新系统补丁&#xff1f;很多人感觉漏洞更新没必要&#x…

基准电流源仿真

注意连线PMOS必须连接到VDD上&#xff0c;NMOS练到GND上 1.记得选择PNP之后&#xff0c;直接按Q就可以直接选择并联个数&#xff0c;不需要用器件。 2.记得调整放大器如图所示&#xff0c;否则会出错。 3.记得先调整PMOS的宽长比 4.按比例调节R2和R3的阻值 5.仿真的时候&#…

nlp课设 - 基于BERT 的情感分类

基于BERT 的情感分类 主要论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding&#xff08;双向Transformer 的预训练&#xff09; 核心技术&#xff1a; Embedding 、Attention --> Transformer 任务简介、拟解决问题…

springboot+vue+mybatis图书推荐管理系统的设计与实现+PPT+论文+讲解+售后

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;图书推荐管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…

医学论文摘要翻译 中译英哪里比较专业

论文摘要是对论文内容不加注释和评论的简短陈述&#xff0c;需要扼要说明论文的目的、研究方法和最终结论。在发表学术论文时&#xff0c;很多重要刊物会要求作者将文章的摘要翻译成英文。那么&#xff0c;针对医学论文摘要翻译&#xff0c;中译英哪里比较专业&#xff1f; 专…

动态规划——路径问题:931.下降路径最小和

文章目录 题目描述算法原理1.状态表示&#xff08;经验题目&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;931.下降路径最小和 关于这⼀类题&#xff0c;看过我之前的博客的朋友对于状态表示以及状态转移是⽐较容易分析…

pytorch基础: torch.unbind()

1. torch.unbind 作用 说明&#xff1a;移除指定维后&#xff0c;返回一个元组&#xff0c;包含了沿着指定维切片后的各个切片。 参数&#xff1a; tensor(Tensor) – 输入张量dim(int) – 删除的维度 2. 案例 案例1 x torch.rand(1,80,3,360,360)y x.unbind(dim2)print(&…

含义:理财风险等级R1、R2、R3、R4、R5

理财风险等级R1、R2、R3代表什么&#xff0c;为什么R1不保本&#xff0c;R2可能亏损 不尔聊投资https://author.baidu.com/home?frombjh_article&app_id1704141696580953 我们购买理财产品的时候&#xff0c;首先都会看到相关产品的风险等级。风险等级约定俗成有5级&…