基本思路就是使用dup寻找当前最小可用文件描述符,找到后与将要重定向的目标文件描述符进行比对,若比对成功则跳出,否则则将该文件描述符存入数组,待定位成功后依序close。
代码如下,main中实现了书中的例程3.11(从标准输入到标准输出):
/*
* @Author: JJerry
* @Date: 2019-01-07 11:25:27
* @Desciption: try to implement dup2
*/
#include <unistd.h>
#include <fcntl.h>
#include <apue.h>
#define BUFSIZE 4096
int dup_own(int fd1,int fd2){
int i=0,flag=1;
int tmp[BUFSIZE];
if(fd1==fd2) return fd2;
close(fd2);
while(flag){
tmp[i]=dup(fd1);
if(tmp[i++]==fd2) flag=0;
}
flag=1,i=0;
while(flag){
if(tmp[i]==fd2) flag=0;
close(tmp[i++]);
}
return fd2;
}
int main(){
int n;
char buf[BUFSIZE];
int fd1=open("data.in",O_RDONLY);
int fd2=open("data.out",O_CREAT|O_RDWR,BUFSIZE);
dup_own(fd1,STDIN_FILENO);
dup_own(fd2,STDOUT_FILENO);
while((n=read(STDIN_FILENO, buf, BUFSIZE))>0){
if(write(STDOUT_FILENO, buf, n)!=n){
err_sys("write error");
}
if(n<0){
err_sys("read error");
}
}
}
曾冒出了一个直接dup,dup后不匹配则直接close的想法,后来想到了这样可能除了标准输入和标准输出两种特殊女情况外肯定会发生死循环,因为一旦这两个文件描述符未被占用,则最小的一定就是这两个情况,进而发生死循环。
结果如下: