这是一道UNIX环境高级编程的课后习题,要求不得使用fcntl,自己始终想不出效率比较高的写法,这里贴一下自己的做法,希望有大侠们能告诉我一种高效率的写法。
#include "apue.h"
#include "fcntl.h"
int new_dup2(int oldfd, int newfd)
{
int fd_list[newfd] , i = 0, j = 0;
printf("oldfd is %d and newfd is %d\n",oldfd,newfd);
if (oldfd == newfd) return oldfd;
/*if(close(newfd) == -1)
{
printf("close newfd err\n");
return 0;
}*/
for (i = 0; i < newfd; i++)
{
//printf("i = %d\n",i);
if((fd_list[i] = dup(oldfd)) == -1)
{
printf("dup err\n");
break;
}
//printf("fd_list[i] = %d\n",fd_list[i]);
if(fd_list[i] == newfd)
{
printf("fd_list i = %d\n",i);
break;
}
}
for(j = 0; j<i ;j++) close(fd_list[j]);
return fd_list[i];
}
int main()
{
int fd,dest_fd = 33,fd1;
char *path = "open_fd" ;
fd = open(path,O_RDWR|O_CREAT);
if(fd == -1)
{
printf("open file err \n");
return 0;
}else
{
printf("open file %d success \n",fd);
}
if((fd1 = new_dup2(fd,dest_fd)) != dest_fd)
{
printf("Copy fd err : %d\n",fd1);
return 0;
}
write(fd1,path,sizeof(path));
return 1;
}