IO重定向

news2024/11/24 7:19:20

文章目录

    • IO重定向
      • 概念
        • 3个标准文件描述符
        • “最低可用文件描述符”原则
      • 默认的连接:tty
      • 使用close then open将stdin定向到文件
      • 使用open..close..dup..close将stdin定向到文件
      • 使用open..dup2..close将stdin重定向到文件
      • 课上实验

IO重定向

  • 大多数的程序不接收输出文件名
    • 一般情况下将结果写到文件描述符1,并将错误消息写到文件描述符2
  • 如果希望将进程的输出写到文件或另一个进程的输入去,就必须重定向相应的文件描述符

概念

1.Unix进程使用文件描述符0,1,2作为标准输入、输入和错误的通道
2.当进程请求一个新的文件描述符时,系统内核将最低可用的文件描述符赋给它。

3个标准文件描述符

所有Unix都使用三种流的模型。
此模型通过一个简单的规则来实现。
三种流的每一种都是一个特别的文件描述符。
所有的Unix工具都使用文件描述符0,1,2

  • 标准文件描述符
    0: stdin
    1: stdout
    2: stderr
“最低可用文件描述符”原则
  • 文件描述符的概念:是一个数据的索引号。
  • 每个进程都有其打开的一组文件,这些打开的文件被保持在一个数组中。
  • 文件描述符即为某文件在些数组中的索引。

“最低可用文件描述符”原则:
当打开文件时,为此文件安排的描述符总是此数组中最低可用位置的索引。

默认的连接:tty

  • 通常通过shell命令运行Unix系统工具时,stdinstdoutstderr已连接在终端上。
    因此系统工具从键盘读取数据并把输出和错误消息写到屏幕。
    大部分的Unix工作处理从文件或标准输入读入的数据。
    如果在命令行上给出了文件名,工具将从文件读取数据。若无文件名,程序则从标准输入读取数据。

shell并不将重定向标记和文件名传递给程序,即重定向I/O的是shell而不是程序
重定向可以出现在命令行中的任何地方,并且在重定向标识符周围并不需要空格来区分
shell提供对重定向其他文件描述符的支持。
如: 2>file2,即重定向文件描述符2,将标准错误输出到给定的文件中

使用close then open将stdin定向到文件

  • 开始时,系统采用典型设置

    • 输入的数据流经过文件描述符0,输出流经过文件描述符1和2
    • 在这里插入图片描述
  • 第一步:close(0),将标准输入的连接挂断。
    文件描述符数组中的第一个元素处于空闲状态。

    • 在这里插入图片描述
  • 第二步,使用open(filename, O_RDONLY)打开一个想连接到stdin上的文件。

    • 当前最低可用文件描述符为0,因此打开的文件将被连接到标准输入上去
    • 在这里插入图片描述
  • 示例代码:

main()
{
    int fd ;
    char    line[100];
    fgets( line, 100, stdin ); printf("%s", line );
    fgets( line, 100, stdin ); printf("%s", line );

    close(0);
    fd = open("/etc/passwd", O_RDONLY);
    if ( fd != 0 ){
        fprintf(stderr,"Could not open data as fd 0\n");
        exit(1);
    }

    fgets( line, 100, stdin ); printf("%s", line );
    fgets( line, 100, stdin ); printf("%s", line );
}

stdinredir1从标准输入读取并打印了三行字符串
接着重定向标准输入
之后从重定向的标准输入中读取并打印了三行字符串

使用open…close…dup…close将stdin定向到文件

在这里插入图片描述

  • 第一步:open(file)

    • 打开stdin将要重定向的文件。这个调用返回一个文件描述符,这个文件描述符不是0
    • 在这里插入图片描述
  • 第二步:close(0)

    • 将文件描述符0关闭
    • 在这里插入图片描述
  • 第三步:dup(fd)

    • 系统调用dup(fd)对文件描述符fd进行复制。此次复制使用最低可用文件描述符号。
    • 在这里插入图片描述
  • 第四步:close(fd)

    • 关闭文件的初始连接,只留下文件描述符0的连接。
    • 在这里插入图片描述
  • 示例代码

#include    <stdio.h>
#include    <fcntl.h>

main()
{
    int fd ;
    int newfd;
    char    line[100];

    fgets( line, 100, stdin ); printf("%s", line );
    fgets( line, 100, stdin ); printf("%s", line );
    fd = open("/etc/passwd", O_RDONLY);   
    close(0);
    newfd = dup(fd); 
    if ( newfd != 0 ){
        fprintf(stderr,"Could not duplicate fd to 0\n");
        exit(1);
    }
    close(fd);      
    
    fgets( line, 100, stdin ); printf("%s", line );
    fgets( line, 100, stdin ); printf("%s", line );
}

使用open…dup2…close将stdin重定向到文件

在这里插入图片描述

  • 将 close(0)和dup(fd)结合在一起作为一个单独的系统调用dup2。
    dup2(old, new)将文件描述符old复制到文件描述符new。

    close(0); newfd = dup(fd);
    替换为
    newfd = dup2(fd,0); 即可。

课上实验

  • 使用dup或dup2,结合open/read/write/lseek实现标准输入或标准输出重定向

标准输入流重定向:我们将默认从终端的输入流改为从文件读取的输入流。
代码如下:

#include    <stdio.h>
#include    <fcntl.h>
#include 	<stdlib.h>
main()
{
    int fd ;
    int newfd;
    char    line[100];
    fgets( line, 100, stdin ); printf("%s", line );
    fgets( line, 100, stdin ); printf("%s", line );
 	fd = open("/etc/passwd", O_RDONLY);   
    close(0);
    newfd = dup(fd); 
    if ( newfd != 0 ){
        fprintf(stderr,"Could not duplicate fd to 0\n");
        exit(1);
    }
    close(fd);      
    fgets( line, 100, stdin ); printf("%s", line );
    fgets( line, 100, stdin ); printf("%s", line );
}

标准输出流重定向:将默认标准输出流改为某个文件
代码如下:

#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <string.h>                                                                                                        
main()                                                                                                                      
{                                                                                                                           
    int fd ;                                                                                                                
    int newfd;                                                                                                              
        fd = open("abc.txt", O_WRONLY|O_CREAT|O_TRUNC,0644);                                                                
    close(1);                                                                                                               
    newfd = dup(fd);                                                                                                        
    if ( newfd != 1 ){                                                                                                      
        fprintf(stderr,"Could not duplicate fd to 1\n");                                                                    
        exit(1);                                                                                                            
    }                                                                                                                       
    close(fd);                                                                                                              
    char  line[]="我是标准输出,默认输出到终端,但我被重定向了,将被打印在重定向的位置";                                    
    write(1,line,strlen(line));                                                                                             
    close(newfd);                                                                                                           
}   
  • 分析:

    标准输出流卡了我很久,因为我每次重定向后abc.txt文件内容后面都会有一段乱码,像内存泄露一样乱码出现在abc.txt文件中,可当我将open的模式由O_WRONLY改为O_WRONLY | O_CREAT | O_TRUNC时,才能达到理想实验结果。总之使用 open(“abc.txt”, O_WRONLY | O_CREAT | O_TRUNC, 0644) 更为全面,既能确保文件不存在时创建它,又能确保在打开时清空文件内容,还可以设置新创建文件的权限。

结果如下:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Deformable Transformer论文笔记

原文链接 [2010.04159] Deformable DETR: Deformable Transformers for End-to-End Object Detection (arxiv.org)https://arxiv.org/abs/2010.04159 原文笔记 What 作者结合了可变形卷积的稀疏空间采样和 Transformer 的关系建模能力的优点。提出了Deformable Detr Defor…

算法笔记(十三)——BFS 解决最短路问题

文章目录 迷宫中离入口最近的出口最小基因变化单词接龙为高尔夫比赛砍树 BFS 解决最短路问题 BFS(广度优先搜索) 是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来查找从一个起始点到目标点的最短路径。 迷宫中离入口最近的出口 题目&#xff1a;…

can 总线入门———can简介硬件电路

文章目录 0. 前言1. CAN简介2. 主流通讯协议对比3. CAN 硬件电路4. CAN 电平标准5. CAN 收发器 0. 前言 博客内容来自B站上CAN总线入门教程视频讲解&#xff0c;博客中的插图和内容均为视频中的内容。视频链接 CAN总线入门教程 1. CAN简介 先来看看一它名字的意思&#xff0c…

Redis 缓存策略详解:提升性能的四种常见模式

在现代分布式系统中&#xff0c;缓存是提升性能和减轻数据库负载的关键组件。Redis 作为一种高性能的内存数据库&#xff0c;被广泛应用于缓存层。本文将深入探讨几种常用的 Redis 缓存策略&#xff0c;包括旁路缓存模式&#xff08;Cache-Aside Pattern&#xff09;、读穿透模…

强化学习入门到不想放弃-4

上回的地址&#xff1a;强化学习入门到不想放弃-3 (qq.com) 上上回地址&#xff1a;强化学习入门到不想放弃-2 (qq.com) 上上上回地址&#xff1a;强化学习入门到不想放弃-1 (qq.com) 好久没更新了&#xff0c;也是不知道写啥啊&#xff0c;&#xff08;有些文章刚写了就被有些…

鸽笼原理与递归 - 离散数学系列(四)

目录 1. 鸽笼原理 鸽笼原理的定义 鸽笼原理的示例 鸽笼原理的应用 2. 递归的定义与应用 什么是递归&#xff1f; 递归的示例 递归与迭代的对比 3. 实际应用 鸽笼原理的实际应用 递归的实际应用 4. 例题与练习 例题1&#xff1a;鸽笼原理应用 例题2&#xff1a;递归…

三、Python基础语法(注释、三种波浪线、变量)

一、注释 注释是对代码进行解释说明的文字&#xff0c;不会被解释器执行&#xff0c;可以更方便阅读代码和了解代码的作用。 1.单行注释 使用#开头的文字就是注释&#xff0c;可以使用快捷键Ctrl / 2.多行注释 多行注释就是注释的内容&#xff0c;可以换行书写&#xff0c…

集智书童 | 用于时态动作检测的预测反馈 DETR !

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;用于时态动作检测的预测反馈 DETR ! 视频中的时间动作检测&#xff08;TAD&#xff09;是现实世界中的一个基本且具有挑战性的任务。得益于 Transformer …

提升 CI/CD 稳定性:Jenkins 开机自检与推送通知

简介&#xff1a;Jenkins 是一个广泛使用的开源自动化服务器&#xff0c;常用于持续集成和持续交付。在某些情况下&#xff0c;服务器重启可能导致 Jenkins 构建任务中断或失败。为了解决这个问题&#xff0c;可以使用一个自检服务&#xff0c;定期检查系统的启动时间&#xff…

3559 pcie配置流程

目录 EP配置 uboot配置 uboot代码修改 内核代码修改 带宽配置 带宽查看 硬件管脚配置 EP配置 uboot配置 1)make CROSS_COMPILE=aarch64-himix100-linux- hi3559av100_emmc_defconfig 2) make menuconfig CROSS_COMPILE=aarch64-himix100-linux- 修改配置: 3) 合入…

一种将RAG、KG、VS、TF结合增强领域LLM性能的框架

SMART-SLIC框架&#xff1a;旨在将RAG结合向量存储&#xff08;Vector Stores&#xff09;、知识图谱&#xff08;Knowledge Graphs&#xff09;和张量分解&#xff08;Tensor Factorization&#xff09;来增强特定领域的大型语言模型&#xff08;LLMs&#xff09;的性能。 SM…

codetop标签动态规划大全C++讲解(二)!!动态规划刷穿地心!!学吐了家人们o(╥﹏╥)o

一篇只有十题左右&#xff0c;写少一点好复习 1.目标和2.分割等和子集3.完全平方数4.比特位计数5.石子游戏6.预测赢家7.不同的二叉搜索树8.解码方法9.鸡蛋掉落10.正则表达式匹配11.通配符匹配12.交错字符串 1.目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中…

01-python+selenium自动化测试-基础学习

前言 基于python3和selenium3做自动化测试&#xff0c;俗话说&#xff1a;工欲善其事必先利其器&#xff1b;没有金刚钻就不揽那瓷器活&#xff0c;磨刀不误砍柴工&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&#xff0c…

短剧系统源码短剧平台开发(H5+抖小+微小)部署介绍流程

有想法加入国内短剧赛道的请停下脚步&#xff0c;耐心看完此篇文章&#xff0c;相信一定会对您有所帮助的&#xff0c;下面将排序划分每一个步骤&#xff0c;短剧源码、申请资料、服务器选择、部署上架到正常运行等几个方面&#xff0c;整理了一些资料&#xff0c;来为大家举例…

中广核CGN25届校招网申SHL测评题库、面试流程、招聘对象,内附人才测评认知能力真题

​中国广核集团校园招聘在线测评攻略&#x1f680; &#x1f393; 校园招聘对象 2024届、2025届海内外全日制应届毕业生&#xff0c;大专、本科、硕士、博士&#xff0c;广核集团等你来&#xff01; &#x1f4c8; 招聘流程 投递简历 简历筛选 在线测评&#xff08;重点来啦…

C++ 算法学习——1.6 前缀和与二维前缀和算法

前缀和算法&#xff08;Prefix Sum Algorithm&#xff09;&#xff1a; 概念&#xff1a;前缀和算法通过在遍历数组时计算前缀和&#xff08;从数组的第一个元素开始累加到当前元素的和&#xff09;&#xff0c;可以在O(1)时间内得到任意区间的子数组和&#xff0c;而不需要重复…

告别音乐小白!字节跳动AI音乐创作工具,让你一键变作曲家!

还在羡慕别人能创作动听的音乐&#xff1f;五音不全的你&#xff0c;也梦想着谱写属于自己的乐章&#xff1f;现在&#xff0c;机会来了&#xff01;字节跳动推出了一款AI音乐创作工具——抖音推出的海绵音乐&#xff0c;它能让你轻松一键创作音乐&#xff0c;即使是“音乐小白…

海外科技新闻媒体与商业媒体:垂直网站的魅力与软文分发

海外科技新闻媒体与商业媒体&#xff1a;垂直网站的魅力与软文分发 在信息爆炸的时代&#xff0c;如何有效地传递品牌信息并提高知名度成为了许多企业的重要课题。在这个过程中&#xff0c;海外科技新闻媒体与商业媒体的垂直网站扮演了重要角色&#xff0c;而软文分发则因其独特…

笔试题总结

1.对于线性表的描述&#xff1a;存储空间不一定是连续&#xff0c;且各元素的存储顺序是任意的 2.虚函数的定义&#xff1a;函数的返回值参数不定&#xff0c; 声明&#xff1a; 类型&#xff0c;返回这类型 名字&#xff08;&#xff09;&#xff1b; 例如声明一个虚函数&a…

计算机毕业设计 基于Python的豆果美食推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…