作业dup2功能

时间:2011-11-29 06:14:05

标签: c++ unix unistd.h

我对家庭作业的问题有以下代码:

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

它说,

  

“要查看为什么需要if测试,假设fd为1并绘制图片   三个描述符条目和相应的条目发生了什么   每次调用dup2的文件表条目。假设fd为3并绘制   同样的照片。“

我想知道我是否可以得到一些帮助,因为我很丢失。

任何人都可以给我一个关于这个材料的快速教程,因为我很难在我的书和网上找到它。感谢。

2 个答案:

答案 0 :(得分:3)

如果fd为3,它将关闭原本分别指向stdin,stdout,stderr的fds 0,1,2,并创建3个副本fd:0,1,2全部指向同一目的地fd 3.现在你不需要3,所以你关闭它,因为你已经有0,1,2指向3指向的地方,你不打算再使用3了。

如果fd为1,它将关闭原本分别指向stdin,stderr的fds 0,2,并创建fd:0的2个副本,2全部指向与fd 1(stdout)相同的目的地。现在你确实需要1指向标准输出,因为你的程序的其余部分计划使用1作为标准输出,所以你不要在这种情况下关闭fd。

因此你需要if语句,因为在一种情况下你需要关闭你不打算使用的fd,而在另一种情况下你不需要关闭你计划使用的fd。

手册页:http://linux.die.net/man/2/dup2

答案 1 :(得分:1)

首先,循环dup2()函数的作用,例如http://www.mkssoftware.com/docs/man3/dup2.3.asp。该链接告诉您dup2()“将打开的文件描述符重复到另一个文件描述符上,”并且“如果成功,dup2()返回一个非负整数;即重复的文件描述符,它是最低的可用描述符。“

然后,你需要在一张纸上绘制文件描述符(只需在一块纸上画出fd012纸)。这将是您在第一次dup2()调用之前拥有的文件描述符的初始状态。也就是说,你有三个文件描述符。

然后在每次调用dup2()后重绘文件描述符。最后,如果fd > 2,则关闭其中一个文件描述符。

我不是dup2()函数的专家,但这就是我要去做的事情。请仔细阅读该网页,以便了解该功能的工作原理(任何可能通过查看更多参考资料来验证信息是否正确)。

祝你好运!