這是一道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;}