【Linux】认识文件(二):重定向

【Linux】认识文件(二):重定向

  • 一.stdout,stderr,stdin
  • 二.重定向
    • 1.什么是重定向
      • i.输出重定向>
      • ii.追加重定向>>
      • iii.输入重定向<
    • 2.重定向原理
    • 3.dup2的使用
  • 三.理解linux中的一切皆文件

上篇文件博客中,讲了进程管理已打开文件的方式,这次带来重定。

想要理解重定向的原理的话,需要对文件标识符有一定的认识
所以推荐没看过的把上篇给看了,文件标识符

一.stdout,stderr,stdin

再讲重定向之前,需要讲一下这三个是啥东西。

上篇博客我们说了,一个进程能打开多个文件

这三个可以说是每个进程最先打开的文件
这个是操作系统要求的

这个时候需要用一下上篇博客的内容
在这里插入图片描述

一个进程是通过这个来管理自己打开的文件的。

而进程最先打开的文件就是这三个:

  • 标准输入【键盘文件】(stdin)的文件描述符标识符是 0
  • 标准输出【显示器文件】(stdout)的文件描述符标识符是 1
  • 标准错误【显示器文件】(stderr)的文件描述符标识符是 2

在这里插入图片描述

同时可以在调用文件标识符参数的函数中进行使用

#include<unistd.h>  
int main()
{char* message="asdasd";write(1,message,strlen(message)); 
}

在这里插入图片描述
这里面的1指的就是显示器文件。

这里细心的人可能发现了:

stderr和stdout都是显示器

确实是这样。

但是:

stderr是专门用来输出错误信息的。
stdout是专门用来输出结果的

一般人也不会喜欢错误信息和结果全都输出到一个文件里吧

所以把这两个进行了分离

二.重定向

1.什么是重定向

最开始我们肯定要先了解什么是重定向。

官方术语:在计算机系统中,重定向是一种机制,用于将一个程序的输入或输出从一个默认位置或设备重新定向到另一个位置或设备。这种机制可以改变程序的数据流方向,使其与其他组件或资源进行交互。

这么长一串看起来还挺磨人的,所以这里下面就直接上:
命令行中的重定向操作

大伙应该都已经用过这几个了
所以就随便演示一下操作,主要是让大家明白啥是重定向

i.输出重定向>

在这里插入图片描述
这里我们其实就能理解啥是重定向了,

ls > test.log

这里原本ls,是要输出到显示器中
但是加上> test.log后,将这个结果输出到了test.log中了

就是将文件的输出结果转向到了另一个文件中

ii.追加重定向>>

这个就是不将文件中的原数据清空,在后文进行添加,相当于特殊用法的输出重定向

在这里插入图片描述

iii.输入重定向<

不光是输出和追加能重定向

输入也能重定向
在这里插入图片描述

这里如果直接用cat,它是专门等待用户在stdin文件的输入,然后输出到stdout文件中

但是用了< test.log后,它会直接将test.log的内容当做输入,然后进行打印

在这里插入图片描述

2.重定向原理

上面的只是bash命令行的重定向命令
接下来要前往底层进行了解重定向

这里我们可以看看重定向的相关表现


#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<string.h>
#include<unistd.h>int main()
{const char* message="lalala";close(2);int fd=open("test.log",O_RDWR);write(2,message,strlen(message)-1); 
}

这个代码能看到
把代表sterr的2的文件标识符关闭后
接下来用write将message塞进文件标识符2中。

我们在程序结果中能看到:
在这里插入图片描述
发现这里write对FD2的文件进行输入,这里是test.log接收到了
所以说这个时候test.log的FD是2

这里就应该来讲讲
文件描述符对应的分配规则
从0下标开始,寻找最小的没有使用过的数组位置,它的下标就是新文件的文件标识符

所以这里就能猜到原因了:
这是因为将一号文件标识符(stderr)关闭后,test.log代替了原本stderr的位置
在这里插入图片描述
大致就是这个原理

3.dup2的使用

通过上面的操作,如果要实现重定向,就要将文件一直开启关闭
这个想想就麻烦

所以操作系统自己提供了一个重定向的接口
所以就有了dup接口,来让用户进行重定向
在这里插入图片描述
dup2函数的作用是将文件描述符oldfd复制到newfd,并返回新的文件描述符。

对这里没看错,是把oldfd复制给新的newfd
所以是:

大致是这样的用法:
在这里插入图片描述
这里要注意:
dug拷贝的不是文件标识符,文件标识符只是个下标
拷贝的是数组中的对应文件标识符中的文件地址

三.理解linux中的一切皆文件

可能之前大家或多或少听说过这句话
但是可能理解的不是很透彻
可能只听说过,在Linux中各种硬件设备,本质上都是文件
确实是这样,
这里就慢慢带大家来更加清楚了解一下

在这里插入图片描述

这里有各种硬件,他们都有各自的相关功能接口
在这里插入图片描述

这里能发现各个硬件都有类似的访问接口
特别是读写(I/O)功能
利用各个硬件的读写功能实现方式不一样,但是他们包含的功能是相似
这个特点,我们就可以想到:

设计一个专门的功能集合结构体,然后给不同的硬件对应到各自的操作中
在这里插入图片描述
这里给各个硬件创建相同的功能集合体
然后分别对应他们各自的功能接口

接下来就可以创建文件结构体了,将硬件都用文件进行表示

在这里插入图片描述
这里我们能发现:
只要在文件结构体中,塞进一个能找到对应功能集合体的指针,就大功告成了

在这里插入图片描述

这样就完成了通过文件操作硬件的方式

接下来来对文件的管理我们就很熟悉了

在这里插入图片描述

大致是:
进程结构体->进程管理文件的结构体数组加上对应的文件标识符号->对应的文件->对应的功能集合体->硬件对应的操作接口
在这里插入图片描述
大致差不多是这样。

这里其实就能看到面向对象变成思想的影子

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

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

相关文章

见鬼了!我家的 WiFi 只有下雨天才能正常使用...

这是作者大学时期在家里遇到的一个非常奇怪的网络问题&#xff0c;作者的父亲是一名经验丰富的网络工程师&#xff0c;他们家里使用了一个复杂的网络设置&#xff0c;通过 Wi-Fi 桥接的方式&#xff0c;将父亲公司的高速商业网络连接到家中。但是有一天&#xff0c;作者发现家里…

互联网技术知识点总览——数据库知识点框架

简介 本文对数据库的知识点整体框架进行梳理和分享如下&#xff1a;

【图说】VMware Ubuntu22.04 详细安装教程

前言 无论是从事 Linux 开发工作&#xff0c;还是希望电脑运行双系统&#xff0c;VMware 虚拟机都是我们日常工作不可或缺的工具。本章将会重点介绍 VMware 安装流程&#xff0c;以及在 VMware 上如何运行、使用 Ubuntu22.04 系统。 一、VMware 下载安装 1.1 VMware 官网下载…

Bootstrap 5 保姆级教程(十五):表单

一、表单 1.1 堆叠表单 以下实例使用两个输入框&#xff0c;一个复选框&#xff0c;一个提交按钮来创建堆叠表单&#xff1a; <div class"container mt-3"><h2>堆叠表单</h2><form action""><div class"mb-3 mt-3"…

Oracle VM VirtualBox虚拟机安装配置

一、下载镜像文件 首先&#xff0c;需要从Oracle官方网站下载VirtualBox的最新版本。下载完成后&#xff0c;双击安装包开始安装。按照安装向导的提示&#xff0c;同意许可协议&#xff0c;并选择安装位置。在安装过程中&#xff0c;可以根据需要选择是否创建快捷方式、是否安…

150G全国1米分辨率土地利用数据【2023年】

#1数据摘要 全国1米分辨率土地利用数据 全国范围,分省份分类,1米精度土地利用数据。2023年版本。 数据格式:tif 坐标系:wgs1984 范围:全国各省份 时间:2023年 精度:1米 地类:共计11个地类 中国1m分辨率土地覆盖数据 文件命名与介绍:数据为GeoTIFF栅格格式,每个城市…

CK_Label_V1

CK_Label_v1&#xff08;电池版&#xff09; 产品型号 CK_Label_v1 尺寸 37*65*33.7mm 按键 1 指示灯 1 RGB灯(红/绿/蓝/黄/紫/白/青) 外观颜色 白色 供电方式 5号干电池供电1800mAh&#xff0c;可更换电池 通信方式 无线通信 合规认证 CE, RoHS 工作温度 …

Oracle交换分区测试

1、用exchange分区表减少初始化过程中对业务中断的影响 2、创建分区表 create table t_p (id number,name varchar2(30),addr varchar2(50)) partition by range(id) (partition p1 values less than(10), partition p2 values less than(20), partition p3 values less …

39. UE5 RPG角色释放技能时转向目标方向

在上一篇&#xff0c;我们实现了火球术可以向目标方向发射&#xff0c;并且还可以按住Shift选择方向进行攻击。技能的问题解决&#xff0c;现在人物释放技能时&#xff0c;无法朝向目标方向&#xff0c;接下来我们解决人物的问题。 实现思路&#xff1a; 我们将使用一个官方的…

【python】图形用户界面学习之tkinter

认识tkinter Tkinter是Python中内置的图形用户界面&#xff08;GUI&#xff09;库。它是Tk GUI工具包的接口&#xff0c;可以创建和管理窗口、按钮、标签、文本框等各种GUI组件&#xff0c;并与用户交互。 使用Tkinter&#xff0c;可以创建各种GUI应用程序&#xff0c;如桌面…

Datax助力轻松迁移SQLServer数据至GreatSQL

1.环境说明 1.1源端SQLSserver 版本IP端口Microsoft SQL Server 2017192.168.140.1601433 1.2目标端GreatSQL 版本IP端口GreatSQL-8.0.32192.168.139.863308 2.安装环境 2.1安装SQLServer环境 环境说明&#xff1a;借助Docker使用镜像启动数据库 2.1.1安装docker 1.安…

PCL SAC_IA配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…