等待文件描述符变得可读非常简单:
struct pollfd f;
signed result;
f.fd = a_file_descriptor_a_pipe_in_my_case;
f.events = POLLIN | POLLERR | POLLHUP;
result = poll(&f, 1, timeout_in_millis);
if (result < 0) {
if (errno == EINTR) {
// try again
} else {
// report error
}
} else if (result == 0) {
// timeout
} else {
fd_is_readable = (f.revents & POLLIN) != 0;
fd_has_an_error = (f.revents & POLLERR) != 0;
fd_is_not_valid = (f.revents & POLLNVAL) != 0;
other_end_of_the_pipe_was_closed = (f.revents & EPOLLHUP) != 0;
}
但是,如何在没有繁忙循环的情况下等待文件描述符变为NOT READABLE,即为空?我目前的方法是睡眠几毫秒,但这不是我最喜欢的解决方案。
答案 0 :(得分:0)
不,当文件描述符 nothing 要读取时,没有直接的方法来执行将“isEmpty”信号或标志发送到select
或poll
这样的事情
毕竟,任何fd和select
机制的用例都是传输数据,而不是不传输数据 ...所以你可以说这不是这个系统惯例的工作。
传输到select
的唯一事实是当文件描述符不再存在时,这是“无数据可用”的特例 - 我不认为但是,请介绍您的用例。
通过让生产者在可以检查的描述符上发送某种心跳来转动逻辑并确保数据始终可用,对于例如,重置计时器,或者您让数据消费者向监控过程发送信号(或其他IPC消息),向监控器发出“我刚刚清空该fd”的信号。
答案 1 :(得分:0)