Linux详解 --- 重定向及其原理
文章目录
- 重定向
- 重定向的原理
- 输出重定向
- 追加重定向
- 输入重定向
- 重定向函数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详解 --- 重定向及其原理相关推荐
- 多维度详解redis以及原理实现,结构与应用分析
6个方面了解redis应用及其实现原理 1.redis数据存储概述 2.string结构以及应用 3.list结构以及应用 4.hash结构以及应用 5.set结构以及应用 6.zset结构以及应用 ...
- Linux详解系列2- 这100条常见命令你都用过哪些?
Linux详解系列2- 这100条常见命令你都用过哪些? https://www.toutiao.com/i6941655011004891660/?tt_from=weixin&utm_ca ...
- 【转详解步进电机工作原理】
详解步进电机工作原理[转自知乎gk-auto] 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响, ...
- FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社
大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦. <FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社> 京东自营链接:https://item.jd.com/13 ...
- 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程
@TOC初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程 [1]什么是windows API Windows API 中文翻译过来就是windows应用程序接口(Applica ...
- 嵌入式linux详解,嵌入式Linux详解
嵌入式Linux详解 嵌入式培训就是嵌入式系统相关技术的培训.嵌入式系统说白了就是硬件和软件相结合,嵌入到整机里使整机实现智能化的一个系统.下面是小编整理的关于嵌入式Linux详解,希望大家认真了解! ...
- 详解帧中继工作原理及作用
详解帧中继工作原理及作用 帧中继特点 帧中继工作原理 帧中继的作用 帧中继习题 帧中继(FrameRelay)是一种用于连接计算机系统的面向分组的通信方法.它主要用在公共或专用网上的局域网互联以及广域 ...
- ArrayList 扩容详解,扩容原理
ArrayList 扩容详解,扩容原理 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长. ArrayList不是线程安全的,只能用在单线程环境下. 实现了Serializable ...
- Linux : select()详解 和 实现原理【转】
(转自:https://blog.csdn.net/huntinux/article/details/39289317) (原文:http://blog.csdn.net/boboiask/artic ...
最新文章
- linux 删除mysql
- 手把手教你分析MySQL死锁问题,十分钟看完文章下次轻松完成不加班
- python 显示RGB颜色
- 10个实用Linux运维命令
- 【杂谈】一招,同时可视化18个开源框架的网络模型结构和权重
- java设计模式懒汉_java设计模式-懒汉设计模式
- android获取指针空间大小_Android进阶:Binder那么弱怎么面大厂?
- ODP.NET开发和部署的相关问题
- 地铁综合监控系统网络方案,简化工作轻松应对客流高峰
- 网址 URL 最后的斜杠 / 是作甚的?
- matplotlib绘制鼠标的十字光标(内置方式)
- 天轰川 推荐的Javscript大收集 大集锦
- 【金猿信创展】恒生电子——全栈式信创解决方案,助力金融信创行稳致远
- 把程序作为人生,把人生当作程序
- Mac之时间机器的使用
- linux usb驱动——OTG数据线与普通数据线区别
- 人工智能之华为云5G基站有AI,智能处理流量“潮汐”
- 直播播放器+html5,10款html5网页播放器推荐(总有一款适合你)
- 计算机网络-实验三:使用网络协议分析器捕捉和分析协议数据包
- Tomcat文件夹目录
热门文章
- 成都榆熙:转化率的定义是什么?如何提升?
- 蓝桥杯真题 17省2-等差素数列 2,3,5,7,11,13,....是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。 上边的数列公差为30
- JAVA 数组的输出的三种方式
- Java数组三种输出方式
- python自动化--selenium
- SPC软控件提供商NWA的产品在各行业的应用(化工行业)
- SAP的货币数据类型保留4位小数
- java websocket 关闭_Websocket关闭连接
- 希望聊城营养师协会网站越来越好。
- LoRaWAN终端产品的“身份证”