【Linux】文件重定向以及一切皆文件

文章目录

  • 前言
  • 一、重定向
  • 二、系统调用dup2
  • 三、重定向的使用
  • 四、一切皆文件


前言

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2, 0,1,2对应的物理设备一般是:键盘,显示器,显示器

在这里插入图片描述

而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件

一、重定向

文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的
最小的一个下标,作为新的文件描述符。
我们先来看这段代码
在这里插入图片描述
毫无疑问我们标准输入,标准输出和标准错误占据了file数组0,1,2位置,然后我们执行程序也是打印在显示器上面
在这里插入图片描述

接下来我们再对源代码进行一些更改

在这里插入图片描述
我们执行程序发现没在显示器上面打印信息,而是在文件里面打印了
在这里插入图片描述
而且此时的文件描述符为1,也验证了我们上面说的:
在files_struct数组当中,找到当前没有被使用的
最小的一个下标,作为新的文件描述符。
在这里插入图片描述
原理:我printf默认用标准输出来封装,而我标准输出的文件描述符在数组中对应的是1,我printf只管往1里面写入,不关心你1里面到底是谁,所以当我们关闭原来的文件描述符为1的标准输出,我1位置就放入了myfile的文件指针,所以会向myfile中写入
在这里插入图片描述

二、系统调用dup2

在这里插入图片描述
dup是duplicate的缩写具有重定向的功能,(不需要我们像上面那样复杂的先去关闭一个指定位置,再打开一个新文件的操作),之所以叫这个名字我们需要从原理层来看:

dup2()

我们新打开的文件,操作系统创建fiile的结构体并且其文件描述符分配为3,指针数组中下标1位置直接对我们数组中下标为3位置进行拷贝,1位置最后也指向log.txt的文件结构体
在这里插入图片描述

printf是C库当中的IO函数,一般往 stdout 中输出,但是stdout底层访问文件的时候,找的还是fd:1, 但此时,fd:1下标所表示内容,已经变成了myfile的地址,不再是显示器文件的地址,所以,输出的任何消息都会往文件中写入,进而完成输出重定向。

因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的。所以C库当中的FILE结构体内部,必定封装了fd。

三、重定向的使用

在这里插入图片描述
执行文件:

在这里插入图片描述
我们会发现hello error没有写入log.txt中而是直接打印在了显示器上这是为什么呢?
前面我们已经有过重定向的知识了,这里应该不难理解,

//本质是将log.txt重定向到1也就是标准输出流的位置,
完整写法应该是这样的:
./test 1 > log.txt
因为文件描述符1被重定向,所以我们朝stdout里写入的数据虽然
依旧会向1所指向的位置
去写入,但因为我们的1位置已经被新文件重定向也就是1中存的是新文件的信息地址,
所以写入的时候会写入新文件的位置,这也就解释了为什么log中会被写入数据而我们stderror标准错误流对应的文件描述符2不受影响,
所以我依旧向显示器打印

我们也可以选择重定向到标准错误对应的文件描述符中
在这里插入图片描述
我们也可以将重定向1输出到log.txt中剩余的内容再重定向到文件描述符为2的位置
在这里插入图片描述

还可以同时把这些内容输入到一个文件当中去
在这里插入图片描述
在这里插入图片描述

四、一切皆文件

即使是外设,Linux中也会把他们看成文件,当成文件来进行管理

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

完整图:
在这里插入图片描述

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

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

相关文章

论文笔记:AttnMove: History Enhanced Trajectory Recovery via AttentionalNetwork

AAAI 2021 1 intro 1.1 背景 将用户稀疏的轨迹数据恢复至细粒度的轨迹数据是十分重要的恢复稀疏轨迹数据至细粒度轨迹数据是非常困难的 已观察到的用户位置数据十分稀疏,使得未观察到的用户位置存在较多的不确定性真实数据中存在大量噪声,如何有效的挖…

C语言--前置++与后置++

:自增1 注意区分前置和后置 前置:先,后使用 后置:先使用,后 --:自减1 注意区分前置和后置 前置:先-- ,后使用 后置,先使用,后-- int main() {int i 10;//int j i;//前置,先…

C++20 Text formatting

C20 Text formatting 格式化字符串&#xff0c; 和 python 类似。 std::formatter - cppreference.com string — Common string operations — Python 3.12.0 documentation 新格式库位于 <format> 头文件中。格式库基于 Python3 中的 str.format() 方法建模。格式…

OpenCV-Python小应用(九):通过灰度直方图检测图像异常点

OpenCV-Python小应用&#xff08;九&#xff09;&#xff1a;通过灰度直方图检测图像异常点 前言前提条件相关介绍实验环境通过灰度直方图检测图像异常点代码实现输出结果 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff…

如何使用 NFTScan NFT API 在 zkSync 网络上开发 Web3 应用

zkSync 是由 Matter Labs 创建的&#xff0c;是一个以用户为中心的 zk rollup 平台&#xff0c;它是以太坊的第 2 层扩展解决方案&#xff0c;使用 zk-rollups 作为扩展技术&#xff0c;与 optimistic rollups 一样&#xff0c;zk-rollups 将会汇总以太坊主网上的交易并将交易证…

puzzle(1612)拼单词、wordlegame

目录 拼单词 wordlegame 拼单词 在线play 找出尽可能多的单词。 如果相邻的话&#xff08;在任何方向上&#xff09;&#xff0c;你可以拖拽鼠标从一个字母&#xff08;方格&#xff09;到另一个字母&#xff08;方格&#xff09;。在一个单词中&#xff0c;你不能多次使用…

LeetCode【701】二叉搜索数的插入操作

题目&#xff1a; 思路&#xff1a; https://zhuanlan.zhihu.com/p/272781596 代码&#xff1a; class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {return process(root,val); }//递归public TreeNode process(TreeNode root,int val){//base ca…

ElasticSearch7.x - HTTP 操作 - 文档操作

创建文档(添加数据) 索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数 据库中的表数据,添加的数据格式为 JSON 格式 向 ES 服务器发 POST 请求 :http://192.168.254.101:9200/shopping/_doc 请求体内容为: {"title":"小…

基于工业智能网关的汽车充电桩安全监测方案

近年来&#xff0c;我国新能源汽车产业得到快速发展&#xff0c;电动车产量和销量都在持续增长&#xff0c;不仅国内市场竞争激烈&#xff0c;而且也远销海外&#xff0c;成为新的经济增长点。但与此同时&#xff0c;充电设施的运营却面临着安全和效率的双重挑战。 当前的充电桩…

基于51单片机的篮球比赛计分器积分器

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机篮球 获取完整源程序仿真源文件原理图文件论文报告等 基于51单片机的篮球计分器 由STC89C51单片机数码管显示模块按键模块电源模块构成 具体功能&#xff1a; &#xff08;1&#xff09;能记录单节比赛的比赛时间&am…

基于SSM的培训机构运营系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

管理能力测评,如何提升管理能力?

管理能力是综合能力的体现&#xff0c;通常也解读为组织管理能力&#xff0c;如果要再细分的话&#xff0c;可能还包括有沟通能力&#xff0c;协调能力&#xff0c;组织能力&#xff0c;执行力和专业能力等等。不过没有办法说的太细节&#xff0c;因为每个部分铺开了都是一个独…