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