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

news2024/10/1 19:32:35

【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.coloradmin.cn/o/1613872.html

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

相关文章

助企扩岗稳就业,2024年成都市重点企业稳就业政策培训会圆满举行!

2024年4月17日&#xff0c;由成都市就业服务管理局主办&#xff0c;成都市金牛区就业服务管理局承办的2024年成都市重点企业稳就业政策培训会&#xff08;金牛区专场&#xff09;在成都市金牛区顺利举行。此次培训会由国际数字影像产业园召集全区70余家重点企业积极参与&#x…

Android Studio实现内容丰富的安卓养老平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 158安卓养老 1.开发环境 后端用springboot框架&#xff0c;安卓的用android studio开发android stuido3.6 jak1.8 idea mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登…

ELK 日志分析(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释&#xff0c;Kiabana 服务的默认监听端口为5601 server.po…

C++11——线程库的理解与使用

目录 前言 一、线程库的构造 1.默认构造 2.带参构造 3.拷贝构造与赋值拷贝&#xff08;不支持&#xff09; 4.移动构造 二、线程调用lambda函数 三、线程安全与锁 1.lambda中的线程与锁 2.函数指针中的线程与锁 3.trylock() 4.recursive_mutex 5.lock_gurad守卫锁…

android开发 多进程的基本了解

目录 如何开启多进程?理解多进程模式的运行机制 如何开启多进程? 给四大组件在androidMenifest中指定android:precess <activityandroid:name".ThreeActivity"android:exported"false"android:process"com.my.process.three.remote" />…

4月21日Linux运维用户相关的添加,分组,修改权限等shell脚本开发第一天

4月21日运维用户相关的添加&#xff0c;分组&#xff0c;修改权限等shell脚本开发第一天 第一天主要实现前2个功能 ​ 主要卡在了&#xff1a; 正确的写法如下&#xff0c;注意[]中的空格&#xff0c;要求很严格&#xff01;&#xff01;&#xff01; #!/bin/bash # 先查看已…

Unity射击游戏开发教程:(3)如何销毁游戏对象 ,添加CD

在 Unity 中销毁游戏对象 在我之前的文章中,我写了关于实例化或创建激光预制体,当发射时,激光预制件将继续在屏幕上移动一段时间。 创建所有这些激光预制件后,最终会减慢游戏速度,因此我们必须通过创建激光预制件来找到平衡,在屏幕上移动直到它超出游戏视图,然后销毁它…

Vue2:标签页一个页面拆分成俩个选项卡

概要 在自己的项目中&#xff0c;标签页组件显示一般就是点击一个页面&#xff0c;然后标签页组件显示该页面的名称。但是如果你是一个页面文件中展示不同的内容比如( 某模块的新增页面 和 详情页面)一般内容新建页面和详情页面差别不是很大&#xff0c;有的内容甚至俩边都会用…

windows驱动开发-设备栈

设备栈是windows内核中非常重要的部分&#xff0c;这部分理解可以让我们在调试中节省大量的时间&#xff0c; 在windows NT体系中&#xff0c;内核所有的设备被按照连接次序加载到设备树上&#xff0c;这棵树的根节点是ROOT节点&#xff0c;每一个设备可以从当前路径一直遍历到…

查询服务器上所有SQL SERVER数据库中是否包含某个字段,且该字段是否包含某个值

公司有一堆相同类别的客户&#xff0c;每个客户都部署了相同的一套系统&#xff0c;每套系统对应一个相同结构的数据库&#xff0c;昨天老板让查一下手机号码177xxxxx248是属于哪个客户的客户。 我要查的这个号码来自于oa_member表中的phone字段&#xff0c;我需要对所有的数据…

Android 性能优化之黑科技开道(二)

3. 其它可以黑科技优化的方向 3.1 核心线程绑定大核 3.1.1 定义 核心线程绑定大核的思路也很容易理解&#xff0c;现在的 CPU 都是多核的&#xff0c;大核的频率比小核要高不少&#xff0c;如果我们的核心线程固定运行在大核上&#xff0c;那么应用性能自然会有所提升。 核…

使用Python比较两张人脸图像并获得准确度

使用 Python、OpenCV 和人脸识别模块比较两张图像并获得这些图像之间的准确度水平。 一、原理 使用Face Recognition python 模块来获取两张图像的128 个面部编码&#xff0c;并比较这些编码。比较结果返回 True 或 False。如果结果为True &#xff0c;那么两个图像将是相同的…

社交媒体内容创新:Kompas.ai如何引领潮流

在数字营销的激烈竞争中&#xff0c;社交媒体平台已成为品牌与消费者互动的主要战场。随着用户对新鲜、有趣和互动性强的内容需求不断增长&#xff0c;品牌必须不断创新&#xff0c;以维持其在社交媒体上的影响力和吸引力。本文将深入探讨社交媒体平台上内容创新的必要性及其对…

【Python】使用Python计算简单数值积分

题外话&#xff0c;Python语言命名的来源&#xff1a;&#xff08;见下图&#xff09;Monty Python巨蟒剧团 1、积分题目&#xff08;3&#xff09; 2、解析解答 3、Python计算代码 import math import scipy.integrate as integrate# 积分区间 # x_min 0.0 # 1 # x_min …

【C语言】操作符相关编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目一&#xff1a; 题目&#xff1a;不创建临时变量&#xff0c;交换两个数…

第一届 _帕鲁杯_ - CTF挑战赛

Mis 签到 题目附件&#xff1a; 27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 2…

Spring Boot集成zipkin快速入门Demo

1.什么zipkin Zipkin是一款开源的分布式实时数据追踪系统&#xff08;Distributed Tracking System&#xff09;&#xff0c;基于 Google Dapper的论文设计而来&#xff0c;由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。Zipkin默认支持Http协议&…

提取出图像的感兴趣区域

这是我们的原图像 将图像的数值统计后进行条形图展示 import matplotlib.pyplot as plt from PIL import Image import numpy as np# 图像路径 image_path r"D:\My Data\Figure\OIP.jpg"# 打开图像 image Image.open(image_path)# 将图像转换为numpy数组 image_ar…

Redis持久化策略揭秘:如何实现高可用!

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好!我是你们的小米,很高兴和大家分享Redis的持久化知识。Redis作为一款强大的内存数据库,经常被用于缓存和存储临时数据。然而,在很多场景中,我们希望Redis的数据能够持久保存,以备不时之需。那么,Redis如…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…