dup(int fd)
dup返回的新文件描述符一定是当前可用文件描述符中的最小数值
dup2(int fd,int fd2)
dup2,可以用fd2指定新描述符的值。
如果fd2已经打开,则先将其关闭;
如果fd==fd2,则dup2返回fd2,而不关闭它;
否则,fd2 的 exec_on_close被关闭。
#include<unistd.h>
#include<memory.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include <errno.h>
int my_dup2(int fd,int fd2)
{
int tag[fd2];
int filetmp=dup(fd2);
memset(tag,0,sizeof(tag));
if(filetmp<-1)//如果非法,则返回错误
{
printf("invalid file descriptor");
return -1;
}
else//如果已经打开,则关闭
{
close(filetmp);
}
if(fd==fd2)//如果fd==fd2,则返回fd2,而不关闭它
{
return fd2;
}
close(fd2);
int ans=dup(fd);
tag[ans]=1;
while(ans!=fd2)
{
ans=dup(fd);//因为dup返回的是当前可用的最小值,按顺序查找,直到找到指定值
tag[ans]=1;//记录查找过程中打开的值
}
//int i;
for(int i=0;i<fd2;++i)
{
if(tag[i])close(i);//关闭之前打开的值
}
return ans;
}
int main()
{
int fd2=3,fd;
const char *fname="test.txt";
const char *contents="Test my_dup.";
if((fd=open("temp.foo",O_CREAT|O_RDWR))<0)//以读写方式打开文件,若不存在则创建一个新文件
{
printf("open error\n");
exit(1);
}
int newfd=my_dup2(fd,fd2);
if(write(newfd,contents,strlen(contents))!=strlen(contents))//写成功
{
printf("write error.\n");
exit(2);
}
else printf("write successfully.\n");
exit(0);
}