dup和dup2函数实现

dup

unix-liked操作系统中,复制文件描述符的函数dup和dup2

int dup(int i)
int  dup(int i , int cmd, ***)

由于题目要求不能使用fcntl函数,所以考虑使用dup函数来实现,思路如下:

  • 首先对于参数fd2,应当大于等于当前未使用的最小文件描述符,那么如何确定这个最小值呢?想到dup函数的返回值就是dup函数被调用前最小的未使用的文件描述符,设它为fd_min。

  • 如果fd2大于fd_min,只要使从fd_min到fd2这个区间内(不包含fd2)未使用的文件描述符都被占用,那么只要再调用一次函数dup(fd),那么返回值就等于fd2了。

  • 然后考虑如何使区间内未被使用的文件描述符被占用,只要不断调用dup(fd)直到返回值等于fd2即可,之后再将区间内除fd2之外的那些被设置过的文件描述符逐个关闭,这时候我们就成功将fd复制给了fd2.
    ————————————————
    版权声明:本文为CSDN博主「萧-十一」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/wait_nothing_alone/article/details/78343987

#include <iostream>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stack>
int my_dup(const int fd1, const int fd2) {
    std::stack<int> fd_stack;
    if (fd1 == fd2)
    {
        return fd2;
     } else {
         int fd_now = 0;
         while(true) {
             fd_now = dup(fd1);
             if(fd_now != fd2) {
                 fd_stack.push(fd_now);
                 continue;
             }
         }
     }
     while(!fd_stack.empty()) {
        int temp = fd_stack.top();
        fd_stack.pop();
        close(temp);
     }
     return fd2;
}
发布了80 篇原创文章 · 获赞 0 · 访问量 462
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览