如何检查非阻塞匿名管道是否有数据而不删除它

时间:2017-04-30 18:27:43

标签: c multithreading pipe posix

我有一个POSIX线程,它从非阻塞匿名管道(标有O_NONBLOCK标志)中读取。当线程停止时(例如由于错误)我想检查管道中是否还有东西(在其内部缓冲区中)。如果管道有数据 - 运行具有相同读取描述符的新线程(它在线程之间共享),因此新线程可以继续从管道读取。如果管道是空的 - 关闭管道并且什么都不做。

所以我需要检查管道是否为空而不从管道中删除数据(正如常规read那样)。有没有办法做到这一点?

P.S。我认为在count = 0中设置read(int fd, void *buf, size_t count);可能有所帮助,但文档认为它是某种未定义的行为:

  

如果count为零,则read() 可能 检测下述错误。在   没有任何错误,或者如果read()没有检查错误,a   read()的计数为0,返回零,没有其他影响。

1 个答案:

答案 0 :(得分:2)

我相信你想要pollselect,调用零超时。

select()文档中的简短描述:

   select() and pselect() allow a program to monitor multiple file
   descriptors, waiting until one or more of the file descriptors become
   "ready" for some class of I/O operation (e.g., input possible).

...和poll()文档:

   poll() performs a similar task to select(2): it waits for one of a
   set of file descriptors to become ready to perform I/O.