当文件描述符变坏时 QSocketNotifier 发生了什么?

What is happened with QSocketNotifier when file descriptor becomes bad?

假设我有 QSocketNotifier 是根据有效的文件描述符构造的(它实际上是操纵杆设备 - /dev/input/js0)。我将 QSocketNotifier::activated 连接到相应的处理程序。当文件消失(硬件断开连接)时 - 我应该期待什么?

如我所见,::activated 使用相同的套接字参数重复发出,但在 read() 处理程序内部调用之后有 errno == ENODEV。我可以期望 ::activated 总是 在描述符变坏后发出(因此捕获断开连接事件)或者 QSocketNotifier 的实际行为未定义吗?

我无法特别说明 /dev/input/js0 的行为,因为我从未使用过该设备,但远程连接已关闭的 socket/file-descriptor 的一般行为是return 准备好读取,然后当应用程序尝试在文件描述符上调用 recv()(或 read())时,这些调用中的任何一个都会 return 0 ( a.k.a.EOF)表示远程设备已经关闭连接。

大概这(或类似的事情)在使用 QSocketNotifier 时也会发生,即 Qt 的内部代码将通知 QSocketNotifier 文件描述符现在已准备好读取,并且QSocketNotifier 将通过发出 activated(int) Qt 信号来响应。所以我觉得你的使用模式很好。

(如果您(或其他人)在文件描述符上调用 close() 而没有首先禁用或销毁任何 QSocketNotifier 正在监视该文件描述符的对象。这很糟糕,因为 QSocketNotifier 对象无法知道文件描述符已关闭,因此他们会继续尝试使用它——他们这样做时可能会遇到 EBADFS 类型的错误,但是您的进程中的其他线程也有可能在不久之后出于某些不相关的目的创建一个新的文件描述符,并且偶然会最终得到与之前 close() 相同的 int 值,然后您将有一段非常有趣的时间来调试导致的奇怪行为:))