1. 程式人生 > >寫一個dup2功能同樣的函數,不能調用 fcntl 函數,而且要有出錯處理

寫一個dup2功能同樣的函數,不能調用 fcntl 函數,而且要有出錯處理

make argc exit post pre con version returns imp

實現的時候用到系統原來的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]);
        }
    }
}

寫一個dup2功能同樣的函數,不能調用 fcntl 函數,而且要有出錯處理