当前位置: 技术问答>linux和unix
Unix高级环境编程一有关dup2的习题,求解释!!!!
来源: 互联网 发布时间:2017-02-10
本文导语: 习题3.4: 在许多程序中都包含如下一段代码: dup2(fd,0); dup2(fd,1); dup2(fd,2); if(fd > 2) close(fd); 为了说明 if语句的必要性, 假设fd为1, 画出每次调用dup2时3个描述符项及相应文件表项的变化情况. 然后再画...
习题3.4:
在许多程序中都包含如下一段代码:
为了说明 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原因, 会让人痛苦得想死滴!!!
在许多程序中都包含如下一段代码:
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在上面。
比如你开发一个网络调试程序,想把某程序的三路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),不会影响标准输出、错误输出、标准输入
如果fd=1,你又close(fd),那么1(标准输出)被关闭
如果fd=3,此时close(fd),不会影响标准输出、错误输出、标准输入