我有一个POSIX线程,它从非阻塞匿名管道(标有O_NONBLOCK
标志)中读取。当线程停止时(例如由于错误)我想检查管道中是否还有东西(在其内部缓冲区中)。如果管道有数据 - 运行具有相同读取描述符的新线程(它在线程之间共享),因此新线程可以继续从管道读取。如果管道是空的 - 关闭管道并且什么都不做。
所以我需要检查管道是否为空而不从管道中删除数据(正如常规read
那样)。有没有办法做到这一点?
P.S。我认为在count = 0
中设置read(int fd, void *buf, size_t count);
可能有所帮助,但文档认为它是某种未定义的行为:
如果count为零,则read() 可能 检测下述错误。在 没有任何错误,或者如果read()没有检查错误,a read()的计数为0,返回零,没有其他影响。
答案 0 :(得分:2)
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.