【发布时间】:2017-08-01 00:08:54
【问题描述】:
等待文件描述符变得可读非常简单:
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;
}
但是我如何等待文件描述符变为不可读取,即为空,而没有繁忙的循环?我目前的方法是休眠几毫秒,但这不是我最喜欢的解决方案。
【问题讨论】:
-
不读它怎么会变得不可读?
-
@Max,FD 与其他进程共享。
-
在这种情况下,您可能希望其他进程使用 IPC 告诉您“我刚刚清空了这个 fd”。
-
据我所知,没有什么好的方法可以等待 FD 不再可读,而且还不清楚您希望从中获得什么好处。当然,您可以尝试使用来自给定 FD 的可用数据,直到没有更多可用数据为止。如果您依赖另一个线程或进程来使用数据,那么您可以考虑实现一个显式信号,可能通过管道或信号量。
-
您提到的所有系统接口都在等待 FD 以一种或另一种方式准备就绪。您正在寻找相反的结果:等待 FD 变得未准备好。这些特定的接口没有提供这些。我不知道有什么,但我还没有准备好否认有。