日期:2014-05-16  浏览次数:20623 次

Unix高级环境编程一有关dup2的习题,求解释!!!!
习题3.4:
  在许多程序中都包含如下一段代码:
 
C/C++ code

dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
if(fd > 2)
    close(fd);



  为了说明 if语句的必要性, 假设fd为1, 画出每次调用dup2时3个描述符项及相应文件表项的变化情况. 然后再画出fd为3的情况.

  看了答案: 
 知识点: dup2(filedes, filedes2) , 如果filedes = filedes2, 则返回filedes2, 而不关闭它, 不等于时如果filedes2已打开,则先关闭它
 完整答案: 如果fd为1, 执行dup2(fd,1)时返回1, 没有关闭描述符1, . 调用3次后, 3个描述符指向同一文件表项,所以不需要关闭(一直想不通 这里 为什么不需要关闭? 而后面所说fd为3的时候为什么又要关闭了... 能说下这里的关闭具体是干吗? 是对描述符和与之关联的文件表项做了什么吗?)
  但如果fd 为3 , 调用3次dup2后,有4个描述符指向同一文件表项, 这种情况下就要关闭描述符3 .

  希望大家不要以为我钻牛角尖, 而是深刻体会 : 有时候很小的知识点 关键时候如果不知道 抓破脑袋也找不出BUG原因, 会让人痛苦得想死滴!!!

------解决方案--------------------
题目的意思是,实际应用中0,1,2都对应stdin, stdout, stderr。
比如你开发一个网络调试程序,想把某程序的三路IO重定向到一个socket上,就可以:
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
完成之后你会发现fd其实是多余的,所以close掉它。
if(fd > 2)
close(fd);

并不是说,不close(fd)就会错。只是,我们没必要再浪费一个descripter在上面。
------解决方案--------------------
前3个dup2是把描述符fd分别与0、1、2关联

如果fd=1,你又close(fd),那么1(标准输出)被关闭
如果fd=3,此时close(fd),不会影响标准输出、错误输出、标准输入