实现dup2函数(不使用fcntl)

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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值