免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3873 | 回复: 8
打印 上一主题 下一主题

dup2的实现? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-30 17:42 |只看该作者 |倒序浏览
今天看到APUE上有一个习题:
编写一个与dup2功能相同的函数,要求不调用fcntl杉树,并要有正确的出错处理。
int dup2(int oldfd, int newfd);

想了半天不知道怎么实现,关键的问题是,怎么create出一个fd刚好等于newfd。
内核实现的时候直接把进程表中的newfd下标的值改了就是,但是这里肯定不能这样实现。
难道需要重复调用dup,直到dup返回的值等于newfd,然后在close掉dup产生的其它fd?

论坛徽章:
0
2 [报告]
发表于 2008-01-30 18:31 |只看该作者
顶一下,怎么没有人回答呢

论坛徽章:
0
3 [报告]
发表于 2008-01-30 19:11 |只看该作者
好像除了重复调用dup(),还真的没有什么好办法

论坛徽章:
0
4 [报告]
发表于 2009-01-30 19:12 |只看该作者
前段时间刚好也看那儿,自己写了个
很简陋,效率不高

int mydup2(int oldfd, int newfd)
{
  int tfd;
  
  if (oldfd == newfd)
    return oldfd;

  close(newfd);

  if ((tfd = dup(oldfd)) == newfd) {
    return newfd;
  }
  else {
    mydup2(oldfd, newfd);
    close(tfd);
  }

  return newfd;
}


[ 本帖最后由 logicBaby 于 2009-1-31 01:13 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-01-31 02:34 |只看该作者
int mydup2(int oldfd, int newfd)
{
  int tfd,i=0;
  int *fdp=(int *)malloc((oldfd>newfd)?oldfd:newfd);

  if (oldfd == newfd)
    return oldfd;

  close(newfd);

  do {
    fdp[i]=dup(oldfd);
  }while(fdp[i++] != newfd);

  newfd=fdp[--i];

  for(i--;i > 0 ;i--)
    close(fdp[i]);

  return newfd;

}

不用递归的,感觉越写越乱 

论坛徽章:
0
6 [报告]
发表于 2009-01-31 15:17 |只看该作者

回复 #5 logicBaby 的帖子

假定 max(oldfd, newfd) == 32767,只有单个 dup2() 请求,你是不是准备创建 2^(15+2) 个字节大小的数组呢?
所以……从这个角度来讲,个人觉得简单一点最好,就是按照顺序一个个来,先 close 再一个个 dup,最后把不必要的 fd 统统关闭。

P.S. 这里的 malloc(),传给它的参数应该乘个 sizeof(int)?

论坛徽章:
0
7 [报告]
发表于 2009-01-31 19:46 |只看该作者
原帖由 langue 于 2009-1-31 15:17 发表
假定 max(oldfd, newfd) == 32767,只有单个 dup2() 请求,你是不是准备创建 2^(15+2) 个字节大小的数组呢?
所以……从这个角度来讲,个人觉得简单一点最好,就是按照顺序一个个来,先 close 再一个个 dup,最后把不必要的 fd 统统关闭。

P.S. 这里的 malloc(),传给它的参数应该乘个 sizeof(int)


"先 close 再一个个 dup"

因为不知道哪些描述符已经打开,之前是否已经用过dup2打开过一个指定的描述符,且dup返回的描述符是系统自动返回当前可用描述符的最小,这个最小是多少?只有系统知道。所以出此下策,先将所有试过的描述符存起来,然后再关闭……

“malloc(),传给它的参数应该乘个 sizeof(int)”

这个确实应该加上,谢谢langue指出      
int *fdp = (int *) malloc(sizeof(int) * (oldfd > newfd ? oldfd : newfd));


langue 大大 给个思路,俺只能想到这种一个个试的笨办法  

[ 本帖最后由 logicBaby 于 2009-1-31 19:48 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-02-02 09:34 |只看该作者
偶也有同样的问题!

[ 本帖最后由 李某人 于 2009-2-2 09:35 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-02-02 09:36 |只看该作者
  哪个才是正确的思路呢

[ 本帖最后由 李某人 于 2009-2-2 09:37 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP