1

我对使用以下代码的家庭作业有疑问:

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

它说,

“要了解为什么需要进行 if 测试,假设 fd 为 1,并画出每次调用 dup2 时三个描述符条目和相应的文件表条目发生的情况。然后假设 fd 为 3,并画出相同的图。”

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

谁能给我一个关于这个材料的快速教程,因为我很难在我的书和网上找到它。谢谢。

4

2 回答 2

3

如果 fd 为 3,它将关闭原本分别指向 stdin、stdout、stderr 的 fds 0、1、2,并创建 fd 的 3 个副本: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

于 2011-11-29T06:28:19.720 回答
1

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

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

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

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

祝你好运!

于 2011-11-29T06:27:38.637 回答