IO重定向

文章目录

    • 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.xdnf.cn/news/1557020.html

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

相关文章

015 品牌关联分类

文章目录 后端CategoryBrandEntity.javaCategoryBrandController.javaCategoryBrandServiceImpl.javaCategoryServiceImpl.javaBrandServiceImpl.java删除 npm install pubsub-jsnpm install --save pubsub-js这个错误是由于在尝试安装 pubsub-js 时&#xff0c;npm 发现了项目…

计算机毕业设计 基于Python的荣誉证书管理系统的设计与实现 Python毕业设计 Python毕业设计选题 Django框架 Vue【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【自动驾驶】UniAD代码解析

1.参考 论文&#xff1a;https://arxiv.org/pdf/2212.10156 代码&#xff1a;https://github.com/OpenDriveLab/UniAD 2.环境配置 docs/INSTALL.md &#xff08;1&#xff09;虚拟conda环境 conda create -n uniad python3.8 -y conda activate uniad &#xff08;2&#…

哀牢山“禁区”爆改“景区”,双卫星智能终端给驴友多一份保障

在这个国庆假期&#xff0c;以神秘莫测、地势凶险著称的哀牢山走红&#xff0c;一天之内占据了多个微博热搜。但是&#xff0c;哀牢山的美丽背后隐藏着不可小觑的风险。景区方面已发出安全警示&#xff0c;提醒游客勿轻易涉足未知地带和未开发区域&#xff0c;以免发生危险。 …

论文翻译 | Dynamic Prompting: A Unified Framework for Prompt Tuning

摘要 已经证明&#xff0c;在从预训练的基础模型中高效提取知识方面&#xff0c;提示调整&#xff08;prompt tuning&#xff09;技术是非常有效的&#xff0c;这些基础模型包括预训练的语言模型&#xff08;PLMs&#xff09;、视觉预训练模型以及视觉-语言&#xff08;V-L&…

【网络协议大花园】应用层 http协议的使用小技巧,用好了都不用加班,效率翻两倍(下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

HCIP--以太网交换安全(二)

端口安全 一、端口安全概述 1.1、端口安全概述&#xff1a;端口安全是一种网络设备防护措施&#xff0c;通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理&#xff1a; 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…

[运维]6.github 本地powershell登录及设置ssh连接

当我在本地的git hub 进行修改后&#xff0c;需要推送到远程github仓库。 当我运行了git add . git commit -m "ingress-controller image" 以后&#xff0c;运行git push origin main&#xff0c;发现由于网络原因无法连接到远程github仓库。 此时开始设置ssh连…

数组与集合的应用-数组演练

1、获取一维数组最小值 1.1 实例说明 一维数组常用于保存线性数据&#xff0c;例如数据库中的单行数据就可以使用一维数组保存。本实例接收用户在文本框中输入的单行数据&#xff0c;其中数据都是整数数字&#xff0c;以不同数量的空格分割数字&#xff0c;如图1所示。这个先行…

Spring相关知识补充

目录 一、将Bean存储到spring&#xff08;容器&#xff09;中 1、使用spring-config的方式将对象存储到spring容器中 2、使用类注解的方式将Bean对象存储到容器中 1️⃣、配置扫描路径&#xff08;使用注解的方式存对象的前提&#xff09; 2️⃣、使用五大类注解存储Bean对…

C语言练习

接下来一段时间&#xff0c;博主要参加军训没有时间更新C语言知识点&#xff0c;但博主会每天更新一道C语言的题作为分享。 1.计算并显示整数的差 分析&#xff1a;1.题目并不难&#xff0c;首先我们要知道printf这个库函数&#xff0c;是用来打印数据到屏幕的库函数 2.设置变…

【AI知识点】反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 是训练神经网络的核心算法&#xff0c;它通过反向逐层计算损失函数对每个权重的梯度&#xff0c;来反向逐层更新网络的权重&#xff0c;从而最小化损失函数。 一、反向传播的基本概念 1. 前向传播&#xff08;Forward Propag…

文件丢失一键找回,四大数据恢复免费版工具推荐!

丢失数据的情况虽然不经常出现&#xff0c;但一旦出现都会让人头疼不已&#xff0c;而这时候&#xff0c;要如何恢复丢失的数据呢&#xff1f;一款免费好用的数据恢复工具就派上用场了&#xff01;接下来就为大家推荐几款好用的数据恢复工具&#xff01; 福昕数据恢复 直达链…

Redis list 类型

list类型 类型介绍 列表类型 list 相当于 数组或者顺序表 list内部的编码方式更接近于 双端队列 &#xff0c;支持头插 头删 尾插 尾删。 需要注意的是&#xff0c;Redis的下标支持负数下标。 比如数组大小为5&#xff0c;那么要访问下标为 -2 的值可以理解为访问 5 - 2 3 …

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【272-284】

272. 包基本介绍 272.1 看一个应用场景 272.2 包的三大作用 272.3 包的基本语法 273. 包原理 274. 包快速入门 在不同的包下面创建不同的Dog类 275. 包命名 276. 常用的包 一个包下,包含很多的类,java 中常用的包有: java.lang.* //lang 包是基本包&#xff0c;默认引入&…

农业政策与市场分析:解读当前政策导向下的农业发展趋势

在快速变化的全球经济格局中&#xff0c;农业作为国家稳定发展的基石&#xff0c;其政策走向与市场动态备受瞩目。本文将深入剖析当前的农业政策背景&#xff0c;探讨其对设计的导向作用&#xff0c;以及市场趋势的反馈与影响&#xff0c;为农业可持续发展提供洞见。 1. 政策背…

【大模型理论篇】大模型相关的周边技术分享-关于《NN and DL》的笔记

本文所要介绍的一本书《Neural Networks and Deep Learning》&#xff0c;该书作者Michael Nielsen&#xff0c;Y Combinator Research的研究员&#xff0c;是多年之前自己看的一本基础书籍&#xff0c;很适合入门了解一些关于深度学习的概念知识&#xff0c;当然也包含了一些小…

MyBatis 批量插入方案

MyBatis 批量插入 MyBatis 插入数据的方法有几种&#xff1a; for 循环&#xff0c;每次都重新连接一次数据库&#xff0c;每次只插入一条数据。 在编写 sql 时用 for each 标签&#xff0c;建立一次数据库连接。 使用 MyBatis 的 batchInsert 方法。 下面是方法 1 和 2 的…

三相逆变器中LCL滤波器分析

1.LCL滤波器 传统三相逆变器使用的是L型滤波器&#xff0c;其设计简单&#xff0c;但也存在着一些问题&#xff0c;如在同样的滤波效果下&#xff0c;L型滤波器电感尺寸、重量较大&#xff0c;成本较高&#xff0c;并且随着电感值的增大&#xff0c;其上的电压降增加比较明显&…

【MySQL必知会】事务

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 事务概念 &#x1f4c1; 事务操作 &#x1f4c1; 事务提交方式 &#x1f4c1; 隔离级别 &#x1f4c1; MVCC &#x1f4c2; 3个隐藏列字段 &#x1f4c2; undo日志 &#x1f4c2; Read View视图 &#x1f4c1; RR和R…