现在的位置: 首页 > 综合 > 正文

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

2013年11月20日 ⁄ 综合 ⁄ 共 840字 ⁄ 字号 评论关闭

自己编写一个与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];
}

抱歉!评论已关闭.