dup2和dup理解和用法

每个文件描述符都指向一个文件表,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);    
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值