Linux--文件(2)-重定向和文件缓冲

命令行中的重定向符号

介绍和使用

在Linux的命令行中,重定向符号用于将命令的输入或输出重定向到文件或设备
常见的重定向符号

1.“>“符号:将命令的标准输出重定向到指定文件中,并覆盖原有的内容。
2.”>>“符号:将命令的标准输出重定向的指定文件中,并将输出结果追加到文件末尾。
3.”<“符号:将指定文件的内容作为命令的标准输入。
4."<<"符号:将命令的标准输入设置为指定的文本块。

在使用重定向符号时,应该确保文件或设备的权限设置正确,否则可能会出现无法访问或写入的错误

在这里插入图片描述

模拟实现

下面通过自定义shell来进行模拟实现重定向,加深印象。

自定义Shell的链接入口

在这里插入图片描述
在这里插入图片描述
!](https://img-blog.csdnimg.cn/direct/a83d0ea0d57644918c16ecd27c873575.png)

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

文件缓冲问题

描述

文件缓冲是指将数据暂时存储在内存中,而不是立即写入到文件中这样可以提高文件操作的效率,因为将多次的写操作合并为一次,可以减少IO操作的效率
文件缓冲主要为两种类型:

  • 全缓冲:当填满缓冲区或遇到换行符时,才会执行写操作。例如,使用fwrite()函数写入数据时,默认是全缓冲。
  • 行缓冲:当遇到换行符时,才会执行写操作。例如,使用printf()函数输出数据时,默认是行缓冲。

可以使用setbuf()setvbuf()等函数来设置文件的缓冲方式。此外,使用fflush()函数可以强制刷新缓冲区,将缓冲区中的数据立即写入到文件中。

需要注意的是,文件缓冲只适用于标准I/O库函数(如stdio.h中的函数),对于直接使用系统调用进行文件操作的函数(如read()write()),没有文件缓冲的概念,数据会立即写入文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例子

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

模拟实现

头文件:mystdio.h

#pragma once#include <stdio.h>#define SIZE 4096
#define NONE_FLUSH (1<<1) 
#define LINE_FLUSH (1<<2) 
#define FULL_FLUSH (1<<3) typedef struct _myFILE
{//char inbuffer[];char outbuffer[SIZE];int pos;int cap;int fileno;int flush_mode;
}myFILE;myFILE *my_fopen(const char *pathname, const char *mode);
int my_fwrite(myFILE *fp, const char *s, int size);
//int my_fread();
void my_fflush(myFILE *fp);
void my_fclose(myFILE *fp);
void DebugPrint(myFILE *fp);

源文件:mystdio.c

#include "mystdio.h"
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>const char *toString(int flag)
{if(flag & NONE_FLUSH) return "None";else if(flag & LINE_FLUSH) return "Line";else if(flag & FULL_FLUSH) return "FULL";return "Unknow";
}void DebugPrint(myFILE *fp)
{printf("outbufer: %s\n", fp->outbuffer);printf("fd: %d\n", fp->fileno);printf("pos: %d\n", fp->pos);printf("cap: %d\n", fp->cap);printf("flush_mode: %s\n", toString(fp->flush_mode));
}myFILE *my_fopen(const char *pathname, const char *mode)
{int flag = 0;if(strcmp(mode, "r") == 0){flag |= O_RDONLY;}else if(strcmp(mode, "w") == 0){flag |= (O_CREAT|O_WRONLY|O_TRUNC);}else if(strcmp(mode, "a") == 0){flag |= (O_CREAT|O_WRONLY|O_APPEND);}else{return NULL;}int fd = 0;if(flag & O_WRONLY){umask(0);fd = open(pathname, flag, 0666);}else{fd = open(pathname, flag);}if(fd < 0) return NULL;myFILE *fp = (myFILE*)malloc(sizeof(myFILE));if(fp == NULL) return NULL;fp->fileno = fd;fp->cap = SIZE;fp->pos = 0;fp->flush_mode = LINE_FLUSH;return fp;
}void my_fflush(myFILE *fp)
{if(fp->pos == 0) return;write(fp->fileno, fp->outbuffer, fp->pos);fp->pos = 0;
}int my_fwrite(myFILE *fp, const char *s, int size)
{// 1. 写入memcpy(fp->outbuffer+fp->pos, s, size);fp->pos += size;// 2. 判断,是否要刷新if((fp->flush_mode & LINE_FLUSH) && fp->outbuffer[fp->pos-1] == '\n'){my_fflush(fp);}else if((fp->flush_mode & FULL_FLUSH) && fp->pos  == fp->cap){my_fflush(fp);}return size;
}void my_fclose(myFILE *fp)
{my_fflush(fp);close(fp->fileno);free(fp);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试:
在这里插入图片描述

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

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

相关文章

解决ipconfig不能使用的问题

问题所示&#xff1a;ipconfig不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决办法如下: 1.右击此电脑&#xff0c;点击属性设置&#xff1a; 2.点击高级系统设置 3.点击进入环境变量 4.在系统变量中进行设置&#xff0c;双击PATH进行配置 5.点击新建&am…

绝地求生 实事求是的优化 比增加更多玩法更有效

想必很多老玩家都知道&#xff0c;最初的绝地求生&#xff0c;那样才是最刺激 最好玩的 当然那时候大家都菜 也没有多少外挂 但是后面 为了迎合少部分玩家需求&#xff0c;而进行一些无所需要的改动&#xff0c;而增加一些繁琐而又关紧要的功能&#xff0c; 彻底失去了很多玩家…

【漏洞复现】大华DSS数字监控系统文件读取漏洞

Nx01 产品简介 大华DSS数字监控系统是一个在通用安防视频监控系统基础上设计开发的系统&#xff0c;除了具有普通安防视频监控系统的实时监视、云台操作、录像回放、报警处理、设备治理等功能外&#xff0c;更注重用户使用的便利性。 Nx02 漏洞描述 大华DSS数字监控系统downlo…

展馆设计中展示创造力和创新思维的关联

1、创新科技展示区 在科技展馆设计中可以设置创新科技展示区&#xff0c;展示科技在不同领域的创新应用。该区域可以展示各种前沿科技产品、研发成果和创新项目。通过展示科技的创新性和实用性&#xff0c;观众可以了解到科技如何推动人类创造力的发展和创新思维的实践。 2、创…

企业出海WAS安全自动化解决方案

随着企业出海的日益激烈&#xff0c;安全风险正在成为企业日益关注的问题之一&#xff0c;九河云携手AWS带来了使用Amazon WAF 与 Amazon Shield 的 CloudFront安全自动化。Aws WAF是一种web应用防火墙&#xff0c;可帮助保护客户的web应用程序或api免遭常规web漏洞的攻击。Aws…

微服务架构SpringCloud(2)

热点参数限流 注&#xff1a;热点参数限流默认是对Springmvc资源无效&#xff1b; 隔离和降级 1.开启feign.sentinel.enabletrue 2.FeignClient(fallbackFactory) 3.创建一个类并实现FallbackFactory接口 4.加入依赖 <!--添加Sentienl依赖--><dependency><gro…

消息队列-kafka-消息发送流程(源码跟踪)

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…

机器学习的算法及原理

机器学习算法原理是一种让计算机通过数据学习并做出预测或决策的方法。这些算法可以分为几种主要类型&#xff0c;包括监督学习、无监督学习和强化学习。以下是这些类型中一些常见的算法及其基本原理&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业…

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致 现在有sqlserver和mysql两个库上的表在进行同步&#xff0c;sqlserver上的是源表&#xff0c;mysql上是目标表。 我们就把sqlserver上的数据同步到mysql上 mysql 是没有数据的。 sqlserver的三个表只是创建了…

基于springboot+vue的周边游平台个人管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

计网面试题整理下

1. HTTP常见的状态码有哪些&#xff1f; 常见状态码&#xff1a; 200&#xff1a;服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。301 &#xff1a; (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时&am…

EXPLAIN PLAN FOR:在Oracle中生成执行计划

目录 案例 解析 Operation类型 在Oracle中&#xff0c;可以使用 EXPLAIN PLAN FOR 命令来生成执行计划&#xff0c;然后通过 SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY(PLAN_TABLE))来查看执行计划。需要注意的是&#xff0c;这两个命令需要在同一个窗口下运…