dup和dup2函数实现
2020-01-21 本文已影响0人
MachinePlay
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;
}