1.利用文件描述符规则实现重定向
文件描述的分配规则:最小没有使用的下标会分给最新打开的文件
正常printf打印是在stdin标准输出显示器打印,stdin标准输出显示器的fd是1。
所以只要把显示器文件stdin给关闭,再打开一个文件,这个文件的 fd根据规则就会是1。
但是在上层,printf打印只会向fd为1的文件的缓冲区打印,这样就完成了狸猫换太子。
把log.txt的文件描述符打印到log.txt中。
#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<sys/stat.h>#include<stdio.h>int main(){close(1);int fd = open("log.txt",O_CREAT|O_TRUNC|O_WRONLY,0666);printf("fd:%d\n",fd); return 0; }
运行结果
2.利用dup2实现重定向
新文件fd将变成老文件fd的拷贝,就是把stdin,用log.txt给覆盖了。
#include<unistd.h>2 #include<fcntl.h>3 #include<sys/types.h>4 #include<sys/stat.h>5 #include<stdio.h>6 #include<unistd.h>7 8 9 int main()10 {1116 int fd = open("log.txt",O_CREAT|O_TRUNC|O_WRONLY,0666);\17 dup2(fd,1); 18 printf("fd:%d\n",fd);19 return 0;20 }
运行结果