When an input device is disconnected, select() reports the fd as readable but read() fails with ENODEV. Previously, the code caught the error but kept the dead fd in the list, causing an infinite busy loop that consumed 100% CPU. Now disconnected devices are removed from both self.devices and self.device_fds when read() fails, preventing the busy loop. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Antoine Monnet <39551484+AntoineMontane@users.noreply.github.com> Co-authored-by: AntoineMontane <monnet.antoine@gmail.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>