每个文件描述符都指向一个文件表,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);
}