在第一次阅读后,轮询childs stdout停止设置POLLIN

时间:2009-12-11 17:31:52

标签: c

我想读取我孩子的proccess的输出,但由于某种原因,当仍有输出被读取时,它会停止在revents中设置POLLIN。

以下是我的工作:

  1. 分叉我的过程
  2. 创建管道
  3. dup2(pipe [0],STDOUT_FILENO)我孩子的stdout
  4. 轮询管道的文件描述符(我这样做直到我达到EOF)
  5. 如果设置了POLLIN,则读取输出
  6. 我看到是否达到EOF的方式是在结构中设置一个标志,如果在轮询之后没有在revents中设置POLLIN。

    (poll_fds[idx].revents & ~POLLIN)
    

    现在,即使设置了POLLIN,这总是评估为true,我猜它是因为在bitmask上设置了一些错误标志,对吧?

    我测试程序的方式是./my_program / bin / ls

    现在这应该在我的控制台上打印ls的输出,但它只打印前16个字节(我读取()正好是16个字节)。

    我不知道为什么错误标志正在设置任何想法?

    编辑:我刚刚看到正在设置的标志是POLLHUP ...但我不明白为什么它被设置如果我没有读完所有的管道?

1 个答案:

答案 0 :(得分:1)

(poll_fds[idx].revents & ~POLLIN)

到底是什么?如果设置了任何非POLLIN位,则返回true。可能你想要一个

!(poll_fds[idx].revents & POLLIN)
(~poll_fds[idx].revents & POLLIN)