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