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]);
            }
        }
    }
    

  • 相关阅读:
    [z]单次遍历带权随机选取
    [Z]CiteSeer统计的计算机领域的期刊和会议的影响因子
    神奇的make自动生成include file的功能
    简记特定容器list和forward_list算法
    插入、流和反向迭代器
    参数绑定
    保研流程记录
    VS2019界面透明、主题修改和导出设置
    C++11 lambda表达式小结
    springboot-mybatis-demo遇到的坑
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7228199.html
Copyright © 2011-2022 走看看