每个文件描述符都指向一个文件表,dup(fd)返回一个新的新的文件描述符,这个文件描述符指向的文件表和fd的一样
dup2呢,dup2(int oldfd,int newfd) 把newfd指向的文件表更改为 oldfd,这样一来newfd也和 oldfd一样指向相同的文件表了
我们用一小段代码证明下
/*************************************************************************> File Name: ddup2.c> Author:hrp > Mail: > Created Time: 2020年07月05日 星期日 07时45分53秒>将本来要输入在终端上的内容重定向到指定文件里************************************************************************/#include<stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>int main()
{int fd,temp_fd;int ret ;temp_fd = dup(STDOUT_FILENO);if(temp_fd == -1){perror("dup error");exit(1);}fd = open("./temp.txt",O_WRONLY|O_CREAT|O_TRUNC,0644);if(fd == -1){perror("fd error");exit(1);}printf("现在还可以打印在终端上\n");//现在把STDOUT_FILENO( 即文件描述符 1 )重定向到fd所打开的文件中//那现在输出不在终端显示了,而是输出到fd打开的文件上ret = dup2(fd,STDOUT_FILENO);if(ret == -1){perror("dup2 error");exit(1);}//printf有无换行重要 现在是没换行符,所以不会有行刷新,但是这里用了fllush来对行缓冲刷新printf("现在输出的内容是:我看不到");fflush(NULL);//如果我现在恢复STDOUT_FILENO的原来功能,(指向标准输出);ret = dup2(temp_fd,STDOUT_FILENO);if(ret == -1){perror("dup22 error");exit(1);}printf("我现在恢复了\n ");printf("你可以看到我了")exit(1);
}