等到文件描述符不再可读而没有繁忙的循环

时间:2017-03-10 15:23:52

标签: c linux select io epoll

等待文件描述符变得可读非常简单:

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,即为空?我目前的方法是睡眠几毫秒,但这不是我最喜欢的解决方案。

2 个答案:

答案 0 :(得分:0)

不,当文件描述符 nothing 要读取时,没有直接的方法来执行将“isEmpty”信号或标志发送到selectpoll这样的事情

毕竟,任何fd和select机制的用例都是传输数据,而不是不传输数据 ...所以你可以说这不是这个系统惯例的工作。

传输到select的唯一事实是当文件描述符不再存在时,这是“无数据可用”的特例 - 我不认为但是,请介绍您的用例。

通过让生产者在可以检查的描述符上发送某种心跳来转动逻辑并确保数据始终可用,对于例如,重置计时器,或者您让数据消费者向监控过程发送信号(或其他IPC消息),向监控器发出“我刚刚清空该fd”的信号。

答案 1 :(得分:0)

看看man read它说read返回0,这基本上意味着end of file,这意味着没有更多数据可以从fd中读取。 至于不使用循环,您可以尝试基于事件的方法,在该方法中为事件分配回调函数,并在事件发生时调用该函数。 (link

另外,对于常规Linux不确定,但对于OpenWrt,我使用他们的ustream库,它允许您通过管道传输数据,这将使您的工作变得更加容易。