文章目录

  • 重定向
    • 重定向的原理
    • 输出重定向
    • 追加重定向
    • 输入重定向
  • 重定向函数dup2

重定向

重定向有三种类型:输出重定向、追加重定向、输入重定向
问题:重定向的效果是什么?
  输出重定向:将本应该打印到 显示器 的内容输出到了指定的文件中。
  追加重定向:将本应该打印到 显示器 的内容追加式的输出到了指定的文件
  输入重定向:将本应该从 键盘中 读取的内容改为从指定的文件中读取

重定向的原理

  当我们使用C库函数的时候,实际上就是在调用系统调用接口。

 FILE* fp = fopen();

  这里fp指针,实际上是指向了一个FILE结构体变量的。而FILE结构体变量中则是封装了fd,也就是文件描述符。不了解文件描述符的可以看看这篇文章

 struct FILE{int _fileno;    //封装的文件描述符 fd}

  像我们知道的默认打开的3个流,stdin、stdout、stderr。 他们都是FILE* 类型的,也都分别指向一个FILE对象。
FILE* stdin --> FILE (fd = 0)
FILE* stdout --> FILE (fd = 1)
FILE* stderr --> FILE (fd = 2)

  当我们使用printf、fprintf、fputs一类函数时,如果将文件描述符fd=1 (输出流stdout) 关闭。那么下次我们打开新文件时,就会使用fd = 1 (遵守文件描述符的分配规则)。而上面这些C库函数默认使用的就是stdout,也就是fd = 1。此时他们就会将输出打印到我们新打开的文件当中了。这就是输出重定向。

重定向的本质是:修改文件描述符fd下标 对应的struct file * 的内容 (将其换成目标文件的地址)。

输出重定向

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
using namespace std;    int main()
{    close(1);    //关闭显示器umask(0);    int fd = open("file.txt", O_WRONLY | O_CREAT, 0666);    const char* buffer = "Write some words to file.txt\n";    write(fd, buffer, strlen(buffer));    close(fd);    return 0;
}

追加重定向

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
using namespace std;  int main()
{    close(1);    //关闭显示器int fd = open("file.txt", O_WRONLY | O_APPEND);    const char* buffer = "Append some words \nto the end of file\n";    write(fd, buffer, strlen(buffer));  close(fd);    return 0;
}

输入重定向

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
using namespace std;  int main()
{    close(0);    //关闭键盘int fd = open("file.txt", O_RDONLY);    char buffer[256];    //保证空间足够大    ssize_t num =  read(fd, buffer, sizeof(buffer));  //read的返回值返回实际读到的个数buffer[num] = '\0'; //这里必须给结尾添加'\0',不然打印的时候就会出乱码cout << buffer;    close(fd);    return 0;
}


重定向函数dup2

 int dup2(int oldfd, int newfd);

参数:
    oldfd:你新打开的文件
    newfd:你想要重定向到的目标文件
//这里的old和new比较有干扰性…
//我们想要进行输出重定向就dup2(fd, 1); 输入重定向就dup2(fd, 0);

问题:使用dup2的优势在哪里?dup2比我们自己实现的重定向有什么区别?
  dup2是可以指定重定向到哪里的。我们刚才利用文件描述符的规则进行重定向,先关闭一个我们想要重定向到的文件所对应的文件描述符,再打开新的文件,此时的新文件就用了刚才关闭的文件描述符。这种方法虽然是可行的,但是当你同时打开多个文件的时候,不好控制。因为你必须在关闭文件之后,立刻打开新的文件。而使用dup2完全不需要考虑这些,只需要知道你要重定向到哪个文件就行了。

演示

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
using namespace std; int main()
{    int fd = open("file.txt", O_RDONLY);    dup2(fd, 0);    char buffer[256];    ssize_t num = read(fd, buffer, sizeof(buffer));    buffer[num] = '\0';    cout << buffer;    return 0;
}

Linux详解 --- 重定向及其原理相关推荐

  1. 多维度详解redis以及原理实现,结构与应用分析

    6个方面了解redis应用及其实现原理 1.redis数据存储概述 2.string结构以及应用 3.list结构以及应用 4.hash结构以及应用 5.set结构以及应用 6.zset结构以及应用 ...

  2. Linux详解系列2- 这100条常见命令你都用过哪些?

    Linux详解系列2- 这100条常见命令你都用过哪些? https://www.toutiao.com/i6941655011004891660/?tt_from=weixin&utm_ca ...

  3. 【转详解步进电机工作原理】

    详解步进电机工作原理[转自知乎gk-auto] 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响, ...

  4. FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社

    大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦. <FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社> 京东自营链接:https://item.jd.com/13 ...

  5. 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程

    @TOC初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程 [1]什么是windows API Windows API 中文翻译过来就是windows应用程序接口(Applica ...

  6. 嵌入式linux详解,嵌入式Linux详解

    嵌入式Linux详解 嵌入式培训就是嵌入式系统相关技术的培训.嵌入式系统说白了就是硬件和软件相结合,嵌入到整机里使整机实现智能化的一个系统.下面是小编整理的关于嵌入式Linux详解,希望大家认真了解! ...

  7. 详解帧中继工作原理及作用

    详解帧中继工作原理及作用 帧中继特点 帧中继工作原理 帧中继的作用 帧中继习题 帧中继(FrameRelay)是一种用于连接计算机系统的面向分组的通信方法.它主要用在公共或专用网上的局域网互联以及广域 ...

  8. ArrayList 扩容详解,扩容原理

    ArrayList 扩容详解,扩容原理 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长. ArrayList不是线程安全的,只能用在单线程环境下. 实现了Serializable ...

  9. Linux : select()详解 和 实现原理【转】

    (转自:https://blog.csdn.net/huntinux/article/details/39289317) (原文:http://blog.csdn.net/boboiask/artic ...

最新文章

  1. linux 删除mysql
  2. 手把手教你分析MySQL死锁问题,十分钟看完文章下次轻松完成不加班
  3. python 显示RGB颜色
  4. 10个实用Linux运维命令
  5. 【杂谈】一招,同时可视化18个开源框架的网络模型结构和权重
  6. java设计模式懒汉_java设计模式-懒汉设计模式
  7. android获取指针空间大小_Android进阶:Binder那么弱怎么面大厂?
  8. ODP.NET开发和部署的相关问题
  9. 地铁综合监控系统网络方案,简化工作轻松应对客流高峰
  10. 网址 URL 最后的斜杠 / 是作甚的?
  11. matplotlib绘制鼠标的十字光标(内置方式)
  12. 天轰川 推荐的Javscript大收集 大集锦
  13. 【金猿信创展】恒生电子——全栈式信创解决方案,助力金融信创行稳致远
  14. 把程序作为人生,把人生当作程序
  15. Mac之时间机器的使用
  16. linux usb驱动——OTG数据线与普通数据线区别
  17. 人工智能之华为云5G基站有AI,智能处理流量“潮汐”
  18. 直播播放器+html5,10款html5网页播放器推荐(总有一款适合你)
  19. 计算机网络-实验三:使用网络协议分析器捕捉和分析协议数据包
  20. Tomcat文件夹目录

热门文章

  1. 成都榆熙:转化率的定义是什么?如何提升?
  2. 蓝桥杯真题 17省2-等差素数列 2,3,5,7,11,13,....是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。 上边的数列公差为30
  3. JAVA 数组的输出的三种方式
  4. Java数组三种输出方式
  5. python自动化--selenium
  6. SPC软控件提供商NWA的产品在各行业的应用(化工行业)
  7. SAP的货币数据类型保留4位小数
  8. java websocket 关闭_Websocket关闭连接
  9. 希望聊城营养师协会网站越来越好。
  10. LoRaWAN终端产品的“身份证”