实现的时候用到系统原来的dup函数
// mydup2.c // 2015/08/17 Lucifer Zhang version1.0 // write my own dup2 function // use dup() function when inplementation #include <unistd.h> // include dup() #include <stdio.h> #include <stdlib.h> #define OPEN_MAX 256 /* * when the descriptor is negative or greater than OPEN_MAX, will make a errro * */ int my_dup2(int fd, int newfd); int main(int argc, char *argv[]) { int newfd, return_fd; if (argc != 2) { printf("usage: a.out test.txt\n"); exit(0); } printf("Please input the descriptor than you want to set: "); scanf("%d", &newfd); // open a file int fd = open(argv[1], 0); if (fd == -1) { perror(argv[1]); // print error msg exit(0); } printf("old descriptor is: %d\n", fd); return_fd = my_dup2(fd, newfd); printf("new descriptor is: %d\n"); close(fd); close(return_fd); exit(0); } int my_dup2(int fd, int newfd) { int count = 0; int fdarry[newfd]; // record opened descriptor if (newfd < 0 || newfd > OPEN_MAX) { printf("the new descriptor error!\n"); exit(0); } // dup() return the lowest-numbered available file descriptor if ((fdarry[count] = dup(fd)) == -1) { printf("dup() function error!\n"); exit(0); } else { // test old file descriptor if can be used close(fdarry[count]); } // if fd equals newfd, then dup2 returns newfd without closing it if (fd == newfd) { return fd; } close(newfd); // close // the main implementation for (count = 0; count <= newfd; ++count) { if ((fdarry[count] = dup(fd)) == -1) { printf("dup() funciont error!\n"); exit(0); } else { printf("the descriptor is: %d\n", fdarry[count]); if (fdarry[count] == newfd) { break; } } } for (count = 0; count <= newfd; ++count) { if (fdarry[count] == newfd) { return fdarry[count]; } else { close(fdarry[count]); } } }