《UNIX环境高级编程》笔记--自己实现dup2

自己编写一个与dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。

#include <stdio.h>
#include <unistd.h>

int main(void){
        int fd = -1;
        fd = mydup2(0,10);
        if(fd < 0){
                perror("mydup2");
                return -1;
        }

        printf("fd = %d\n",fd);
        return 0;
}

int mydup2(int fd, int newfd){
		//判断fd和newfd的范围是否正确
        if(fd < 0 || fd > 256){
                printf("fd is wrong.\n");
                return -1;
        }

        if(newfd <0 || newfd > 256){
                printf("newfd is wrong.\n");
                return -1;
        }

        int index = 0;
        int fdarray[newfd];
		//判断fd是否已经被打开。
        if((fdarray[index] = dup(fd)) == -1){
                printf("error while dup.\n");
                return -1;
        }else{
                close(fdarray[index]);
        }
        
		//如果相等,则直接返回。
        if(fd == newfd){
                return fd;
        }
		
		//将newfd关闭
		close(newfd);
		//获取所要的newfd
        int newfdindex;
        for(index=0; index<=newfd; index++){
                fdarray[index] = dup(fd);
                if(fdarray[index] == -1){
                        printf("error while dup.\n");
                        return -1;
                }else{
                        if(fdarray[index] == newfd){
                                newfdindex = index;
                                break;
                        }
                }
        }
		//将之前打开的fd都关闭
        for(index=0; index<newfdindex; index++){
                close(fdarray[index]);
        }

        return fdarray[newfdindex];
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值