例如,什么可以产生 POLLNVAL?

例如,什么可以产生 POLLNVAL?

参考资料关于poll()只是说“指定的 fd 值无效。该标志仅在revents成员中有效;它应在事件成员中被忽略。”。

这还不清楚(至少对我来说):如果文件描述符无效, poll 不应该返回错误(负返回值)吗?

我有同样的问题,POLLERR并在某处了解到它可能指的是设备或网络中的错误。这个,,POLLNVAL仍然是神秘的。

有人知道示例案例吗?

答案1

POLLNVAL如果文件描述符编号与文件描述符不对应,则设置该值。

我不确定为什么选择这种行为而不是poll返回错误。原因可能是易于实现:它允许实现对数组进行struct pollfd一次循环,而不必处理早期返回,其中数组的某些元素已被修改,而其他元素则没有。

原因也可能是程序员的方便。由于调用poll无效的文件描述符不是错误,因此可以关闭文件描述符并仍然将其包含在数组中。这种便利的兴趣有限:只要不打开任何其他文件(因为它可能会重用文件描述符),您就只能这样做,并且您仍然为数组元素付出(微小的)性能损失。它在多线程程序中很有用,其中一个线程可能会调用,close而另一个线程正在执行poll调用或即将执行此操作:这不是错误,轮询线程只需要在open.

相关内容