zoukankan      html  css  js  c++  java
  • 写一个dup2功能同样的函数,不能调用 fcntl 函数,而且要有出错处理

    实现的时候用到系统原来的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
    ");
            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
    ", fd);
        return_fd = my_dup2(fd, newfd);
        printf("new descriptor is: %d
    ");
        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!
    ");
            exit(0);
        }
    
        // dup() return the lowest-numbered available file descriptor
        if ((fdarry[count] = dup(fd)) == -1) {
            printf("dup() function error!
    ");
            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!
    ");
                exit(0);
            } else {
                printf("the descriptor is: %d
    ", fdarry[count]);
                if (fdarry[count] == newfd) {
                    break;
                }
            }
        }
    
        for (count = 0; count <= newfd; ++count) {
            if (fdarry[count] == newfd) {
                return fdarry[count];
            } else {
                close(fdarry[count]);
            }
        }
    }
    

  • 相关阅读:
    网线接线分类
    MongoDB修改用户密码
    win10计算器和商店英文改中文
    电脑微信双开
    ajax
    get和post的区别
    javascript中各种继承方式的优缺点
    原型
    高阶函数的封装
    深浅拷贝
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7228199.html
Copyright © 2011-2022 走看看