【问题标题】:homework dup2 function作业 dup2 功能
【发布时间】:2011-11-29 06:14:04
【问题描述】:

我有一个关于家庭作业的问题,代码如下:

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

它说,

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

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

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

【问题讨论】:

  • 您的问题是什么?您不想关闭 stdout 或 stderr!
  • @BasileStarynkevitch 你为什么不把它写成答案?这是正确的。
  • 我想知道我是否可以解释一下问题所在。我很难理解 dup2 函数以及当它谈论“相应的文件表条目”时。
  • @BasileStarynkevitch - 但是如果您关闭 stderr,您将不会再收到任何错误! :P

标签: c++ unix unistd.h


【解决方案1】:

如果 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 的 2 个副本:0、2 都指向与 fd 1 相同的目的地(stdout) .现在您确实需要 1 指向标准输出,因为您的程序的其余部分计划使用 1 作为标准输出,所以在这种情况下您不要关闭 fd。

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    祝你好运!

    【讨论】:

    • rtfwb ;p(只是拉你的腿;很高兴你能帮忙)
    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 2018-03-12
    • 1970-01-01
    • 2010-10-22
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多