在记录原理之前,先进行一个小小的实验
实验
首先在ubuntu下建立2个文件,分别是a.cpp和out.txt
a.cpp的内容如下
#include<bits/stdc++.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
//#define int long long
int main(int argc,char *argv[]){
int fd =open("./out.txt",O_RDWR);
printf("%d\n",fd);
if(fd<0){
perror("open error");
return 0;
}
dup2(fd,1);
printf("file des:%d\n",fd);
close(fd);
return 0;
}
out.txt可以为空
接着编译a.cpp,并运行可执行文件
g++ a.cpp -o a
./a
然后,我们打开原先为空的out.txt,就能发现printf
直接输出在out.txt文件中
原理
这里利用到了dup2函数来实现以上操作。
函数名: dup2
功能: 复制文件描述符
用法: int dup2(int oldfd,int newfd);
标准输入(stdin) --标准输出(stdout)–标准错误(stderr)
✳✳✳本质:通过改变文件描述符的下标对应的文件描述符,进而改变操作的文件,实现数据流向的改变!