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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值