dup2()功能实现

    //用dup()来返回文件描述符,直到符合要求的为止,最后再把不符合要求的关闭  
    //当输入的描述符是负的或者已超过MAX_OPEN时,会出错  
    #include <unistd.h>//dup()  
    #include <stdio.h>  
    #include <stdlib.h>  
    #define OPEN_MAX 256  
    int my_dup2(int, int);  
    int main(int argc, char *argv[])  
    {  
        int newfd, return_fd;  
        if(argc != 2)  
        {  
            printf("格式:./a.out test.txt\n");  
            exit(0);  
        }  
        printf("请输入你要设置复制的描述符: ");  
        scanf("%d", &newfd);  
        //打开一个文件  
        int fd = open(argv[1], 0);//打开一个文件准备复制  
        if(fd == -1)  
        {  
            perror(argv[1]);//打印错误信息  
            exit(0);  
        }  
        printf("原来的文件描述符是: %d\n", fd);  
        return_fd = my_dup2(fd, newfd);  
        printf("之后的文件描述符是: %d\n");  
            close(fd);  
            close(return_fd);  
            exit(0);  
    }  
    int my_dup2(int fd, int newfd)  
    {  
        int count = 0;  
        int fdarry[newfd];  //记录打开的描述符  
        if(newfd < 0 || newfd > OPEN_MAX)  
        {  
            printf("你设置的新描述符有误!\n");  
            exit(0);  
        }  
      
        if((fdarry[count] = dup(fd)) == -1)//返回当前最小未用的文件描述符  
        {  
            printf("dup()函数出错!\n");  
            exit(0);  
        }  
        else//的是为了测试原文件描述符是否可用  
        {  
            close(fdarry[count]);     
        }  
        if(fd == newfd)//如果新设置的与原来的相等则直接接返回原来的  
        {  
            return fd;  
        }  
        close(newfd);//关闭要复制的文件描述符  
        //当运行下面的代码时说明用户设置的文件描述符与一开始的并不相同  
        for(count = 0; count <= newfd; count++)  
        {  
            fdarry[count] = dup(fd);//返回当前可用的最小文件描述符  
            if(fdarry[count] == -1)  
            {  
                printf("dup()出错!\n");  
                exit(0);  
            }  
            else  
            {  
                printf("for里面的描述符为: %d\n", fdarry[count]);  
                if(fdarry[count] == newfd)  
                    break;  
            }  
        }  
        for(count = 0; count <= newfd; count++)  
        {  
            if(fdarry[count] == newfd)  
                return fdarry[count];  
            else  
                close(fdarry[count]);     
        }  
    }  


转自
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值