Linux重定向原理与系统调用dup2

news2024/11/25 4:55:04

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
在这里插入图片描述

文章目录

  • 一、重定向原理
    • ①输出重定向
    • ②输入重定向
  • 二、重定向的系统调用dup2
    • dup2输出重定向
  • 三、如何理解一切皆文件
  • 四.缓冲区
    • ①常见的缓冲区刷新策略
    • ②缓冲区的认识

一、重定向原理

在这里插入图片描述
因为文件类的接口都会去调用系统调用,因为对文件操作属于是文件管理,这部分内容是需要操作系统去完成的,因此在系统中,他是只认识fd这个数字的,并不知道FILE*这些,这些是上层封装出来的

①输出重定向

输出重定向的本质就是关掉stdout,也就是1号文件描述符,然后打开一个文件去占用这个文件描述符,然后输出即可

int main()
{
	char buffer[SIZE]="zhupi";
	close(1);//unistd.h
	int fd = open("log.txt",O_WRONLY|O_TRUNC|O_CREAT,0666);
	//打开文件,写|覆盖|没有则创建,权限为0666,真实权限需要集合权限掩码 0666&umask
	if(fd<0) ...
	printf("fd:%d\n",fd);
	cout<<buffer<<endl;
	close(fd);
	return  0;
}

在这里插入图片描述

②输入重定向

输入重定向就是关掉stdin,也就是0号文件描述符,然后打开文件,占用0号文件描述符的位置,然后键盘输入,或者其他输入进去即可

int main()
{
	char buffer[64];
	close(0);
	int fd = open("log.txt",O_RDONLY)
	if(fd<0) ...
	printf("fd:%d\n",fd);
	fgets(buffer,sizeof buffer,stdin);
	printf(buffer);
	printf("\n");
	close(fd);
	return 0;
}

二、重定向的系统调用dup2

在这里插入图片描述
在这里插入图片描述

int dup2(int oldfd,int newfd);

dup2的作用是把oldfd拷贝到newfd,比如给log.txt创建到3的位置,然后将3拷贝给1,所以3是oldfd,1是newfd(这只是dup2的做法,其实我们close掉1,再open文件log.txt也是一样的效果)
在这里插入图片描述

dup2输出重定向

int main(int argc,char*argv[])
{
	printf("%d\n",argc);
	if(argc!=2)
	{
		return 2;
	}
	int fd = open("log.txt",O_WROLNY|O_CREAT|O_TRUNC,0666);
	if(fd<0)
	{
		perror("open");
		return 1;
	}
	dup2(fd,1);//old是fd,new是1,把fd拷贝给1
	fprintf(stdout,"%s\n",argv[1]);
	return 0;
}

当我们自己先close(1),再open log.txt,最后如果close(fd)的时候,发现并没有输出进log.txt,这是因为缓冲区的原因,还没有刷新进log.txt就被关了,这个到后面缓冲区的时候再谈,而dup2(fd,1)就不会,这是dup2的一种特性

三、如何理解一切皆文件

一切皆文件时Linux的设计哲学,体现在软件设计层面
那Linux是C写的,如何用C实现面向对象,甚至是运行时多态?

在这里插入图片描述
也就是用结构体来体现类的成员变量,然后存函数指针来找成员函数
所以说底层不同的硬件,对应不同的操作方法就可以了,每个设备实现的read和write不同

所以设计了一个struct_file来描述,在上层没有任何的硬件差别,看待所有文件的格式,都统一成了对file_struct的操作,所以在操作系统之上,Linux就有一切皆文件,Linux的这种管理模式,称作VFS(virtual file system虚拟文件系统)

在这里插入图片描述

四.缓冲区

①常见的缓冲区刷新策略

1.立即刷新
2.行刷新(行缓冲)
3,满刷新(全缓冲)

②缓冲区的认识

一般而言,行缓冲的设备一般是显示器
因为显示器是给用户看的,一方面照顾效率,一方面照顾用户体验
全缓冲的设备一般是磁盘文件
因为刷新到磁盘文件,因为用户是不需要马上看到的,更在乎的是效率

但是所有的设备,都倾向于全缓冲,因为缓冲区满了才刷新就意味着需要更少的IO操作->更少的访问外设,提高效率,其他属性层略是结合具体情况做的妥协(都倾向于缓冲区)

例:
在这里插入图片描述
因为向显示器打印是行缓冲,所以都能够正常打印,但当向文件中打印的时候,因为刷新策略是全缓冲(满刷新),所以在程序结束之前或者说缓冲区满之前并不会刷新到文件,所以子进程进行对父进程的拷贝,所以C的打印接口打印了两次,那么write系统调用为什么只打印一次呢?因为缓冲区是C标准库提供的,缓冲区并不是OS的,所以系统调用并不会用这套缓冲区的刷新策略,而且,父子进程所指向的缓冲区在打印之前也是指向的同一个,因为有写时拷贝。C的打印接口其实就是拷贝一份给缓冲区,然后缓冲区去调用系统调来刷新

上面我们指的缓冲区是用户级缓冲区,这个缓冲区是C标准库提供的,除此之外,还有内核级缓冲区,其实调用write,也不是直接写到外设上的,而是每个file结构体都有对应的内核缓冲区。

需要注意的是:
1.我们需要避免在全缓冲策略下在还未刷新数据前关闭文件描述符导致数据并未刷新
2.通过关闭1号文件描述符,再让打开的文件取占位,就可以达到行刷新的目的

在这里插入图片描述

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

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

相关文章

【数据结构与算法】B树与B+树

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;数据结构与算法 &#x1f320; 首发时间&#xff1a;2022年12月6日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e;…

电脑e盘不见了怎么恢复?6个步骤找回e盘

电脑e盘不见虽然不是一件常见的事&#xff0c;但是也会有发生的情况。虽然我们还有其他磁盘&#xff0c;平时也会经常忽略e盘。但是e盘也是一个存储磁盘&#xff0c;当电脑e盘不见了&#xff0c;我们也会想要找回来。那么电脑里的e盘丢失了怎么找回呢&#xff1f;下面我们就一起…

QListWidget::itemEntered无效

利用QListWidget进行数据列表的展示&#xff1b; &#xff08;1&#xff09;初始化一个QListWidget&#xff1a; QListWidget* newListWidget new QListWidget(parent); newListWidget->setResizeMode(QListView::Adjust); newListWidget->setViewMode(QListView::Icon…

论文浅尝 | AdaLoGN: 基于推理的机器阅读理解的自适应逻辑图网络

笔记整理&#xff1a;何仕玉珑&#xff0c;天津大学硕士链接&#xff1a;https://arxiv.org/pdf/2203.08992.pdf动机最近的机器阅读理解数据集(如ReClor和LogiQA)需要对文本执行逻辑推理。传统的神经模型不足以进行逻辑推理&#xff0c;而符号推理机不能直接应用于文本推理。为…

【Cross-Direction and Progressive Network:交叉的挖掘信息】

A Cross-Direction and Progressive Network for Pan-Sharpening &#xff08;一种交叉递进的泛锐化网络&#xff09; 本文提出了一种交叉方向渐进&#xff08;cross-direction and progressive&#xff09;网络CPNet来解决全色锐化问题。对信息的充分处理是我们模型的主要特…

实战三十一:基于LightGCN推荐算法的推荐系统详细教程(代码+数据)

推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)构造出用户-项目交互图,协同过滤利用过去的用户-项目交互来实现预测;对相似的用户进行推荐相同喜好的item,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的…

01-go基础-05-数组(声明数组、数组赋值、遍历数组、数组值修改)

文章目录1. 声明数组- 语法- 完整示例2. 数组赋值- 语法- 完整示例- 未赋值的元素仍为默认值3. 数组元素赋值- 语法- 示例4. 数组访问4.1 访问数组中元素4.2 遍历数组5. 数组的修改5.1 修改全部数组元素值5.2 修改单个元素值5.3 数组长度不可以更改1. 声明数组 - 语法 语法 …

刷爆力扣之1 比特与 2 比特字符

刷爆力扣之1 比特与 2 比特字符 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&am…

[附源码]Python计算机毕业设计Django四川景区管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Go语言的IO库那么多纠结该如何选择

在Go语言中I/O操作的内置库有很多种&#xff0c;比如:io库&#xff0c;os库&#xff0c;ioutil库&#xff0c;bytes库&#xff0c;strings库等等。 io.Reader/Writer Go语言里使用io.Reader和io.Writer两个 interface 来抽象I/O&#xff0c;他们的定义如下。 type Reader int…

数据图表软件-FineReport控件简介

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 应用场景 在帆软报表的具体应用中&#xff0c;经常使用「控件」来实现不同的功能。根据使用方式可将控件分为填报控件和参数控件两大类&#xff0c;填报时使用的控件为填报控件&#xff0c;参数界面使用的控件为参…

认证服务------遇到的问题及解决方案

认证服务的问题及解决方案 问题1&#xff1a;发送验证码 发送验证码要注意的问题 发送验证码要注意的两个问题 1、接口防刷 接口防刷就是因为发送验证码的api接口是可以通过查看页面元素看的到的 上面就可以看到发送验证码的js代码中的请求地址&#xff0c;可以恶意的通过…

【产品设计】APP提升用户注册率的五个方案探讨结论

首先介绍下前置条件&#xff0c;我们在做产品时&#xff0c;出于一开始对行业特征和用户参与度的考虑&#xff0c;所以对注册没有要求&#xff0c;当用户触发需要记录用户行为的功能时才会弹出登陆注册的聚合页面&#xff0c;能够触发弹出的功能有&#xff1a;赞、写点评、回复…

ActiveMQ 笔记(九)Windows部署:单机与集群部署流程

1. 单机版部署 版本关系说明:JDK8环境只能安装5.2及以下的。超过5.2需要JDK9及以上版本环境。 (1)官网下载安装包 activemq.apache.org 选择一个版本进行下载, (2)解压安装包 下载完成之后解压 下载后直接解压缩直接就能用(免安装)。 bin/是服务启动相关的命令文件…

Xylan-PEG-NHS|木聚糖-聚乙二醇-琥珀酰亚胺

Xylan-PEG-NHS|木聚糖-聚乙二醇-琥珀酰亚胺 琥珀酰亚胺又称为丁酰亚胺或丁二酰亚胺&#xff0c;是一种无色针状结晶或具有淡褐色光泽的薄片固体&#xff0c;味甜。易溶于水、醇或氢氧化钠溶液&#xff0c;不溶于醚、氯仿等 中文名称&#xff1a;木聚糖-聚乙二醇-琥珀酰亚胺 …

目标检测 YOLOv5 开源代码项目-环境配置问题

学习视频&#xff1a; 目标检测 YOLOv5 开源代码项目调试与讲解实战【土堆 x 布尔艺数】 项目源码&#xff1a;ultralytics / yolov5 教程&#xff1a;手把手带你调参Yolo v5 (v6.2)&#xff08;推理&#xff09; 遇到的问题&解决的链接&#xff1a; ERROR: Failed buil…

怎样查看对方计算机网络密码,如何查看邻居家的wifi密码?不知道wifi密码怎么蹭网...

如何查看邻居家的wifi密码&#xff1f;不知道wifi密码怎么蹭网&#xff1f;不知道大家有没有遇到这样的问题&#xff1a;手机虽然已经连接到了WiFi&#xff0c;但是却已经忘记了WiFi密码。这时候如果会有一丝担忧在心中&#xff0c;如果下次连接不上&#xff0c;或是有人问你密…

[C语言数据结构]树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录1.树1.1树的概念&#xff1a;1.2树与非树1.3一些关于树的概念&#xff1a;1.4树的一些表示方法&#xff1a;2.二叉树2.1概念&#xff1a;2.2二叉树的特点2.3满二叉树…

为什么在做微服务设计的时候一定需要DDD?

记得之前在规划和设计微服务架构的时候&#xff0c;张队长给了我一个至今依然记忆深刻的提示&#xff1a;你的设计蓝图里为什么没有看到DDD的影子呢&#xff1f; 随着对充血模型的领域认知的加深&#xff0c;我越加感觉到DDD的重要性。于是网上一顿海找&#xff0c;并做了学习…

Thinkpad x13 锐龙安装 Archlinux 记录

硬件配置&#xff1a; 笔记本影响cpu显卡内存硬盘ThinkPad X13 锐龙版r7 4750U核显16g1TB 山寨固态&#xff08;大华&#xff09;镜像准备 https://archlinux.org/download/ http://mirrors.163.com/archlinux/iso/2022.12.01/ 每次安装都检查iso镜像是否是网站最新的&#x…