Unix环境编程 如何实现dup2函数,不允许调用fcntl?

这是unix编程环境第三章的一个题目,前段时间翻了下,发现这个题目还有点小意思,而且网上也没什么全面的答案。

先补充几个概念:

 

文件描述符:内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。(百度百科)

内核为每个进程维护一张进程表项,每一行代表一个打开的文件,包含两个数据:文件描述符、指向文件表的指针。进程为每个打开的文件维护一张文件表,文件表记录了文件一些基本信息,以及指向文件实体的指针,大体如下图:

当我们打开一个文件的时候,内核会返回一个对应的文件描述符(通常从3开始递增,0、1、2分别代表STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO);

int dup(int fd);

复制fd描述符,并且是当前可用的最小描述符

int dup2(int fd1,int fd2);

复制fd1的描述符,并且其值为fd2

题目要做的就是实现dup2,但不能调用fcntl函数

代码如下


 
 
  1. #include <stdio.h> 
  2. #include <unistd.h> 
  3. #include <fcntl.h> 
  4.  
  5. int mydup2(int filedes, int filedes2); 
  6.  
  7. int main(void
  8.     int a,b; 
  9.  
  10.     a = open("1.txt", O_RDWR);   
  11.  
  12.     b = mydup2(a,1); 
  13.  
  14.     write(b,"tsslssdfesaat",20); 
  15.  
  16. int mydup2(int filedes, int filedes2) 
  17.      
  18.     int filetmp, i = 0; 
  19.     int filearr[filedes2]; 
  20.      
  21.     //测试filedes是否合法 
  22.     filetmp = dup(filedes); 
  23.     if(filetmp == -1) 
  24.     { 
  25.         return -1; 
  26.     }else 
  27.     { 
  28.         close(filetmp); 
  29.     } 
  30.      
  31.      
  32.     if(filedes == filedes2) 
  33.     { 
  34.         return filedes; 
  35.     }else 
  36.     { 
  37.         //关闭filedes 
  38.         close(filedes); 
  39.         for(i = 0; i < filedes2 + 1; i++) 
  40.         { 
  41.             filearr[i] = 0; 
  42.             filetmp = dup(filedes); 
  43.             if(filetmp < 0) 
  44.             { 
  45.                 return -1; 
  46.             }else 
  47.             { 
  48.                 if(filetmp == filedes2) 
  49.                     break
  50.                 else 
  51.                     filearr[filetmp] = 1; 
  52.             } 
  53.         } 
  54.     } 
  55.      
  56.  
  57.     for(i = 0; i < filedes2; i++) 
  58.     { 
  59.         if(filearr[i] == 1) 
  60.             close(i); 
  61.     } 
  62.  
  63.     return filetmp; 
  64. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值