【Linux】:重定向和用户缓冲区

news/2024/11/30 3:33:01/

重定向和用户缓冲区

  • 一.输出重定向
    • 1.现象
    • 2.系统调用接口
  • 二.缓冲区
    • 1.引子
    • 2.刷新
  • 三.回答引例

文件描述符对应匹配规则:从0下标开始,寻找最小的没有被使用的数组位置,它就是新的文件描述符(fd)。

一.输出重定向

1.现象

在这里插入图片描述

在这里我们向1号文件内写入字符串,1号文件本来是显示器,那么我们将1号文件关闭后再向1号文件写入会发生什么呢?

在这里插入图片描述

我们可以看到屏幕并没有打印字符串,很正常因为我们把屏幕关闭了,但它却把内容写到了log.txt内,这个现象就是输出重定向。

当我们把1号文件关闭后再创建了一个log.txt文件,该文件就会占据1号文件的位置,那么当我们向1号文件写入时,自然就写入到了log.txt里。

2.系统调用接口

显然对于先关闭再打开这样的操作还是很麻烦,其实只需要struct file*fd_array[]数组里对应下标的值拷贝一份放到目标下标里,就可以完成一次重定向。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二.缓冲区

1.引子

在这里插入图片描述

在这里插入图片描述

这里没什么问题,接下来将代码改一下。

在这里插入图片描述

在这里插入图片描述

直接运行程序也没有出现问题。

在这里插入图片描述

这里为什么重定向到另一个文件就变成了7行内容呢?再仔细观察可以发现c接口的打印了两次,而系统接口的只打印了一次。由于我们只加了一个fork函数,所以这个现象必定和fork有关。 想要解释这个现象需要花费一系列的功夫,慢慢说来。

2.刷新

再次更改代码

在这里插入图片描述

新增一个close并且去掉了/n,来看看现象。

在这里插入图片描述

结果是没有任何输出(当然将close去掉就能打印出来)。首先这个缓冲区一定不在操作系统内部。因为如果在内部,当close时,缓冲区的数据就会直接被刷新到磁盘里。而write写入能看到,是因为write直接写到内部缓冲区里了。

在这里插入图片描述

而C语言它会自己提供一个缓冲区,这个缓冲区是语言层面的。而当等到合适的时候,例如:遇到/n,fclose…它才会调用write接口将其发送到内部缓冲区里。而这种操作被称为刷新。 用户刷新的本质就是将数据用write写入到内核里。目前我们认为只有将数据刷新到了内核,数据就可以找到硬件了。

应用层的三种刷新方式

在这里插入图片描述

在平常我们写printf函数时不带/n也能打印出来,是因为在进程退出时,缓冲区也会进行刷新。

在这里插入图片描述

在这里插入图片描述

而在退出前关闭文件就不会进行刷新。

在这里插入图片描述

在这里插入图片描述

前文说到缓冲区在C语言里,这样很笼统。其实具体在FILE这个结构体内,而FILE是属于语言层面的,那么每打开一个文件就会创建一个FILE结构体,也会多一个缓冲区。

三.回答引例

因为在fork时,子进程与父进程公用同一份代码,同时在最开始时共用一份数据,如果需要,子进程才会发生写时拷贝复制数据并更改。那么在此之前父进程的缓冲区里已经有了3条代码(注意write是系统调用接口,直接写入了内核),所以子进程在创建时的缓冲区也有3条代码(注意是写入普通文件,是全缓冲),当子进程结束时将这3条写入文件,父进程结束时也将这3条写入文件,(注意当一个进程刷新后,数据发生了变化,另一个进程就会发生写时拷贝,所以这里父子进程会刷新3条)所以该文件就会有7条代码了(write的首先写入了)。


http://www.ppmy.cn/news/1198315.html

相关文章

CSRF攻击(2), 绕过Referer防御

CSRF攻击(2), 绕过Referer防御 一. 场景: 攻击服务器: 192.168.112.202 目标服务器: 192.168.112.200说明: 1. 前端页面的功能是修改密码. 2. 将恶意页面放到202服务器上, 在目标200服务器上访问恶意页面, 目的是绕过200服务器上对CSRF的防御, 修改密码. 二. 后端防御代码: …

机器视觉在农业、医疗等领域的应用与拓展

机器视觉在农业、医疗等领域有着广泛的应用和拓展,以下是具体的介绍: 在农业领域,机器视觉技术可以用于农作物生长状态监测、品质检测、产量预测等方面。通过对农作物的生长状态进行实时监测,可以及时发现病虫害、营养不足等问题…

python图像处理 ——图像锐化

python图像处理 ——图像锐化 前言一、原理二、 空间域锐化滤波1.拉普拉斯算子(Laplacian)2.罗伯茨算子(Roberts)3.Sobel算子4.Prewitt算子5.Scharr算子 三、实验对比 前言 由于收集图像数据的器件或传输图像的通道存在一些质量缺…

ELK搭建以及使用教程(多pipiline)

1、环境准备 服务器:Centos7 Jdk版本:1.8 Es版本:7.12.1 kibana版本:7.12.1 logstash版本:7.12.1 IP地址安装软件192.168.50.211Es,Kibana,logstash 2、安装docker 安装步骤参考:https:…

win10提示mfc100u.dll丢失的解决方法,快速解决dll问题

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“mfc100u.dll丢失”。那么,mfc100u.dll是什么?mfc100u.dll是Microsoft Visual C Redistributable文件之一,它包含了用于MFC (Microsoft Foundation Class…

StringBuffer-安全可变字符串容器

1、诞生原因 StringBuffer适用于作为共享变量使用,因为它通过排它锁来保证线程安全,也就是用了synchronized关键字修饰了相关操作方法,而这些方法的用法及特性与StringBuilder相同,只不过StringBuffer增加了一个缓存字符数组toSt…

三、操作系统

(一)概述 操作系统是管理整个系统的软、硬件资源的系统,既是人和硬件之间的一种接口,也是应用软件与硬件之间的接口。 (二)进程管理 1.进程的状态 进程的状态是操作系统对进程进行管理的时候设置的几种状…

MapReduce WordCount程序实践(IDEA版)

环境 Linux:Hadoop2.x Windows:jdk1.8、Maven3、IDEA2021 步骤 编程分析 编程分析包括: 1.数据过程分析:数据从输入到输出的过程分析。 2.数据类型分析:Map的输入输出类型,Reduce的输入输出类型&#x…